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