Title: [229310] trunk
Revision
229310
Author
n_w...@apple.com
Date
2018-03-06 00:18:53 -0800 (Tue, 06 Mar 2018)

Log Message

AX: AOM: More accessibility events support
https://bugs.webkit.org/show_bug.cgi?id=183023
<rdar://problem/37764380>

Reviewed by Chris Fleizach.

Source/WebCore:

Accessibility events.
Spec: https://wicg.github.io/aom/spec/phase2.html

This change adds support for these new events:
  accessiblecontextmenu
  accessibledecrement
  accessibledismiss
  accessiblefocus
  accessibleincrement
  accessiblescrollintoview
  accessibleselect

Note: The show context menu action is only supported on macOS now.
The dismiss action is not implemented for all the platforms yet.

Test: accessibility/mac/AOM-events-all.html

* accessibility/AccessibilityListBoxOption.cpp:
(WebCore::AccessibilityListBoxOption::setSelected):
* accessibility/AccessibilityMediaObject.cpp:
(WebCore::AccessibilityMediaObject::increment):
(WebCore::AccessibilityMediaObject::decrement):
* accessibility/AccessibilityMenuListOption.cpp:
(WebCore::AccessibilityMenuListOption::setSelected):
* accessibility/AccessibilityNodeObject.cpp:
(WebCore::AccessibilityNodeObject::increment):
(WebCore::AccessibilityNodeObject::decrement):
* accessibility/AccessibilityObject.cpp:
(WebCore::AccessibilityObject::press):
(WebCore::AccessibilityObject::dispatchAccessibilityEvent const):
(WebCore::AccessibilityObject::dispatchAccessibilityEventWithType const):
(WebCore::AccessibilityObject::dispatchAccessibleSetValueEvent const):
(WebCore::AccessibilityObject::scrollToMakeVisible const):
(WebCore::AccessibilityObject::dispatchAccessibilityEvent): Deleted.
(WebCore::AccessibilityObject::dispatchAccessibleSetValueEvent): Deleted.
* accessibility/AccessibilityObject.h:
* accessibility/AccessibilityRenderObject.cpp:
(WebCore::AccessibilityRenderObject::setFocused):
* accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
(-[WebAccessibilityObjectWrapper accessibilityShowContextMenu]):
* dom/Element.idl:
* dom/EventNames.h:

LayoutTests:

* accessibility/mac/AOM-events-all-expected.txt: Added.
* accessibility/mac/AOM-events-all.html: Added.
* js/dom/dom-static-property-for-in-iteration-expected.txt:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (229309 => 229310)


--- trunk/LayoutTests/ChangeLog	2018-03-06 07:25:14 UTC (rev 229309)
+++ trunk/LayoutTests/ChangeLog	2018-03-06 08:18:53 UTC (rev 229310)
@@ -1,3 +1,15 @@
+2018-03-06  Nan Wang  <n_w...@apple.com>
+
+        AX: AOM: More accessibility events support
+        https://bugs.webkit.org/show_bug.cgi?id=183023
+        <rdar://problem/37764380>
+
+        Reviewed by Chris Fleizach.
+
+        * accessibility/mac/AOM-events-all-expected.txt: Added.
+        * accessibility/mac/AOM-events-all.html: Added.
+        * js/dom/dom-static-property-for-in-iteration-expected.txt:
+
 2018-03-05  Yoav Weiss  <y...@yoav.ws>
 
         Support for preconnect Link headers

Added: trunk/LayoutTests/accessibility/mac/AOM-events-all-expected.txt (0 => 229310)


--- trunk/LayoutTests/accessibility/mac/AOM-events-all-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/accessibility/mac/AOM-events-all-expected.txt	2018-03-06 08:18:53 UTC (rev 229310)
@@ -0,0 +1,26 @@
+  button  
+This tests all accessibility events.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Test accessibleincrement and accessibledecrement
+received accessibleincrement event
+received accessibledecrement event
+
+Test accessiblefocus
+received accessiblefocus event
+
+Test accessiblescrollintoview
+received accessiblescrollintoview event
+
+Test accessiblecontextmenu
+received accessiblecontextmenu event
+
+Test accessibleselect
+received accessibleselect event
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/accessibility/mac/AOM-events-all.html (0 => 229310)


