Changeset 240277 in webkit


Ignore:
Timestamp:
Jan 22, 2019 12:52:53 PM (5 years ago)
Author:
Devin Rousso
Message:

Web Inspector: Audit: provide a way to get related Accessibility nodes for a given node
https://bugs.webkit.org/show_bug.cgi?id=193225
<rdar://problem/46799956>

Reviewed by Joseph Pecoraro.

Source/WebCore:

Test: inspector/audit/run-accessibility.html

  • inspector/InspectorAuditAccessibilityObject.idl:
  • inspector/InspectorAuditAccessibilityObject.h:
  • inspector/InspectorAuditAccessibilityObject.cpp:

(WebCore::InspectorAuditAccessibilityObject::getActiveDescendant): Added.
(WebCore::addChildren): Added.
(WebCore::InspectorAuditAccessibilityObject::getChildNodes): Added.
(WebCore::InspectorAuditAccessibilityObject::getControlledNodes): Added.
(WebCore::InspectorAuditAccessibilityObject::getFlowedNodes): Added.
(WebCore::InspectorAuditAccessibilityObject::getMouseEventNode): Added.
(WebCore::InspectorAuditAccessibilityObject::getOwnedNodes): Added.
(WebCore::InspectorAuditAccessibilityObject::getParentNode): Added.
(WebCore::InspectorAuditAccessibilityObject::getSelectedChildNodes): Added.

