OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 11 matching lines...) Expand all Loading... |
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 */ | 29 */ |
30 | 30 |
31 #include "config.h" | 31 #include "config.h" |
| 32 #include "WebAccessibilityObject.h" |
| 33 |
32 #include "AccessibilityObject.h" | 34 #include "AccessibilityObject.h" |
33 #include "WebAccessibilityObject.h" | 35 #include "EventHandler.h" |
| 36 #include "FrameView.h" |
| 37 #include "PlatformKeyboardEvent.h" |
| 38 #include "WebPoint.h" |
| 39 #include "WebRect.h" |
34 #include "WebString.h" | 40 #include "WebString.h" |
35 | 41 |
36 using namespace WebCore; | 42 using namespace WebCore; |
37 | 43 |
38 namespace WebKit { | 44 namespace WebKit { |
39 | 45 |
40 class WebAccessibilityObjectPrivate : public WebCore::AccessibilityObject { | 46 class WebAccessibilityObjectPrivate : public WebCore::AccessibilityObject { |
41 }; | 47 }; |
42 | 48 |
43 void WebAccessibilityObject::reset() | 49 void WebAccessibilityObject::reset() |
(...skipping 11 matching lines...) Expand all Loading... |
55 | 61 |
56 WebString WebAccessibilityObject::accessibilityDescription() const | 62 WebString WebAccessibilityObject::accessibilityDescription() const |
57 { | 63 { |
58 if (!m_private) | 64 if (!m_private) |
59 return WebString(); | 65 return WebString(); |
60 | 66 |
61 m_private->updateBackingStore(); | 67 m_private->updateBackingStore(); |
62 return m_private->accessibilityDescription(); | 68 return m_private->accessibilityDescription(); |
63 } | 69 } |
64 | 70 |
| 71 WebString WebAccessibilityObject::actionVerb() const |
| 72 { |
| 73 if (!m_private) |
| 74 return WebString(); |
| 75 |
| 76 m_private->updateBackingStore(); |
| 77 return m_private->actionVerb(); |
| 78 } |
| 79 |
| 80 bool WebAccessibilityObject::canSetFocusAttribute() const |
| 81 { |
| 82 if (!m_private) |
| 83 return false; |
| 84 |
| 85 m_private->updateBackingStore(); |
| 86 return m_private->canSetFocusAttribute(); |
| 87 } |
| 88 |
| 89 unsigned WebAccessibilityObject::childCount() const |
| 90 { |
| 91 if (!m_private) |
| 92 return 0; |
| 93 |
| 94 m_private->updateBackingStore(); |
| 95 return m_private->children().size(); |
| 96 } |
| 97 |
65 WebAccessibilityObject WebAccessibilityObject::childAt(unsigned index) const | 98 WebAccessibilityObject WebAccessibilityObject::childAt(unsigned index) const |
66 { | 99 { |
67 if (!m_private) | 100 if (!m_private) |
68 return WebAccessibilityObject(); | 101 return WebAccessibilityObject(); |
69 | 102 |
70 m_private->updateBackingStore(); | 103 m_private->updateBackingStore(); |
71 if (m_private->children().size() <= index) | 104 if (m_private->children().size() <= index) |
72 return WebAccessibilityObject(); | 105 return WebAccessibilityObject(); |
73 | 106 |
74 return WebAccessibilityObject(m_private->children()[index]); | 107 return WebAccessibilityObject(m_private->children()[index]); |
75 } | 108 } |
76 | 109 |
77 unsigned WebAccessibilityObject::childCount() const | 110 WebAccessibilityObject WebAccessibilityObject::firstChild() const |
| 111 { |
| 112 if (!m_private) |
| 113 return WebAccessibilityObject(); |
| 114 |
| 115 m_private->updateBackingStore(); |
| 116 return WebAccessibilityObject(m_private->firstChild()); |
| 117 } |
| 118 |
| 119 WebAccessibilityObject WebAccessibilityObject::focusedChild() const |
| 120 { |
| 121 if (!m_private) |
| 122 return WebAccessibilityObject(); |
| 123 |
| 124 m_private->updateBackingStore(); |
| 125 RefPtr<AccessibilityObject> focused = m_private->focusedUIElement(); |
| 126 if (m_private == focused.get() || focused->parentObject() == m_private) |
| 127 return WebAccessibilityObject(focused); |
| 128 |
| 129 return WebAccessibilityObject(); |
| 130 } |
| 131 |
| 132 WebAccessibilityObject WebAccessibilityObject::lastChild() const |
| 133 { |
| 134 if (!m_private) |
| 135 return WebAccessibilityObject(); |
| 136 |
| 137 m_private->updateBackingStore(); |
| 138 return WebAccessibilityObject(m_private->lastChild()); |
| 139 } |
| 140 |
| 141 |
| 142 WebAccessibilityObject WebAccessibilityObject::nextSibling() const |
| 143 { |
| 144 if (!m_private) |
| 145 return WebAccessibilityObject(); |
| 146 |
| 147 m_private->updateBackingStore(); |
| 148 return WebAccessibilityObject(m_private->nextSibling()); |
| 149 } |
| 150 |
| 151 WebAccessibilityObject WebAccessibilityObject::parentObject() const |
| 152 { |
| 153 if (!m_private) |
| 154 return WebAccessibilityObject(); |
| 155 |
| 156 m_private->updateBackingStore(); |
| 157 return WebAccessibilityObject(m_private->parentObject()); |
| 158 } |
| 159 |
| 160 |
| 161 WebAccessibilityObject WebAccessibilityObject::previousSibling() const |
| 162 { |
| 163 if (!m_private) |
| 164 return WebAccessibilityObject(); |
| 165 |
| 166 m_private->updateBackingStore(); |
| 167 return WebAccessibilityObject(m_private->previousSibling()); |
| 168 } |
| 169 |
| 170 bool WebAccessibilityObject::isAnchor() const |
78 { | 171 { |
79 if (!m_private) | 172 if (!m_private) |
80 return 0; | 173 return 0; |
81 | 174 |
82 m_private->updateBackingStore(); | 175 m_private->updateBackingStore(); |
83 return m_private->children().size(); | 176 return m_private->isAnchor(); |
| 177 } |
| 178 |
| 179 bool WebAccessibilityObject::isChecked() const |
| 180 { |
| 181 if (!m_private) |
| 182 return 0; |
| 183 |
| 184 m_private->updateBackingStore(); |
| 185 return m_private->isChecked(); |
| 186 } |
| 187 |
| 188 |
| 189 bool WebAccessibilityObject::isFocused() const |
| 190 { |
| 191 if (!m_private) |
| 192 return 0; |
| 193 |
| 194 m_private->updateBackingStore(); |
| 195 return m_private->isFocused(); |
84 } | 196 } |
85 | 197 |
86 bool WebAccessibilityObject::isEnabled() const | 198 bool WebAccessibilityObject::isEnabled() const |
87 { | 199 { |
88 if (!m_private) | 200 if (!m_private) |
89 return 0; | 201 return 0; |
90 | 202 |
91 m_private->updateBackingStore(); | 203 m_private->updateBackingStore(); |
92 return m_private->isEnabled(); | 204 return m_private->isEnabled(); |
93 } | 205 } |
94 | 206 |
| 207 bool WebAccessibilityObject::isHovered() const |
| 208 { |
| 209 if (!m_private) |
| 210 return 0; |
| 211 |
| 212 m_private->updateBackingStore(); |
| 213 return m_private->isHovered(); |
| 214 } |
| 215 |
| 216 bool WebAccessibilityObject::isIndeterminate() const |
| 217 { |
| 218 if (!m_private) |
| 219 return 0; |
| 220 |
| 221 m_private->updateBackingStore(); |
| 222 return m_private->isIndeterminate(); |
| 223 } |
| 224 |
| 225 bool WebAccessibilityObject::isMultiSelect() const |
| 226 { |
| 227 if (!m_private) |
| 228 return 0; |
| 229 |
| 230 m_private->updateBackingStore(); |
| 231 return m_private->isMultiSelect(); |
| 232 } |
| 233 |
| 234 bool WebAccessibilityObject::isOffScreen() const |
| 235 { |
| 236 if (!m_private) |
| 237 return 0; |
| 238 |
| 239 m_private->updateBackingStore(); |
| 240 return m_private->isOffScreen(); |
| 241 } |
| 242 |
| 243 bool WebAccessibilityObject::isPasswordField() const |
| 244 { |
| 245 if (!m_private) |
| 246 return 0; |
| 247 |
| 248 m_private->updateBackingStore(); |
| 249 return m_private->isPasswordField(); |
| 250 } |
| 251 |
| 252 bool WebAccessibilityObject::isPressed() const |
| 253 { |
| 254 if (!m_private) |
| 255 return 0; |
| 256 |
| 257 m_private->updateBackingStore(); |
| 258 return m_private->isPressed(); |
| 259 } |
| 260 |
| 261 bool WebAccessibilityObject::isReadOnly() const |
| 262 { |
| 263 if (!m_private) |
| 264 return 0; |
| 265 |
| 266 m_private->updateBackingStore(); |
| 267 return m_private->isReadOnly(); |
| 268 } |
| 269 |
| 270 bool WebAccessibilityObject::isVisited() const |
| 271 { |
| 272 if (!m_private) |
| 273 return 0; |
| 274 |
| 275 m_private->updateBackingStore(); |
| 276 return m_private->isVisited(); |
| 277 } |
| 278 |
| 279 WebRect WebAccessibilityObject::boundingBoxRect() const |
| 280 { |
| 281 if (!m_private) |
| 282 return WebRect(); |
| 283 |
| 284 m_private->updateBackingStore(); |
| 285 return m_private->documentFrameView()->contentsToWindow(m_private->boundingBoxRect()); |
| 286 } |
| 287 |
| 288 WebString WebAccessibilityObject::helpText() const |
| 289 { |
| 290 if (!m_private) |
| 291 return WebString(); |
| 292 |
| 293 m_private->updateBackingStore(); |
| 294 return m_private->helpText(); |
| 295 } |
| 296 |
| 297 WebAccessibilityObject WebAccessibilityObject::hitTest(const WebPoint& point) const |
| 298 { |
| 299 if (!m_private) |
| 300 return WebAccessibilityObject(); |
| 301 |
| 302 m_private->updateBackingStore(); |
| 303 IntPoint contentsPoint = m_private->documentFrameView()->windowToContents(point); |
| 304 RefPtr<AccessibilityObject> hit = m_private->doAccessibilityHitTest(contentsPoint); |
| 305 |
| 306 if (hit.get()) |
| 307 return WebAccessibilityObject(hit); |
| 308 |
| 309 if (m_private->boundingBoxRect().contains(contentsPoint)) |
| 310 return *this; |
| 311 |
| 312 return WebAccessibilityObject(); |
| 313 } |
| 314 |
| 315 WebString WebAccessibilityObject::keyboardShortcut() const |
| 316 { |
| 317 if (!m_private) |
| 318 return WebString(); |
| 319 |
| 320 m_private->updateBackingStore(); |
| 321 String accessKey = m_private->accessKey(); |
| 322 if (accessKey.isNull()) |
| 323 return WebString(); |
| 324 |
| 325 static String modifierString; |
| 326 if (modifierString.isNull()) { |
| 327 unsigned modifiers = EventHandler::accessKeyModifiers(); |
| 328 // Follow the same order as Mozilla MSAA implementation: |
| 329 // Ctrl+Alt+Shift+Meta+key. MSDN states that keyboard shortcut strings |
| 330 // should not be localized and defines the separator as "+". |
| 331 if (modifiers & PlatformKeyboardEvent::CtrlKey) |
| 332 modifierString += "Ctrl+"; |
| 333 if (modifiers & PlatformKeyboardEvent::AltKey) |
| 334 modifierString += "Alt+"; |
| 335 if (modifiers & PlatformKeyboardEvent::ShiftKey) |
| 336 modifierString += "Shift+"; |
| 337 if (modifiers & PlatformKeyboardEvent::MetaKey) |
| 338 modifierString += "Win+"; |
| 339 } |
| 340 |
| 341 return modifierString + accessKey; |
| 342 } |
| 343 |
| 344 bool WebAccessibilityObject::performDefaultAction() const |
| 345 { |
| 346 if (!m_private) |
| 347 return false; |
| 348 |
| 349 m_private->updateBackingStore(); |
| 350 return m_private->performDefaultAction(); |
| 351 } |
| 352 |
95 WebAccessibilityRole WebAccessibilityObject::roleValue() const | 353 WebAccessibilityRole WebAccessibilityObject::roleValue() const |
96 { | 354 { |
| 355 if (!m_private) |
| 356 return WebKit::WebAccessibilityRoleUnknown; |
| 357 |
97 m_private->updateBackingStore(); | 358 m_private->updateBackingStore(); |
98 return static_cast<WebAccessibilityRole>(m_private->roleValue()); | 359 return static_cast<WebAccessibilityRole>(m_private->roleValue()); |
99 } | 360 } |
100 | 361 |
| 362 WebString WebAccessibilityObject::stringValue() const |
| 363 { |
| 364 if (!m_private) |
| 365 return WebString(); |
| 366 |
| 367 m_private->updateBackingStore(); |
| 368 return m_private->stringValue(); |
| 369 } |
| 370 |
101 WebString WebAccessibilityObject::title() const | 371 WebString WebAccessibilityObject::title() const |
102 { | 372 { |
103 if (!m_private) | 373 if (!m_private) |
104 return WebString(); | 374 return WebString(); |
105 | 375 |
106 m_private->updateBackingStore(); | 376 m_private->updateBackingStore(); |
107 return m_private->title(); | 377 return m_private->title(); |
108 } | 378 } |
109 | 379 |
110 WebAccessibilityObject::WebAccessibilityObject(const WTF::PassRefPtr<WebCore::AccessibilityObject>& object) | 380 WebAccessibilityObject::WebAccessibilityObject(const WTF::PassRefPtr<WebCore::AccessibilityObject>& object) |
(...skipping 14 matching lines...) Expand all Loading... |
125 | 395 |
126 void WebAccessibilityObject::assign(WebAccessibilityObjectPrivate* p) | 396 void WebAccessibilityObject::assign(WebAccessibilityObjectPrivate* p) |
127 { | 397 { |
128 // p is already ref'd for us by the caller | 398 // p is already ref'd for us by the caller |
129 if (m_private) | 399 if (m_private) |
130 m_private->deref(); | 400 m_private->deref(); |
131 m_private = p; | 401 m_private = p; |
132 } | 402 } |
133 | 403 |
134 } // namespace WebKit | 404 } // namespace WebKit |
OLD | NEW |