--- trunk/LayoutTests/accessibility/mac/AOM-events-all.html	                        (rev 0)
+++ trunk/LayoutTests/accessibility/mac/AOM-events-all.html	2018-03-06 08:18:53 UTC (rev 229310)
@@ -0,0 +1,105 @@
+<!DOCTYPE html>
+<html>
+<body id="body">
+<script src=""
+<div id="content">
+
+<input type="range" min="0" max="100" value="25" step="25" id="slider"/>
+<input type="text" id="input">
+<button id="button">button</button>
+
+<select id="group" multiple="multiple">
+    <option id="option">Option 1</option>
+    <option>Option 2</option>
+</select>
+
+</div>
+
+<p id="description"></p>
+<div id="console"></div>
+
+<script>
+
+    description("This tests all accessibility events.");
+
+    if (window.accessibilityController) {
+        jsTestIsAsync = true;
+       
+        var node;
+        var axNode;
+        
+        testIncrementDecrement();
+       
+        function testIncrementDecrement() {
+            debug("\nTest accessibleincrement and accessibledecrement");
+            node = document.getElementById("slider");
+            axNode = accessibilityController.accessibleElementById("slider");
+
+            node._onaccessibleincrement_ = function() {
+                debug("received accessibleincrement event");
+            };
+            node._onaccessibledecrement_ = function() {
+                debug("received accessibledecrement event");
+            };
+            axNode.increment();
+            axNode.decrement();
+
+            testFocus();
+        }
+
+        function testFocus() {
+            debug("\nTest accessiblefocus");
+            node = document.getElementById("input");
+            axNode = accessibilityController.accessibleElementById("input");
+
+            node._onaccessiblefocus_ = function() {
+                debug("received accessiblefocus event");
+                testScrollIntoView();
+            };
+            axNode.takeFocus();
+        }
+
+        function testScrollIntoView() {
+            debug("\nTest accessiblescrollintoview");
+            node = document.getElementById("button");
+            axNode = accessibilityController.accessibleElementById("button");
+
+            node._onaccessiblescrollintoview_ = function() {
+                debug("received accessiblescrollintoview event");
+                testShowContextMenu();
+            };
+            axNode.scrollToMakeVisible();
+        }
+
+        function testShowContextMenu() {
+            debug("\nTest accessiblecontextmenu");
+            node = document.getElementById("button");
+            axNode = accessibilityController.accessibleElementById("button");
+
+            node._onaccessiblecontextmenu_ = function() {
+                debug("received accessiblecontextmenu event");
+                testSelect();
+            };
+            axNode.showMenu();
+        }
+
+        function testSelect() {
+            debug("\nTest accessibleselect");
+            node = document.getElementById("option");
+            axNode = accessibilityController.accessibleElementById("group");
+            node._onaccessibleselect_ = function() {
+                debug("received accessibleselect event");
+                finishJSTest();
+            }
+            axNode.setSelectedChildAtIndex(0);
+        }
+
+    } else {
+        testFailed("Could not load accessibility controller");
+    }
+
+</script>
+
+<script src=""
+</body>
+</html>

Modified: trunk/LayoutTests/js/dom/dom-static-property-for-in-iteration-expected.txt (229309 => 229310)


--- trunk/LayoutTests/js/dom/dom-static-property-for-in-iteration-expected.txt	2018-03-06 07:25:14 UTC (rev 229309)
+++ trunk/LayoutTests/js/dom/dom-static-property-for-in-iteration-expected.txt	2018-03-06 08:18:53 UTC (rev 229310)
@@ -134,8 +134,15 @@
 PASS a["clientHeight"] is 0
 PASS a["innerHTML"] is nerget
 PASS a["outerHTML"] is <a id="foo" href=""