LayoutTests:

  • inspector/audit/run-accessibility.html:
  • inspector/audit/run-accessibility-expected.txt:
Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r240271 r240277  
     12019-01-22  Devin Rousso  <drousso@apple.com>
     2
     3        Web Inspector: Audit: provide a way to get related Accessibility nodes for a given node
     4        https://bugs.webkit.org/show_bug.cgi?id=193225
     5        <rdar://problem/46799956>
     6
     7        Reviewed by Joseph Pecoraro.
     8
     9        * inspector/audit/run-accessibility.html:
     10        * inspector/audit/run-accessibility-expected.txt:
     11
    1122019-01-22  Simon Fraser  <simon.fraser@apple.com>
    213
  • trunk/LayoutTests/inspector/audit/run-accessibility-expected.txt

    r239986 r240277  
    4040Audit teardown...
    4141
     42-- Running test case: Audit.run.Accessibility.getActiveDescendant.parent
     43Audit setup...
     44Audit run `WebInspectorAudit.Accessibility.getActiveDescendant(document.querySelector("#parent"))`...
     45Result: #child
     46Audit teardown...
     47
     48-- Running test case: Audit.run.Accessibility.getActiveDescendant.child
     49Audit setup...
     50Audit run `WebInspectorAudit.Accessibility.getActiveDescendant(document.querySelector("#child"))`...
     51Result: null
     52Audit teardown...
     53
     54-- Running test case: Audit.run.Accessibility.getChildNodes.parent
     55Audit setup...
     56Audit run `WebInspectorAudit.Accessibility.getChildNodes(document.querySelector("#parent"))`...
     57Result: ["#child"]
     58Audit teardown...
     59
     60-- Running test case: Audit.run.Accessibility.getChildNodes.child
     61Audit setup...
     62Audit run `WebInspectorAudit.Accessibility.getChildNodes(document.querySelector("#child"))`...
     63Result: []
     64Audit teardown...
     65
     66-- Running test case: Audit.run.Accessibility.getControlledNodes.parent
     67Audit setup...
     68Audit run `WebInspectorAudit.Accessibility.getControlledNodes(document.querySelector("#parent"))`...
     69Result: ["#child"]
     70Audit teardown...
     71
     72-- Running test case: Audit.run.Accessibility.getControlledNodes.child
     73Audit setup...
     74Audit run `WebInspectorAudit.Accessibility.getControlledNodes(document.querySelector("#child"))`...
     75Result: []
     76Audit teardown...
     77
     78-- Running test case: Audit.run.Accessibility.getFlowedNodes.parent
     79Audit setup...
     80Audit run `WebInspectorAudit.Accessibility.getFlowedNodes(document.querySelector("#parent"))`...
     81Result: ["#child"]
     82Audit teardown...
     83
     84-- Running test case: Audit.run.Accessibility.getFlowedNodes.child
     85Audit setup...
     86Audit run `WebInspectorAudit.Accessibility.getFlowedNodes(document.querySelector("#child"))`...
     87Result: []
     88Audit teardown...
     89
     90-- Running test case: Audit.run.Accessibility.getMouseEventNode.parent
     91Audit setup...
     92Audit run `WebInspectorAudit.Accessibility.getMouseEventNode(document.querySelector("#parent"))`...
     93Result: #parent
     94Audit teardown...
     95
     96-- Running test case: Audit.run.Accessibility.getMouseEventNode.child
     97Audit setup...
     98Audit run `WebInspectorAudit.Accessibility.getMouseEventNode(document.querySelector("#child"))`...
     99Result: #parent
     100Audit teardown...
     101
     102-- Running test case: Audit.run.Accessibility.getOwnedNodes.parent
     103Audit setup...
     104Audit run `WebInspectorAudit.Accessibility.getOwnedNodes(document.querySelector("#parent"))`...
     105Result: ["#child"]
     106Audit teardown...
     107
     108-- Running test case: Audit.run.Accessibility.getOwnedNodes.child
     109Audit setup...
     110Audit run `WebInspectorAudit.Accessibility.getOwnedNodes(document.querySelector("#child"))`...
     111Result: null
     112Audit teardown...
     113
     114-- Running test case: Audit.run.Accessibility.getParentNode.parent
     115Audit setup...
     116Audit run `WebInspectorAudit.Accessibility.getParentNode(document.querySelector("#parent"))`...
     117Result: undefined
     118Audit teardown...
     119
     120-- Running test case: Audit.run.Accessibility.getParentNode.child
     121Audit setup...
     122Audit run `WebInspectorAudit.Accessibility.getParentNode(document.querySelector("#child"))`...
     123Result: #parent
     124Audit teardown...
     125
     126-- Running test case: Audit.run.Accessibility.getSelectedChildNodes.parent
     127Audit setup...
     128Audit run `WebInspectorAudit.Accessibility.getSelectedChildNodes(document.querySelector("#parent"))`...
     129Result: ["#child"]
     130Audit teardown...
     131
     132-- Running test case: Audit.run.Accessibility.getSelectedChildNodes.child
     133Audit setup...
     134Audit run `WebInspectorAudit.Accessibility.getSelectedChildNodes(document.querySelector("#child"))`...
     135Result: []
     136Audit teardown...
     137
    42138-- Running test case: Audit.run.Accessibility.InvalidCopiedFunctionCall
    43139Audit setup...
     
    47143PASS: Should produce an exception.
    48144Error: NotAllowedError: Cannot be called outside of a Web Inspector Audit
     145Testing copied getActiveDescendant...
     146PASS: Should produce an exception.
     147Error: NotAllowedError: Cannot be called outside of a Web Inspector Audit
     148Testing copied getChildNodes...
     149PASS: Should produce an exception.
     150Error: NotAllowedError: Cannot be called outside of a Web Inspector Audit
     151Testing copied getControlledNodes...
     152PASS: Should produce an exception.
     153Error: NotAllowedError: Cannot be called outside of a Web Inspector Audit
     154Testing copied getFlowedNodes...
     155PASS: Should produce an exception.
     156Error: NotAllowedError: Cannot be called outside of a Web Inspector Audit
     157Testing copied getMouseEventNode...
     158PASS: Should produce an exception.
     159Error: NotAllowedError: Cannot be called outside of a Web Inspector Audit
     160Testing copied getOwnedNodes...
     161PASS: Should produce an exception.
     162Error: NotAllowedError: Cannot be called outside of a Web Inspector Audit
     163Testing copied getParentNode...
     164PASS: Should produce an exception.
     165Error: NotAllowedError: Cannot be called outside of a Web Inspector Audit
     166Testing copied getSelectedChildNodes...
     167PASS: Should produce an exception.
     168Error: NotAllowedError: Cannot be called outside of a Web Inspector Audit
    49169
  • trunk/LayoutTests/inspector/audit/run-accessibility.html

    r239986 r240277  
    1111    if (Array.isArray(result))
    1212        return JSON.stringify(result.map(stringify));
    13     return false;
     13    if (result === null || result === undefined);
     14        return result;
     15    return "UNEXPECTED " + result;
    1416}
    1517
     
    3638        { func: "getElementsByComputedRole", role: "button" },
    3739        { func: "getElementsByComputedRole", role: "button", target: "parent" },
     40
     41        { func: "getActiveDescendant", target: "parent" },
     42        { func: "getActiveDescendant", target: "child" },
     43
     44        { func: "getChildNodes", target: "parent" },
     45        { func: "getChildNodes", target: "child" },
     46
     47        { func: "getControlledNodes", target: "parent" },
     48        { func: "getControlledNodes", target: "child" },
     49
     50        { func: "getFlowedNodes", target: "parent" },
     51        { func: "getFlowedNodes", target: "child" },
     52
     53        { func: "getMouseEventNode", target: "parent" },
     54        { func: "getMouseEventNode", target: "child" },
     55
     56        { func: "getOwnedNodes", target: "parent" },
     57        { func: "getOwnedNodes", target: "child" },
     58
     59        { func: "getParentNode", target: "parent" },
     60        { func: "getParentNode", target: "child" },
     61
     62        { func: "getSelectedChildNodes", target: "parent" },
     63        { func: "getSelectedChildNodes", target: "child" },
    3864    ];
    3965
  • trunk/Source/WebCore/ChangeLog

    r240272 r240277  
     12019-01-22  Devin Rousso  <drousso@apple.com>
     2
     3        Web Inspector: Audit: provide a way to get related Accessibility nodes for a given node
     4        https://bugs.webkit.org/show_bug.cgi?id=193225
     5        <rdar://problem/46799956>
     6
     7        Reviewed by Joseph Pecoraro.
     8
     9        Test: inspector/audit/run-accessibility.html
     10
     11        * inspector/InspectorAuditAccessibilityObject.idl:
     12        * inspector/InspectorAuditAccessibilityObject.h:
     13        * inspector/InspectorAuditAccessibilityObject.cpp:
     14        (WebCore::InspectorAuditAccessibilityObject::getActiveDescendant): Added.
     15        (WebCore::addChildren): Added.
     16        (WebCore::InspectorAuditAccessibilityObject::getChildNodes): Added.
     17        (WebCore::InspectorAuditAccessibilityObject::getControlledNodes): Added.
     18        (WebCore::InspectorAuditAccessibilityObject::getFlowedNodes): Added.
     19        (WebCore::InspectorAuditAccessibilityObject::getMouseEventNode): Added.
     20        (WebCore::InspectorAuditAccessibilityObject::getOwnedNodes): Added.
     21        (WebCore::InspectorAuditAccessibilityObject::getParentNode): Added.
     22        (WebCore::InspectorAuditAccessibilityObject::getSelectedChildNodes): Added.
     23
    1242019-01-22  David Kilzer  <ddkilzer@apple.com>
    225
  • trunk/Source/WebCore/inspector/InspectorAuditAccessibilityObject.cpp

    r239986 r240277  
    2929
    3030#include "AXObjectCache.h"
     31#include "AccessibilityNodeObject.h"
    3132#include "AccessibilityObject.h"
    3233#include "ContainerNode.h"
    3334#include "Document.h"
     35#include "Element.h"
    3436#include "ElementDescendantIterator.h"
     37#include "HTMLNames.h"
    3538#include "Node.h"
    3639#include <wtf/Vector.h>
     
    7679}
    7780
     81ExceptionOr<RefPtr<Node>> InspectorAuditAccessibilityObject::getActiveDescendant(Node& node)
     82{
     83    ERROR_IF_NO_ACTIVE_AUDIT();
     84
     85    if (AccessibilityObject* axObject = accessiblityObjectForNode(node)) {
     86        if (AccessibilityObject* activeDescendant = axObject->activeDescendant())
     87            return activeDescendant->node();
     88    }
     89
     90    return nullptr;
     91}
     92
     93static void addChildren(AccessibilityObject& parentObject, Vector<RefPtr<Node>>& childNodes)
     94{
     95    for (const RefPtr<AccessibilityObject>& childObject : parentObject.children()) {
     96        if (Node* childNode = childObject->node())
     97            childNodes.append(childNode);
     98        else
     99            addChildren(*childObject, childNodes);
     100    }
     101}
     102
     103ExceptionOr<Optional<Vector<RefPtr<Node>>>> InspectorAuditAccessibilityObject::getChildNodes(Node& node)
     104{
     105    ERROR_IF_NO_ACTIVE_AUDIT();
     106
     107    Optional<Vector<RefPtr<Node>>> result;
     108
     109    if (AccessibilityObject* axObject = accessiblityObjectForNode(node)) {
     110        Vector<RefPtr<Node>> childNodes;
     111        addChildren(*axObject, childNodes);
     112        result = WTFMove(childNodes);
     113    }
     114
     115    return result;
     116}
     117
     118
     119ExceptionOr<Optional<Vector<RefPtr<Node>>>> InspectorAuditAccessibilityObject::getControlledNodes(Node& node)
     120{
     121    ERROR_IF_NO_ACTIVE_AUDIT();
     122
     123    Optional<Vector<RefPtr<Node>>> result;
     124
     125    if (AccessibilityObject* axObject = accessiblityObjectForNode(node)) {
     126        Vector<RefPtr<Node>> controlledNodes;
     127
     128        Vector<Element*> controlledElements;
     129        axObject->elementsFromAttribute(controlledElements, HTMLNames::aria_controlsAttr);
     130        for (Element* controlledElement : controlledElements) {
     131            if (controlledElement)
     132                controlledNodes.append(controlledElement);
     133        }
     134
     135        result = WTFMove(controlledNodes);
     136    }
     137
     138    return result;
     139}
     140
     141ExceptionOr<Optional<Vector<RefPtr<Node>>>> InspectorAuditAccessibilityObject::getFlowedNodes(Node& node)
     142{
     143    ERROR_IF_NO_ACTIVE_AUDIT();
     144
     145    Optional<Vector<RefPtr<Node>>> result;
     146
     147    if (AccessibilityObject* axObject = accessiblityObjectForNode(node)) {
     148        Vector<RefPtr<Node>> flowedNodes;
     149
     150        Vector<Element*> flowedElements;
     151        axObject->elementsFromAttribute(flowedElements, HTMLNames::aria_flowtoAttr);
     152        for (Element* flowedElement : flowedElements) {
     153            if (flowedElement)
     154                flowedNodes.append(flowedElement);
     155        }
     156
     157        result = WTFMove(flowedNodes);
     158    }
     159
     160    return result;
     161}
     162
     163ExceptionOr<RefPtr<Node>> InspectorAuditAccessibilityObject::getMouseEventNode(Node& node)
     164{
     165    ERROR_IF_NO_ACTIVE_AUDIT();
     166
     167    if (AccessibilityObject* axObject = accessiblityObjectForNode(node)) {
     168        if (is<AccessibilityNodeObject>(axObject))
     169            return downcast<AccessibilityNodeObject>(axObject)->mouseButtonListener(MouseButtonListenerResultFilter::IncludeBodyElement);
     170    }
     171
     172    return nullptr;
     173}
     174
     175ExceptionOr<Optional<Vector<RefPtr<Node>>>> InspectorAuditAccessibilityObject::getOwnedNodes(Node& node)
     176{
     177    ERROR_IF_NO_ACTIVE_AUDIT();
     178
     179    Optional<Vector<RefPtr<Node>>> result;
     180
     181    if (AccessibilityObject* axObject = accessiblityObjectForNode(node)) {
     182        if (axObject->supportsARIAOwns()) {
     183            Vector<RefPtr<Node>> ownedNodes;
     184
     185            Vector<Element*> ownedElements;
     186            axObject->elementsFromAttribute(ownedElements, HTMLNames::aria_ownsAttr);
     187            for (Element* ownedElement : ownedElements) {
     188                if (ownedElement)
     189                    ownedNodes.append(ownedElement);
     190            }
     191
     192            result = WTFMove(ownedNodes);
     193        }
     194    }
     195
     196    return result;
     197}
     198
     199ExceptionOr<RefPtr<Node>> InspectorAuditAccessibilityObject::getParentNode(Node& node)
     200{
     201    ERROR_IF_NO_ACTIVE_AUDIT();
     202
     203    if (AccessibilityObject* axObject = accessiblityObjectForNode(node)) {
     204        if (AccessibilityObject* parentObject = axObject->parentObjectUnignored())
     205            return parentObject->node();
     206    }
     207
     208    return nullptr;
     209}
     210
     211ExceptionOr<Optional<Vector<RefPtr<Node>>>> InspectorAuditAccessibilityObject::getSelectedChildNodes(Node& node)
     212{
     213    ERROR_IF_NO_ACTIVE_AUDIT();
     214
     215    Optional<Vector<RefPtr<Node>>> result;
     216
     217    if (AccessibilityObject* axObject = accessiblityObjectForNode(node)) {
     218        Vector<RefPtr<Node>> selectedChildNodes;
     219
     220        AccessibilityObject::AccessibilityChildrenVector selectedChildren;
     221        axObject->selectedChildren(selectedChildren);
     222        for (RefPtr<AccessibilityObject>& selectedChildObject : selectedChildren) {
     223            if (Node* selectedChildNode = selectedChildObject->node())
     224                selectedChildNodes.append(selectedChildNode);
     225        }
     226
     227        result = WTFMove(selectedChildNodes);
     228    }
     229
     230    return result;
     231}
     232
    78233} // namespace WebCore
  • trunk/Source/WebCore/inspector/InspectorAuditAccessibilityObject.h

    r239986 r240277  
    2929#include <JavaScriptCore/InspectorAuditAgent.h>
    3030#include <wtf/Forward.h>
     31#include <wtf/Optional.h>
    3132#include <wtf/Ref.h>
    3233#include <wtf/RefCounted.h>
     
    4647    ExceptionOr<Vector<Ref<Node>>> getElementsByComputedRole(Document&, const String& role, Node* container);
    4748
     49    ExceptionOr<RefPtr<Node>> getActiveDescendant(Node&);
     50    ExceptionOr<Optional<Vector<RefPtr<Node>>>> getChildNodes(Node&);
     51    ExceptionOr<Optional<Vector<RefPtr<Node>>>> getControlledNodes(Node&);
     52    ExceptionOr<Optional<Vector<RefPtr<Node>>>> getFlowedNodes(Node&);
     53    ExceptionOr<RefPtr<Node>> getMouseEventNode(Node&);
     54    ExceptionOr<Optional<Vector<RefPtr<Node>>>> getOwnedNodes(Node&);
     55    ExceptionOr<RefPtr<Node>> getParentNode(Node&);
     56    ExceptionOr<Optional<Vector<RefPtr<Node>>>> getSelectedChildNodes(Node&);
     57
    4858private:
    4959    explicit InspectorAuditAccessibilityObject(Inspector::InspectorAuditAgent&);
  • trunk/Source/WebCore/inspector/InspectorAuditAccessibilityObject.idl

    r239986 r240277  
    3030] interface InspectorAuditAccessibilityObject {
    3131    [CallWith=Document, MayThrowException] sequence<Node> getElementsByComputedRole(DOMString role, optional Node? container);
     32
     33    [MayThrowException] Node? getActiveDescendant(Node node);
     34    [MayThrowException] sequence<Node>? getChildNodes(Node node);
     35    [MayThrowException] sequence<Node>? getControlledNodes(Node node);
     36    [MayThrowException] sequence<Node>? getFlowedNodes(Node node);
     37    [MayThrowException] Node? getMouseEventNode(Node node);
     38    [MayThrowException] sequence<Node>? getOwnedNodes(Node node);
     39    [MayThrowException] Node? getParentNode(Node node);
     40    [MayThrowException] sequence<Node>? getSelectedChildNodes(Node node);
    3241};
Note: See TracChangeset for help on using the changeset viewer.