OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (C) 2009 Google 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 are | |
6 * met: | |
7 * | |
8 * * Redistributions of source code must retain the above copyright | |
9 * notice, this list of conditions and the following disclaimer. | |
10 * * Redistributions in binary form must reproduce the above | |
11 * copyright notice, this list of conditions and the following disclaimer | |
12 * in the documentation and/or other materials provided with the | |
13 * distribution. | |
14 * * Neither the name of Google Inc. nor the names of its | |
15 * contributors may be used to endorse or promote products derived from | |
16 * this software without specific prior written permission. | |
17 * | |
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
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. | |
29 */ | |
30 | |
31 #include "config.h" | |
32 #include "WebAccessibilityObject.h" | |
33 | |
34 #include "AccessibilityObject.h" | |
35 #include "EventHandler.h" | |
36 #include "FrameView.h" | |
37 #include "PlatformKeyboardEvent.h" | |
38 #include "WebPoint.h" | |
39 #include "WebRect.h" | |
40 #include "WebString.h" | |
41 | |
42 using namespace WebCore; | |
43 | |
44 namespace WebKit { | |
45 | |
46 class WebAccessibilityObjectPrivate : public WebCore::AccessibilityObject { | |
47 }; | |
48 | |
49 void WebAccessibilityObject::reset() | |
50 { | |
51 assign(0); | |
52 } | |
53 | |
54 void WebAccessibilityObject::assign(const WebKit::WebAccessibilityObject& other) | |
55 { | |
56 WebAccessibilityObjectPrivate* p = const_cast<WebAccessibilityObjectPrivate*>(other.m_private); | |
57 if (p) | |
58 p->ref(); | |
59 assign(p); | |
60 } | |
61 | |
62 WebString WebAccessibilityObject::accessibilityDescription() const | |
63 { | |
64 if (!m_private) | |
65 return WebString(); | |
66 | |
67 m_private->updateBackingStore(); | |
68 return m_private->accessibilityDescription(); | |
69 } | |
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 | |
98 WebAccessibilityObject WebAccessibilityObject::childAt(unsigned index) const | |
99 { | |
100 if (!m_private) | |
101 return WebAccessibilityObject(); | |
102 | |
103 m_private->updateBackingStore(); | |
104 if (m_private->children().size() <= index) | |
105 return WebAccessibilityObject(); | |
106 | |
107 return WebAccessibilityObject(m_private->children()[index]); | |
108 } | |
109 | |
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 | |
171 { | |
172 if (!m_private) | |
173 return 0; | |
174 | |
175 m_private->updateBackingStore(); | |
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(); | |
196 } | |
197 | |
198 bool WebAccessibilityObject::isEnabled() const | |
199 { | |
200 if (!m_private) | |
201 return 0; | |
202 | |
203 m_private->updateBackingStore(); | |
204 return m_private->isEnabled(); | |
205 } | |
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 | |
353 WebAccessibilityRole WebAccessibilityObject::roleValue() const | |
354 { | |
355 if (!m_private) | |
356 return WebKit::WebAccessibilityRoleUnknown; | |
357 | |
358 m_private->updateBackingStore(); | |
359 return static_cast<WebAccessibilityRole>(m_private->roleValue()); | |
360 } | |
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 | |
371 WebString WebAccessibilityObject::title() const | |
372 { | |
373 if (!m_private) | |
374 return WebString(); | |
375 | |
376 m_private->updateBackingStore(); | |
377 return m_private->title(); | |
378 } | |
379 | |
380 WebAccessibilityObject::WebAccessibilityObject(const WTF::PassRefPtr<WebCore::AccessibilityObject>& object) | |
381 : m_private(static_cast<WebAccessibilityObjectPrivate*>(object.releaseRef())) | |
382 { | |
383 } | |
384 | |
385 WebAccessibilityObject& WebAccessibilityObject::operator=(const WTF::PassRefPtr<WebCore::AccessibilityObject>& object) | |
386 { | |
387 assign(static_cast<WebAccessibilityObjectPrivate*>(object.releaseRef())); | |
388 return *this; | |
389 } | |
390 | |
391 WebAccessibilityObject::operator WTF::PassRefPtr<WebCore::AccessibilityObject>() const | |
392 { | |
393 return PassRefPtr<WebCore::AccessibilityObject>(const_cast<WebAccessibilityObjectPrivate*>(m_private)); | |
394 } | |
395 | |
396 void WebAccessibilityObject::assign(WebAccessibilityObjectPrivate* p) | |
397 { | |
398 // p is already ref'd for us by the caller | |
399 if (m_private) | |
400 m_private->deref(); | |
401 m_private = p; | |
402 } | |
403 | |
404 } // namespace WebKit | |
OLD | NEW |