+PASS a["onaccessiblecontextmenu"] is null
 PASS a["onaccessibleclick"] is null
+PASS a["onaccessibledecrement"] is null
+PASS a["onaccessibledismiss"] is null
+PASS a["onaccessiblefocus"] is null
+PASS a["onaccessibleincrement"] is null
+PASS a["onaccessiblescrollintoview"] is null
 PASS a["onaccessiblesetvalue"] is null
+PASS a["onaccessibleselect"] is null
 PASS a["oncopy"] is null
 PASS a["oncut"] is null
 PASS a["onpaste"] is null

Modified: trunk/LayoutTests/platform/mac-wk1/TestExpectations (229309 => 229310)


--- trunk/LayoutTests/platform/mac-wk1/TestExpectations	2018-03-06 07:25:14 UTC (rev 229309)
+++ trunk/LayoutTests/platform/mac-wk1/TestExpectations	2018-03-06 08:18:53 UTC (rev 229310)
@@ -494,6 +494,7 @@
 webkit.org/b/172044 [ Debug ] imported/w3c/web-platform-tests/IndexedDB/open-request-queue.html [ Pass Timeout ]
 
 webkit.org/b/180898 accessibility/mac/AOM-events.html [ Skip ]
+webkit.org/b/183023 accessibility/mac/AOM-events-all.html [ Skip ]
 
 webkit.org/b/182752 accessibility/mac/accessibility-make-first-responder.html [ Skip ]
 

Modified: trunk/Source/WebCore/ChangeLog (229309 => 229310)


--- trunk/Source/WebCore/ChangeLog	2018-03-06 07:25:14 UTC (rev 229309)
+++ trunk/Source/WebCore/ChangeLog	2018-03-06 08:18:53 UTC (rev 229310)
@@ -1,3 +1,54 @@
+2018-03-06  Nan Wang  <n_w...@apple.com>
+
+        AX: AOM: More accessibility events support
+        https://bugs.webkit.org/show_bug.cgi?id=183023
+        <rdar://problem/37764380>
+
+        Reviewed by Chris Fleizach.
+
+        Accessibility events.
+        Spec: https://wicg.github.io/aom/spec/phase2.html
+
+        This change adds support for these new events:
+          accessiblecontextmenu
+          accessibledecrement
+          accessibledismiss
+          accessiblefocus
+          accessibleincrement
+          accessiblescrollintoview
+          accessibleselect
+
+        Note: The show context menu action is only supported on macOS now.
+        The dismiss action is not implemented for all the platforms yet.
+
+        Test: accessibility/mac/AOM-events-all.html
+
+        * accessibility/AccessibilityListBoxOption.cpp:
+        (WebCore::AccessibilityListBoxOption::setSelected):
+        * accessibility/AccessibilityMediaObject.cpp:
+        (WebCore::AccessibilityMediaObject::increment):
+        (WebCore::AccessibilityMediaObject::decrement):
+        * accessibility/AccessibilityMenuListOption.cpp:
+        (WebCore::AccessibilityMenuListOption::setSelected):
+        * accessibility/AccessibilityNodeObject.cpp:
+        (WebCore::AccessibilityNodeObject::increment):
+        (WebCore::AccessibilityNodeObject::decrement):
+        * accessibility/AccessibilityObject.cpp:
+        (WebCore::AccessibilityObject::press):
+        (WebCore::AccessibilityObject::dispatchAccessibilityEvent const):
+        (WebCore::AccessibilityObject::dispatchAccessibilityEventWithType const):
+        (WebCore::AccessibilityObject::dispatchAccessibleSetValueEvent const):
+        (WebCore::AccessibilityObject::scrollToMakeVisible const):
+        (WebCore::AccessibilityObject::dispatchAccessibilityEvent): Deleted.
+        (WebCore::AccessibilityObject::dispatchAccessibleSetValueEvent): Deleted.
+        * accessibility/AccessibilityObject.h:
+        * accessibility/AccessibilityRenderObject.cpp:
+        (WebCore::AccessibilityRenderObject::setFocused):
+        * accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
+        (-[WebAccessibilityObjectWrapper accessibilityShowContextMenu]):
+        * dom/Element.idl:
+        * dom/EventNames.h:
+
 2018-03-05  Yusuke Suzuki  <utatane....@gmail.com>
 
         Fix std::make_unique / new[] using system malloc

