1231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block/*
2231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) 2009 Apple Inc. All rights reserved.
3231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *
4231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Redistribution and use in source and binary forms, with or without
5231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * modification, are permitted provided that the following conditions
6231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * are met:
7231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *
8231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * 1.  Redistributions of source code must retain the above copyright
9231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *     notice, this list of conditions and the following disclaimer.
10231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * 2.  Redistributions in binary form must reproduce the above copyright
11231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *     notice, this list of conditions and the following disclaimer in the
12231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *     documentation and/or other materials provided with the distribution.
13231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *     its contributors may be used to endorse or promote products derived
15231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *     from this software without specific prior written permission.
16231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *
17231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block */
28231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
29231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
30231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "config.h"
31231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
32231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(VIDEO)
33231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
34231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "AccessibilityMediaControls.h"
35231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
36231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "AXObjectCache.h"
37231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "HTMLInputElement.h"
38231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "HTMLNames.h"
39231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "LocalizedStrings.h"
40231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "MediaControlElements.h"
41231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "RenderObject.h"
42231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "RenderSlider.h"
43231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
44231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blocknamespace WebCore {
45231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
46231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockusing namespace HTMLNames;
47231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
48231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
49231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockAccessibilityMediaControl::AccessibilityMediaControl(RenderObject* renderer)
50231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    : AccessibilityRenderObject(renderer)
51231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
52231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
53231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
54231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockPassRefPtr<AccessibilityObject> AccessibilityMediaControl::create(RenderObject* renderer)
55231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
56231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(renderer->node() && renderer->node()->isMediaControlElement());
57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
58231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Node* node = renderer->node();
59231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    MediaControlElementType controlType;
60231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
61231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (node->hasTagName(inputTag))
62231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        controlType = static_cast<MediaControlInputElement*>(node)->displayType();
63231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    else
64231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        controlType = static_cast<MediaControlElement*>(node)->displayType();
65231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
66231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    PassRefPtr<AccessibilityObject> obj;
67231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    switch (controlType) {
68231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaSlider:
69231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        obj = AccessibilityMediaTimeline::create(renderer);
70231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
71231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
72231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaCurrentTimeDisplay:
73231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaTimeRemainingDisplay:
74231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        obj = AccessibilityMediaTimeDisplay::create(renderer);
75231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
76231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
77231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaControlsPanel:
78231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        obj = AccessibilityMediaControlsContainer::create(renderer);
79231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
80231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
81231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    default:
82231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        obj = adoptRef(new AccessibilityMediaControl(renderer));
83231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
84231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
85231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
86231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return obj;
87231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
88231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
89231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockMediaControlElementType AccessibilityMediaControl::controlType() const
90231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
91231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!renderer() || !renderer()->node())
92231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return MediaTimelineContainer;  // Timeline container is not accessible.
93231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
94231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Node* node = renderer()->node();
95231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
96231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (node->hasTagName(inputTag))
97231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return static_cast<MediaControlInputElement*>(node)->displayType();
98231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
99231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return static_cast<MediaControlElement*>(node)->displayType();
100231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
101231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
102231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockString AccessibilityMediaControl::controlTypeName() const
103231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
104231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(const String, mediaFullscreenButtonName, ("FullscreenButton"));
105231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(const String, mediaMuteButtonName, ("MuteButton"));
106231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(const String, mediaPlayButtonName, ("PlayButton"));
107231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(const String, mediaSeekBackButtonName, ("SeekBackButton"));
108231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(const String, mediaSeekForwardButtonName, ("SeekForwardButton"));
109231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(const String, mediaRewindButtonName, ("RewindButton"));
110231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(const String, mediaReturnToRealtimeButtonName, ("ReturnToRealtimeButton"));
111231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(const String, mediaUnMuteButtonName, ("UnMuteButton"));
112231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(const String, mediaPauseButtonName, ("PauseButton"));
113231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(const String, mediaStatusDisplayName, ("StatusDisplay"));
114231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(const String, mediaCurrentTimeDisplay, ("CurrentTimeDisplay"));
115231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(const String, mediaTimeRemainingDisplay, ("TimeRemainingDisplay"));
116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    DEFINE_STATIC_LOCAL(const String, mediaShowClosedCaptionsButtonName, ("ShowClosedCaptionsButton"));
117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    DEFINE_STATIC_LOCAL(const String, mediaHideClosedCaptionsButtonName, ("HideClosedCaptionsButton"));
118231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
119231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    switch (controlType()) {
120231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaFullscreenButton:
121231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return mediaFullscreenButtonName;
122231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaMuteButton:
123231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return mediaMuteButtonName;
124231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaPlayButton:
125231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return mediaPlayButtonName;
126231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaSeekBackButton:
127231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return mediaSeekBackButtonName;
128231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaSeekForwardButton:
129231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return mediaSeekForwardButtonName;
130231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaRewindButton:
131231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return mediaRewindButtonName;
132231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaReturnToRealtimeButton:
133231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return mediaReturnToRealtimeButtonName;
134231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaUnMuteButton:
135231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return mediaUnMuteButtonName;
136231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaPauseButton:
137231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return mediaPauseButtonName;
138231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaStatusDisplay:
139231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return mediaStatusDisplayName;
140231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaCurrentTimeDisplay:
141231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return mediaCurrentTimeDisplay;
142231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaTimeRemainingDisplay:
143231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return mediaTimeRemainingDisplay;
144643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case MediaShowClosedCaptionsButton:
145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return mediaShowClosedCaptionsButtonName;
146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case MediaHideClosedCaptionsButton:
147643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return mediaHideClosedCaptionsButtonName;
148231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
149231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    default:
150231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
151231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
152231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
153231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return String();
154231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
155231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
156231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockString AccessibilityMediaControl::title() const
157231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
158231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(const String, controlsPanel, ("ControlsPanel"));
159231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
160231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (controlType() == MediaControlsPanel)
161231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return localizedMediaControlElementString(controlsPanel);
162231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
163231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return AccessibilityRenderObject::title();
164231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
165231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
166231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockString AccessibilityMediaControl::accessibilityDescription() const
167231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
168231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return localizedMediaControlElementString(controlTypeName());
169231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
170231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
171231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockString AccessibilityMediaControl::helpText() const
172231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
173231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return localizedMediaControlElementHelpText(controlTypeName());
174231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
175231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
176231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool AccessibilityMediaControl::accessibilityIsIgnored() const
177231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
178231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!m_renderer || !m_renderer->style() || m_renderer->style()->visibility() != VISIBLE || controlType() == MediaTimelineContainer)
179231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return true;
180231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
181231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return false;
182231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
183231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
184231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockAccessibilityRole AccessibilityMediaControl::roleValue() const
185231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
186231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    switch (controlType()) {
187231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaFullscreenButton:
188231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaMuteButton:
189231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaPlayButton:
190231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaSeekBackButton:
191231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaSeekForwardButton:
192231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaRewindButton:
193231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaReturnToRealtimeButton:
194231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaUnMuteButton:
195231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaPauseButton:
196643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case MediaShowClosedCaptionsButton:
197643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case MediaHideClosedCaptionsButton:
198231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return ButtonRole;
199231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
200231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaStatusDisplay:
201231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return StaticTextRole;
202231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
203231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    case MediaTimelineContainer:
204231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return GroupRole;
205231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
206231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    default:
207231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        break;
208231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
209231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
210231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return UnknownRole;
211231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
212231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
213231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
214231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
215231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block//
216231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block// AccessibilityMediaControlsContainer
217231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
218231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockAccessibilityMediaControlsContainer::AccessibilityMediaControlsContainer(RenderObject* renderer)
219231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    : AccessibilityMediaControl(renderer)
220231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
221231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
222231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
223231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockPassRefPtr<AccessibilityObject> AccessibilityMediaControlsContainer::create(RenderObject* renderer)
224231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
225231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return adoptRef(new AccessibilityMediaControlsContainer(renderer));
226231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
227231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
228231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockString AccessibilityMediaControlsContainer::accessibilityDescription() const
229231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
230231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return localizedMediaControlElementString(elementTypeName());
231231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
232231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
233231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockString AccessibilityMediaControlsContainer::helpText() const
234231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
235231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return localizedMediaControlElementHelpText(elementTypeName());
236231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
237231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
238231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool AccessibilityMediaControlsContainer::controllingVideoElement() const
239231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
240231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!m_renderer->node())
241231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return true;
242231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
243231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    MediaControlTimeDisplayElement* element = static_cast<MediaControlTimeDisplayElement*>(m_renderer->node());
244231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
245231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return element->mediaElement()->isVideo();
246231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
247231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
248231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockconst String AccessibilityMediaControlsContainer::elementTypeName() const
249231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
250231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(const String, videoElement, ("VideoElement"));
251231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(const String, audioElement, ("AudioElement"));
252231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
253231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (controllingVideoElement())
254231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return videoElement;
255231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return audioElement;
256231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
257231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
258231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
259231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block//
260231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block// AccessibilityMediaTimeline
261231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
262231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockAccessibilityMediaTimeline::AccessibilityMediaTimeline(RenderObject* renderer)
263231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    : AccessibilitySlider(renderer)
264231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
265231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
266231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
267231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockPassRefPtr<AccessibilityObject> AccessibilityMediaTimeline::create(RenderObject* renderer)
268231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
269231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return adoptRef(new AccessibilityMediaTimeline(renderer));
270231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
271231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
272231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockString AccessibilityMediaTimeline::valueDescription() const
273231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
274231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    ASSERT(m_renderer->node()->hasTagName(inputTag));
275231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
276231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    float time = static_cast<HTMLInputElement*>(m_renderer->node())->value().toFloat();
277231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return localizedMediaTimeDescription(time);
278231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
279231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
280231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockString AccessibilityMediaTimeline::helpText() const
281231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
282231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(const String, slider, ("Slider"));
283231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return localizedMediaControlElementHelpText(slider);
284231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
285231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
286231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
287231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block//
288231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block// AccessibilityMediaTimeDisplay
289231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
290231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockAccessibilityMediaTimeDisplay::AccessibilityMediaTimeDisplay(RenderObject* renderer)
291231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    : AccessibilityMediaControl(renderer)
292231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
293231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
294231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
295231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockPassRefPtr<AccessibilityObject> AccessibilityMediaTimeDisplay::create(RenderObject* renderer)
296231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
297231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return adoptRef(new AccessibilityMediaTimeDisplay(renderer));
298231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
299231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
300231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool AccessibilityMediaTimeDisplay::accessibilityIsIgnored() const
301231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
302231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!m_renderer || !m_renderer->style() || m_renderer->style()->visibility() != VISIBLE)
303231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return true;
304231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
305231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return !m_renderer->style()->width().value();
306231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
307231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
308231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockString AccessibilityMediaTimeDisplay::accessibilityDescription() const
309231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
310231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(const String, currentTimeDisplay, ("CurrentTimeDisplay"));
311231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    DEFINE_STATIC_LOCAL(const String, timeRemainingDisplay, ("TimeRemainingDisplay"));
312231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
313231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (controlType() == MediaCurrentTimeDisplay)
314231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return localizedMediaControlElementString(currentTimeDisplay);
315231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
316231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return localizedMediaControlElementString(timeRemainingDisplay);
317231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
318231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
319231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockString AccessibilityMediaTimeDisplay::stringValue() const
320231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
321231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!m_renderer || !m_renderer->node())
322231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return String();
323231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
324231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    MediaControlTimeDisplayElement* element = static_cast<MediaControlTimeDisplayElement*>(m_renderer->node());
325231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    float time = element->currentValue();
326231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return localizedMediaTimeDescription(fabsf(time));
327231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
328231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
329231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} // namespace WebCore
330231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
331231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif // ENABLE(VIDEO)
332