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 #include "core/accessibility/AccessibilityMediaControls.h" 33 34 #include "core/platform/LocalizedStrings.h" 35 36 namespace WebCore { 37 38 using namespace HTMLNames; 39 40 41 AccessibilityMediaControl::AccessibilityMediaControl(RenderObject* renderer) 42 : AccessibilityRenderObject(renderer) 43 { 44 } 45 46 PassRefPtr<AccessibilityObject> AccessibilityMediaControl::create(RenderObject* renderer) 47 { 48 ASSERT(renderer->node()); 49 50 switch (mediaControlElementType(renderer->node())) { 51 case MediaSlider: 52 return AccessibilityMediaTimeline::create(renderer); 53 54 case MediaCurrentTimeDisplay: 55 case MediaTimeRemainingDisplay: 56 return AccessibilityMediaTimeDisplay::create(renderer); 57 58 case MediaControlsPanel: 59 return AccessibilityMediaControlsContainer::create(renderer); 60 61 default: 62 return adoptRef(new AccessibilityMediaControl(renderer)); 63 } 64 } 65 66 MediaControlElementType AccessibilityMediaControl::controlType() const 67 { 68 if (!renderer() || !renderer()->node()) 69 return MediaTimelineContainer; // Timeline container is not accessible. 70 71 return mediaControlElementType(renderer()->node()); 72 } 73 74 String AccessibilityMediaControl::controlTypeName() const 75 { 76 switch (controlType()) { 77 case MediaEnterFullscreenButton: 78 return "EnterFullscreenButton"; 79 case MediaExitFullscreenButton: 80 return "ExitFullscreenButton"; 81 case MediaMuteButton: 82 return "MuteButton"; 83 case MediaPlayButton: 84 return "PlayButton"; 85 case MediaSeekBackButton: 86 return "SeekBackButton"; 87 case MediaSeekForwardButton: 88 return "SeekForwardButton"; 89 case MediaRewindButton: 90 return "RewindButton"; 91 case MediaReturnToRealtimeButton: 92 return "ReturnToRealtimeButton"; 93 case MediaUnMuteButton: 94 return "UnMuteButton"; 95 case MediaPauseButton: 96 return "PauseButton"; 97 case MediaStatusDisplay: 98 return "StatusDisplay"; 99 case MediaCurrentTimeDisplay: 100 return "CurrentTimeDisplay"; 101 case MediaTimeRemainingDisplay: 102 return "TimeRemainingDisplay"; 103 case MediaShowClosedCaptionsButton: 104 return "ShowClosedCaptionsButton"; 105 case MediaHideClosedCaptionsButton: 106 return "HideClosedCaptionsButton"; 107 108 default: 109 break; 110 } 111 112 return String(); 113 } 114 115 void AccessibilityMediaControl::accessibilityText(Vector<AccessibilityText>& textOrder) 116 { 117 String description = accessibilityDescription(); 118 if (!description.isEmpty()) 119 textOrder.append(AccessibilityText(description, AlternativeText)); 120 121 String title = this->title(); 122 if (!title.isEmpty()) 123 textOrder.append(AccessibilityText(title, AlternativeText)); 124 125 String helptext = helpText(); 126 if (!helptext.isEmpty()) 127 textOrder.append(AccessibilityText(helptext, HelpText)); 128 } 129 130 131 String AccessibilityMediaControl::title() const 132 { 133 if (controlType() == MediaControlsPanel) 134 return localizedMediaControlElementString("ControlsPanel"); 135 136 return AccessibilityRenderObject::title(); 137 } 138 139 String AccessibilityMediaControl::accessibilityDescription() const 140 { 141 return localizedMediaControlElementString(controlTypeName()); 142 } 143 144 String AccessibilityMediaControl::helpText() const 145 { 146 return localizedMediaControlElementHelpText(controlTypeName()); 147 } 148 149 bool AccessibilityMediaControl::computeAccessibilityIsIgnored() const 150 { 151 if (!m_renderer || !m_renderer->style() || m_renderer->style()->visibility() != VISIBLE || controlType() == MediaTimelineContainer) 152 return true; 153 154 return accessibilityIsIgnoredByDefault(); 155 } 156 157 AccessibilityRole AccessibilityMediaControl::roleValue() const 158 { 159 switch (controlType()) { 160 case MediaEnterFullscreenButton: 161 case MediaExitFullscreenButton: 162 case MediaMuteButton: 163 case MediaPlayButton: 164 case MediaSeekBackButton: 165 case MediaSeekForwardButton: 166 case MediaRewindButton: 167 case MediaReturnToRealtimeButton: 168 case MediaUnMuteButton: 169 case MediaPauseButton: 170 case MediaShowClosedCaptionsButton: 171 case MediaHideClosedCaptionsButton: 172 return ButtonRole; 173 174 case MediaStatusDisplay: 175 return StaticTextRole; 176 177 case MediaTimelineContainer: 178 return GroupRole; 179 180 default: 181 break; 182 } 183 184 return UnknownRole; 185 } 186 187 188 189 // 190 // AccessibilityMediaControlsContainer 191 192 AccessibilityMediaControlsContainer::AccessibilityMediaControlsContainer(RenderObject* renderer) 193 : AccessibilityMediaControl(renderer) 194 { 195 } 196 197 PassRefPtr<AccessibilityObject> AccessibilityMediaControlsContainer::create(RenderObject* renderer) 198 { 199 return adoptRef(new AccessibilityMediaControlsContainer(renderer)); 200 } 201 202 String AccessibilityMediaControlsContainer::accessibilityDescription() const 203 { 204 return localizedMediaControlElementString(elementTypeName()); 205 } 206 207 String AccessibilityMediaControlsContainer::helpText() const 208 { 209 return localizedMediaControlElementHelpText(elementTypeName()); 210 } 211 212 bool AccessibilityMediaControlsContainer::controllingVideoElement() const 213 { 214 if (!m_renderer->node()) 215 return true; 216 217 MediaControlTimeDisplayElement* element = static_cast<MediaControlTimeDisplayElement*>(m_renderer->node()); 218 219 return toParentMediaElement(element)->isVideo(); 220 } 221 222 const String AccessibilityMediaControlsContainer::elementTypeName() const 223 { 224 if (controllingVideoElement()) 225 return "VideoElement"; 226 return "AudioElement"; 227 } 228 229 bool AccessibilityMediaControlsContainer::computeAccessibilityIsIgnored() const 230 { 231 return accessibilityIsIgnoredByDefault(); 232 } 233 234 // 235 // AccessibilityMediaTimeline 236 237 AccessibilityMediaTimeline::AccessibilityMediaTimeline(RenderObject* renderer) 238 : AccessibilitySlider(renderer) 239 { 240 } 241 242 PassRefPtr<AccessibilityObject> AccessibilityMediaTimeline::create(RenderObject* renderer) 243 { 244 return adoptRef(new AccessibilityMediaTimeline(renderer)); 245 } 246 247 String AccessibilityMediaTimeline::valueDescription() const 248 { 249 Node* node = m_renderer->node(); 250 if (!node->hasTagName(inputTag)) 251 return String(); 252 253 return localizedMediaTimeDescription(toHTMLInputElement(node)->value().toFloat()); 254 } 255 256 String AccessibilityMediaTimeline::helpText() const 257 { 258 return localizedMediaControlElementHelpText("Slider"); 259 } 260 261 262 // 263 // AccessibilityMediaTimeDisplay 264 265 AccessibilityMediaTimeDisplay::AccessibilityMediaTimeDisplay(RenderObject* renderer) 266 : AccessibilityMediaControl(renderer) 267 { 268 } 269 270 PassRefPtr<AccessibilityObject> AccessibilityMediaTimeDisplay::create(RenderObject* renderer) 271 { 272 return adoptRef(new AccessibilityMediaTimeDisplay(renderer)); 273 } 274 275 bool AccessibilityMediaTimeDisplay::computeAccessibilityIsIgnored() const 276 { 277 if (!m_renderer || !m_renderer->style() || m_renderer->style()->visibility() != VISIBLE) 278 return true; 279 280 if (!m_renderer->style()->width().value()) 281 return true; 282 283 return accessibilityIsIgnoredByDefault(); 284 } 285 286 String AccessibilityMediaTimeDisplay::accessibilityDescription() const 287 { 288 if (controlType() == MediaCurrentTimeDisplay) 289 return localizedMediaControlElementString("CurrentTimeDisplay"); 290 291 return localizedMediaControlElementString("TimeRemainingDisplay"); 292 } 293 294 String AccessibilityMediaTimeDisplay::stringValue() const 295 { 296 if (!m_renderer || !m_renderer->node()) 297 return String(); 298 299 MediaControlTimeDisplayElement* element = static_cast<MediaControlTimeDisplayElement*>(m_renderer->node()); 300 float time = element->currentValue(); 301 return localizedMediaTimeDescription(fabsf(time)); 302 } 303 304 } // namespace WebCore 305