Modified: trunk/Source/WebCore/accessibility/AccessibilityListBoxOption.cpp (229309 => 229310)


--- trunk/Source/WebCore/accessibility/AccessibilityListBoxOption.cpp	2018-03-06 07:25:14 UTC (rev 229309)
+++ trunk/Source/WebCore/accessibility/AccessibilityListBoxOption.cpp	2018-03-06 08:18:53 UTC (rev 229310)
@@ -177,6 +177,9 @@
     if (!canSetSelectedAttribute())
         return;
     
+    if (selected && dispatchAccessibilityEventWithType(AccessibilityEventType::Select))
+        return;
+    
     bool isOptionSelected = isSelected();
     if ((isOptionSelected && selected) || (!isOptionSelected && !selected))
         return;

Modified: trunk/Source/WebCore/accessibility/AccessibilityMediaObject.cpp (229309 => 229310)


--- trunk/Source/WebCore/accessibility/AccessibilityMediaObject.cpp	2018-03-06 07:25:14 UTC (rev 229309)
+++ trunk/Source/WebCore/accessibility/AccessibilityMediaObject.cpp	2018-03-06 08:18:53 UTC (rev 229310)
@@ -107,11 +107,15 @@
 
 void AccessibilityMediaObject::increment()
 {
+    if (dispatchAccessibilityEventWithType(AccessibilityEventType::Increment))
+        return;
     mediaSeek(AXSeekForward);
 }
 
 void AccessibilityMediaObject::decrement()
 {
+    if (dispatchAccessibilityEventWithType(AccessibilityEventType::Decrement))
+        return;
     mediaSeek(AXSeekBackward);
 }
 

Modified: trunk/Source/WebCore/accessibility/AccessibilityMenuListOption.cpp (229309 => 229310)


--- trunk/Source/WebCore/accessibility/AccessibilityMenuListOption.cpp	2018-03-06 07:25:14 UTC (rev 229309)
+++ trunk/Source/WebCore/accessibility/AccessibilityMenuListOption.cpp	2018-03-06 08:18:53 UTC (rev 229310)
@@ -82,6 +82,9 @@
 {
     if (!canSetSelectedAttribute())
         return;
+    
+    if (selected && dispatchAccessibilityEventWithType(AccessibilityEventType::Select))
+        return;
 
     downcast<HTMLOptionElement>(*m_element).setSelected(selected);
 }

Modified: trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp (229309 => 229310)


--- trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp	2018-03-06 07:25:14 UTC (rev 229309)
+++ trunk/Source/WebCore/accessibility/AccessibilityNodeObject.cpp	2018-03-06 08:18:53 UTC (rev 229310)
@@ -1072,6 +1072,8 @@
     
 void AccessibilityNodeObject::increment()
 {
+    if (dispatchAccessibilityEventWithType(AccessibilityEventType::Increment))
+        return;
     UserGestureIndicator gestureIndicator(ProcessingUserGesture, document());
     alterSliderValue(true);
 }
@@ -1078,6 +1080,8 @@
 
 void AccessibilityNodeObject::decrement()
 {
+    if (dispatchAccessibilityEventWithType(AccessibilityEventType::Decrement))
+        return;
     UserGestureIndicator gestureIndicator(ProcessingUserGesture, document());
     alterSliderValue(false);
 }

Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.cpp (229309 => 229310)


