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
PassRefPtr<AccessibilityObject> obj;
67
switch (controlType) {
69
obj = AccessibilityMediaTimeline::create(renderer);
72
case MediaCurrentTimeDisplay:
73
case MediaTimeRemainingDisplay:
74
obj = AccessibilityMediaTimeDisplay::create(renderer);
77
case MediaControlsPanel:
78
obj = AccessibilityMediaControlsContainer::create(renderer);
82
obj = adoptRef(new AccessibilityMediaControl(renderer));
89
MediaControlElementType AccessibilityMediaControl::controlType() const
91
if (!renderer() || !renderer()->node())
92
return MediaTimelineContainer; // Timeline container is not accessible.
94
Node* node = renderer()->node();
96
if (node->hasTagName(inputTag))
97
return static_cast<MediaControlInputElement*>(node)->displayType();
99
return static_cast<MediaControlElement*>(node)->displayType();
102
String AccessibilityMediaControl::controlTypeName() const
104
DEFINE_STATIC_LOCAL(const String, mediaMuteButtonName, ("MuteButton"));
105
DEFINE_STATIC_LOCAL(const String, mediaPlayButtonName, ("PlayButton"));
106
DEFINE_STATIC_LOCAL(const String, mediaSeekBackButtonName, ("SeekBackButton"));
107
DEFINE_STATIC_LOCAL(const String, mediaSeekForwardButtonName, ("SeekForwardButton"));
108
DEFINE_STATIC_LOCAL(const String, mediaRewindButtonName, ("RewindButton"));
109
DEFINE_STATIC_LOCAL(const String, mediaReturnToRealtimeButtonName, ("ReturnToRealtimeButton"));
110
DEFINE_STATIC_LOCAL(const String, mediaUnMuteButtonName, ("UnMuteButton"));
111
DEFINE_STATIC_LOCAL(const String, mediaPauseButtonName, ("PauseButton"));
112
DEFINE_STATIC_LOCAL(const String, mediaStatusDisplayName, ("StatusDisplay"));
113
DEFINE_STATIC_LOCAL(const String, mediaCurrentTimeDisplay, ("CurrentTimeDisplay"));
114
DEFINE_STATIC_LOCAL(const String, mediaTimeRemainingDisplay, ("TimeRemainingDisplay"));
116
switch (controlType()) {
117
case MediaMuteButton:
118
return mediaMuteButtonName;
119
case MediaPlayButton:
120
return mediaPlayButtonName;
121
case MediaSeekBackButton:
122
return mediaSeekBackButtonName;
123
case MediaSeekForwardButton:
124
return mediaSeekForwardButtonName;
125
case MediaRewindButton:
126
return mediaRewindButtonName;
127
case MediaReturnToRealtimeButton:
128
return mediaReturnToRealtimeButtonName;
129
case MediaUnMuteButton:
130
return mediaUnMuteButtonName;
131
case MediaPauseButton:
132
return mediaPauseButtonName;
133
case MediaStatusDisplay:
134
return mediaStatusDisplayName;
135
case MediaCurrentTimeDisplay:
136
return mediaCurrentTimeDisplay;
137
case MediaTimeRemainingDisplay:
138
return mediaTimeRemainingDisplay;
147
String AccessibilityMediaControl::title() const
149
DEFINE_STATIC_LOCAL(const String, controlsPanel, ("ControlsPanel"));
151
if (controlType() == MediaControlsPanel)
152
return localizedMediaControlElementString(controlsPanel);
154
return AccessibilityRenderObject::title();
157
String AccessibilityMediaControl::accessibilityDescription() const
159
return localizedMediaControlElementString(controlTypeName());
162
String AccessibilityMediaControl::helpText() const
164
return localizedMediaControlElementHelpText(controlTypeName());
167
bool AccessibilityMediaControl::accessibilityIsIgnored() const
169
if (!m_renderer || !m_renderer->style() || m_renderer->style()->visibility() != VISIBLE || controlType() == MediaTimelineContainer)
175
AccessibilityRole AccessibilityMediaControl::roleValue() const
177
switch (controlType()) {
178
case MediaFullscreenButton:
179
case MediaMuteButton:
180
case MediaPlayButton:
181
case MediaSeekBackButton:
182
case MediaSeekForwardButton:
183
case MediaRewindButton:
184
case MediaReturnToRealtimeButton:
185
case MediaUnMuteButton:
186
case MediaPauseButton:
189
case MediaStatusDisplay:
190
return StaticTextRole;
192
case MediaTimelineContainer:
205
// AccessibilityMediaControlsContainer
207
AccessibilityMediaControlsContainer::AccessibilityMediaControlsContainer(RenderObject* renderer)
208
: AccessibilityMediaControl(renderer)
212
PassRefPtr<AccessibilityObject> AccessibilityMediaControlsContainer::create(RenderObject* renderer)
214
return adoptRef(new AccessibilityMediaControlsContainer(renderer));
217
String AccessibilityMediaControlsContainer::accessibilityDescription() const
219
return localizedMediaControlElementString(elementTypeName());
222
String AccessibilityMediaControlsContainer::helpText() const
224
return localizedMediaControlElementHelpText(elementTypeName());
227
bool AccessibilityMediaControlsContainer::controllingVideoElement() const
229
if (!m_renderer->node())
232
MediaControlTimeDisplayElement* element = static_cast<MediaControlTimeDisplayElement*>(m_renderer->node());
234
return element->mediaElement()->isVideo();
237
const String AccessibilityMediaControlsContainer::elementTypeName() const
239
DEFINE_STATIC_LOCAL(const String, videoElement, ("VideoElement"));
240
DEFINE_STATIC_LOCAL(const String, audioElement, ("AudioElement"));
242
if (controllingVideoElement())
249
// AccessibilityMediaTimeline
251
AccessibilityMediaTimeline::AccessibilityMediaTimeline(RenderObject* renderer)
252
: AccessibilitySlider(renderer)
256
PassRefPtr<AccessibilityObject> AccessibilityMediaTimeline::create(RenderObject* renderer)
258
return adoptRef(new AccessibilityMediaTimeline(renderer));
261
String AccessibilityMediaTimeline::valueDescription() const
263
ASSERT(m_renderer->node()->hasTagName(inputTag));
265
float time = static_cast<HTMLInputElement*>(m_renderer->node())->value().toFloat();
266
return localizedMediaTimeDescription(time);
269
String AccessibilityMediaTimeline::helpText() const
271
DEFINE_STATIC_LOCAL(const String, slider, ("Slider"));
272
return localizedMediaControlElementHelpText(slider);
277
// AccessibilityMediaTimeDisplay
279
AccessibilityMediaTimeDisplay::AccessibilityMediaTimeDisplay(RenderObject* renderer)
280
: AccessibilityMediaControl(renderer)
284
PassRefPtr<AccessibilityObject> AccessibilityMediaTimeDisplay::create(RenderObject* renderer)
286
return adoptRef(new AccessibilityMediaTimeDisplay(renderer));
289
bool AccessibilityMediaTimeDisplay::accessibilityIsIgnored() const
291
if (!m_renderer || !m_renderer->style() || m_renderer->style()->visibility() != VISIBLE)
294
return !m_renderer->style()->width().value();
297
String AccessibilityMediaTimeDisplay::accessibilityDescription() const
299
DEFINE_STATIC_LOCAL(const String, currentTimeDisplay, ("CurrentTimeDisplay"));
300
DEFINE_STATIC_LOCAL(const String, timeRemainingDisplay, ("TimeRemainingDisplay"));
302
if (controlType() == MediaCurrentTimeDisplay)
303
return localizedMediaControlElementString(currentTimeDisplay);
305
return localizedMediaControlElementString(timeRemainingDisplay);
308
String AccessibilityMediaTimeDisplay::stringValue() const
310
if (!m_renderer || !m_renderer->node())
313
MediaControlTimeDisplayElement* element = static_cast<MediaControlTimeDisplayElement*>(m_renderer->node());
314
float time = element->currentValue();
315
return localizedMediaTimeDescription(fabsf(time));
318
} // namespace WebCore
320
#endif // ENABLE(VIDEO)