OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 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 17 matching lines...) Expand all Loading... |
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 "AccessibilityUIElementChromium.h" | 31 #include "AccessibilityUIElementChromium.h" |
32 | 32 |
33 #include "TestCommon.h" | 33 #include "TestCommon.h" |
34 #include "public/platform/WebCString.h" | 34 #include "public/platform/WebCString.h" |
35 #include "public/platform/WebPoint.h" | 35 #include "public/platform/WebPoint.h" |
36 #include "public/platform/WebRect.h" | 36 #include "public/platform/WebRect.h" |
37 #include "public/platform/WebString.h" | 37 #include "public/platform/WebString.h" |
38 #include "public/web/WebAccessibilityObject.h" | 38 #include "public/web/WebAXObject.h" |
39 | 39 |
40 using namespace WebKit; | 40 using namespace WebKit; |
41 using namespace std; | 41 using namespace std; |
42 | 42 |
43 namespace WebTestRunner { | 43 namespace WebTestRunner { |
44 | 44 |
45 namespace { | 45 namespace { |
46 | 46 |
47 // Map role value to string, matching Safari/Mac platform implementation to | 47 // Map role value to string, matching Safari/Mac platform implementation to |
48 // avoid rebaselining layout tests. | 48 // avoid rebaselining layout tests. |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 return result.append("ValueIndicator"); | 268 return result.append("ValueIndicator"); |
269 case WebAXRoleWebArea: | 269 case WebAXRoleWebArea: |
270 return result.append("WebArea"); | 270 return result.append("WebArea"); |
271 case WebAXRoleWindow: | 271 case WebAXRoleWindow: |
272 return result.append("Window"); | 272 return result.append("Window"); |
273 default: | 273 default: |
274 return result.append("Unknown"); | 274 return result.append("Unknown"); |
275 } | 275 } |
276 } | 276 } |
277 | 277 |
278 string getDescription(const WebAccessibilityObject& object) | 278 string getDescription(const WebAXObject& object) |
279 { | 279 { |
280 string description = object.accessibilityDescription().utf8(); | 280 string description = object.accessibilityDescription().utf8(); |
281 return description.insert(0, "AXDescription: "); | 281 return description.insert(0, "AXDescription: "); |
282 } | 282 } |
283 | 283 |
284 string getHelpText(const WebAccessibilityObject& object) | 284 string getHelpText(const WebAXObject& object) |
285 { | 285 { |
286 string helpText = object.helpText().utf8(); | 286 string helpText = object.helpText().utf8(); |
287 return helpText.insert(0, "AXHelp: "); | 287 return helpText.insert(0, "AXHelp: "); |
288 } | 288 } |
289 | 289 |
290 string getStringValue(const WebAccessibilityObject& object) | 290 string getStringValue(const WebAXObject& object) |
291 { | 291 { |
292 string value; | 292 string value; |
293 if (object.roleValue() == WebAccessibilityRoleColorWell) { | 293 if (object.role() == WebAXRoleColorWell) { |
294 int r, g, b; | 294 int r, g, b; |
295 char buffer[100]; | 295 char buffer[100]; |
296 object.colorValue(r, g, b); | 296 object.colorValue(r, g, b); |
297 snprintf(buffer, sizeof(buffer), "rgb %7.5f %7.5f %7.5f 1", r / 255., g
/ 255., b / 255.); | 297 snprintf(buffer, sizeof(buffer), "rgb %7.5f %7.5f %7.5f 1", r / 255., g
/ 255., b / 255.); |
298 value = buffer; | 298 value = buffer; |
299 } else | 299 } else |
300 value = object.stringValue().utf8(); | 300 value = object.stringValue().utf8(); |
301 return value.insert(0, "AXValue: "); | 301 return value.insert(0, "AXValue: "); |
302 } | 302 } |
303 | 303 |
304 string getRole(const WebAccessibilityObject& object) | 304 string getRole(const WebAXObject& object) |
305 { | 305 { |
306 string roleString = roleToString(object.role()); | 306 string roleString = roleToString(object.role()); |
307 | 307 |
308 // Special-case canvas with fallback content because Chromium wants to | 308 // Special-case canvas with fallback content because Chromium wants to |
309 // treat this as essentially a separate role that it can map differently dep
ending | 309 // treat this as essentially a separate role that it can map differently dep
ending |
310 // on the platform. | 310 // on the platform. |
311 if (object.roleValue() == WebAccessibilityRoleCanvas && object.canvasHasFall
backContent()) | 311 if (object.role() == WebAXRoleCanvas && object.canvasHasFallbackContent()) |
312 roleString += "WithFallbackContent"; | 312 roleString += "WithFallbackContent"; |
313 | 313 |
314 return roleString; | 314 return roleString; |
315 } | 315 } |
316 | 316 |
317 string getTitle(const WebAccessibilityObject& object) | 317 string getTitle(const WebAXObject& object) |
318 { | 318 { |
319 string title = object.title().utf8(); | 319 string title = object.title().utf8(); |
320 return title.insert(0, "AXTitle: "); | 320 return title.insert(0, "AXTitle: "); |
321 } | 321 } |
322 | 322 |
323 string getOrientation(const WebAccessibilityObject& object) | 323 string getOrientation(const WebAXObject& object) |
324 { | 324 { |
325 if (object.isVertical()) | 325 if (object.isVertical()) |
326 return "AXOrientation: AXVerticalOrientation"; | 326 return "AXOrientation: AXVerticalOrientation"; |
327 | 327 |
328 return "AXOrientation: AXHorizontalOrientation"; | 328 return "AXOrientation: AXHorizontalOrientation"; |
329 } | 329 } |
330 | 330 |
331 string getValueDescription(const WebAccessibilityObject& object) | 331 string getValueDescription(const WebAXObject& object) |
332 { | 332 { |
333 string valueDescription = object.valueDescription().utf8(); | 333 string valueDescription = object.valueDescription().utf8(); |
334 return valueDescription.insert(0, "AXValueDescription: "); | 334 return valueDescription.insert(0, "AXValueDescription: "); |
335 } | 335 } |
336 | 336 |
337 string getAttributes(const WebAccessibilityObject& object) | 337 string getAttributes(const WebAXObject& object) |
338 { | 338 { |
339 // FIXME: Concatenate all attributes of the AccessibilityObject. | 339 // FIXME: Concatenate all attributes of the AccessibilityObject. |
340 string attributes(getTitle(object)); | 340 string attributes(getTitle(object)); |
341 attributes.append("\n"); | 341 attributes.append("\n"); |
342 attributes.append(getRole(object)); | 342 attributes.append(getRole(object)); |
343 attributes.append("\n"); | 343 attributes.append("\n"); |
344 attributes.append(getDescription(object)); | 344 attributes.append(getDescription(object)); |
345 return attributes; | 345 return attributes; |
346 } | 346 } |
347 | 347 |
348 | 348 |
349 // Collects attributes into a string, delimited by dashes. Used by all methods | 349 // Collects attributes into a string, delimited by dashes. Used by all methods |
350 // that output lists of attributes: attributesOfLinkedUIElementsCallback, | 350 // that output lists of attributes: attributesOfLinkedUIElementsCallback, |
351 // AttributesOfChildrenCallback, etc. | 351 // AttributesOfChildrenCallback, etc. |
352 class AttributesCollector { | 352 class AttributesCollector { |
353 public: | 353 public: |
354 void collectAttributes(const WebAccessibilityObject& object) | 354 void collectAttributes(const WebAXObject& object) |
355 { | 355 { |
356 m_attributes.append("\n------------\n"); | 356 m_attributes.append("\n------------\n"); |
357 m_attributes.append(getAttributes(object)); | 357 m_attributes.append(getAttributes(object)); |
358 } | 358 } |
359 | 359 |
360 string attributes() const { return m_attributes; } | 360 string attributes() const { return m_attributes; } |
361 | 361 |
362 private: | 362 private: |
363 string m_attributes; | 363 string m_attributes; |
364 }; | 364 }; |
365 | 365 |
366 } | 366 } |
367 | 367 |
368 AccessibilityUIElement::AccessibilityUIElement(const WebAccessibilityObject& obj
ect, Factory* factory) | 368 AccessibilityUIElement::AccessibilityUIElement(const WebAXObject& object, Factor
y* factory) |
369 : m_accessibilityObject(object) | 369 : m_accessibilityObject(object) |
370 , m_factory(factory) | 370 , m_factory(factory) |
371 { | 371 { |
372 | 372 |
373 WEBKIT_ASSERT(factory); | 373 WEBKIT_ASSERT(factory); |
374 | 374 |
375 // | 375 // |
376 // Properties | 376 // Properties |
377 // | 377 // |
378 | 378 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 bindMethod("scrollToGlobalPoint", &AccessibilityUIElement::scrollToGlobalPoi
ntCallback); | 460 bindMethod("scrollToGlobalPoint", &AccessibilityUIElement::scrollToGlobalPoi
ntCallback); |
461 | 461 |
462 bindFallbackMethod(&AccessibilityUIElement::fallbackCallback); | 462 bindFallbackMethod(&AccessibilityUIElement::fallbackCallback); |
463 } | 463 } |
464 | 464 |
465 AccessibilityUIElement* AccessibilityUIElement::getChildAtIndex(unsigned index) | 465 AccessibilityUIElement* AccessibilityUIElement::getChildAtIndex(unsigned index) |
466 { | 466 { |
467 return m_factory->getOrCreate(accessibilityObject().childAt(index)); | 467 return m_factory->getOrCreate(accessibilityObject().childAt(index)); |
468 } | 468 } |
469 | 469 |
470 bool AccessibilityUIElement::isEqual(const WebKit::WebAccessibilityObject& other
) | 470 bool AccessibilityUIElement::isEqual(const WebKit::WebAXObject& other) |
471 { | 471 { |
472 return accessibilityObject().equals(other); | 472 return accessibilityObject().equals(other); |
473 } | 473 } |
474 | 474 |
475 void AccessibilityUIElement::notificationReceived(const char* notificationName) | 475 void AccessibilityUIElement::notificationReceived(const char* notificationName) |
476 { | 476 { |
477 size_t callbackCount = m_notificationCallbacks.size(); | 477 size_t callbackCount = m_notificationCallbacks.size(); |
478 for (size_t i = 0; i < callbackCount; i++) { | 478 for (size_t i = 0; i < callbackCount; i++) { |
479 CppVariant notificationNameArgument; | 479 CppVariant notificationNameArgument; |
480 notificationNameArgument.set(notificationName); | 480 notificationNameArgument.set(notificationName); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 | 529 |
530 void AccessibilityUIElement::heightGetterCallback(CppVariant* result) | 530 void AccessibilityUIElement::heightGetterCallback(CppVariant* result) |
531 { | 531 { |
532 result->set(accessibilityObject().boundingBoxRect().height); | 532 result->set(accessibilityObject().boundingBoxRect().height); |
533 } | 533 } |
534 | 534 |
535 void AccessibilityUIElement::intValueGetterCallback(CppVariant* result) | 535 void AccessibilityUIElement::intValueGetterCallback(CppVariant* result) |
536 { | 536 { |
537 if (accessibilityObject().supportsRangeValue()) | 537 if (accessibilityObject().supportsRangeValue()) |
538 result->set(accessibilityObject().valueForRange()); | 538 result->set(accessibilityObject().valueForRange()); |
539 else if (accessibilityObject().roleValue() == WebAccessibilityRoleHeading) | 539 else if (accessibilityObject().role() == WebAXRoleHeading) |
540 result->set(accessibilityObject().headingLevel()); | 540 result->set(accessibilityObject().headingLevel()); |
541 else | 541 else |
542 result->set(atoi(accessibilityObject().stringValue().utf8().data())); | 542 result->set(atoi(accessibilityObject().stringValue().utf8().data())); |
543 } | 543 } |
544 | 544 |
545 void AccessibilityUIElement::minValueGetterCallback(CppVariant* result) | 545 void AccessibilityUIElement::minValueGetterCallback(CppVariant* result) |
546 { | 546 { |
547 result->set(accessibilityObject().minValueForRange()); | 547 result->set(accessibilityObject().minValueForRange()); |
548 } | 548 } |
549 | 549 |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
776 void AccessibilityUIElement::elementAtPointCallback(const CppArgumentList& argum
ents, CppVariant* result) | 776 void AccessibilityUIElement::elementAtPointCallback(const CppArgumentList& argum
ents, CppVariant* result) |
777 { | 777 { |
778 result->setNull(); | 778 result->setNull(); |
779 | 779 |
780 if (arguments.size() != 2 || !arguments[0].isNumber() || !arguments[1].isNum
ber()) | 780 if (arguments.size() != 2 || !arguments[0].isNumber() || !arguments[1].isNum
ber()) |
781 return; | 781 return; |
782 | 782 |
783 int x = arguments[0].toInt32(); | 783 int x = arguments[0].toInt32(); |
784 int y = arguments[1].toInt32(); | 784 int y = arguments[1].toInt32(); |
785 WebPoint point(x, y); | 785 WebPoint point(x, y); |
786 WebAccessibilityObject obj = accessibilityObject().hitTest(point); | 786 WebAXObject obj = accessibilityObject().hitTest(point); |
787 if (obj.isNull()) | 787 if (obj.isNull()) |
788 return; | 788 return; |
789 | 789 |
790 result->set(*(m_factory->getOrCreate(obj)->getAsCppVariant())); | 790 result->set(*(m_factory->getOrCreate(obj)->getAsCppVariant())); |
791 } | 791 } |
792 | 792 |
793 void AccessibilityUIElement::attributesOfColumnHeadersCallback(const CppArgument
List&, CppVariant* result) | 793 void AccessibilityUIElement::attributesOfColumnHeadersCallback(const CppArgument
List&, CppVariant* result) |
794 { | 794 { |
795 result->setNull(); | 795 result->setNull(); |
796 } | 796 } |
(...skipping 18 matching lines...) Expand all Loading... |
815 result->setNull(); | 815 result->setNull(); |
816 } | 816 } |
817 | 817 |
818 void AccessibilityUIElement::attributesOfHeaderCallback(const CppArgumentList&,
CppVariant* result) | 818 void AccessibilityUIElement::attributesOfHeaderCallback(const CppArgumentList&,
CppVariant* result) |
819 { | 819 { |
820 result->setNull(); | 820 result->setNull(); |
821 } | 821 } |
822 | 822 |
823 void AccessibilityUIElement::tableHeaderCallback(const CppArgumentList&, CppVari
ant* result) | 823 void AccessibilityUIElement::tableHeaderCallback(const CppArgumentList&, CppVari
ant* result) |
824 { | 824 { |
825 WebAccessibilityObject obj = accessibilityObject().headerContainerObject(); | 825 WebAXObject obj = accessibilityObject().headerContainerObject(); |
826 if (obj.isNull()) { | 826 if (obj.isNull()) { |
827 result->setNull(); | 827 result->setNull(); |
828 return; | 828 return; |
829 } | 829 } |
830 | 830 |
831 result->set(*(m_factory->getOrCreate(obj)->getAsCppVariant())); | 831 result->set(*(m_factory->getOrCreate(obj)->getAsCppVariant())); |
832 } | 832 } |
833 | 833 |
834 void AccessibilityUIElement::indexInTableCallback(const CppArgumentList&, CppVar
iant* result) | 834 void AccessibilityUIElement::indexInTableCallback(const CppArgumentList&, CppVar
iant* result) |
835 { | 835 { |
(...skipping 19 matching lines...) Expand all Loading... |
855 result->set(std::string(buffer)); | 855 result->set(std::string(buffer)); |
856 } | 856 } |
857 | 857 |
858 void AccessibilityUIElement::cellForColumnAndRowCallback(const CppArgumentList&
arguments, CppVariant* result) | 858 void AccessibilityUIElement::cellForColumnAndRowCallback(const CppArgumentList&
arguments, CppVariant* result) |
859 { | 859 { |
860 if (arguments.size() != 2 || !arguments[0].isNumber() || !arguments[1].isNum
ber()) | 860 if (arguments.size() != 2 || !arguments[0].isNumber() || !arguments[1].isNum
ber()) |
861 return; | 861 return; |
862 | 862 |
863 int column = arguments[0].toInt32(); | 863 int column = arguments[0].toInt32(); |
864 int row = arguments[1].toInt32(); | 864 int row = arguments[1].toInt32(); |
865 WebAccessibilityObject obj = accessibilityObject().cellForColumnAndRow(colum
n, row); | 865 WebAXObject obj = accessibilityObject().cellForColumnAndRow(column, row); |
866 if (obj.isNull()) { | 866 if (obj.isNull()) { |
867 result->setNull(); | 867 result->setNull(); |
868 return; | 868 return; |
869 } | 869 } |
870 | 870 |
871 result->set(*(m_factory->getOrCreate(obj)->getAsCppVariant())); | 871 result->set(*(m_factory->getOrCreate(obj)->getAsCppVariant())); |
872 } | 872 } |
873 | 873 |
874 void AccessibilityUIElement::titleUIElementCallback(const CppArgumentList&, CppV
ariant* result) | 874 void AccessibilityUIElement::titleUIElementCallback(const CppArgumentList&, CppV
ariant* result) |
875 { | 875 { |
876 WebAccessibilityObject obj = accessibilityObject().titleUIElement(); | 876 WebAXObject obj = accessibilityObject().titleUIElement(); |
877 if (obj.isNull()) { | 877 if (obj.isNull()) { |
878 result->setNull(); | 878 result->setNull(); |
879 return; | 879 return; |
880 } | 880 } |
881 | 881 |
882 result->set(*(m_factory->getOrCreate(obj)->getAsCppVariant())); | 882 result->set(*(m_factory->getOrCreate(obj)->getAsCppVariant())); |
883 } | 883 } |
884 | 884 |
885 void AccessibilityUIElement::setSelectedTextRangeCallback(const CppArgumentList&
arguments, CppVariant* result) | 885 void AccessibilityUIElement::setSelectedTextRangeCallback(const CppArgumentList&
arguments, CppVariant* result) |
886 { | 886 { |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1034 accessibilityObject().scrollToGlobalPoint(WebPoint(x, y)); | 1034 accessibilityObject().scrollToGlobalPoint(WebPoint(x, y)); |
1035 result->setNull(); | 1035 result->setNull(); |
1036 } | 1036 } |
1037 | 1037 |
1038 void AccessibilityUIElement::fallbackCallback(const CppArgumentList &, CppVarian
t* result) | 1038 void AccessibilityUIElement::fallbackCallback(const CppArgumentList &, CppVarian
t* result) |
1039 { | 1039 { |
1040 // FIXME: Implement this. | 1040 // FIXME: Implement this. |
1041 result->setNull(); | 1041 result->setNull(); |
1042 } | 1042 } |
1043 | 1043 |
1044 RootAccessibilityUIElement::RootAccessibilityUIElement(const WebAccessibilityObj
ect &object, Factory *factory) | 1044 RootAccessibilityUIElement::RootAccessibilityUIElement(const WebAXObject &object
, Factory *factory) |
1045 : AccessibilityUIElement(object, factory) { } | 1045 : AccessibilityUIElement(object, factory) { } |
1046 | 1046 |
1047 AccessibilityUIElement* RootAccessibilityUIElement::getChildAtIndex(unsigned ind
ex) | 1047 AccessibilityUIElement* RootAccessibilityUIElement::getChildAtIndex(unsigned ind
ex) |
1048 { | 1048 { |
1049 if (index) | 1049 if (index) |
1050 return 0; | 1050 return 0; |
1051 | 1051 |
1052 return factory()->getOrCreate(accessibilityObject()); | 1052 return factory()->getOrCreate(accessibilityObject()); |
1053 } | 1053 } |
1054 | 1054 |
1055 | 1055 |
1056 AccessibilityUIElementList ::~AccessibilityUIElementList() | 1056 AccessibilityUIElementList ::~AccessibilityUIElementList() |
1057 { | 1057 { |
1058 clear(); | 1058 clear(); |
1059 } | 1059 } |
1060 | 1060 |
1061 void AccessibilityUIElementList::clear() | 1061 void AccessibilityUIElementList::clear() |
1062 { | 1062 { |
1063 for (ElementList::iterator i = m_elements.begin(); i != m_elements.end(); ++
i) | 1063 for (ElementList::iterator i = m_elements.begin(); i != m_elements.end(); ++
i) |
1064 delete (*i); | 1064 delete (*i); |
1065 m_elements.clear(); | 1065 m_elements.clear(); |
1066 } | 1066 } |
1067 | 1067 |
1068 AccessibilityUIElement* AccessibilityUIElementList::getOrCreate(const WebAccessi
bilityObject& object) | 1068 AccessibilityUIElement* AccessibilityUIElementList::getOrCreate(const WebAXObjec
t& object) |
1069 { | 1069 { |
1070 if (object.isNull()) | 1070 if (object.isNull()) |
1071 return 0; | 1071 return 0; |
1072 | 1072 |
1073 size_t elementCount = m_elements.size(); | 1073 size_t elementCount = m_elements.size(); |
1074 for (size_t i = 0; i < elementCount; i++) { | 1074 for (size_t i = 0; i < elementCount; i++) { |
1075 if (m_elements[i]->isEqual(object)) | 1075 if (m_elements[i]->isEqual(object)) |
1076 return m_elements[i]; | 1076 return m_elements[i]; |
1077 } | 1077 } |
1078 | 1078 |
1079 AccessibilityUIElement* element = new AccessibilityUIElement(object, this); | 1079 AccessibilityUIElement* element = new AccessibilityUIElement(object, this); |
1080 m_elements.push_back(element); | 1080 m_elements.push_back(element); |
1081 return element; | 1081 return element; |
1082 } | 1082 } |
1083 | 1083 |
1084 AccessibilityUIElement* AccessibilityUIElementList::createRoot(const WebAccessib
ilityObject& object) | 1084 AccessibilityUIElement* AccessibilityUIElementList::createRoot(const WebAXObject
& object) |
1085 { | 1085 { |
1086 AccessibilityUIElement* element = new RootAccessibilityUIElement(object, thi
s); | 1086 AccessibilityUIElement* element = new RootAccessibilityUIElement(object, thi
s); |
1087 m_elements.push_back(element); | 1087 m_elements.push_back(element); |
1088 return element; | 1088 return element; |
1089 } | 1089 } |
1090 | 1090 |
1091 } | 1091 } |
OLD | NEW |