2 * Copyright (C) 2009 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14 * its contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 #include "AccessibilityMediaControls.h"
36 #include "AXObjectCache.h"
37 #include "HTMLInputElement.h"
38 #include "HTMLNames.h"
39 #include "LocalizedStrings.h"
40 #include "MediaControlElements.h"
41 #include "RenderObject.h"
42 #include "RenderSlider.h"
46 using namespace HTMLNames;
49 AccessibilityMediaControl::AccessibilityMediaControl(RenderObject* renderer)
50 : AccessibilityRenderObject(renderer)
54 PassRefPtr<AccessibilityObject> AccessibilityMediaControl::create(RenderObject* renderer)
56 ASSERT(renderer->node() && renderer->node()->isMediaControlElement());
58 Node* node = renderer->node();
59 MediaControlElementType controlType;
61 if (node->hasTagName(inputTag))
62 controlType = static_cast<MediaControlInputElement*>(node)->displayType();
64 controlType = static_cast<MediaControlElement*>(node)->displayType();
66 switch (controlType) {
68 return AccessibilityMediaTimeline::create(renderer);
70 case MediaCurrentTimeDisplay:
71 case MediaTimeRemainingDisplay:
72 return AccessibilityMediaTimeDisplay::create(renderer);
74 case MediaControlsPanel:
75 return AccessibilityMediaControlsContainer::create(renderer);
78 return adoptRef(new AccessibilityMediaControl(renderer));
82 MediaControlElementType AccessibilityMediaControl::controlType() const
84 if (!renderer() || !renderer()->node())
85 return MediaTimelineContainer; // Timeline container is not accessible.
87 Node* node = renderer()->node();
89 if (node->hasTagName(inputTag))
90 return static_cast<MediaControlInputElement*>(node)->displayType();
92 return static_cast<MediaControlElement*>(node)->displayType();
95 String AccessibilityMediaControl::controlTypeName() const
97 DEFINE_STATIC_LOCAL(const String, mediaFullscreenButtonName, ("FullscreenButton"));
98 DEFINE_STATIC_LOCAL(const String, mediaMuteButtonName, ("MuteButton"));
99 DEFINE_STATIC_LOCAL(const String, mediaPlayButtonName, ("PlayButton"));
100 DEFINE_STATIC_LOCAL(const String, mediaSeekBackButtonName, ("SeekBackButton"));
101 DEFINE_STATIC_LOCAL(const String, mediaSeekForwardButtonName, ("SeekForwardButton"));
102 DEFINE_STATIC_LOCAL(const String, mediaRewindButtonName, ("RewindButton"));
103 DEFINE_STATIC_LOCAL(const String, mediaReturnToRealtimeButtonName, ("ReturnToRealtimeButton"));
104 DEFINE_STATIC_LOCAL(const String, mediaUnMuteButtonName, ("UnMuteButton"));
105 DEFINE_STATIC_LOCAL(const String, mediaPauseButtonName, ("PauseButton"));
106 DEFINE_STATIC_LOCAL(const String, mediaStatusDisplayName, ("StatusDisplay"));
107 DEFINE_STATIC_LOCAL(const String, mediaCurrentTimeDisplay, ("CurrentTimeDisplay"));
108 DEFINE_STATIC_LOCAL(const String, mediaTimeRemainingDisplay, ("TimeRemainingDisplay"));
109 DEFINE_STATIC_LOCAL(const String, mediaShowClosedCaptionsButtonName, ("ShowClosedCaptionsButton"));
110 DEFINE_STATIC_LOCAL(const String, mediaHideClosedCaptionsButtonName, ("HideClosedCaptionsButton"));
112 switch (controlType()) {
113 case MediaFullscreenButton:
114 return mediaFullscreenButtonName;
115 case MediaMuteButton:
116 return mediaMuteButtonName;
117 case MediaPlayButton:
118 return mediaPlayButtonName;
119 case MediaSeekBackButton:
120 return mediaSeekBackButtonName;
121 case MediaSeekForwardButton:
122 return mediaSeekForwardButtonName;
123 case MediaRewindButton:
124 return mediaRewindButtonName;
125 case MediaReturnToRealtimeButton:
126 return mediaReturnToRealtimeButtonName;
127 case MediaUnMuteButton:
128 return mediaUnMuteButtonName;
129 case MediaPauseButton:
130 return mediaPauseButtonName;
131 case MediaStatusDisplay:
132 return mediaStatusDisplayName;
133 case MediaCurrentTimeDisplay:
134 return mediaCurrentTimeDisplay;
135 case MediaTimeRemainingDisplay:
136 return mediaTimeRemainingDisplay;
137 case MediaShowClosedCaptionsButton:
138 return mediaShowClosedCaptionsButtonName;
139 case MediaHideClosedCaptionsButton:
140 return mediaHideClosedCaptionsButtonName;
149 String AccessibilityMediaControl::title() const
151 DEFINE_STATIC_LOCAL(const String, controlsPanel, ("ControlsPanel"));
153 if (controlType() == MediaControlsPanel)
154 return localizedMediaControlElementString(controlsPanel);
156 return AccessibilityRenderObject::title();
159 String AccessibilityMediaControl::accessibilityDescription() const
161 return localizedMediaControlElementString(controlTypeName());
164 String AccessibilityMediaControl::helpText() const
166 return localizedMediaControlElementHelpText(controlTypeName());
169 bool AccessibilityMediaControl::accessibilityIsIgnored() const
171 if (!m_renderer || !m_renderer->style() || m_renderer->style()->visibility() != VISIBLE || controlType() == MediaTimelineContainer)
177 AccessibilityRole AccessibilityMediaControl::roleValue() const
179 switch (controlType()) {
180 case MediaFullscreenButton:
181 case MediaMuteButton:
182 case MediaPlayButton:
183 case MediaSeekBackButton:
184 case MediaSeekForwardButton:
185 case MediaRewindButton:
186 case MediaReturnToRealtimeButton:
187 case MediaUnMuteButton:
188 case MediaPauseButton:
189 case MediaShowClosedCaptionsButton:
190 case MediaHideClosedCaptionsButton:
193 case MediaStatusDisplay:
194 return StaticTextRole;
196 case MediaTimelineContainer:
209 // AccessibilityMediaControlsContainer
211 AccessibilityMediaControlsContainer::AccessibilityMediaControlsContainer(RenderObject* renderer)
212 : AccessibilityMediaControl(renderer)
216 PassRefPtr<AccessibilityObject> AccessibilityMediaControlsContainer::create(RenderObject* renderer)
218 return adoptRef(new AccessibilityMediaControlsContainer(renderer));
221 String AccessibilityMediaControlsContainer::accessibilityDescription() const
223 return localizedMediaControlElementString(elementTypeName());
226 String AccessibilityMediaControlsContainer::helpText() const
228 return localizedMediaControlElementHelpText(elementTypeName());
231 bool AccessibilityMediaControlsContainer::controllingVideoElement() const
233 if (!m_renderer->node())
236 MediaControlTimeDisplayElement* element = static_cast<MediaControlTimeDisplayElement*>(m_renderer->node());
238 return element->mediaElement()->isVideo();
241 const String AccessibilityMediaControlsContainer::elementTypeName() const
243 DEFINE_STATIC_LOCAL(const String, videoElement, ("VideoElement"));
244 DEFINE_STATIC_LOCAL(const String, audioElement, ("AudioElement"));
246 if (controllingVideoElement())
253 // AccessibilityMediaTimeline
255 AccessibilityMediaTimeline::AccessibilityMediaTimeline(RenderObject* renderer)
256 : AccessibilitySlider(renderer)
260 PassRefPtr<AccessibilityObject> AccessibilityMediaTimeline::create(RenderObject* renderer)
262 return adoptRef(new AccessibilityMediaTimeline(renderer));
265 String AccessibilityMediaTimeline::valueDescription() const
267 ASSERT(m_renderer->node()->hasTagName(inputTag));
269 float time = static_cast<HTMLInputElement*>(m_renderer->node())->value().toFloat();
270 return localizedMediaTimeDescription(time);
273 String AccessibilityMediaTimeline::helpText() const
275 DEFINE_STATIC_LOCAL(const String, slider, ("Slider"));
276 return localizedMediaControlElementHelpText(slider);
281 // AccessibilityMediaTimeDisplay
283 AccessibilityMediaTimeDisplay::AccessibilityMediaTimeDisplay(RenderObject* renderer)
284 : AccessibilityMediaControl(renderer)
288 PassRefPtr<AccessibilityObject> AccessibilityMediaTimeDisplay::create(RenderObject* renderer)
290 return adoptRef(new AccessibilityMediaTimeDisplay(renderer));
293 bool AccessibilityMediaTimeDisplay::accessibilityIsIgnored() const
295 if (!m_renderer || !m_renderer->style() || m_renderer->style()->visibility() != VISIBLE)
298 return !m_renderer->style()->width().value();
301 String AccessibilityMediaTimeDisplay::accessibilityDescription() const
303 DEFINE_STATIC_LOCAL(const String, currentTimeDisplay, ("CurrentTimeDisplay"));
304 DEFINE_STATIC_LOCAL(const String, timeRemainingDisplay, ("TimeRemainingDisplay"));
306 if (controlType() == MediaCurrentTimeDisplay)
307 return localizedMediaControlElementString(currentTimeDisplay);
309 return localizedMediaControlElementString(timeRemainingDisplay);
312 String AccessibilityMediaTimeDisplay::stringValue() const
314 if (!m_renderer || !m_renderer->node())
317 MediaControlTimeDisplayElement* element = static_cast<MediaControlTimeDisplayElement*>(m_renderer->node());
318 float time = element->currentValue();
319 return localizedMediaTimeDescription(fabsf(time));
322 } // namespace WebCore
324 #endif // ENABLE(VIDEO)