--- trunk/Source/WebCore/accessibility/AccessibilityObject.cpp	2018-03-06 07:25:14 UTC (rev 229309)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.cpp	2018-03-06 08:18:53 UTC (rev 229310)
@@ -997,8 +997,7 @@
     // dispatch accessibleclick event
     if (auto* cache = axObjectCache()) {
         if (auto* pressObject = cache->getOrCreate(pressElement)) {
-            auto event = Event::create(eventNames().accessibleclickEvent, true, true);
-            if (pressObject->dispatchAccessibilityEvent(event))
+            if (pressObject->dispatchAccessibilityEventWithType(AccessibilityEventType::Click))
                 return true;
         }
     }
@@ -2153,10 +2152,12 @@
     return nullAtom();
 }
 
-bool AccessibilityObject::dispatchAccessibilityEvent(Event& event)
+bool AccessibilityObject::dispatchAccessibilityEvent(Event& event) const
 {
     Vector<Element*> eventPath;
     for (auto* parentObject = this; parentObject; parentObject = parentObject->parentObject()) {
+        if (parentObject->isWebArea())
+            break;
         if (auto* parentElement = parentObject->element())
             eventPath.append(parentElement);
     }
@@ -2167,8 +2168,44 @@
     return event.defaultPrevented();
 }
 
