1 /* 2 * Copyright (C) 2009 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 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. 16 * 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. 27 */ 28 29 30 #include "config.h" 31 32 #if ENABLE(VIDEO) 33 34 #include "AccessibilityMediaControls.h" 35 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" 43 44 namespace WebCore { 45 46 using namespace HTMLNames; 47 48 49 AccessibilityMediaControl::AccessibilityMediaControl(RenderObject* renderer) 50 : AccessibilityRenderObject(renderer) 51 { 52 } 53 54 PassRefPtr<AccessibilityObject> AccessibilityMediaControl::create(RenderObject* renderer) 55 { 56 ASSERT(renderer->node() && renderer->node()->isMediaControlElement()); 57 58 Node* node = renderer->node(); 59 MediaControlElementType controlType; 60 61 if (node->hasTagName(inputTag)) 62 controlType = static_cast<MediaControlInputElement*>(node)->displayType(); 63 else 64 controlType = static_cast<MediaControlElement*>(node)->displayType(); 65 66 PassRefPtr<AccessibilityObject> obj; 67 switch (controlType) { 68 case MediaSlider: 69 obj = AccessibilityMediaTimeline::create(renderer); 70 break; 71 72 case MediaCurrentTimeDisplay: 73 case MediaTimeRemainingDisplay: 74 obj = AccessibilityMediaTimeDisplay::create(renderer); 75 break; 76 77 case MediaControlsPanel: 78 obj = AccessibilityMediaControlsContainer::create(renderer); 79 break; 80 81 default: 82 obj = adoptRef(new AccessibilityMediaControl(renderer)); 83 break; 84 } 85 86 return obj; 87 } 88 89 MediaControlElementType AccessibilityMediaControl::controlType() const 90 { 91 if (!renderer() || !renderer()->node()) 92 return MediaTimelineContainer; // Timeline container is not accessible. 93 94 Node* node = renderer()->node(); 95 96 if (node->hasTagName(inputTag)) 97 return static_cast<MediaControlInputElement*>(node)->displayType(); 98 99 return static_cast<MediaControlElement*>(node)->displayType(); 100 } 101 102 String AccessibilityMediaControl::controlTypeName() const 103 { 104 DEFINE_STATIC_LOCAL(const String, mediaFullscreenButtonName, ("FullscreenButton")); 105 DEFINE_STATIC_LOCAL(const String, mediaMuteButtonName, ("MuteButton")); 106 DEFINE_STATIC_LOCAL(const String, mediaPlayButtonName, ("PlayButton")); 107 DEFINE_STATIC_LOCAL(const String, mediaSeekBackButtonName, ("SeekBackButton")); 108 DEFINE_STATIC_LOCAL(const String, mediaSeekForwardButtonName, ("SeekForwardButton")); 109 DEFINE_STATIC_LOCAL(const String, mediaRewindButtonName, ("RewindButton")); 110 DEFINE_STATIC_LOCAL(const String, mediaReturnToRealtimeButtonName, ("ReturnToRealtimeButton")); 111 DEFINE_STATIC_LOCAL(const String, mediaUnMuteButtonName, ("UnMuteButton")); 112 DEFINE_STATIC_LOCAL(const String, mediaPauseButtonName, ("PauseButton")); 113 DEFINE_STATIC_LOCAL(const String, mediaStatusDisplayName, ("StatusDisplay")); 114 DEFINE_STATIC_LOCAL(const String, mediaCurrentTimeDisplay, ("CurrentTimeDisplay")); 115 DEFINE_STATIC_LOCAL(const String, mediaTimeRemainingDisplay, ("TimeRemainingDisplay")); 116 DEFINE_STATIC_LOCAL(const String, mediaShowClosedCaptionsButtonName, ("ShowClosedCaptionsButton")); 117 DEFINE_STATIC_LOCAL(const String, mediaHideClosedCaptionsButtonName, ("HideClosedCaptionsButton")); 118 119 switch (controlType()) { 120 case MediaFullscreenButton: 121 return mediaFullscreenButtonName; 122 case MediaMuteButton: 123 return mediaMuteButtonName; 124 case MediaPlayButton: 125 return mediaPlayButtonName; 126 case MediaSeekBackButton: 127 return mediaSeekBackButtonName; 128 case MediaSeekForwardButton: 129 return mediaSeekForwardButtonName; 130 case MediaRewindButton: 131 return mediaRewindButtonName; 132 case MediaReturnToRealtimeButton: 133 return mediaReturnToRealtimeButtonName; 134 case MediaUnMuteButton: 135 return mediaUnMuteButtonName; 136 case MediaPauseButton: 137 return mediaPauseButtonName; 138 case MediaStatusDisplay: 139 return mediaStatusDisplayName; 140 case MediaCurrentTimeDisplay: 141 return mediaCurrentTimeDisplay; 142 case MediaTimeRemainingDisplay: 143 return mediaTimeRemainingDisplay; 144 case MediaShowClosedCaptionsButton: 145 return mediaShowClosedCaptionsButtonName; 146 case MediaHideClosedCaptionsButton: 147 return mediaHideClosedCaptionsButtonName; 148 149 default: 150 break; 151 } 152 153 return String(); 154 } 155 156 String AccessibilityMediaControl::title() const 157 { 158 DEFINE_STATIC_LOCAL(const String, controlsPanel, ("ControlsPanel")); 159 160 if (controlType() == MediaControlsPanel) 161 return localizedMediaControlElementString(controlsPanel); 162 163 return AccessibilityRenderObject::title(); 164 } 165 166 String AccessibilityMediaControl::accessibilityDescription() const 167 { 168 return localizedMediaControlElementString(controlTypeName()); 169 } 170 171 String AccessibilityMediaControl::helpText() const 172 { 173 return localizedMediaControlElementHelpText(controlTypeName()); 174 } 175 176 bool AccessibilityMediaControl::accessibilityIsIgnored() const 177 { 178 if (!m_renderer || !m_renderer->style() || m_renderer->style()->visibility() != VISIBLE || controlType() == MediaTimelineContainer) 179 return true; 180 181 return false; 182 } 183 184 AccessibilityRole AccessibilityMediaControl::roleValue() const 185 { 186 switch (controlType()) { 187 case MediaFullscreenButton: 188 case MediaMuteButton: 189 case MediaPlayButton: 190 case MediaSeekBackButton: 191 case MediaSeekForwardButton: 192 case MediaRewindButton: 193 case MediaReturnToRealtimeButton: 194 case MediaUnMuteButton: 195 case MediaPauseButton: 196 case MediaShowClosedCaptionsButton: 197 case MediaHideClosedCaptionsButton: 198 return ButtonRole; 199 200 case MediaStatusDisplay: 201 return StaticTextRole; 202 203 case MediaTimelineContainer: 204 return GroupRole; 205 206 default: 207 break; 208 } 209 210 return UnknownRole; 211 } 212 213 214 215 // 216 // AccessibilityMediaControlsContainer 217 218 AccessibilityMediaControlsContainer::AccessibilityMediaControlsContainer(RenderObject* renderer) 219 : AccessibilityMediaControl(renderer) 220 { 221 } 222 223 PassRefPtr<AccessibilityObject> AccessibilityMediaControlsContainer::create(RenderObject* renderer) 224 { 225 return adoptRef(new AccessibilityMediaControlsContainer(renderer)); 226 } 227 228 String AccessibilityMediaControlsContainer::accessibilityDescription() const 229 { 230 return localizedMediaControlElementString(elementTypeName()); 231 } 232 233 String AccessibilityMediaControlsContainer::helpText() const 234 { 235 return localizedMediaControlElementHelpText(elementTypeName()); 236 } 237 238 bool AccessibilityMediaControlsContainer::controllingVideoElement() const 239 { 240 if (!m_renderer->node()) 241 return true; 242 243 MediaControlTimeDisplayElement* element = static_cast<MediaControlTimeDisplayElement*>(m_renderer->node()); 244 245 return element->mediaElement()->isVideo(); 246 } 247 248 const String AccessibilityMediaControlsContainer::elementTypeName() const 249 { 250 DEFINE_STATIC_LOCAL(const String, videoElement, ("VideoElement")); 251 DEFINE_STATIC_LOCAL(const String, audioElement, ("AudioElement")); 252 253 if (controllingVideoElement()) 254 return videoElement; 255 return audioElement; 256 } 257 258 259 // 260 // AccessibilityMediaTimeline 261 262 AccessibilityMediaTimeline::AccessibilityMediaTimeline(RenderObject* renderer) 263 : AccessibilitySlider(renderer) 264 { 265 } 266 267 PassRefPtr<AccessibilityObject> AccessibilityMediaTimeline::create(RenderObject* renderer) 268 { 269 return adoptRef(new AccessibilityMediaTimeline(renderer)); 270 } 271 272 String AccessibilityMediaTimeline::valueDescription() const 273 { 274 ASSERT(m_renderer->node()->hasTagName(inputTag)); 275 276 float time = static_cast<HTMLInputElement*>(m_renderer->node())->value().toFloat(); 277 return localizedMediaTimeDescription(time); 278 } 279 280 String AccessibilityMediaTimeline::helpText() const 281 { 282 DEFINE_STATIC_LOCAL(const String, slider, ("Slider")); 283 return localizedMediaControlElementHelpText(slider); 284 } 285 286 287 // 288 // AccessibilityMediaTimeDisplay 289 290 AccessibilityMediaTimeDisplay::AccessibilityMediaTimeDisplay(RenderObject* renderer) 291 : AccessibilityMediaControl(renderer) 292 { 293 } 294 295 PassRefPtr<AccessibilityObject> AccessibilityMediaTimeDisplay::create(RenderObject* renderer) 296 { 297 return adoptRef(new AccessibilityMediaTimeDisplay(renderer)); 298 } 299 300 bool AccessibilityMediaTimeDisplay::accessibilityIsIgnored() const 301 { 302 if (!m_renderer || !m_renderer->style() || m_renderer->style()->visibility() != VISIBLE) 303 return true; 304 305 return !m_renderer->style()->width().value(); 306 } 307 308 String AccessibilityMediaTimeDisplay::accessibilityDescription() const 309 { 310 DEFINE_STATIC_LOCAL(const String, currentTimeDisplay, ("CurrentTimeDisplay")); 311 DEFINE_STATIC_LOCAL(const String, timeRemainingDisplay, ("TimeRemainingDisplay")); 312 313 if (controlType() == MediaCurrentTimeDisplay) 314 return localizedMediaControlElementString(currentTimeDisplay); 315 316 return localizedMediaControlElementString(timeRemainingDisplay); 317 } 318 319 String AccessibilityMediaTimeDisplay::stringValue() const 320 { 321 if (!m_renderer || !m_renderer->node()) 322 return String(); 323 324 MediaControlTimeDisplayElement* element = static_cast<MediaControlTimeDisplayElement*>(m_renderer->node()); 325 float time = element->currentValue(); 326 return localizedMediaTimeDescription(fabsf(time)); 327 } 328 329 } // namespace WebCore 330 331 #endif // ENABLE(VIDEO) 332