Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(66)

Side by Side Diff: content/shell/renderer/test_runner/WebAXObjectProxy.cpp

Issue 110533009: Import TestRunner library into chromium. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: updates Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/shell/renderer/test_runner/WebAXObjectProxy.h"
6
7 #include "content/shell/renderer/test_runner/TestCommon.h"
8 #include "third_party/WebKit/public/platform/WebCString.h"
9 #include "third_party/WebKit/public/platform/WebPoint.h"
10 #include "third_party/WebKit/public/platform/WebRect.h"
11 #include "third_party/WebKit/public/platform/WebString.h"
12
13 using namespace blink;
14 using namespace std;
15
16 namespace WebTestRunner {
17
18 namespace {
19
20 // Map role value to string, matching Safari/Mac platform implementation to
21 // avoid rebaselining layout tests.
22 string roleToString(WebAXRole role)
23 {
24 string result = "AXRole: AX";
25 switch (role) {
26 case WebAXRoleAlertDialog:
27 return result.append("AlertDialog");
28 case WebAXRoleAlert:
29 return result.append("Alert");
30 case WebAXRoleAnnotation:
31 return result.append("Annotation");
32 case WebAXRoleApplication:
33 return result.append("Application");
34 case WebAXRoleArticle:
35 return result.append("Article");
36 case WebAXRoleBanner:
37 return result.append("Banner");
38 case WebAXRoleBrowser:
39 return result.append("Browser");
40 case WebAXRoleBusyIndicator:
41 return result.append("BusyIndicator");
42 case WebAXRoleButton:
43 return result.append("Button");
44 case WebAXRoleCanvas:
45 return result.append("Canvas");
46 case WebAXRoleCell:
47 return result.append("Cell");
48 case WebAXRoleCheckBox:
49 return result.append("CheckBox");
50 case WebAXRoleColorWell:
51 return result.append("ColorWell");
52 case WebAXRoleColumnHeader:
53 return result.append("ColumnHeader");
54 case WebAXRoleColumn:
55 return result.append("Column");
56 case WebAXRoleComboBox:
57 return result.append("ComboBox");
58 case WebAXRoleComplementary:
59 return result.append("Complementary");
60 case WebAXRoleContentInfo:
61 return result.append("ContentInfo");
62 case WebAXRoleDefinition:
63 return result.append("Definition");
64 case WebAXRoleDescriptionListDetail:
65 return result.append("DescriptionListDetail");
66 case WebAXRoleDescriptionListTerm:
67 return result.append("DescriptionListTerm");
68 case WebAXRoleDialog:
69 return result.append("Dialog");
70 case WebAXRoleDirectory:
71 return result.append("Directory");
72 case WebAXRoleDisclosureTriangle:
73 return result.append("DisclosureTriangle");
74 case WebAXRoleDiv:
75 return result.append("Div");
76 case WebAXRoleDocument:
77 return result.append("Document");
78 case WebAXRoleDrawer:
79 return result.append("Drawer");
80 case WebAXRoleEditableText:
81 return result.append("EditableText");
82 case WebAXRoleFooter:
83 return result.append("Footer");
84 case WebAXRoleForm:
85 return result.append("Form");
86 case WebAXRoleGrid:
87 return result.append("Grid");
88 case WebAXRoleGroup:
89 return result.append("Group");
90 case WebAXRoleGrowArea:
91 return result.append("GrowArea");
92 case WebAXRoleHeading:
93 return result.append("Heading");
94 case WebAXRoleHelpTag:
95 return result.append("HelpTag");
96 case WebAXRoleHorizontalRule:
97 return result.append("HorizontalRule");
98 case WebAXRoleIgnored:
99 return result.append("Ignored");
100 case WebAXRoleImageMapLink:
101 return result.append("ImageMapLink");
102 case WebAXRoleImageMap:
103 return result.append("ImageMap");
104 case WebAXRoleImage:
105 return result.append("Image");
106 case WebAXRoleIncrementor:
107 return result.append("Incrementor");
108 case WebAXRoleInlineTextBox:
109 return result.append("InlineTextBox");
110 case WebAXRoleLabel:
111 return result.append("Label");
112 case WebAXRoleLegend:
113 return result.append("Legend");
114 case WebAXRoleLink:
115 return result.append("Link");
116 case WebAXRoleListBoxOption:
117 return result.append("ListBoxOption");
118 case WebAXRoleListBox:
119 return result.append("ListBox");
120 case WebAXRoleListItem:
121 return result.append("ListItem");
122 case WebAXRoleListMarker:
123 return result.append("ListMarker");
124 case WebAXRoleList:
125 return result.append("List");
126 case WebAXRoleLog:
127 return result.append("Log");
128 case WebAXRoleMain:
129 return result.append("Main");
130 case WebAXRoleMarquee:
131 return result.append("Marquee");
132 case WebAXRoleMathElement:
133 return result.append("MathElement");
134 case WebAXRoleMath:
135 return result.append("Math");
136 case WebAXRoleMatte:
137 return result.append("Matte");
138 case WebAXRoleMenuBar:
139 return result.append("MenuBar");
140 case WebAXRoleMenuButton:
141 return result.append("MenuButton");
142 case WebAXRoleMenuItem:
143 return result.append("MenuItem");
144 case WebAXRoleMenuListOption:
145 return result.append("MenuListOption");
146 case WebAXRoleMenuListPopup:
147 return result.append("MenuListPopup");
148 case WebAXRoleMenu:
149 return result.append("Menu");
150 case WebAXRoleNavigation:
151 return result.append("Navigation");
152 case WebAXRoleNote:
153 return result.append("Note");
154 case WebAXRoleOutline:
155 return result.append("Outline");
156 case WebAXRoleParagraph:
157 return result.append("Paragraph");
158 case WebAXRolePopUpButton:
159 return result.append("PopUpButton");
160 case WebAXRolePresentational:
161 return result.append("Presentational");
162 case WebAXRoleProgressIndicator:
163 return result.append("ProgressIndicator");
164 case WebAXRoleRadioButton:
165 return result.append("RadioButton");
166 case WebAXRoleRadioGroup:
167 return result.append("RadioGroup");
168 case WebAXRoleRegion:
169 return result.append("Region");
170 case WebAXRoleRootWebArea:
171 return result.append("RootWebArea");
172 case WebAXRoleRowHeader:
173 return result.append("RowHeader");
174 case WebAXRoleRow:
175 return result.append("Row");
176 case WebAXRoleRulerMarker:
177 return result.append("RulerMarker");
178 case WebAXRoleRuler:
179 return result.append("Ruler");
180 case WebAXRoleSVGRoot:
181 return result.append("SVGRoot");
182 case WebAXRoleScrollArea:
183 return result.append("ScrollArea");
184 case WebAXRoleScrollBar:
185 return result.append("ScrollBar");
186 case WebAXRoleSeamlessWebArea:
187 return result.append("SeamlessWebArea");
188 case WebAXRoleSearch:
189 return result.append("Search");
190 case WebAXRoleSheet:
191 return result.append("Sheet");
192 case WebAXRoleSlider:
193 return result.append("Slider");
194 case WebAXRoleSliderThumb:
195 return result.append("SliderThumb");
196 case WebAXRoleSpinButtonPart:
197 return result.append("SpinButtonPart");
198 case WebAXRoleSpinButton:
199 return result.append("SpinButton");
200 case WebAXRoleSplitGroup:
201 return result.append("SplitGroup");
202 case WebAXRoleSplitter:
203 return result.append("Splitter");
204 case WebAXRoleStaticText:
205 return result.append("StaticText");
206 case WebAXRoleStatus:
207 return result.append("Status");
208 case WebAXRoleSystemWide:
209 return result.append("SystemWide");
210 case WebAXRoleTabGroup:
211 return result.append("TabGroup");
212 case WebAXRoleTabList:
213 return result.append("TabList");
214 case WebAXRoleTabPanel:
215 return result.append("TabPanel");
216 case WebAXRoleTab:
217 return result.append("Tab");
218 case WebAXRoleTableHeaderContainer:
219 return result.append("TableHeaderContainer");
220 case WebAXRoleTable:
221 return result.append("Table");
222 case WebAXRoleTextArea:
223 return result.append("TextArea");
224 case WebAXRoleTextField:
225 return result.append("TextField");
226 case WebAXRoleTimer:
227 return result.append("Timer");
228 case WebAXRoleToggleButton:
229 return result.append("ToggleButton");
230 case WebAXRoleToolbar:
231 return result.append("Toolbar");
232 case WebAXRoleTreeGrid:
233 return result.append("TreeGrid");
234 case WebAXRoleTreeItem:
235 return result.append("TreeItem");
236 case WebAXRoleTree:
237 return result.append("Tree");
238 case WebAXRoleUnknown:
239 return result.append("Unknown");
240 case WebAXRoleUserInterfaceTooltip:
241 return result.append("UserInterfaceTooltip");
242 case WebAXRoleValueIndicator:
243 return result.append("ValueIndicator");
244 case WebAXRoleWebArea:
245 return result.append("WebArea");
246 case WebAXRoleWindow:
247 return result.append("Window");
248 default:
249 return result.append("Unknown");
250 }
251 }
252
253 string getDescription(const WebAXObject& object)
254 {
255 string description = object.accessibilityDescription().utf8();
256 return description.insert(0, "AXDescription: ");
257 }
258
259 string getHelpText(const WebAXObject& object)
260 {
261 string helpText = object.helpText().utf8();
262 return helpText.insert(0, "AXHelp: ");
263 }
264
265 string getStringValue(const WebAXObject& object)
266 {
267 string value;
268 if (object.role() == WebAXRoleColorWell) {
269 int r, g, b;
270 char buffer[100];
271 object.colorValue(r, g, b);
272 snprintf(buffer, sizeof(buffer), "rgb %7.5f %7.5f %7.5f 1", r / 255., g / 255., b / 255.);
273 value = buffer;
274 } else {
275 value = object.stringValue().utf8();
276 }
277 return value.insert(0, "AXValue: ");
278 }
279
280 string getRole(const WebAXObject& object)
281 {
282 string roleString = roleToString(object.role());
283
284 // Special-case canvas with fallback content because Chromium wants to
285 // treat this as essentially a separate role that it can map differently dep ending
286 // on the platform.
287 if (object.role() == WebAXRoleCanvas && object.canvasHasFallbackContent())
288 roleString += "WithFallbackContent";
289
290 return roleString;
291 }
292
293 string getTitle(const WebAXObject& object)
294 {
295 string title = object.title().utf8();
296 return title.insert(0, "AXTitle: ");
297 }
298
299 string getOrientation(const WebAXObject& object)
300 {
301 if (object.isVertical())
302 return "AXOrientation: AXVerticalOrientation";
303
304 return "AXOrientation: AXHorizontalOrientation";
305 }
306
307 string getValueDescription(const WebAXObject& object)
308 {
309 string valueDescription = object.valueDescription().utf8();
310 return valueDescription.insert(0, "AXValueDescription: ");
311 }
312
313 string getAttributes(const WebAXObject& object)
314 {
315 // FIXME: Concatenate all attributes of the AXObject.
316 string attributes(getTitle(object));
317 attributes.append("\n");
318 attributes.append(getRole(object));
319 attributes.append("\n");
320 attributes.append(getDescription(object));
321 return attributes;
322 }
323
324 WebRect boundsForCharacter(const WebAXObject& object, int characterIndex)
325 {
326 BLINK_ASSERT(object.role() == WebAXRoleStaticText);
327 int end = 0;
328 for (unsigned i = 0; i < object.childCount(); i++) {
329 WebAXObject inlineTextBox = object.childAt(i);
330 BLINK_ASSERT(inlineTextBox.role() == WebAXRoleInlineTextBox);
331 int start = end;
332 end += inlineTextBox.stringValue().length();
333 if (end <= characterIndex)
334 continue;
335 WebRect inlineTextBoxRect = inlineTextBox.boundingBoxRect();
336 int localIndex = characterIndex - start;
337 WebVector<int> characterOffsets;
338 inlineTextBox.characterOffsets(characterOffsets);
339 BLINK_ASSERT(characterOffsets.size() > 0 && characterOffsets.size() == i nlineTextBox.stringValue().length());
340 switch (inlineTextBox.textDirection()) {
341 case WebAXTextDirectionLR: {
342 if (localIndex) {
343 int left = inlineTextBoxRect.x + characterOffsets[localIndex - 1 ];
344 int width = characterOffsets[localIndex] - characterOffsets[loca lIndex - 1];
345 return WebRect(left, inlineTextBoxRect.y, width, inlineTextBoxRe ct.height);
346 }
347 return WebRect(inlineTextBoxRect.x, inlineTextBoxRect.y, characterOf fsets[0], inlineTextBoxRect.height);
348 }
349 case WebAXTextDirectionRL: {
350 int right = inlineTextBoxRect.x + inlineTextBoxRect.width;
351
352 if (localIndex) {
353 int left = right - characterOffsets[localIndex];
354 int width = characterOffsets[localIndex] - characterOffsets[loca lIndex - 1];
355 return WebRect(left, inlineTextBoxRect.y, width, inlineTextBoxRe ct.height);
356 }
357 int left = right - characterOffsets[0];
358 return WebRect(left, inlineTextBoxRect.y, characterOffsets[0], inlin eTextBoxRect.height);
359 }
360 case WebAXTextDirectionTB: {
361 if (localIndex) {
362 int top = inlineTextBoxRect.y + characterOffsets[localIndex - 1] ;
363 int height = characterOffsets[localIndex] - characterOffsets[loc alIndex - 1];
364 return WebRect(inlineTextBoxRect.x, top, inlineTextBoxRect.width , height);
365 }
366 return WebRect(inlineTextBoxRect.x, inlineTextBoxRect.y, inlineTextB oxRect.width, characterOffsets[0]);
367 }
368 case WebAXTextDirectionBT: {
369 int bottom = inlineTextBoxRect.y + inlineTextBoxRect.height;
370
371 if (localIndex) {
372 int top = bottom - characterOffsets[localIndex];
373 int height = characterOffsets[localIndex] - characterOffsets[loc alIndex - 1];
374 return WebRect(inlineTextBoxRect.x, top, inlineTextBoxRect.width , height);
375 }
376 int top = bottom - characterOffsets[0];
377 return WebRect(inlineTextBoxRect.x, top, inlineTextBoxRect.width, ch aracterOffsets[0]);
378 }
379 }
380 }
381
382 BLINK_ASSERT(false);
383 return WebRect();
384 }
385
386 void getBoundariesForOneWord(const WebAXObject& object, int characterIndex, int& wordStart, int& wordEnd)
387 {
388 int end = 0;
389 for (unsigned i = 0; i < object.childCount(); i++) {
390 WebAXObject inlineTextBox = object.childAt(i);
391 BLINK_ASSERT(inlineTextBox.role() == WebAXRoleInlineTextBox);
392 int start = end;
393 end += inlineTextBox.stringValue().length();
394 if (end <= characterIndex)
395 continue;
396 int localIndex = characterIndex - start;
397
398 WebVector<int> starts;
399 WebVector<int> ends;
400 inlineTextBox.wordBoundaries(starts, ends);
401 size_t wordCount = starts.size();
402 BLINK_ASSERT(ends.size() == wordCount);
403
404 // If there are no words, use the InlineTextBox boundaries.
405 if (!wordCount) {
406 wordStart = start;
407 wordEnd = end;
408 return;
409 }
410
411 // Look for a character within any word other than the last.
412 for (size_t j = 0; j < wordCount - 1; j++) {
413 if (localIndex <= ends[j]) {
414 wordStart = start + starts[j];
415 wordEnd = start + ends[j];
416 return;
417 }
418 }
419
420 // Return the last word by default.
421 wordStart = start + starts[wordCount - 1];
422 wordEnd = start + ends[wordCount - 1];
423 return;
424 }
425 }
426
427 // Collects attributes into a string, delimited by dashes. Used by all methods
428 // that output lists of attributes: attributesOfLinkedUIElementsCallback,
429 // AttributesOfChildrenCallback, etc.
430 class AttributesCollector {
431 public:
432 void collectAttributes(const WebAXObject& object)
433 {
434 m_attributes.append("\n------------\n");
435 m_attributes.append(getAttributes(object));
436 }
437
438 string attributes() const { return m_attributes; }
439
440 private:
441 string m_attributes;
442 };
443
444 }
445
446 WebAXObjectProxy::WebAXObjectProxy(const WebAXObject& object, Factory* factory)
447 : m_accessibilityObject(object)
448 , m_factory(factory)
449 {
450
451 BLINK_ASSERT(factory);
452
453 //
454 // Properties
455 //
456
457 bindProperty("role", &WebAXObjectProxy::roleGetterCallback);
458 bindProperty("title", &WebAXObjectProxy::titleGetterCallback);
459 bindProperty("description", &WebAXObjectProxy::descriptionGetterCallback);
460 bindProperty("helpText", &WebAXObjectProxy::helpTextGetterCallback);
461 bindProperty("stringValue", &WebAXObjectProxy::stringValueGetterCallback);
462 bindProperty("x", &WebAXObjectProxy::xGetterCallback);
463 bindProperty("y", &WebAXObjectProxy::yGetterCallback);
464 bindProperty("width", &WebAXObjectProxy::widthGetterCallback);
465 bindProperty("height", &WebAXObjectProxy::heightGetterCallback);
466 bindProperty("intValue", &WebAXObjectProxy::intValueGetterCallback);
467 bindProperty("minValue", &WebAXObjectProxy::minValueGetterCallback);
468 bindProperty("maxValue", &WebAXObjectProxy::maxValueGetterCallback);
469 bindProperty("valueDescription", &WebAXObjectProxy::valueDescriptionGetterCa llback);
470 bindProperty("childrenCount", &WebAXObjectProxy::childrenCountGetterCallback );
471 bindProperty("insertionPointLineNumber", &WebAXObjectProxy::insertionPointLi neNumberGetterCallback);
472 bindProperty("selectedTextRange", &WebAXObjectProxy::selectedTextRangeGetter Callback);
473 bindProperty("isEnabled", &WebAXObjectProxy::isEnabledGetterCallback);
474 bindProperty("isRequired", &WebAXObjectProxy::isRequiredGetterCallback);
475 bindProperty("isFocused", &WebAXObjectProxy::isFocusedGetterCallback);
476 bindProperty("isFocusable", &WebAXObjectProxy::isFocusableGetterCallback);
477 bindProperty("isSelected", &WebAXObjectProxy::isSelectedGetterCallback);
478 bindProperty("isSelectable", &WebAXObjectProxy::isSelectableGetterCallback);
479 bindProperty("isMultiSelectable", &WebAXObjectProxy::isMultiSelectableGetter Callback);
480 bindProperty("isSelectedOptionActive", &WebAXObjectProxy::isSelectedOptionAc tiveGetterCallback);
481 bindProperty("isExpanded", &WebAXObjectProxy::isExpandedGetterCallback);
482 bindProperty("isChecked", &WebAXObjectProxy::isCheckedGetterCallback);
483 bindProperty("isVisible", &WebAXObjectProxy::isVisibleGetterCallback);
484 bindProperty("isOffScreen", &WebAXObjectProxy::isOffScreenGetterCallback);
485 bindProperty("isCollapsed", &WebAXObjectProxy::isCollapsedGetterCallback);
486 bindProperty("hasPopup", &WebAXObjectProxy::hasPopupGetterCallback);
487 bindProperty("isValid", &WebAXObjectProxy::isValidGetterCallback);
488 bindProperty("isReadOnly", &WebAXObjectProxy::isReadOnlyGetterCallback);
489 bindProperty("orientation", &WebAXObjectProxy::orientationGetterCallback);
490 bindProperty("clickPointX", &WebAXObjectProxy::clickPointXGetterCallback);
491 bindProperty("clickPointY", &WebAXObjectProxy::clickPointYGetterCallback);
492 bindProperty("rowCount", &WebAXObjectProxy::rowCountGetterCallback);
493 bindProperty("columnCount", &WebAXObjectProxy::columnCountGetterCallback);
494 bindProperty("isClickable", &WebAXObjectProxy::isClickableGetterCallback);
495
496 //
497 // Methods
498 //
499
500 bindMethod("allAttributes", &WebAXObjectProxy::allAttributesCallback);
501 bindMethod("attributesOfChildren", &WebAXObjectProxy::attributesOfChildrenCa llback);
502 bindMethod("lineForIndex", &WebAXObjectProxy::lineForIndexCallback);
503 bindMethod("boundsForRange", &WebAXObjectProxy::boundsForRangeCallback);
504 bindMethod("childAtIndex", &WebAXObjectProxy::childAtIndexCallback);
505 bindMethod("elementAtPoint", &WebAXObjectProxy::elementAtPointCallback);
506 bindMethod("tableHeader", &WebAXObjectProxy::tableHeaderCallback);
507 bindMethod("rowIndexRange", &WebAXObjectProxy::rowIndexRangeCallback);
508 bindMethod("columnIndexRange", &WebAXObjectProxy::columnIndexRangeCallback);
509 bindMethod("cellForColumnAndRow", &WebAXObjectProxy::cellForColumnAndRowCall back);
510 bindMethod("titleUIElement", &WebAXObjectProxy::titleUIElementCallback);
511 bindMethod("setSelectedTextRange", &WebAXObjectProxy::setSelectedTextRangeCa llback);
512 bindMethod("isAttributeSettable", &WebAXObjectProxy::isAttributeSettableCall back);
513 bindMethod("isPressActionSupported", &WebAXObjectProxy::isPressActionSupport edCallback);
514 bindMethod("isIncrementActionSupported", &WebAXObjectProxy::isIncrementActio nSupportedCallback);
515 bindMethod("isDecrementActionSupported", &WebAXObjectProxy::isDecrementActio nSupportedCallback);
516 bindMethod("parentElement", &WebAXObjectProxy::parentElementCallback);
517 bindMethod("increment", &WebAXObjectProxy::incrementCallback);
518 bindMethod("decrement", &WebAXObjectProxy::decrementCallback);
519 bindMethod("showMenu", &WebAXObjectProxy::showMenuCallback);
520 bindMethod("press", &WebAXObjectProxy::pressCallback);
521 bindMethod("isEqual", &WebAXObjectProxy::isEqualCallback);
522 bindMethod("addNotificationListener", &WebAXObjectProxy::addNotificationList enerCallback);
523 bindMethod("removeNotificationListener", &WebAXObjectProxy::removeNotificati onListenerCallback);
524 bindMethod("takeFocus", &WebAXObjectProxy::takeFocusCallback);
525 bindMethod("scrollToMakeVisible", &WebAXObjectProxy::scrollToMakeVisibleCall back);
526 bindMethod("scrollToMakeVisibleWithSubFocus", &WebAXObjectProxy::scrollToMak eVisibleWithSubFocusCallback);
527 bindMethod("scrollToGlobalPoint", &WebAXObjectProxy::scrollToGlobalPointCall back);
528 bindMethod("wordStart", &WebAXObjectProxy::wordStartCallback);
529 bindMethod("wordEnd", &WebAXObjectProxy::wordEndCallback);
530
531 bindFallbackMethod(&WebAXObjectProxy::fallbackCallback);
532 }
533
534 WebAXObjectProxy* WebAXObjectProxy::getChildAtIndex(unsigned index)
535 {
536 return m_factory->getOrCreate(accessibilityObject().childAt(index));
537 }
538
539 bool WebAXObjectProxy::isEqual(const blink::WebAXObject& other)
540 {
541 return accessibilityObject().equals(other);
542 }
543
544 void WebAXObjectProxy::notificationReceived(const char* notificationName)
545 {
546 size_t callbackCount = m_notificationCallbacks.size();
547 for (size_t i = 0; i < callbackCount; i++) {
548 CppVariant notificationNameArgument;
549 notificationNameArgument.set(notificationName);
550 CppVariant invokeResult;
551 m_notificationCallbacks[i].invokeDefault(&notificationNameArgument, 1, i nvokeResult);
552 }
553 }
554
555 //
556 // Properties
557 //
558
559 void WebAXObjectProxy::roleGetterCallback(CppVariant* result)
560 {
561 result->set(getRole(accessibilityObject()));
562 }
563
564 void WebAXObjectProxy::titleGetterCallback(CppVariant* result)
565 {
566 result->set(getTitle(accessibilityObject()));
567 }
568
569 void WebAXObjectProxy::descriptionGetterCallback(CppVariant* result)
570 {
571 result->set(getDescription(accessibilityObject()));
572 }
573
574 void WebAXObjectProxy::helpTextGetterCallback(CppVariant* result)
575 {
576 result->set(getHelpText(accessibilityObject()));
577 }
578
579 void WebAXObjectProxy::stringValueGetterCallback(CppVariant* result)
580 {
581 result->set(getStringValue(accessibilityObject()));
582 }
583
584 void WebAXObjectProxy::xGetterCallback(CppVariant* result)
585 {
586 result->set(accessibilityObject().boundingBoxRect().x);
587 }
588
589 void WebAXObjectProxy::yGetterCallback(CppVariant* result)
590 {
591 result->set(accessibilityObject().boundingBoxRect().y);
592 }
593
594 void WebAXObjectProxy::widthGetterCallback(CppVariant* result)
595 {
596 result->set(accessibilityObject().boundingBoxRect().width);
597 }
598
599 void WebAXObjectProxy::heightGetterCallback(CppVariant* result)
600 {
601 result->set(accessibilityObject().boundingBoxRect().height);
602 }
603
604 void WebAXObjectProxy::intValueGetterCallback(CppVariant* result)
605 {
606 if (accessibilityObject().supportsRangeValue())
607 result->set(accessibilityObject().valueForRange());
608 else if (accessibilityObject().role() == WebAXRoleHeading)
609 result->set(accessibilityObject().headingLevel());
610 else
611 result->set(atoi(accessibilityObject().stringValue().utf8().data()));
612 }
613
614 void WebAXObjectProxy::minValueGetterCallback(CppVariant* result)
615 {
616 result->set(accessibilityObject().minValueForRange());
617 }
618
619 void WebAXObjectProxy::maxValueGetterCallback(CppVariant* result)
620 {
621 result->set(accessibilityObject().maxValueForRange());
622 }
623
624 void WebAXObjectProxy::valueDescriptionGetterCallback(CppVariant* result)
625 {
626 result->set(getValueDescription(accessibilityObject()));
627 }
628
629 void WebAXObjectProxy::childrenCountGetterCallback(CppVariant* result)
630 {
631 int count = 1; // Root object always has only one child, the WebView.
632 if (!isRoot())
633 count = accessibilityObject().childCount();
634 result->set(count);
635 }
636
637 void WebAXObjectProxy::insertionPointLineNumberGetterCallback(CppVariant* result )
638 {
639 if (!accessibilityObject().isFocused()) {
640 result->set(-1);
641 return;
642 }
643
644 int lineNumber = accessibilityObject().selectionEndLineNumber();
645 result->set(lineNumber);
646 }
647
648 void WebAXObjectProxy::selectedTextRangeGetterCallback(CppVariant* result)
649 {
650 unsigned selectionStart = accessibilityObject().selectionStart();
651 unsigned selectionEnd = accessibilityObject().selectionEnd();
652 char buffer[100];
653 snprintf(buffer, sizeof(buffer), "{%d, %d}", selectionStart, selectionEnd - selectionStart);
654
655 result->set(std::string(buffer));
656 }
657
658 void WebAXObjectProxy::isEnabledGetterCallback(CppVariant* result)
659 {
660 result->set(accessibilityObject().isEnabled());
661 }
662
663 void WebAXObjectProxy::isRequiredGetterCallback(CppVariant* result)
664 {
665 result->set(accessibilityObject().isRequired());
666 }
667
668 void WebAXObjectProxy::isFocusedGetterCallback(CppVariant* result)
669 {
670 result->set(accessibilityObject().isFocused());
671 }
672
673 void WebAXObjectProxy::isFocusableGetterCallback(CppVariant* result)
674 {
675 result->set(accessibilityObject().canSetFocusAttribute());
676 }
677
678 void WebAXObjectProxy::isSelectedGetterCallback(CppVariant* result)
679 {
680 result->set(accessibilityObject().isSelected());
681 }
682
683 void WebAXObjectProxy::isSelectableGetterCallback(CppVariant* result)
684 {
685 result->set(accessibilityObject().canSetSelectedAttribute());
686 }
687
688 void WebAXObjectProxy::isMultiSelectableGetterCallback(CppVariant* result)
689 {
690 result->set(accessibilityObject().isMultiSelectable());
691 }
692
693 void WebAXObjectProxy::isSelectedOptionActiveGetterCallback(CppVariant* result)
694 {
695 result->set(accessibilityObject().isSelectedOptionActive());
696 }
697
698 void WebAXObjectProxy::isExpandedGetterCallback(CppVariant* result)
699 {
700 result->set(!accessibilityObject().isCollapsed());
701 }
702
703 void WebAXObjectProxy::isCheckedGetterCallback(CppVariant* result)
704 {
705 result->set(accessibilityObject().isChecked());
706 }
707
708 void WebAXObjectProxy::isVisibleGetterCallback(CppVariant* result)
709 {
710 result->set(accessibilityObject().isVisible());
711 }
712
713 void WebAXObjectProxy::isOffScreenGetterCallback(CppVariant* result)
714 {
715 result->set(accessibilityObject().isOffScreen());
716 }
717
718 void WebAXObjectProxy::isCollapsedGetterCallback(CppVariant* result)
719 {
720 result->set(accessibilityObject().isCollapsed());
721 }
722
723 void WebAXObjectProxy::hasPopupGetterCallback(CppVariant* result)
724 {
725 result->set(accessibilityObject().ariaHasPopup());
726 }
727
728 void WebAXObjectProxy::isValidGetterCallback(CppVariant* result)
729 {
730 result->set(!accessibilityObject().isDetached());
731 }
732
733 void WebAXObjectProxy::isReadOnlyGetterCallback(CppVariant* result)
734 {
735 result->set(accessibilityObject().isReadOnly());
736 }
737
738 void WebAXObjectProxy::orientationGetterCallback(CppVariant* result)
739 {
740 result->set(getOrientation(accessibilityObject()));
741 }
742
743 void WebAXObjectProxy::clickPointXGetterCallback(CppVariant* result)
744 {
745 result->set(accessibilityObject().clickPoint().x);
746 }
747
748 void WebAXObjectProxy::clickPointYGetterCallback(CppVariant* result)
749 {
750 result->set(accessibilityObject().clickPoint().y);
751 }
752
753 void WebAXObjectProxy::rowCountGetterCallback(CppVariant* result)
754 {
755 result->set(static_cast<int32_t>(accessibilityObject().rowCount()));
756 }
757
758 void WebAXObjectProxy::columnCountGetterCallback(CppVariant* result)
759 {
760 result->set(static_cast<int32_t>(accessibilityObject().columnCount()));
761 }
762
763 void WebAXObjectProxy::isClickableGetterCallback(CppVariant* result)
764 {
765 result->set(accessibilityObject().isClickable());
766 }
767
768 //
769 // Methods
770 //
771
772 void WebAXObjectProxy::allAttributesCallback(const CppArgumentList&, CppVariant* result)
773 {
774 result->set(getAttributes(accessibilityObject()));
775 }
776
777 void WebAXObjectProxy::attributesOfChildrenCallback(const CppArgumentList& argum ents, CppVariant* result)
778 {
779 AttributesCollector collector;
780 unsigned size = accessibilityObject().childCount();
781 for (unsigned i = 0; i < size; ++i)
782 collector.collectAttributes(accessibilityObject().childAt(i));
783 result->set(collector.attributes());
784 }
785
786 void WebAXObjectProxy::lineForIndexCallback(const CppArgumentList& arguments, Cp pVariant* result)
787 {
788 if (!arguments.size() || !arguments[0].isNumber()) {
789 result->setNull();
790 return;
791 }
792
793 int index = arguments[0].toInt32();
794
795 WebVector<int> lineBreaks;
796 accessibilityObject().lineBreaks(lineBreaks);
797 int line = 0;
798 int vectorSize = static_cast<int>(lineBreaks.size());
799 while (line < vectorSize && lineBreaks[line] <= index)
800 line++;
801 result->set(line);
802 }
803
804 void WebAXObjectProxy::boundsForRangeCallback(const CppArgumentList& arguments, CppVariant* result)
805 {
806 result->setNull();
807
808 if (arguments.size() != 2 || !arguments[0].isNumber() || !arguments[1].isNum ber())
809 return;
810
811 if (accessibilityObject().role() != WebAXRoleStaticText)
812 return;
813
814 int start = arguments[0].toInt32();
815 int end = arguments[1].toInt32();
816 int len = end - start;
817
818 // Get the bounds for each character and union them into one large rectangle .
819 // This is just for testing so it doesn't need to be efficient.
820 WebRect bounds = boundsForCharacter(accessibilityObject(), start);
821 for (int i = 1; i < len; i++) {
822 WebRect next = boundsForCharacter(accessibilityObject(), start + i);
823 int right = std::max(bounds.x + bounds.width, next.x + next.width);
824 int bottom = std::max(bounds.y + bounds.height, next.y + next.height);
825 bounds.x = std::min(bounds.x, next.x);
826 bounds.y = std::min(bounds.y, next.y);
827 bounds.width = right - bounds.x;
828 bounds.height = bottom - bounds.y;
829 }
830
831 char buffer[100];
832 snprintf(buffer, sizeof(buffer), "{x: %d, y: %d, width: %d, height: %d}", bo unds.x, bounds.y, bounds.width, bounds.height);
833 result->set(string(buffer));
834 }
835
836 void WebAXObjectProxy::childAtIndexCallback(const CppArgumentList& arguments, Cp pVariant* result)
837 {
838 if (!arguments.size() || !arguments[0].isNumber()) {
839 result->setNull();
840 return;
841 }
842
843 WebAXObjectProxy* child = getChildAtIndex(arguments[0].toInt32());
844 if (!child) {
845 result->setNull();
846 return;
847 }
848
849 result->set(*(child->getAsCppVariant()));
850 }
851
852 void WebAXObjectProxy::elementAtPointCallback(const CppArgumentList& arguments, CppVariant* result)
853 {
854 result->setNull();
855
856 if (arguments.size() != 2 || !arguments[0].isNumber() || !arguments[1].isNum ber())
857 return;
858
859 int x = arguments[0].toInt32();
860 int y = arguments[1].toInt32();
861 WebPoint point(x, y);
862 WebAXObject obj = accessibilityObject().hitTest(point);
863 if (obj.isNull())
864 return;
865
866 result->set(*(m_factory->getOrCreate(obj)->getAsCppVariant()));
867 }
868
869 void WebAXObjectProxy::tableHeaderCallback(const CppArgumentList&, CppVariant* r esult)
870 {
871 WebAXObject obj = accessibilityObject().headerContainerObject();
872 if (obj.isNull()) {
873 result->setNull();
874 return;
875 }
876
877 result->set(*(m_factory->getOrCreate(obj)->getAsCppVariant()));
878 }
879
880 void WebAXObjectProxy::rowIndexRangeCallback(const CppArgumentList&, CppVariant* result)
881 {
882 unsigned rowIndex = accessibilityObject().cellRowIndex();
883 unsigned rowSpan = accessibilityObject().cellRowSpan();
884 char buffer[100];
885 snprintf(buffer, sizeof(buffer), "{%d, %d}", rowIndex, rowSpan);
886 string value = buffer;
887 result->set(std::string(buffer));
888 }
889
890 void WebAXObjectProxy::columnIndexRangeCallback(const CppArgumentList&, CppVaria nt* result)
891 {
892 unsigned columnIndex = accessibilityObject().cellColumnIndex();
893 unsigned columnSpan = accessibilityObject().cellColumnSpan();
894 char buffer[100];
895 snprintf(buffer, sizeof(buffer), "{%d, %d}", columnIndex, columnSpan);
896 result->set(std::string(buffer));
897 }
898
899 void WebAXObjectProxy::cellForColumnAndRowCallback(const CppArgumentList& argume nts, CppVariant* result)
900 {
901 if (arguments.size() != 2 || !arguments[0].isNumber() || !arguments[1].isNum ber())
902 return;
903
904 int column = arguments[0].toInt32();
905 int row = arguments[1].toInt32();
906 WebAXObject obj = accessibilityObject().cellForColumnAndRow(column, row);
907 if (obj.isNull()) {
908 result->setNull();
909 return;
910 }
911
912 result->set(*(m_factory->getOrCreate(obj)->getAsCppVariant()));
913 }
914
915 void WebAXObjectProxy::titleUIElementCallback(const CppArgumentList&, CppVariant * result)
916 {
917 WebAXObject obj = accessibilityObject().titleUIElement();
918 if (obj.isNull()) {
919 result->setNull();
920 return;
921 }
922
923 result->set(*(m_factory->getOrCreate(obj)->getAsCppVariant()));
924 }
925
926 void WebAXObjectProxy::setSelectedTextRangeCallback(const CppArgumentList&argume nts, CppVariant* result)
927 {
928 result->setNull();
929 if (arguments.size() != 2 || !arguments[0].isNumber() || !arguments[1].isNum ber())
930 return;
931
932 int selectionStart = arguments[0].toInt32();
933 int selectionEnd = selectionStart + arguments[1].toInt32();
934 accessibilityObject().setSelectedTextRange(selectionStart, selectionEnd);
935 }
936
937 void WebAXObjectProxy::isAttributeSettableCallback(const CppArgumentList& argume nts, CppVariant* result)
938 {
939 if (arguments.size() < 1 && !arguments[0].isString()) {
940 result->setNull();
941 return;
942 }
943
944 string attribute = arguments[0].toString();
945 bool settable = false;
946 if (attribute == "AXValue")
947 settable = accessibilityObject().canSetValueAttribute();
948 result->set(settable);
949 }
950
951 void WebAXObjectProxy::isPressActionSupportedCallback(const CppArgumentList&, Cp pVariant* result)
952 {
953 result->set(accessibilityObject().canPress());
954 }
955
956 void WebAXObjectProxy::isIncrementActionSupportedCallback(const CppArgumentList& , CppVariant* result)
957 {
958 result->set(accessibilityObject().canIncrement());
959 }
960
961 void WebAXObjectProxy::isDecrementActionSupportedCallback(const CppArgumentList& , CppVariant* result)
962 {
963 result->set(accessibilityObject().canDecrement());
964 }
965
966 void WebAXObjectProxy::parentElementCallback(const CppArgumentList&, CppVariant* result)
967 {
968 WebAXObject parentObject = accessibilityObject().parentObject();
969 while (parentObject.accessibilityIsIgnored())
970 parentObject = parentObject.parentObject();
971 WebAXObjectProxy* parent = m_factory->getOrCreate(parentObject);
972 if (!parent) {
973 result->setNull();
974 return;
975 }
976
977 result->set(*(parent->getAsCppVariant()));
978 }
979
980 void WebAXObjectProxy::incrementCallback(const CppArgumentList&, CppVariant* res ult)
981 {
982 accessibilityObject().increment();
983 result->setNull();
984 }
985
986 void WebAXObjectProxy::decrementCallback(const CppArgumentList&, CppVariant* res ult)
987 {
988 accessibilityObject().decrement();
989 result->setNull();
990 }
991
992 void WebAXObjectProxy::showMenuCallback(const CppArgumentList&, CppVariant* resu lt)
993 {
994 result->setNull();
995 }
996
997 void WebAXObjectProxy::pressCallback(const CppArgumentList&, CppVariant* result)
998 {
999 accessibilityObject().press();
1000 result->setNull();
1001 }
1002
1003 void WebAXObjectProxy::isEqualCallback(const CppArgumentList& arguments, CppVari ant* result)
1004 {
1005 if (arguments.size() < 1 || !arguments[0].isObject()) {
1006 result->setNull();
1007 return;
1008 }
1009
1010 result->set(arguments[0].isEqual(*getAsCppVariant()));
1011 }
1012
1013 void WebAXObjectProxy::addNotificationListenerCallback(const CppArgumentList& ar guments, CppVariant* result)
1014 {
1015 if (arguments.size() < 1 || !arguments[0].isObject()) {
1016 result->setNull();
1017 return;
1018 }
1019
1020 m_notificationCallbacks.push_back(arguments[0]);
1021 result->setNull();
1022 }
1023
1024 void WebAXObjectProxy::removeNotificationListenerCallback(const CppArgumentList& , CppVariant* result)
1025 {
1026 // FIXME: Implement this.
1027 result->setNull();
1028 }
1029
1030 void WebAXObjectProxy::takeFocusCallback(const CppArgumentList&, CppVariant* res ult)
1031 {
1032 accessibilityObject().setFocused(true);
1033 result->setNull();
1034 }
1035
1036 void WebAXObjectProxy::scrollToMakeVisibleCallback(const CppArgumentList&, CppVa riant* result)
1037 {
1038 accessibilityObject().scrollToMakeVisible();
1039 result->setNull();
1040 }
1041
1042 void WebAXObjectProxy::scrollToMakeVisibleWithSubFocusCallback(const CppArgument List& arguments, CppVariant* result)
1043 {
1044 result->setNull();
1045
1046 if (arguments.size() != 4
1047 || !arguments[0].isNumber()
1048 || !arguments[1].isNumber()
1049 || !arguments[2].isNumber()
1050 || !arguments[3].isNumber())
1051 return;
1052
1053 int x = arguments[0].toInt32();
1054 int y = arguments[1].toInt32();
1055 int width = arguments[2].toInt32();
1056 int height = arguments[3].toInt32();
1057 accessibilityObject().scrollToMakeVisibleWithSubFocus(WebRect(x, y, width, h eight));
1058 result->setNull();
1059 }
1060
1061 void WebAXObjectProxy::scrollToGlobalPointCallback(const CppArgumentList& argume nts, CppVariant* result)
1062 {
1063 result->setNull();
1064
1065 if (arguments.size() != 2
1066 || !arguments[0].isNumber()
1067 || !arguments[1].isNumber())
1068 return;
1069
1070 int x = arguments[0].toInt32();
1071 int y = arguments[1].toInt32();
1072
1073 accessibilityObject().scrollToGlobalPoint(WebPoint(x, y));
1074 result->setNull();
1075 }
1076
1077 void WebAXObjectProxy::wordStartCallback(const CppArgumentList& arguments, CppVa riant* result)
1078 {
1079 result->setNull();
1080
1081 if (arguments.size() != 1 || !arguments[0].isNumber())
1082 return;
1083
1084 if (accessibilityObject().role() != WebAXRoleStaticText)
1085 return;
1086
1087 int characterIndex = arguments[0].toInt32();
1088 int wordStart, wordEnd;
1089 getBoundariesForOneWord(accessibilityObject(), characterIndex, wordStart, wo rdEnd);
1090 result->set(wordStart);
1091 }
1092
1093 void WebAXObjectProxy::wordEndCallback(const CppArgumentList& arguments, CppVari ant* result)
1094 {
1095 result->setNull();
1096
1097 if (arguments.size() != 1 || !arguments[0].isNumber())
1098 return;
1099
1100 if (accessibilityObject().role() != WebAXRoleStaticText)
1101 return;
1102
1103 int characterIndex = arguments[0].toInt32();
1104 int wordStart, wordEnd;
1105 getBoundariesForOneWord(accessibilityObject(), characterIndex, wordStart, wo rdEnd);
1106 result->set(wordEnd);
1107 }
1108
1109 void WebAXObjectProxy::fallbackCallback(const CppArgumentList &, CppVariant* res ult)
1110 {
1111 result->setNull();
1112 }
1113
1114 RootWebAXObjectProxy::RootWebAXObjectProxy(const WebAXObject &object, Factory *f actory)
1115 : WebAXObjectProxy(object, factory) { }
1116
1117 WebAXObjectProxy* RootWebAXObjectProxy::getChildAtIndex(unsigned index)
1118 {
1119 if (index)
1120 return 0;
1121
1122 return factory()->getOrCreate(accessibilityObject());
1123 }
1124
1125
1126 WebAXObjectProxyList ::~WebAXObjectProxyList()
1127 {
1128 clear();
1129 }
1130
1131 void WebAXObjectProxyList::clear()
1132 {
1133 for (ElementList::iterator i = m_elements.begin(); i != m_elements.end(); ++ i)
1134 delete (*i);
1135 m_elements.clear();
1136 }
1137
1138 WebAXObjectProxy* WebAXObjectProxyList::getOrCreate(const WebAXObject& object)
1139 {
1140 if (object.isNull())
1141 return 0;
1142
1143 size_t elementCount = m_elements.size();
1144 for (size_t i = 0; i < elementCount; i++) {
1145 if (m_elements[i]->isEqual(object))
1146 return m_elements[i];
1147 }
1148
1149 WebAXObjectProxy* element = new WebAXObjectProxy(object, this);
1150 m_elements.push_back(element);
1151 return element;
1152 }
1153
1154 WebAXObjectProxy* WebAXObjectProxyList::createRoot(const WebAXObject& object)
1155 {
1156 WebAXObjectProxy* element = new RootWebAXObjectProxy(object, this);
1157 m_elements.push_back(element);
1158 return element;
1159 }
1160
1161 }
OLDNEW
« no previous file with comments | « content/shell/renderer/test_runner/WebAXObjectProxy.h ('k') | content/shell/renderer/test_runner/WebFrameTestProxy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698