-bool AccessibilityObject::dispatchAccessibleSetValueEvent(const String& value)
+bool AccessibilityObject::dispatchAccessibilityEventWithType(AccessibilityEventType type) const
 {
+    AtomicString eventName;
+    switch (type) {
+    case AccessibilityEventType::ContextMenu:
+        eventName = eventNames().accessiblecontextmenuEvent;
+        break;
+    case AccessibilityEventType::Click:
+        eventName = eventNames().accessibleclickEvent;
+        break;
+    case AccessibilityEventType::Decrement:
+        eventName = eventNames().accessibledecrementEvent;
+        break;
+    case AccessibilityEventType::Dismiss:
+        eventName = eventNames().accessibledismissEvent;
+        break;
+    case AccessibilityEventType::Focus:
+        eventName = eventNames().accessiblefocusEvent;
+        break;
+    case AccessibilityEventType::Increment:
+        eventName = eventNames().accessibleincrementEvent;
+        break;
+    case AccessibilityEventType::ScrollIntoView:
+        eventName = eventNames().accessiblescrollintoviewEvent;
+        break;
+    case AccessibilityEventType::Select:
+        eventName = eventNames().accessibleselectEvent;
+        break;
+    default:
+        return false;
+    }
+    
+    auto event = Event::create(eventName, true, true);
+    return dispatchAccessibilityEvent(event);
+}
+
+bool AccessibilityObject::dispatchAccessibleSetValueEvent(const String& value) const
+{
     if (!canSetValueAttribute())
         return false;
     auto event = AccessibleSetValueEvent::create(eventNames().accessiblesetvalueEvent, value);
@@ -2924,6 +2961,8 @@
 
 void AccessibilityObject::scrollToMakeVisible() const
 {
+    if (dispatchAccessibilityEventWithType(AccessibilityEventType::ScrollIntoView))
+        return;
     IntRect objectRect = snappedIntRect(boundingBoxRect());
     objectRect.setLocation(IntPoint());
     scrollToMakeVisibleWithSubFocus(objectRect);

Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.h (229309 => 229310)


--- trunk/Source/WebCore/accessibility/AccessibilityObject.h	2018-03-06 07:25:14 UTC (rev 229309)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.h	2018-03-06 08:18:53 UTC (rev 229310)
@@ -254,6 +254,17 @@
     Subtitle,
     Action,
 };
+
+enum class AccessibilityEventType {
+    ContextMenu,
+    Click,
+    Decrement,
+    Dismiss,
+    Focus,
+    Increment,
+    ScrollIntoView,
+    Select,
+};
     
 struct AccessibilityText {
     String text;
@@ -895,8 +906,9 @@
     const AtomicString& getAttribute(const QualifiedName&) const;
     bool hasTagName(const QualifiedName&) const;
     
-    bool dispatchAccessibilityEvent(Event&);
-    bool dispatchAccessibleSetValueEvent(const String&);
+    bool dispatchAccessibilityEvent(Event&) const;
+    bool dispatchAccessibilityEventWithType(AccessibilityEventType) const;
+    bool dispatchAccessibleSetValueEvent(const String&) const;
 
     virtual VisiblePositionRange visiblePositionRange() const { return VisiblePositionRange(); }
     virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const { return VisiblePositionRange(); }

Modified: trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp (229309 => 229310)


--- trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp	2018-03-06 07:25:14 UTC (rev 229309)
+++ trunk/Source/WebCore/accessibility/AccessibilityRenderObject.cpp	2018-03-06 08:18:53 UTC (rev 229310)
@@ -1707,6 +1707,9 @@
 
 void AccessibilityRenderObject::setFocused(bool on)
 {
+    if (on && dispatchAccessibilityEventWithType(AccessibilityEventType::Focus))
+        return;
+    
     if (!canSetFocusAttribute())
         return;
     

Modified: trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm (229309 => 229310)


--- trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm	2018-03-06 07:25:14 UTC (rev 229309)
+++ trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm	2018-03-06 08:18:53 UTC (rev 229310)
@@ -3539,6 +3539,9 @@
     if (!page)
         return;
     
+    if (m_object->dispatchAccessibilityEventWithType(AccessibilityEventType::ContextMenu))
+        return;
+    
     IntRect rect = snappedIntRect(m_object->elementRect());
     FrameView* frameView = m_object->documentFrameView();
     

Modified: trunk/Source/WebCore/dom/Element.idl (229309 => 229310)


--- trunk/Source/WebCore/dom/Element.idl	2018-03-06 07:25:14 UTC (rev 229309)
+++ trunk/Source/WebCore/dom/Element.idl	2018-03-06 08:18:53 UTC (rev 229310)
@@ -142,8 +142,15 @@
     [NotEnumerable, Conditional=WIRELESS_PLAYBACK_TARGET] attribute EventHandler onwebkitplaybacktargetavailabilitychanged;
 
     // Accessibility events.
+    [EnabledAtRuntime=AccessibilityObjectModel] attribute EventHandler onaccessiblecontextmenu;
     [EnabledAtRuntime=AccessibilityObjectModel] attribute EventHandler onaccessibleclick;
+    [EnabledAtRuntime=AccessibilityObjectModel] attribute EventHandler onaccessibledecrement;
+    [EnabledAtRuntime=AccessibilityObjectModel] attribute EventHandler onaccessibledismiss;
+    [EnabledAtRuntime=AccessibilityObjectModel] attribute EventHandler onaccessiblefocus;
+    [EnabledAtRuntime=AccessibilityObjectModel] attribute EventHandler onaccessibleincrement;
+    [EnabledAtRuntime=AccessibilityObjectModel] attribute EventHandler onaccessiblescrollintoview;
     [EnabledAtRuntime=AccessibilityObjectModel] attribute EventHandler onaccessiblesetvalue;
+    [EnabledAtRuntime=AccessibilityObjectModel] attribute EventHandler onaccessibleselect;
 };
 
 dictionary ShadowRootInit {

Modified: trunk/Source/WebCore/dom/EventNames.h (229309 => 229310)


--- trunk/Source/WebCore/dom/EventNames.h	2018-03-06 07:25:14 UTC (rev 229309)
+++ trunk/Source/WebCore/dom/EventNames.h	2018-03-06 08:18:53 UTC (rev 229310)
@@ -45,8 +45,15 @@
     macro(DOMNodeRemovedFromDocument) \
     macro(DOMSubtreeModified) \
     macro(abort) \
+    macro(accessiblecontextmenu) \
     macro(accessibleclick) \
+    macro(accessibledecrement) \
+    macro(accessibledismiss) \
+    macro(accessiblefocus) \
+    macro(accessibleincrement) \
+    macro(accessiblescrollintoview) \
     macro(accessiblesetvalue) \
+    macro(accessibleselect) \
     macro(activate) \
     macro(active) \
     macro(addsourcebuffer) \
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to