Changeset 102378 in webkit
- Timestamp:
- Dec 8, 2011 1:27:16 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 5 added
- 24 edited
- 3 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r102358 r102378 1 2011-12-08 Dominic Mazzoni <dmazzoni@google.com> 2 3 Accessibility: AccessibilityController should support listening to notifications on all elements. 4 https://bugs.webkit.org/show_bug.cgi?id=72866 5 6 Previously, the Mac implementation of AccessibilityUIElement.addNotificationListener 7 incorrectly triggered on notifications from all elements. Now it only triggers on 8 notifications from the correct element, and a new addNotificationListener method 9 in AccessibilityController can be used to trigger on notifications from all elements. 10 11 Updates 2 tests that depended on the old incorrect behavior. 12 13 Reviewed by Chris Fleizach. 14 15 * accessibility/notification-listeners.html: Added. 16 * platform/chromium/accessibility/notification-listeners-expected.txt: Added. 17 * platform/gtk/Skipped: 18 * platform/mac/accessibility/aria-expanded-notifications.html: 19 * platform/mac/accessibility/aria-listbox-selectedchildren-change.html: 20 * platform/mac/accessibility/notification-listeners-expected.txt: Added. 21 * platform/win/Skipped: 22 1 23 2011-12-08 Andrey Kosyakov <caseq@chromium.org> 2 24 -
trunk/LayoutTests/platform/gtk/Skipped
r102327 r102378 424 424 accessibility/lists.html 425 425 accessibility/loading-iframe-updates-axtree.html 426 accessibility/notification-listeners.html 426 427 accessibility/onclick-handlers.html 427 428 accessibility/placeholder.html -
trunk/LayoutTests/platform/mac/accessibility/aria-expanded-notifications.html
r100488 r102378 30 30 var notifyName = 0; 31 31 // The order of notifications should be Row Count, Row Collapsed, Row Count, Row Expanded 32 function notifyCallback( notification) {32 function notifyCallback(element, notification) { 33 33 notifyName = notification; 34 34 document.getElementById("notifications").innerHTML += "Notification: " + notifyName + "<br>"; 35 35 if (notifyCount == 3) { 36 a xTree.removeNotificationListener();36 accessibilityController.removeNotificationListener(); 37 37 window.layoutTestController.notifyDone(); 38 38 } … … 48 48 axTree = window.accessibilityController.focusedElement; 49 49 50 var addedNotification = a xTree.addNotificationListener(notifyCallback);50 var addedNotification = accessibilityController.addNotificationListener(notifyCallback); 51 51 shouldBe("addedNotification", "true"); 52 52 -
trunk/LayoutTests/platform/mac/accessibility/aria-listbox-selectedchildren-change.html
r99258 r102378 21 21 var listbox = 0; 22 22 var notificationCount = 0; 23 function ariaCallback( notification) {23 function ariaCallback(element, notification) { 24 24 if (notification == "AXSelectedChildrenChanged") { 25 25 notificationCount++; … … 27 27 // We should get a total of 4 live region changes. 28 28 if (notificationCount == 2) { 29 listbox.removeNotificationListener();29 window.accessibilityController.removeNotificationListener(); 30 30 window.layoutTestController.notifyDone(); 31 31 } … … 39 39 listbox = window.accessibilityController.focusedElement; 40 40 41 var addedNotification = listbox.addNotificationListener(ariaCallback);41 var addedNotification = window.accessibilityController.addNotificationListener(ariaCallback); 42 42 shouldBe("addedNotification", "true"); 43 43 -
trunk/LayoutTests/platform/win/Skipped
r102281 r102378 583 583 accessibility/non-data-table-cell-title-ui-element.html 584 584 accessibility/non-native-image-crash.html 585 accessibility/notification-listeners.html 585 586 accessibility/onclick-handlers.html 586 587 accessibility/aria-option-role.html -
trunk/Source/WebCore/ChangeLog
r102375 r102378 1 2011-12-08 Dominic Mazzoni <dmazzoni@google.com> 2 3 AccessibilityController should support listening to notifications on all elements. 4 https://bugs.webkit.org/show_bug.cgi?id=72866 5 6 Changes accessibilitySetShouldRepostNotifications from an instance method 7 into a class method so that it can be used for global notification listeners, 8 not just for listeners on a particular object. 9 10 Reviewed by Chris Fleizach. 11 12 Test: accessibility/notification-listeners.html 13 14 * accessibility/mac/WebAccessibilityObjectWrapper.h: 15 * accessibility/mac/WebAccessibilityObjectWrapper.mm: 16 (+[WebAccessibilityObjectWrapper accessibilitySetShouldRepostNotifications:]): 17 (-[WebAccessibilityObjectWrapper accessibilityPostedNotification:]): 18 1 19 2011-12-08 Vsevolod Vlasov <vsevik@chromium.org> 2 20 -
trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.h
r95901 r102378 42 42 - (void)detach; 43 43 - (WebCore::AccessibilityObject*)accessibilityObject; 44 + (void)accessibilitySetShouldRepostNotifications:(BOOL)repost; 44 45 45 46 // Used to inform an element when a notification is posted for it. Used by DRT. -
trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm
r100666 r102378 3178 3178 // This is set by DRT when it wants to listen for notifications. 3179 3179 static BOOL accessibilityShouldRepostNotifications; 3180 -(void)accessibilitySetShouldRepostNotifications:(BOOL)repost3180 + (void)accessibilitySetShouldRepostNotifications:(BOOL)repost 3181 3181 { 3182 3182 accessibilityShouldRepostNotifications = repost; … … 3187 3187 if (accessibilityShouldRepostNotifications) { 3188 3188 NSDictionary* userInfo = [NSDictionary dictionaryWithObjectsAndKeys:notificationName, @"notificationName", nil]; 3189 [[NSNotificationCenter defaultCenter] postNotificationName:@"AXDRTNotification" object: niluserInfo:userInfo];3189 [[NSNotificationCenter defaultCenter] postNotificationName:@"AXDRTNotification" object:self userInfo:userInfo]; 3190 3190 } 3191 3191 } -
trunk/Tools/ChangeLog
r102363 r102378 1 2011-12-08 Dominic Mazzoni <dmazzoni@google.com> 2 3 Accessibility: AccessibilityController should support listening to notifications on all elements. 4 https://bugs.webkit.org/show_bug.cgi?id=72866 5 6 Adds addNotificationListener and removeNotificationListener methods 7 to AccessibilityController, to listen to notifications on any element 8 rather than a specific element. Mac (DRT and WKTR) and Chromium (DRT) 9 implementations are all contained in this change. 10 11 On Mac, refactors AccessibilityNotificationHandler into its own 12 source file that can be used by both AccessibilityController and 13 AccessibilityUIElement. (Both DRT and WKTR.) 14 15 Reviewed by Chris Fleizach. 16 17 * DumpRenderTree/AccessibilityController.cpp: 18 (addNotificationListenerCallback): 19 (removeNotificationListenerCallback): 20 (AccessibilityController::getJSClass): 21 * DumpRenderTree/AccessibilityController.h: 22 * DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj: 23 * DumpRenderTree/chromium/AccessibilityController.cpp: 24 (AccessibilityController::AccessibilityController): 25 (AccessibilityController::notificationReceived): 26 (AccessibilityController::addNotificationListenerCallback): 27 (AccessibilityController::removeNotificationListenerCallback): 28 * DumpRenderTree/chromium/AccessibilityController.h: 29 * DumpRenderTree/gtk/AccessibilityControllerGtk.cpp: 30 (AccessibilityController::addNotificationListener): 31 (AccessibilityController::removeNotificationListener): 32 * DumpRenderTree/mac/AccessibilityControllerMac.mm: 33 (AccessibilityController::~AccessibilityController): 34 (AccessibilityController::addNotificationListener): 35 (AccessibilityController::removeNotificationListener): 36 * DumpRenderTree/mac/AccessibilityNotificationHandler.h: Added. 37 * DumpRenderTree/mac/AccessibilityNotificationHandler.mm: Added. 38 (-[NSString createJSStringRef]): 39 (-[AccessibilityNotificationHandler init]): 40 (-[AccessibilityNotificationHandler setPlatformElement:]): 41 (-[AccessibilityNotificationHandler dealloc]): 42 (-[AccessibilityNotificationHandler setCallback:]): 43 (-[AccessibilityNotificationHandler startObserving]): 44 (-[AccessibilityNotificationHandler _notificationReceived:]): 45 * DumpRenderTree/mac/AccessibilityUIElementMac.mm: 46 (AccessibilityUIElement::addNotificationListener): 47 * DumpRenderTree/win/AccessibilityControllerWin.cpp: 48 (notificationListenerProc): 49 (AccessibilityController::addNotificationListener): 50 (AccessibilityController::removeNotificationListener): 51 (AccessibilityController::winNotificationReceived): 52 (AccessibilityController::winAddNotificationListener): 53 * DumpRenderTree/win/AccessibilityUIElementWin.cpp: 54 (AccessibilityUIElement::addNotificationListener): 55 * WebKitTestRunner/InjectedBundle/AccessibilityController.cpp: 56 (WTR::AccessibilityController::addNotificationListener): 57 (WTR::AccessibilityController::removeNotificationListener): 58 * WebKitTestRunner/InjectedBundle/AccessibilityController.h: 59 (WTR::AccessibilityController::logAccessibilityEvents): 60 * WebKitTestRunner/InjectedBundle/AccessibilityTextMarker.cpp: 61 (WTR::AccessibilityTextMarker::AccessibilityTextMarker): 62 * WebKitTestRunner/InjectedBundle/AccessibilityTextMarkerRange.cpp: 63 (WTR::AccessibilityTextMarkerRange::AccessibilityTextMarkerRange): 64 * WebKitTestRunner/InjectedBundle/Bindings/AccessibilityController.idl: 65 * WebKitTestRunner/InjectedBundle/mac/AccessibilityControllerMac.mm: Added. 66 (WTR::AccessibilityController::addNotificationListener): 67 (WTR::AccessibilityController::removeNotificationListener): 68 * WebKitTestRunner/InjectedBundle/mac/AccessibilityNotificationHandler.h: Added. 69 * WebKitTestRunner/InjectedBundle/mac/AccessibilityNotificationHandler.mm: Added. 70 (-[NSString createJSStringRef]): 71 (-[AccessibilityNotificationHandler init]): 72 (-[AccessibilityNotificationHandler setPlatformElement:]): 73 (-[AccessibilityNotificationHandler dealloc]): 74 (-[AccessibilityNotificationHandler setCallback:]): 75 (-[AccessibilityNotificationHandler startObserving]): 76 (-[AccessibilityNotificationHandler _notificationReceived:]): 77 * WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm: 78 (WTR::AccessibilityUIElement::AccessibilityUIElement): 79 (WTR::AccessibilityUIElement::verticalScrollbar): 80 (WTR::AccessibilityUIElement::addNotificationListener): 81 * WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj: 82 1 83 2011-12-08 Csaba Osztrogonác <ossy@webkit.org> 2 84 -
trunk/Tools/DumpRenderTree/AccessibilityController.cpp
r78179 r102378 98 98 } 99 99 100 static JSValueRef addNotificationListenerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) 101 { 102 if (argumentCount != 1) 103 return JSValueMakeBoolean(context, false); 104 105 AccessibilityController* controller = static_cast<AccessibilityController*>(JSObjectGetPrivate(thisObject)); 106 JSObjectRef callback = JSValueToObject(context, arguments[0], exception); 107 bool succeeded = controller->addNotificationListener(callback); 108 return JSValueMakeBoolean(context, succeeded); 109 } 110 111 static JSValueRef removeNotificationListenerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) 112 { 113 AccessibilityController* controller = static_cast<AccessibilityController*>(JSObjectGetPrivate(thisObject)); 114 controller->removeNotificationListener(); 115 return JSValueMakeUndefined(context); 116 } 117 100 118 JSClassRef AccessibilityController::getJSClass() 101 119 { … … 106 124 { "logAccessibilityEvents", logAccessibilityEventsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, 107 125 { "elementAtPoint", getElementAtPointCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, 126 { "addNotificationListener", addNotificationListenerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, 127 { "removeNotificationListener", removeNotificationListenerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, 108 128 { 0, 0, 0 } 109 129 }; -
trunk/Tools/DumpRenderTree/AccessibilityController.h
r91219 r102378 55 55 void resetToConsistentState(); 56 56 57 void addNotificationListener(PlatformUIElement, JSObjectRef functionCallback); 58 void notificationReceived(PlatformUIElement, const std::string& eventName); 57 // Global notification listener, captures notifications on any object. 58 bool addNotificationListener(JSObjectRef functionCallback); 59 void removeNotificationListener(); 60 61 #if PLATFORM(WIN) 62 // Helper methods so this class can add the listeners on behalf of AccessibilityUIElement. 63 void winAddNotificationListener(PlatformUIElement, JSObjectRef functionCallback); 64 void winNotificationReceived(PlatformUIElement, const std::string& eventName); 65 #endif 59 66 60 67 private: … … 70 77 HashMap<PlatformUIElement, JSObjectRef> m_notificationListeners; 71 78 #endif 79 80 #if PLATFORM(MAC) 81 RetainPtr<NotificationHandler> m_globalNotificationHandler; 82 #endif 72 83 }; 73 84 -
trunk/Tools/DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj
r99134 r102378 78 78 5DB9ACA00F722C3600684641 /* WebKitWeightWatcher900.ttf in Copy Font Files */ = {isa = PBXBuildFile; fileRef = 375F09790DAC3CB600C8B4E5 /* WebKitWeightWatcher900.ttf */; }; 79 79 5DE8AE4413A2C15900D6A37D /* libWebCoreTestSupport.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DE8AE4313A2C15800D6A37D /* libWebCoreTestSupport.dylib */; }; 80 80045AED147718E7008290A8 /* AccessibilityNotificationHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 80045AEB147718E7008290A8 /* AccessibilityNotificationHandler.h */; }; 81 80045AEE147718E7008290A8 /* AccessibilityNotificationHandler.mm in Sources */ = {isa = PBXBuildFile; fileRef = 80045AEC147718E7008290A8 /* AccessibilityNotificationHandler.mm */; }; 80 82 8465E2C70FFA8DF2003B8342 /* PixelDumpSupport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8465E2C60FFA8DF2003B8342 /* PixelDumpSupport.cpp */; }; 81 83 933BF5AB0F93FA5C000F0441 /* PlainTextController.h in Headers */ = {isa = PBXBuildFile; fileRef = 933BF5A90F93FA5C000F0441 /* PlainTextController.h */; }; … … 259 261 53CBB831134E42F3001CE6A4 /* CyclicRedundancyCheck.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CyclicRedundancyCheck.h; sourceTree = "<group>"; }; 260 262 5DE8AE4313A2C15800D6A37D /* libWebCoreTestSupport.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libWebCoreTestSupport.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; 263 80045AEB147718E7008290A8 /* AccessibilityNotificationHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AccessibilityNotificationHandler.h; path = mac/AccessibilityNotificationHandler.h; sourceTree = "<group>"; }; 264 80045AEC147718E7008290A8 /* AccessibilityNotificationHandler.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AccessibilityNotificationHandler.mm; path = mac/AccessibilityNotificationHandler.mm; sourceTree = "<group>"; }; 261 265 8465E2C60FFA8DF2003B8342 /* PixelDumpSupport.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = PixelDumpSupport.cpp; sourceTree = "<group>"; }; 262 266 9335435F03D75502008635CE /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = WebKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; … … 439 443 isa = PBXGroup; 440 444 children = ( 445 80045AEB147718E7008290A8 /* AccessibilityNotificationHandler.h */, 446 80045AEC147718E7008290A8 /* AccessibilityNotificationHandler.mm */, 441 447 BCD08B390E1057EF00A7D0C1 /* AccessibilityController.cpp */, 442 448 BCD08A580E10496B00A7D0C1 /* AccessibilityController.h */, … … 680 686 3A5626CC131CA036002BE6D9 /* StorageTrackerDelegate.h in Headers */, 681 687 417DAA1D137B3E24007C57FB /* WebCoreTestSupport.h in Headers */, 688 80045AED147718E7008290A8 /* AccessibilityNotificationHandler.h in Headers */, 682 689 ); 683 690 runOnlyForDeploymentPostprocessing = 0; … … 880 887 29CFBA2E12273A1000BC30C0 /* AccessibilityTextMarkerMac.mm in Sources */, 881 888 3A5626CB131CA02A002BE6D9 /* StorageTrackerDelegate.mm in Sources */, 889 80045AEE147718E7008290A8 /* AccessibilityNotificationHandler.mm in Sources */, 882 890 ); 883 891 runOnlyForDeploymentPostprocessing = 0; -
trunk/Tools/DumpRenderTree/chromium/AccessibilityController.cpp
r102044 r102378 46 46 47 47 bindMethod("logAccessibilityEvents", &AccessibilityController::logAccessibilityEventsCallback); 48 bindMethod("addNotificationListener", &AccessibilityController::addNotificationListenerCallback); 49 bindMethod("removeNotificationListener", &AccessibilityController::removeNotificationListenerCallback); 48 50 49 51 bindProperty("focusedElement", &AccessibilityController::focusedElementGetterCallback); … … 94 96 void AccessibilityController::notificationReceived(const WebKit::WebAccessibilityObject& target, const char* notificationName) 95 97 { 98 // Call notification listeners on the element. 96 99 AccessibilityUIElement* element = m_elements.getOrCreate(target); 97 100 element->notificationReceived(notificationName); 101 102 // Call global notification listeners. 103 size_t callbackCount = m_notificationCallbacks.size(); 104 for (size_t i = 0; i < callbackCount; i++) { 105 CppVariant arguments[2]; 106 arguments[0].set(*element->getAsCppVariant()); 107 arguments[1].set(notificationName); 108 CppVariant invokeResult; 109 m_notificationCallbacks[i].invokeDefault(arguments, 2, invokeResult); 110 } 98 111 } 99 112 … … 101 114 { 102 115 m_logAccessibilityEvents = true; 116 result->setNull(); 117 } 118 119 void AccessibilityController::addNotificationListenerCallback(const CppArgumentList& arguments, CppVariant* result) 120 { 121 if (arguments.size() < 1 || !arguments[0].isObject()) { 122 result->setNull(); 123 return; 124 } 125 126 m_notificationCallbacks.push_back(arguments[0]); 127 result->setNull(); 128 } 129 130 void AccessibilityController::removeNotificationListenerCallback(const CppArgumentList&, CppVariant* result) 131 { 132 // FIXME: Implement this. 103 133 result->setNull(); 104 134 } -
trunk/Tools/DumpRenderTree/chromium/AccessibilityController.h
r97128 r102378 65 65 void logAccessibilityEventsCallback(const CppArgumentList&, CppVariant*); 66 66 void fallbackCallback(const CppArgumentList&, CppVariant*); 67 void addNotificationListenerCallback(const CppArgumentList&, CppVariant*); 68 void removeNotificationListenerCallback(const CppArgumentList&, CppVariant*); 67 69 68 70 void focusedElementGetterCallback(CppVariant*); … … 74 76 AccessibilityUIElementList m_elements; 75 77 78 std::vector<CppVariant> m_notificationCallbacks; 79 76 80 TestShell* m_shell; 77 81 }; -
trunk/Tools/DumpRenderTree/gtk/AccessibilityControllerGtk.cpp
r78244 r102378 98 98 } 99 99 100 void AccessibilityController::addNotificationListener(PlatformUIElement, JSObjectRef) 100 bool AccessibilityController::addNotificationListener(JSObjectRef) 101 { 102 return false; 103 } 104 105 void AccessibilityController::removeNotificationListener() 101 106 { 102 107 } 103 104 void AccessibilityController::notificationReceived(PlatformUIElement, const std::string&)105 {106 } -
trunk/Tools/DumpRenderTree/mac/AccessibilityControllerMac.mm
r80498 r102378 28 28 #import "AccessibilityController.h" 29 29 30 #import "AccessibilityNotificationHandler.h" 30 31 #import "AccessibilityUIElement.h" 31 32 #import <AppKit/NSColor.h> … … 41 42 AccessibilityController::~AccessibilityController() 42 43 { 44 // The notification handler should be nil because removeNotificationListener() should have been called in the test. 45 ASSERT(!m_globalNotificationHandler); 43 46 } 44 47 … … 82 85 } 83 86 84 void AccessibilityController::addNotificationListener(PlatformUIElement, JSObjectRef)87 bool AccessibilityController::addNotificationListener(JSObjectRef functionCallback) 85 88 { 89 if (!functionCallback) 90 return false; 91 92 // Mac programmers should not be adding more than one global notification listener. 93 // Other platforms may be different. 94 if (m_globalNotificationHandler) 95 return false; 96 m_globalNotificationHandler = [[AccessibilityNotificationHandler alloc] init]; 97 [m_globalNotificationHandler.get() setCallback:functionCallback]; 98 [m_globalNotificationHandler.get() startObserving]; 99 100 return true; 86 101 } 87 102 88 void AccessibilityController:: notificationReceived(PlatformUIElement, const std::string&)103 void AccessibilityController::removeNotificationListener() 89 104 { 105 // Mac programmers should not be trying to remove a listener that's already removed. 106 ASSERT(m_globalNotificationHandler); 107 m_globalNotificationHandler.clear(); 90 108 } -
trunk/Tools/DumpRenderTree/mac/AccessibilityNotificationHandler.h
r102377 r102378 1 1 /* 2 * Copyright (C) 201 0Google Inc. All rights reserved.2 * Copyright (C) 2011 Google Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 29 29 */ 30 30 31 #ifndef Accessibility Controller_h32 #define Accessibility Controller_h31 #ifndef AccessibilityNotificationHandler_h 32 #define AccessibilityNotificationHandler_h 33 33 34 #include "AccessibilityUIElement.h" 35 #include "CppBoundClass.h" 34 #import <JavaScriptCore/JSObjectRef.h> 36 35 37 namespace WebKit {38 class WebAccessibilityObject;39 class WebFrame;36 @interface AccessibilityNotificationHandler : NSObject { 37 id m_platformElement; 38 JSObjectRef m_notificationFunctionCallback; 40 39 } 41 40 42 class TestShell; 41 - (id)init; 42 - (void)setPlatformElement:(id)platformElement; 43 - (void)setCallback:(JSObjectRef)callback; 44 - (void)startObserving; 43 45 44 class AccessibilityController : public CppBoundClass { 45 public: 46 explicit AccessibilityController(TestShell*); 46 @end 47 47 48 // Shadow to include accessibility initialization. 49 void bindToJavascript(WebKit::WebFrame*, const WebKit::WebString& classname); 50 void reset(); 51 52 void setFocusedElement(const WebKit::WebAccessibilityObject&); 53 AccessibilityUIElement* getFocusedElement(); 54 AccessibilityUIElement* getRootElement(); 55 56 bool shouldLogAccessibilityEvents(); 57 58 void notificationReceived(const WebKit::WebAccessibilityObject& target, const char* notificationName); 59 60 private: 61 // If true, will log all accessibility notifications. 62 bool m_logAccessibilityEvents; 63 64 // Bound methods and properties 65 void logAccessibilityEventsCallback(const CppArgumentList&, CppVariant*); 66 void fallbackCallback(const CppArgumentList&, CppVariant*); 67 68 void focusedElementGetterCallback(CppVariant*); 69 void rootElementGetterCallback(CppVariant*); 70 71 WebKit::WebAccessibilityObject m_focusedElement; 72 WebKit::WebAccessibilityObject m_rootElement; 73 74 AccessibilityUIElementList m_elements; 75 76 TestShell* m_shell; 77 }; 78 79 #endif // AccessibilityController_h 48 #endif // AccessibilityNotificationHandler_h -
trunk/Tools/DumpRenderTree/mac/AccessibilityUIElementMac.mm
r101573 r102378 26 26 #import "config.h" 27 27 #import "DumpRenderTree.h" 28 #import "AccessibilityNotificationHandler.h" 28 29 #import "AccessibilityUIElement.h" 29 30 … … 61 62 @interface NSObject (WebKitAccessibilityAdditions) 62 63 - (NSArray *)accessibilityArrayAttributeValues:(NSString *)attribute index:(NSUInteger)index maxCount:(NSUInteger)maxCount; 63 - (void)accessibilitySetShouldRepostNotifications:(BOOL)repost;64 64 - (NSUInteger)accessibilityIndexOfChild:(id)child; 65 65 - (NSUInteger)accessibilityArrayAttributeCount:(NSString *)attribute; … … 85 85 { 86 86 return JSStringCreateWithCFString((CFStringRef)self); 87 }88 89 @end90 91 @interface AccessibilityNotificationHandler : NSObject92 {93 id m_platformElement;94 JSObjectRef m_notificationFunctionCallback;95 }96 97 @end98 99 @implementation AccessibilityNotificationHandler100 101 - (id)initWithPlatformElement:(id)platformElement102 {103 self = [super init];104 105 m_platformElement = platformElement;106 107 // Once an object starts requesting notifications, it's on for the duration of the program.108 // This is to avoid any race conditions between tests turning this flag on and off. Instead109 // AccessibilityNotificationHandler can just listen when they want to.110 [m_platformElement accessibilitySetShouldRepostNotifications:YES];111 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_notificationReceived:) name:@"AXDRTNotification" object:nil];112 113 return self;114 }115 116 - (void)dealloc117 {118 [[NSNotificationCenter defaultCenter] removeObserver:self];119 JSValueUnprotect([mainFrame globalContext], m_notificationFunctionCallback);120 m_notificationFunctionCallback = 0;121 122 [super dealloc];123 }124 125 - (void)_notificationReceived:(NSNotification *)notification126 {127 NSString *notificationName = [[notification userInfo] objectForKey:@"notificationName"];128 if (!notificationName)129 return;130 131 JSRetainPtr<JSStringRef> jsNotification(Adopt, [notificationName createJSStringRef]);132 JSValueRef argument = JSValueMakeString([mainFrame globalContext], jsNotification.get());133 JSObjectCallAsFunction([mainFrame globalContext], m_notificationFunctionCallback, 0, 1, &argument, 0);134 }135 136 - (void)setCallback:(JSObjectRef)callback137 {138 if (!callback)139 return;140 141 // Release the old callback.142 if (m_notificationFunctionCallback)143 JSValueUnprotect([mainFrame globalContext], m_notificationFunctionCallback);144 145 m_notificationFunctionCallback = callback;146 JSValueProtect([mainFrame globalContext], m_notificationFunctionCallback);147 87 } 148 88 … … 1230 1170 if (m_notificationHandler) 1231 1171 return false; 1232 m_notificationHandler = [[AccessibilityNotificationHandler alloc] initWithPlatformElement:platformUIElement()]; 1172 m_notificationHandler = [[AccessibilityNotificationHandler alloc] init]; 1173 [m_notificationHandler setPlatformElement:platformUIElement()]; 1233 1174 [m_notificationHandler setCallback:functionCallback]; 1175 [m_notificationHandler startObserving]; 1234 1176 1235 1177 return true; -
trunk/Tools/DumpRenderTree/win/AccessibilityControllerWin.cpp
r91219 r102378 270 270 COMPtr<IAccessible> childAccessible(Query, childDispatch); 271 271 272 sharedFrameLoadDelegate->accessibilityController()-> notificationReceived(childAccessible, stringEvent(event));272 sharedFrameLoadDelegate->accessibilityController()->winNotificationReceived(childAccessible, stringEvent(event)); 273 273 274 274 VariantClear(&vChild); … … 282 282 } 283 283 284 void AccessibilityController::notificationReceived(PlatformUIElement element, const string& eventName) 284 bool AccessibilityController::addNotificationListener(JSObjectRef functionCallback) 285 { 286 return false; 287 } 288 289 void AccessibilityController::removeNotificationListener() 290 { 291 } 292 293 void AccessibilityController::winNotificationReceived(PlatformUIElement element, const string& eventName) 285 294 { 286 295 for (HashMap<PlatformUIElement, JSObjectRef>::iterator it = m_notificationListeners.begin(); it != m_notificationListeners.end(); ++it) { … … 312 321 } 313 322 314 void AccessibilityController:: addNotificationListener(PlatformUIElement element, JSObjectRef functionCallback)323 void AccessibilityController::winAddNotificationListener(PlatformUIElement element, JSObjectRef functionCallback) 315 324 { 316 325 if (!m_notificationsEventHook) -
trunk/Tools/DumpRenderTree/win/AccessibilityUIElementWin.cpp
r100892 r102378 614 614 return false; 615 615 616 sharedFrameLoadDelegate->accessibilityController()-> addNotificationListener(m_element, functionCallback);616 sharedFrameLoadDelegate->accessibilityController()->winAddNotificationListener(m_element, functionCallback); 617 617 return true; 618 618 } -
trunk/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.cpp
r100488 r102378 93 93 return uiElement->elementAtPoint(x, y); 94 94 } 95 96 // Unsupported methods on various platforms. As they're implemented on other platforms this list should be modified. 97 #if !PLATFORM(MAC) 98 bool AccessibilityController::addNotificationListener(JSValueRef) { return false; } 99 bool AccessibilityController::removeNotificationListener() { return false; } 100 #endif 95 101 96 102 } // namespace WTR -
trunk/Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.h
r100488 r102378 50 50 PassRefPtr<AccessibilityUIElement> elementAtPoint(int x, int y); 51 51 52 bool addNotificationListener(JSValueRef functionCallback); 53 bool removeNotificationListener(); 54 52 55 // Here for consistency with DRT. Not implemented because they don't do anything on the Mac. 53 56 void logFocusEvents() { } … … 55 58 void logScrollingStartEvents() { } 56 59 void logAccessibilityEvents() { } 57 void addNotificationListener(AccessibilityUIElement*, JSValueRef functionCallback) { }58 void notificationReceived(AccessibilityUIElement*, JSStringRef eventName) { }59 60 60 61 void resetToConsistentState() { } … … 62 63 private: 63 64 AccessibilityController(); 65 66 #if PLATFORM(MAC) 67 RetainPtr<NotificationHandler> m_globalNotificationHandler; 68 #endif 64 69 }; 65 70 -
trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/AccessibilityController.idl
r100488 r102378 31 31 AccessibilityUIElement elementAtPoint(in int x, in int y); 32 32 33 void addNotificationListener(in AccessibilityUIElement element,in object functionCallback);34 void notificationReceived(in AccessibilityUIElement element, in DOMString eventName);33 boolean addNotificationListener(in object functionCallback); 34 boolean removeNotificationListener(); 35 35 36 36 void logFocusEvents(); -
trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityControllerMac.mm
r102377 r102378 1 1 /* 2 * Copyright (C) 201 0Google Inc. All rights reserved.2 * Copyright (C) 2011 Google Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 29 29 */ 30 30 31 #ifndef AccessibilityController_h 32 #define AccessibilityController_h 31 #import "config.h" 32 #import "AccessibilityController.h" 33 #import "AccessibilityNotificationHandler.h" 33 34 34 #include "AccessibilityUIElement.h" 35 #include "CppBoundClass.h" 35 namespace WTR { 36 36 37 namespace WebKit { 38 class WebAccessibilityObject; 39 class WebFrame; 37 bool AccessibilityController::addNotificationListener(JSValueRef functionCallback) 38 { 39 if (!functionCallback) 40 return false; 41 42 // Mac programmers should not be adding more than one global notification listener. 43 // Other platforms may be different. 44 if (m_globalNotificationHandler) 45 return false; 46 m_globalNotificationHandler = [[AccessibilityNotificationHandler alloc] init]; 47 [m_globalNotificationHandler.get() setCallback:functionCallback]; 48 [m_globalNotificationHandler.get() startObserving]; 49 50 return true; 40 51 } 41 52 42 class TestShell; 53 bool AccessibilityController::removeNotificationListener() 54 { 55 // Mac programmers should not be trying to remove a listener that's already removed. 56 ASSERT(m_globalNotificationHandler); 57 m_globalNotificationHandler.clear(); 43 58 44 class AccessibilityController : public CppBoundClass { 45 public: 46 explicit AccessibilityController(TestShell*); 59 return true; 60 } 47 61 48 // Shadow to include accessibility initialization. 49 void bindToJavascript(WebKit::WebFrame*, const WebKit::WebString& classname); 50 void reset(); 51 52 void setFocusedElement(const WebKit::WebAccessibilityObject&); 53 AccessibilityUIElement* getFocusedElement(); 54 AccessibilityUIElement* getRootElement(); 55 56 bool shouldLogAccessibilityEvents(); 57 58 void notificationReceived(const WebKit::WebAccessibilityObject& target, const char* notificationName); 59 60 private: 61 // If true, will log all accessibility notifications. 62 bool m_logAccessibilityEvents; 63 64 // Bound methods and properties 65 void logAccessibilityEventsCallback(const CppArgumentList&, CppVariant*); 66 void fallbackCallback(const CppArgumentList&, CppVariant*); 67 68 void focusedElementGetterCallback(CppVariant*); 69 void rootElementGetterCallback(CppVariant*); 70 71 WebKit::WebAccessibilityObject m_focusedElement; 72 WebKit::WebAccessibilityObject m_rootElement; 73 74 AccessibilityUIElementList m_elements; 75 76 TestShell* m_shell; 77 }; 78 79 #endif // AccessibilityController_h 62 } // namespace WTR -
trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityNotificationHandler.h
r102377 r102378 1 1 /* 2 * Copyright (C) 201 0Google Inc. All rights reserved.2 * Copyright (C) 2011 Google Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 29 29 */ 30 30 31 #ifndef Accessibility Controller_h32 #define Accessibility Controller_h31 #ifndef AccessibilityNotificationHandler_h 32 #define AccessibilityNotificationHandler_h 33 33 34 #include "AccessibilityUIElement.h" 35 #include "CppBoundClass.h" 34 #import <JavaScriptCore/JSObjectRef.h> 36 35 37 namespace WebKit {38 class WebAccessibilityObject;39 class WebFrame;36 @interface AccessibilityNotificationHandler : NSObject { 37 id m_platformElement; 38 JSValueRef m_notificationFunctionCallback; 40 39 } 41 40 42 class TestShell; 41 - (id)init; 42 - (void)setPlatformElement:(id)platformElement; 43 - (void)setCallback:(JSValueRef)callback; 44 - (void)startObserving; 43 45 44 class AccessibilityController : public CppBoundClass { 45 public: 46 explicit AccessibilityController(TestShell*); 46 @end 47 47 48 // Shadow to include accessibility initialization. 49 void bindToJavascript(WebKit::WebFrame*, const WebKit::WebString& classname); 50 void reset(); 51 52 void setFocusedElement(const WebKit::WebAccessibilityObject&); 53 AccessibilityUIElement* getFocusedElement(); 54 AccessibilityUIElement* getRootElement(); 55 56 bool shouldLogAccessibilityEvents(); 57 58 void notificationReceived(const WebKit::WebAccessibilityObject& target, const char* notificationName); 59 60 private: 61 // If true, will log all accessibility notifications. 62 bool m_logAccessibilityEvents; 63 64 // Bound methods and properties 65 void logAccessibilityEventsCallback(const CppArgumentList&, CppVariant*); 66 void fallbackCallback(const CppArgumentList&, CppVariant*); 67 68 void focusedElementGetterCallback(CppVariant*); 69 void rootElementGetterCallback(CppVariant*); 70 71 WebKit::WebAccessibilityObject m_focusedElement; 72 WebKit::WebAccessibilityObject m_rootElement; 73 74 AccessibilityUIElementList m_elements; 75 76 TestShell* m_shell; 77 }; 78 79 #endif // AccessibilityController_h 48 #endif // AccessibilityNotificationHandler_h -
trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm
r101700 r102378 25 25 26 26 #import "config.h" 27 #import "AccessibilityNotificationHandler.h" 27 28 #import "AccessibilityUIElement.h" 28 29 #import "InjectedBundle.h" … … 61 62 @interface NSObject (WebKitAccessibilityAdditions) 62 63 - (NSArray *)accessibilityArrayAttributeValues:(NSString *)attribute index:(NSUInteger)index maxCount:(NSUInteger)maxCount; 63 - (void)accessibilitySetShouldRepostNotifications:(BOOL)repost;64 64 - (NSUInteger)accessibilityIndexOfChild:(id)child; 65 65 - (NSUInteger)accessibilityArrayAttributeCount:(NSString *)attribute; … … 85 85 { 86 86 return JSStringCreateWithCFString((CFStringRef)self); 87 }88 89 @end90 91 @interface AccessibilityNotificationHandler : NSObject92 {93 id m_platformElement;94 JSValueRef m_notificationFunctionCallback;95 }96 97 @end98 99 @implementation AccessibilityNotificationHandler100 101 - (id)initWithPlatformElement:(id)platformElement102 {103 self = [super init];104 105 m_platformElement = platformElement;106 107 // Once an object starts requesting notifications, it's on for the duration of the program.108 // This is to avoid any race conditions between tests turning this flag on and off. Instead109 // AccessibilityNotificationHandler can just listen when they want to.110 [m_platformElement accessibilitySetShouldRepostNotifications:YES];111 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_notificationReceived:) name:@"AXDRTNotification" object:nil];112 113 return self;114 }115 116 - (void)dealloc117 {118 [[NSNotificationCenter defaultCenter] removeObserver:self];119 120 WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(WTR::InjectedBundle::shared().page()->page());121 JSContextRef context = WKBundleFrameGetJavaScriptContext(mainFrame);122 123 JSValueUnprotect(context, m_notificationFunctionCallback);124 m_notificationFunctionCallback = 0;125 126 [super dealloc];127 }128 129 - (void)_notificationReceived:(NSNotification *)notification130 {131 NSString *notificationName = [[notification userInfo] objectForKey:@"notificationName"];132 if (!notificationName)133 return;134 135 WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(WTR::InjectedBundle::shared().page()->page());136 JSContextRef context = WKBundleFrameGetJavaScriptContext(mainFrame);137 138 JSRetainPtr<JSStringRef> jsNotification(Adopt, [notificationName createJSStringRef]);139 JSValueRef argument = JSValueMakeString(context, jsNotification.get());140 JSObjectCallAsFunction(context, const_cast<JSObjectRef>(m_notificationFunctionCallback), 0, 1, &argument, 0);141 }142 143 - (void)setCallback:(JSValueRef)callback144 {145 if (!callback)146 return;147 148 WKBundleFrameRef mainFrame = WKBundlePageGetMainFrame(WTR::InjectedBundle::shared().page()->page());149 JSContextRef context = WKBundleFrameGetJavaScriptContext(mainFrame);150 151 // Release the old callback.152 if (m_notificationFunctionCallback)153 JSValueUnprotect(context, m_notificationFunctionCallback);154 155 m_notificationFunctionCallback = callback;156 JSValueProtect(context, m_notificationFunctionCallback);157 87 } 158 88 … … 1248 1178 if (m_notificationHandler) 1249 1179 return false; 1250 m_notificationHandler = [[AccessibilityNotificationHandler alloc] initWithPlatformElement:platformUIElement()]; 1180 m_notificationHandler = [[AccessibilityNotificationHandler alloc] init]; 1181 [m_notificationHandler setPlatformElement:platformUIElement()]; 1251 1182 [m_notificationHandler setCallback:functionCallback]; 1183 [m_notificationHandler startObserving]; 1252 1184 1253 1185 return true; -
trunk/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj
r100488 r102378 51 51 6510A78C11EC643800410867 /* WebKitWeightWatcher900.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6510A78111EC643800410867 /* WebKitWeightWatcher900.ttf */; }; 52 52 65EB85A011EC67CC0034D300 /* ActivateFonts.mm in Sources */ = {isa = PBXBuildFile; fileRef = 65EB859F11EC67CC0034D300 /* ActivateFonts.mm */; }; 53 8034C6621487636400AC32E9 /* AccessibilityControllerMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8034C6611487636400AC32E9 /* AccessibilityControllerMac.mm */; }; 54 8097338A14874A5A008156D9 /* AccessibilityNotificationHandler.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8097338914874A5A008156D9 /* AccessibilityNotificationHandler.mm */; }; 53 55 A664BC7613A5F3A9009A7B25 /* libWebCoreTestSupport.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 41230E16138C78BF00BCCFCA /* libWebCoreTestSupport.dylib */; }; 54 56 BC14E4DB120E02D000826C0C /* GCController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC14E4D9120E02D000826C0C /* GCController.cpp */; }; … … 146 148 65EB859D11EC67CC0034D300 /* ActivateFonts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ActivateFonts.h; sourceTree = "<group>"; }; 147 149 65EB859F11EC67CC0034D300 /* ActivateFonts.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ActivateFonts.mm; sourceTree = "<group>"; }; 150 8034C6611487636400AC32E9 /* AccessibilityControllerMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AccessibilityControllerMac.mm; path = mac/AccessibilityControllerMac.mm; sourceTree = "<group>"; }; 151 8097338814874A5A008156D9 /* AccessibilityNotificationHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AccessibilityNotificationHandler.h; path = mac/AccessibilityNotificationHandler.h; sourceTree = "<group>"; }; 152 8097338914874A5A008156D9 /* AccessibilityNotificationHandler.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AccessibilityNotificationHandler.mm; path = mac/AccessibilityNotificationHandler.mm; sourceTree = "<group>"; }; 148 153 8DD76FA10486AA7600D96B5E /* WebKitTestRunner */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = WebKitTestRunner; sourceTree = BUILT_PRODUCTS_DIR; }; 149 154 BC14E4D8120E02D000826C0C /* GCController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCController.h; sourceTree = "<group>"; }; … … 283 288 isa = PBXGroup; 284 289 children = ( 290 8034C6611487636400AC32E9 /* AccessibilityControllerMac.mm */, 291 8097338814874A5A008156D9 /* AccessibilityNotificationHandler.h */, 292 8097338914874A5A008156D9 /* AccessibilityNotificationHandler.mm */, 285 293 29210EA2144CAAA500835BB5 /* AccessibilityController.cpp */, 286 294 29210EA3144CAAA500835BB5 /* AccessibilityController.h */, … … 589 597 29A8FCE2145F037B009045A6 /* AccessibilityTextMarkerRange.cpp in Sources */, 590 598 29A8FCE5145F0464009045A6 /* AccessibilityTextMarkerRangeMac.mm in Sources */, 599 8097338A14874A5A008156D9 /* AccessibilityNotificationHandler.mm in Sources */, 600 8034C6621487636400AC32E9 /* AccessibilityControllerMac.mm in Sources */, 591 601 ); 592 602 runOnlyForDeploymentPostprocessing = 0;
Note: See TracChangeset
for help on using the changeset viewer.