WebKit Bugzilla
Attachment 359596 Details for
Bug 193225
: Web Inspector: Audit: provide a way to get related Accessibility nodes for a given node
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-193225-20190119004954.patch (text/plain), 17.50 KB, created by
Devin Rousso
on 2019-01-19 00:49:55 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Devin Rousso
Created:
2019-01-19 00:49:55 PST
Size:
17.50 KB
patch
obsolete
>diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index c041dc2d1645f44974f0bd49b44573c0b63763d6..161467fa8d6914d40c7db050c3fd9b9e01a40815 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,26 @@ >+2019-01-19 Devin Rousso <drousso@apple.com> >+ >+ 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. >+ >+ 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. >+ > 2019-01-18 Eric Carlson <eric.carlson@apple.com> > > Revert r238815, it broke WK1 video fullscreen on Mac >diff --git a/Source/WebCore/inspector/InspectorAuditAccessibilityObject.cpp b/Source/WebCore/inspector/InspectorAuditAccessibilityObject.cpp >index 7882a7108de1c790f095ba8ef59500fcfef8cf45..1d8c403de017ef990593a23f877498657f41fa16 100644 >--- a/Source/WebCore/inspector/InspectorAuditAccessibilityObject.cpp >+++ b/Source/WebCore/inspector/InspectorAuditAccessibilityObject.cpp >@@ -28,10 +28,13 @@ > #include "InspectorAuditAccessibilityObject.h" > > #include "AXObjectCache.h" >+#include "AccessibilityNodeObject.h" > #include "AccessibilityObject.h" > #include "ContainerNode.h" > #include "Document.h" >+#include "Element.h" > #include "ElementDescendantIterator.h" >+#include "HTMLNames.h" > #include "Node.h" > #include <wtf/Vector.h> > >@@ -75,4 +78,156 @@ ExceptionOr<Vector<Ref<Node>>> InspectorAuditAccessibilityObject::getElementsByC > return nodes; > } > >+ExceptionOr<RefPtr<Node>> InspectorAuditAccessibilityObject::getActiveDescendant(Node& node) >+{ >+ ERROR_IF_NO_ACTIVE_AUDIT(); >+ >+ if (AccessibilityObject* axObject = accessiblityObjectForNode(node)) { >+ if (AccessibilityObject* activeDescendant = axObject->activeDescendant()) >+ return activeDescendant->node(); >+ } >+ >+ return nullptr; >+} >+ >+static void addChildren(AccessibilityObject& parentObject, Vector<RefPtr<Node>>& childNodes) >+{ >+ for (const RefPtr<AccessibilityObject>& childObject : parentObject.children()) { >+ if (Node* childNode = childObject->node()) >+ childNodes.append(childNode); >+ else >+ addChildren(*childObject, childNodes); >+ } >+} >+ >+ExceptionOr<Optional<Vector<RefPtr<Node>>>> InspectorAuditAccessibilityObject::getChildNodes(Node& node) >+{ >+ ERROR_IF_NO_ACTIVE_AUDIT(); >+ >+ Optional<Vector<RefPtr<Node>>> result; >+ >+ if (AccessibilityObject* axObject = accessiblityObjectForNode(node)) { >+ Vector<RefPtr<Node>> childNodes; >+ addChildren(*axObject, childNodes); >+ result = WTFMove(childNodes); >+ } >+ >+ return result; >+} >+ >+ >+ExceptionOr<Optional<Vector<RefPtr<Node>>>> InspectorAuditAccessibilityObject::getControlledNodes(Node& node) >+{ >+ ERROR_IF_NO_ACTIVE_AUDIT(); >+ >+ Optional<Vector<RefPtr<Node>>> result; >+ >+ if (AccessibilityObject* axObject = accessiblityObjectForNode(node)) { >+ Vector<RefPtr<Node>> controlledNodes; >+ >+ Vector<Element*> controlledElements; >+ axObject->elementsFromAttribute(controlledElements, HTMLNames::aria_controlsAttr); >+ for (Element* controlledElement : controlledElements) { >+ if (controlledElement) >+ controlledNodes.append(controlledElement); >+ } >+ >+ result = WTFMove(controlledNodes); >+ } >+ >+ return result; >+} >+ >+ExceptionOr<Optional<Vector<RefPtr<Node>>>> InspectorAuditAccessibilityObject::getFlowedNodes(Node& node) >+{ >+ ERROR_IF_NO_ACTIVE_AUDIT(); >+ >+ Optional<Vector<RefPtr<Node>>> result; >+ >+ if (AccessibilityObject* axObject = accessiblityObjectForNode(node)) { >+ Vector<RefPtr<Node>> flowedNodes; >+ >+ Vector<Element*> flowedElements; >+ axObject->elementsFromAttribute(flowedElements, HTMLNames::aria_flowtoAttr); >+ for (Element* flowedElement : flowedElements) { >+ if (flowedElement) >+ flowedNodes.append(flowedElement); >+ } >+ >+ result = WTFMove(flowedNodes); >+ } >+ >+ return result; >+} >+ >+ExceptionOr<RefPtr<Node>> InspectorAuditAccessibilityObject::getMouseEventNode(Node& node) >+{ >+ ERROR_IF_NO_ACTIVE_AUDIT(); >+ >+ if (AccessibilityObject* axObject = accessiblityObjectForNode(node)) { >+ if (is<AccessibilityNodeObject>(axObject)) >+ return downcast<AccessibilityNodeObject>(axObject)->mouseButtonListener(MouseButtonListenerResultFilter::IncludeBodyElement); >+ } >+ >+ return nullptr; >+} >+ >+ExceptionOr<Optional<Vector<RefPtr<Node>>>> InspectorAuditAccessibilityObject::getOwnedNodes(Node& node) >+{ >+ ERROR_IF_NO_ACTIVE_AUDIT(); >+ >+ Optional<Vector<RefPtr<Node>>> result; >+ >+ if (AccessibilityObject* axObject = accessiblityObjectForNode(node)) { >+ if (axObject->supportsARIAOwns()) { >+ Vector<RefPtr<Node>> ownedNodes; >+ >+ Vector<Element*> ownedElements; >+ axObject->elementsFromAttribute(ownedElements, HTMLNames::aria_ownsAttr); >+ for (Element* ownedElement : ownedElements) { >+ if (ownedElement) >+ ownedNodes.append(ownedElement); >+ } >+ >+ result = WTFMove(ownedNodes); >+ } >+ } >+ >+ return result; >+} >+ >+ExceptionOr<RefPtr<Node>> InspectorAuditAccessibilityObject::getParentNode(Node& node) >+{ >+ ERROR_IF_NO_ACTIVE_AUDIT(); >+ >+ if (AccessibilityObject* axObject = accessiblityObjectForNode(node)) { >+ if (AccessibilityObject* parentObject = axObject->parentObjectUnignored()) >+ return parentObject->node(); >+ } >+ >+ return nullptr; >+} >+ >+ExceptionOr<Optional<Vector<RefPtr<Node>>>> InspectorAuditAccessibilityObject::getSelectedChildNodes(Node& node) >+{ >+ ERROR_IF_NO_ACTIVE_AUDIT(); >+ >+ Optional<Vector<RefPtr<Node>>> result; >+ >+ if (AccessibilityObject* axObject = accessiblityObjectForNode(node)) { >+ Vector<RefPtr<Node>> selectedChildNodes; >+ >+ AccessibilityObject::AccessibilityChildrenVector selectedChildren; >+ axObject->selectedChildren(selectedChildren); >+ for (RefPtr<AccessibilityObject>& selectedChildObject : selectedChildren) { >+ if (Node* selectedChildNode = selectedChildObject->node()) >+ selectedChildNodes.append(selectedChildNode); >+ } >+ >+ result = WTFMove(selectedChildNodes); >+ } >+ >+ return result; >+} >+ > } // namespace WebCore >diff --git a/Source/WebCore/inspector/InspectorAuditAccessibilityObject.h b/Source/WebCore/inspector/InspectorAuditAccessibilityObject.h >index 88f963a9531b8e6b2cc86198f8b849c537206dcc..348e6fb5bed34ef0232d8dd60e8f723bd12213da 100644 >--- a/Source/WebCore/inspector/InspectorAuditAccessibilityObject.h >+++ b/Source/WebCore/inspector/InspectorAuditAccessibilityObject.h >@@ -28,6 +28,7 @@ > #include "ExceptionOr.h" > #include <JavaScriptCore/InspectorAuditAgent.h> > #include <wtf/Forward.h> >+#include <wtf/Optional.h> > #include <wtf/Ref.h> > #include <wtf/RefCounted.h> > >@@ -45,6 +46,15 @@ public: > > ExceptionOr<Vector<Ref<Node>>> getElementsByComputedRole(Document&, const String& role, Node* container); > >+ ExceptionOr<RefPtr<Node>> getActiveDescendant(Node&); >+ ExceptionOr<Optional<Vector<RefPtr<Node>>>> getChildNodes(Node&); >+ ExceptionOr<Optional<Vector<RefPtr<Node>>>> getControlledNodes(Node&); >+ ExceptionOr<Optional<Vector<RefPtr<Node>>>> getFlowedNodes(Node&); >+ ExceptionOr<RefPtr<Node>> getMouseEventNode(Node&); >+ ExceptionOr<Optional<Vector<RefPtr<Node>>>> getOwnedNodes(Node&); >+ ExceptionOr<RefPtr<Node>> getParentNode(Node&); >+ ExceptionOr<Optional<Vector<RefPtr<Node>>>> getSelectedChildNodes(Node&); >+ > private: > explicit InspectorAuditAccessibilityObject(Inspector::InspectorAuditAgent&); > >diff --git a/Source/WebCore/inspector/InspectorAuditAccessibilityObject.idl b/Source/WebCore/inspector/InspectorAuditAccessibilityObject.idl >index 46f1b52655876a9c0289c40df960b9a74a91932e..926450f28283bb45ed8719337c0db01ae129f2f0 100644 >--- a/Source/WebCore/inspector/InspectorAuditAccessibilityObject.idl >+++ b/Source/WebCore/inspector/InspectorAuditAccessibilityObject.idl >@@ -29,4 +29,13 @@ > NoInterfaceObject, > ] interface InspectorAuditAccessibilityObject { > [CallWith=Document, MayThrowException] sequence<Node> getElementsByComputedRole(DOMString role, optional Node? container); >+ >+ [MayThrowException] Node? getActiveDescendant(Node node); >+ [MayThrowException] sequence<Node>? getChildNodes(Node node); >+ [MayThrowException] sequence<Node>? getControlledNodes(Node node); >+ [MayThrowException] sequence<Node>? getFlowedNodes(Node node); >+ [MayThrowException] Node? getMouseEventNode(Node node); >+ [MayThrowException] sequence<Node>? getOwnedNodes(Node node); >+ [MayThrowException] Node? getParentNode(Node node); >+ [MayThrowException] sequence<Node>? getSelectedChildNodes(Node node); > }; >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 3546178a072af9b739ed64f27275b53b1c239a3d..e40ade17fc3c32b69d35288c39a48411996f98aa 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,14 @@ >+2019-01-19 Devin Rousso <drousso@apple.com> >+ >+ 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. >+ >+ * inspector/audit/run-accessibility.html: >+ * inspector/audit/run-accessibility-expected.txt: >+ > 2019-01-18 Justin Fan <justin_fan@apple.com> > > (WIP) [WebGPU] WebGPUProgrammablePassEncoder::setBindGroup prototype >diff --git a/LayoutTests/inspector/audit/run-accessibility-expected.txt b/LayoutTests/inspector/audit/run-accessibility-expected.txt >index 7a663dc9006529c3dfbf610920f6632588d24704..72d2fb7ab499172e9b714462b1dc85b2967b584c 100644 >--- a/LayoutTests/inspector/audit/run-accessibility-expected.txt >+++ b/LayoutTests/inspector/audit/run-accessibility-expected.txt >@@ -39,6 +39,102 @@ Audit run `WebInspectorAudit.Accessibility.getElementsByComputedRole("button", d > Result: [] > Audit teardown... > >+-- Running test case: Audit.run.Accessibility.getActiveDescendant.parent >+Audit setup... >+Audit run `WebInspectorAudit.Accessibility.getActiveDescendant(document.querySelector("#parent"))`... >+Result: #child >+Audit teardown... >+ >+-- Running test case: Audit.run.Accessibility.getActiveDescendant.child >+Audit setup... >+Audit run `WebInspectorAudit.Accessibility.getActiveDescendant(document.querySelector("#child"))`... >+Result: null >+Audit teardown... >+ >+-- Running test case: Audit.run.Accessibility.getChildNodes.parent >+Audit setup... >+Audit run `WebInspectorAudit.Accessibility.getChildNodes(document.querySelector("#parent"))`... >+Result: ["#child"] >+Audit teardown... >+ >+-- Running test case: Audit.run.Accessibility.getChildNodes.child >+Audit setup... >+Audit run `WebInspectorAudit.Accessibility.getChildNodes(document.querySelector("#child"))`... >+Result: [] >+Audit teardown... >+ >+-- Running test case: Audit.run.Accessibility.getControlledNodes.parent >+Audit setup... >+Audit run `WebInspectorAudit.Accessibility.getControlledNodes(document.querySelector("#parent"))`... >+Result: ["#child"] >+Audit teardown... >+ >+-- Running test case: Audit.run.Accessibility.getControlledNodes.child >+Audit setup... >+Audit run `WebInspectorAudit.Accessibility.getControlledNodes(document.querySelector("#child"))`... >+Result: [] >+Audit teardown... >+ >+-- Running test case: Audit.run.Accessibility.getFlowedNodes.parent >+Audit setup... >+Audit run `WebInspectorAudit.Accessibility.getFlowedNodes(document.querySelector("#parent"))`... >+Result: ["#child"] >+Audit teardown... >+ >+-- Running test case: Audit.run.Accessibility.getFlowedNodes.child >+Audit setup... >+Audit run `WebInspectorAudit.Accessibility.getFlowedNodes(document.querySelector("#child"))`... >+Result: [] >+Audit teardown... >+ >+-- Running test case: Audit.run.Accessibility.getMouseEventNode.parent >+Audit setup... >+Audit run `WebInspectorAudit.Accessibility.getMouseEventNode(document.querySelector("#parent"))`... >+Result: #parent >+Audit teardown... >+ >+-- Running test case: Audit.run.Accessibility.getMouseEventNode.child >+Audit setup... >+Audit run `WebInspectorAudit.Accessibility.getMouseEventNode(document.querySelector("#child"))`... >+Result: #parent >+Audit teardown... >+ >+-- Running test case: Audit.run.Accessibility.getOwnedNodes.parent >+Audit setup... >+Audit run `WebInspectorAudit.Accessibility.getOwnedNodes(document.querySelector("#parent"))`... >+Result: ["#child"] >+Audit teardown... >+ >+-- Running test case: Audit.run.Accessibility.getOwnedNodes.child >+Audit setup... >+Audit run `WebInspectorAudit.Accessibility.getOwnedNodes(document.querySelector("#child"))`... >+Result: null >+Audit teardown... >+ >+-- Running test case: Audit.run.Accessibility.getParentNode.parent >+Audit setup... >+Audit run `WebInspectorAudit.Accessibility.getParentNode(document.querySelector("#parent"))`... >+Result: null >+Audit teardown... >+ >+-- Running test case: Audit.run.Accessibility.getParentNode.child >+Audit setup... >+Audit run `WebInspectorAudit.Accessibility.getParentNode(document.querySelector("#child"))`... >+Result: #parent >+Audit teardown... >+ >+-- Running test case: Audit.run.Accessibility.getSelectedChildNodes.parent >+Audit setup... >+Audit run `WebInspectorAudit.Accessibility.getSelectedChildNodes(document.querySelector("#parent"))`... >+Result: ["#child"] >+Audit teardown... >+ >+-- Running test case: Audit.run.Accessibility.getSelectedChildNodes.child >+Audit setup... >+Audit run `WebInspectorAudit.Accessibility.getSelectedChildNodes(document.querySelector("#child"))`... >+Result: [] >+Audit teardown... >+ > -- Running test case: Audit.run.Accessibility.InvalidCopiedFunctionCall > Audit setup... > Copying WebInspectorAudit to window... >@@ -46,4 +142,28 @@ Audit teardown... > Testing copied getElementsByComputedRole... > PASS: Should produce an exception. > Error: NotAllowedError: Cannot be called outside of a Web Inspector Audit >+Testing copied getActiveDescendant... >+PASS: Should produce an exception. >+Error: NotAllowedError: Cannot be called outside of a Web Inspector Audit >+Testing copied getChildNodes... >+PASS: Should produce an exception. >+Error: NotAllowedError: Cannot be called outside of a Web Inspector Audit >+Testing copied getControlledNodes... >+PASS: Should produce an exception. >+Error: NotAllowedError: Cannot be called outside of a Web Inspector Audit >+Testing copied getFlowedNodes... >+PASS: Should produce an exception. >+Error: NotAllowedError: Cannot be called outside of a Web Inspector Audit >+Testing copied getMouseEventNode... >+PASS: Should produce an exception. >+Error: NotAllowedError: Cannot be called outside of a Web Inspector Audit >+Testing copied getOwnedNodes... >+PASS: Should produce an exception. >+Error: NotAllowedError: Cannot be called outside of a Web Inspector Audit >+Testing copied getParentNode... >+PASS: Should produce an exception. >+Error: NotAllowedError: Cannot be called outside of a Web Inspector Audit >+Testing copied getSelectedChildNodes... >+PASS: Should produce an exception. >+Error: NotAllowedError: Cannot be called outside of a Web Inspector Audit > >diff --git a/LayoutTests/inspector/audit/run-accessibility.html b/LayoutTests/inspector/audit/run-accessibility.html >index 305135f130f9a484a85102ea5893b3d94ee4bbfc..09d4385fab66178383124b2d09fd25ac078cd61a 100644 >--- a/LayoutTests/inspector/audit/run-accessibility.html >+++ b/LayoutTests/inspector/audit/run-accessibility.html >@@ -10,7 +10,9 @@ function stringify(result) { > return "#" + result.id; > if (Array.isArray(result)) > return JSON.stringify(result.map(stringify)); >- return false; >+ if (result === null); >+ return result; >+ return "UNEXPECTED " + result; > } > > function test() >@@ -35,6 +37,30 @@ function test() > { func: "getElementsByComputedRole", role: "tree", target: "parent" }, > { func: "getElementsByComputedRole", role: "button" }, > { func: "getElementsByComputedRole", role: "button", target: "parent" }, >+ >+ { func: "getActiveDescendant", target: "parent" }, >+ { func: "getActiveDescendant", target: "child" }, >+ >+ { func: "getChildNodes", target: "parent" }, >+ { func: "getChildNodes", target: "child" }, >+ >+ { func: "getControlledNodes", target: "parent" }, >+ { func: "getControlledNodes", target: "child" }, >+ >+ { func: "getFlowedNodes", target: "parent" }, >+ { func: "getFlowedNodes", target: "child" }, >+ >+ { func: "getMouseEventNode", target: "parent" }, >+ { func: "getMouseEventNode", target: "child" }, >+ >+ { func: "getOwnedNodes", target: "parent" }, >+ { func: "getOwnedNodes", target: "child" }, >+ >+ { func: "getParentNode", target: "parent" }, >+ { func: "getParentNode", target: "child" }, >+ >+ { func: "getSelectedChildNodes", target: "parent" }, >+ { func: "getSelectedChildNodes", target: "child" }, > ]; > > for (let {func, target, role} of tests) {
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 193225
:
358565
|
358568
|
358848
|
358858
|
359174
|
359175
|
359182
|
359183
|
359188
|
359232
|
359237
|
359240
|
359244
|
359562
|
359567
|
359572
|
359581
|
359596
|
359601
|
359602
|
359604
|
359749