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 "HTMLMediaElement.h"
39
#include "HTMLNames.h"
40
#include "LocalizedStrings.h"
41
#include "MediaControlElements.h"
42
#include "RenderObject.h"
43
#include "RenderSlider.h"
47
using namespace HTMLNames;
50
AccessibilityMediaControl::AccessibilityMediaControl(RenderObject* renderer)
51
: AccessibilityRenderObject(renderer)
55
PassRefPtr<AccessibilityObject> AccessibilityMediaControl::create(RenderObject* renderer)
57
ASSERT(renderer->node());
59
switch (mediaControlElementType(renderer->node())) {
61
return AccessibilityMediaTimeline::create(renderer);
63
case MediaCurrentTimeDisplay:
64
case MediaTimeRemainingDisplay:
65
return AccessibilityMediaTimeDisplay::create(renderer);
67
case MediaControlsPanel:
68
return AccessibilityMediaControlsContainer::create(renderer);
71
AccessibilityMediaControl* obj = new AccessibilityMediaControl(renderer);
78
MediaControlElementType AccessibilityMediaControl::controlType() const
80
if (!renderer() || !renderer()->node())
81
return MediaTimelineContainer; // Timeline container is not accessible.
83
return mediaControlElementType(renderer()->node());
86
String AccessibilityMediaControl::controlTypeName() const
88
DEFINE_STATIC_LOCAL(const String, mediaEnterFullscreenButtonName, (ASCIILiteral("EnterFullscreenButton")));
89
DEFINE_STATIC_LOCAL(const String, mediaExitFullscreenButtonName, (ASCIILiteral("ExitFullscreenButton")));
90
DEFINE_STATIC_LOCAL(const String, mediaMuteButtonName, (ASCIILiteral("MuteButton")));
91
DEFINE_STATIC_LOCAL(const String, mediaPlayButtonName, (ASCIILiteral("PlayButton")));
92
DEFINE_STATIC_LOCAL(const String, mediaSeekBackButtonName, (ASCIILiteral("SeekBackButton")));
93
DEFINE_STATIC_LOCAL(const String, mediaSeekForwardButtonName, (ASCIILiteral("SeekForwardButton")));
94
DEFINE_STATIC_LOCAL(const String, mediaRewindButtonName, (ASCIILiteral("RewindButton")));
95
DEFINE_STATIC_LOCAL(const String, mediaReturnToRealtimeButtonName, (ASCIILiteral("ReturnToRealtimeButton")));
96
DEFINE_STATIC_LOCAL(const String, mediaUnMuteButtonName, (ASCIILiteral("UnMuteButton")));
97
DEFINE_STATIC_LOCAL(const String, mediaPauseButtonName, (ASCIILiteral("PauseButton")));
98
DEFINE_STATIC_LOCAL(const String, mediaStatusDisplayName, (ASCIILiteral("StatusDisplay")));
99
DEFINE_STATIC_LOCAL(const String, mediaCurrentTimeDisplay, (ASCIILiteral("CurrentTimeDisplay")));
100
DEFINE_STATIC_LOCAL(const String, mediaTimeRemainingDisplay, (ASCIILiteral("TimeRemainingDisplay")));
101
DEFINE_STATIC_LOCAL(const String, mediaShowClosedCaptionsButtonName, (ASCIILiteral("ShowClosedCaptionsButton")));
102
DEFINE_STATIC_LOCAL(const String, mediaHideClosedCaptionsButtonName, (ASCIILiteral("HideClosedCaptionsButton")));
104
switch (controlType()) {
105
case MediaEnterFullscreenButton:
106
return mediaEnterFullscreenButtonName;
107
case MediaExitFullscreenButton:
108
return mediaExitFullscreenButtonName;
109
case MediaMuteButton:
110
return mediaMuteButtonName;
111
case MediaPlayButton:
112
return mediaPlayButtonName;
113
case MediaSeekBackButton:
114
return mediaSeekBackButtonName;
115
case MediaSeekForwardButton:
116
return mediaSeekForwardButtonName;
117
case MediaRewindButton:
118
return mediaRewindButtonName;
119
case MediaReturnToRealtimeButton:
120
return mediaReturnToRealtimeButtonName;
121
case MediaUnMuteButton:
122
return mediaUnMuteButtonName;
123
case MediaPauseButton:
124
return mediaPauseButtonName;
125
case MediaStatusDisplay:
126
return mediaStatusDisplayName;
127
case MediaCurrentTimeDisplay:
128
return mediaCurrentTimeDisplay;
129
case MediaTimeRemainingDisplay:
130
return mediaTimeRemainingDisplay;
131
case MediaShowClosedCaptionsButton:
132
return mediaShowClosedCaptionsButtonName;
133
case MediaHideClosedCaptionsButton:
134
return mediaHideClosedCaptionsButtonName;
143
void AccessibilityMediaControl::accessibilityText(Vector<AccessibilityText>& textOrder)
145
String description = accessibilityDescription();
146
if (!description.isEmpty())
147
textOrder.append(AccessibilityText(description, AlternativeText));
149
String title = this->title();
150
if (!title.isEmpty())
151
textOrder.append(AccessibilityText(title, AlternativeText));
153
String helptext = helpText();
154
if (!helptext.isEmpty())
155
textOrder.append(AccessibilityText(helptext, HelpText));
159
String AccessibilityMediaControl::title() const
161
DEFINE_STATIC_LOCAL(const String, controlsPanel, (ASCIILiteral("ControlsPanel")));
163
if (controlType() == MediaControlsPanel)
164
return localizedMediaControlElementString(controlsPanel);
166
return AccessibilityRenderObject::title();
169
String AccessibilityMediaControl::accessibilityDescription() const
171
return localizedMediaControlElementString(controlTypeName());
174
String AccessibilityMediaControl::helpText() const
176
return localizedMediaControlElementHelpText(controlTypeName());
179
bool AccessibilityMediaControl::accessibilityIsIgnored() const
181
if (!m_renderer || !m_renderer->style() || m_renderer->style()->visibility() != VISIBLE || controlType() == MediaTimelineContainer)
187
AccessibilityRole AccessibilityMediaControl::roleValue() const
189
switch (controlType()) {
190
case MediaEnterFullscreenButton:
191
case MediaExitFullscreenButton:
192
case MediaMuteButton:
193
case MediaPlayButton:
194
case MediaSeekBackButton:
195
case MediaSeekForwardButton:
196
case MediaRewindButton:
197
case MediaReturnToRealtimeButton:
198
case MediaUnMuteButton:
199
case MediaPauseButton:
200
case MediaShowClosedCaptionsButton:
201
case MediaHideClosedCaptionsButton:
204
case MediaStatusDisplay:
205
return StaticTextRole;
207
case MediaTimelineContainer:
220
// AccessibilityMediaControlsContainer
222
AccessibilityMediaControlsContainer::AccessibilityMediaControlsContainer(RenderObject* renderer)
223
: AccessibilityMediaControl(renderer)
227
PassRefPtr<AccessibilityObject> AccessibilityMediaControlsContainer::create(RenderObject* renderer)
229
AccessibilityMediaControlsContainer* obj = new AccessibilityMediaControlsContainer(renderer);
231
return adoptRef(obj);
234
String AccessibilityMediaControlsContainer::accessibilityDescription() const
236
return localizedMediaControlElementString(elementTypeName());
239
String AccessibilityMediaControlsContainer::helpText() const
241
return localizedMediaControlElementHelpText(elementTypeName());
244
bool AccessibilityMediaControlsContainer::controllingVideoElement() const
246
if (!m_renderer->node())
249
MediaControlTimeDisplayElement* element = static_cast<MediaControlTimeDisplayElement*>(m_renderer->node());
251
return toParentMediaElement(element)->isVideo();
254
const String AccessibilityMediaControlsContainer::elementTypeName() const
256
DEFINE_STATIC_LOCAL(const String, videoElement, (ASCIILiteral("VideoElement")));
257
DEFINE_STATIC_LOCAL(const String, audioElement, (ASCIILiteral("AudioElement")));
259
if (controllingVideoElement())
266
// AccessibilityMediaTimeline
268
AccessibilityMediaTimeline::AccessibilityMediaTimeline(RenderObject* renderer)
269
: AccessibilitySlider(renderer)
273
PassRefPtr<AccessibilityObject> AccessibilityMediaTimeline::create(RenderObject* renderer)
275
AccessibilityMediaTimeline* obj = new AccessibilityMediaTimeline(renderer);
277
return adoptRef(obj);
280
String AccessibilityMediaTimeline::valueDescription() const
282
Node* node = m_renderer->node();
283
if (!node->hasTagName(inputTag))
286
float time = static_cast<HTMLInputElement*>(node)->value().toFloat();
287
return localizedMediaTimeDescription(time);
290
String AccessibilityMediaTimeline::helpText() const
292
DEFINE_STATIC_LOCAL(const String, slider, (ASCIILiteral("Slider")));
293
return localizedMediaControlElementHelpText(slider);
298
// AccessibilityMediaTimeDisplay
300
AccessibilityMediaTimeDisplay::AccessibilityMediaTimeDisplay(RenderObject* renderer)
301
: AccessibilityMediaControl(renderer)
305
PassRefPtr<AccessibilityObject> AccessibilityMediaTimeDisplay::create(RenderObject* renderer)
307
AccessibilityMediaTimeDisplay* obj = new AccessibilityMediaTimeDisplay(renderer);
309
return adoptRef(obj);
312
bool AccessibilityMediaTimeDisplay::accessibilityIsIgnored() const
314
if (!m_renderer || !m_renderer->style() || m_renderer->style()->visibility() != VISIBLE)
317
return !m_renderer->style()->width().value();
320
String AccessibilityMediaTimeDisplay::accessibilityDescription() const
322
DEFINE_STATIC_LOCAL(const String, currentTimeDisplay, (ASCIILiteral("CurrentTimeDisplay")));
323
DEFINE_STATIC_LOCAL(const String, timeRemainingDisplay, (ASCIILiteral("TimeRemainingDisplay")));
325
if (controlType() == MediaCurrentTimeDisplay)
326
return localizedMediaControlElementString(currentTimeDisplay);
328
return localizedMediaControlElementString(timeRemainingDisplay);
331
String AccessibilityMediaTimeDisplay::stringValue() const
333
if (!m_renderer || !m_renderer->node())
336
MediaControlTimeDisplayElement* element = static_cast<MediaControlTimeDisplayElement*>(m_renderer->node());
337
float time = element->currentValue();
338
return localizedMediaTimeDescription(fabsf(time));
341
} // namespace WebCore
343
#endif // ENABLE(VIDEO)