From 1cbc72ce672c54ac555bc16a4f7f4e6dc02840d9 Mon Sep 17 00:00:00 2001 From: Joel Einbinder Date: Thu, 9 Jan 2020 15:14:23 -0800 Subject: [PATCH] feat(webkit): pass objectId into Page.accessibilitySnapshot (#445) --- browser_patches/webkit/patches/bootstrap.diff | 70 ++++++++++++++----- 1 file changed, 52 insertions(+), 18 deletions(-) diff --git a/browser_patches/webkit/patches/bootstrap.diff b/browser_patches/webkit/patches/bootstrap.diff index 938133f7e2..a0d850e4b7 100644 --- a/browser_patches/webkit/patches/bootstrap.diff +++ b/browser_patches/webkit/patches/bootstrap.diff @@ -945,10 +945,10 @@ index 658f14f8af68073b99a01dd7332628223b67fcd7..bf7c6b49ac403a3b877f60b0f2e23697 "name": "webSocketWillSendHandshakeRequest", "description": "Fired when WebSocket is about to initiate handshake.", diff --git a/Source/JavaScriptCore/inspector/protocol/Page.json b/Source/JavaScriptCore/inspector/protocol/Page.json -index a8fc5332ac92424b00a3dec62152fd3c5f28544e..f68b0722868fbfb449354dead34def546edc3ca7 100644 +index a8fc5332ac92424b00a3dec62152fd3c5f28544e..6dc8ac8e247631d2af6418155f088ea3cc172797 100644 --- a/Source/JavaScriptCore/inspector/protocol/Page.json +++ b/Source/JavaScriptCore/inspector/protocol/Page.json -@@ -110,6 +110,40 @@ +@@ -110,6 +110,41 @@ { "name": "session", "type": "boolean", "description": "True in case of session cookie." }, { "name": "sameSite", "$ref": "CookieSameSitePolicy", "description": "Cookie Same-Site policy." } ] @@ -984,12 +984,13 @@ index a8fc5332ac92424b00a3dec62152fd3c5f28544e..f68b0722868fbfb449354dead34def54 + { "name": "invalid", "type": "string", "optional": true, "enum": ["true", "false", "grammar", "spelling"], "description": "Whether and in what way this node's value is invalid."}, + { "name": "orientation", "type": "string", "optional": true, "description": "Whether the node is oriented horizontally or vertically."}, + { "name": "focusable", "type": "boolean", "optional": true, "description": "Whether the node is focusable."}, -+ { "name": "children", "type": "array", "optional": true, "items": { "$ref": "AXNode"}, "description": "Child AXNodes of this node, if any."} ++ { "name": "children", "type": "array", "optional": true, "items": { "$ref": "AXNode"}, "description": "Child AXNodes of this node, if any."}, ++ { "name": "found", "type": "boolean", "optional": true, "description": "True if this AXNode corresponds with the ObjectId passed into acessibilitySnapshot."} + ] } ], "commands": [ -@@ -129,11 +163,21 @@ +@@ -129,11 +164,21 @@ { "name": "revalidateAllResources", "type": "boolean", "optional": true, "description": "If true, all cached subresources will be revalidated when the main resource loads. Otherwise, only expired cached subresources will be revalidated (the default behavior for most WebKit clients)." } ] }, @@ -1012,7 +1013,7 @@ index a8fc5332ac92424b00a3dec62152fd3c5f28544e..f68b0722868fbfb449354dead34def54 ] }, { -@@ -246,6 +290,13 @@ +@@ -246,6 +291,13 @@ { "name": "appearance", "$ref": "Appearance", "description": "Appearance name to force. Empty string disables the override." } ] }, @@ -1026,7 +1027,7 @@ index a8fc5332ac92424b00a3dec62152fd3c5f28544e..f68b0722868fbfb449354dead34def54 { "name": "snapshotNode", "description": "Capture a snapshot of the specified node that does not include unrelated layers.", -@@ -276,19 +327,68 @@ +@@ -276,19 +328,71 @@ "returns": [ { "name": "data", "type": "string", "description": "Base64-encoded web archive." } ] @@ -1041,6 +1042,9 @@ index a8fc5332ac92424b00a3dec62152fd3c5f28544e..f68b0722868fbfb449354dead34def54 + { + "name": "accessibilitySnapshot", + "description": "Serializes and returns all of the accessibility nodes of the page.", ++ "parameters": [ ++ { "name": "objectId", "type": "string", "optional": true, "description": "Object Id of a node to find in the accessibility tree."} ++ ], + "returns": [ + { "name": "axNode", "$ref": "AXNode", "description": "The root AXNode."} + ] @@ -1097,7 +1101,7 @@ index a8fc5332ac92424b00a3dec62152fd3c5f28544e..f68b0722868fbfb449354dead34def54 ] }, { -@@ -298,6 +398,14 @@ +@@ -298,6 +402,14 @@ { "name": "frame", "$ref": "Frame", "description": "Frame object." } ] }, @@ -1112,7 +1116,7 @@ index a8fc5332ac92424b00a3dec62152fd3c5f28544e..f68b0722868fbfb449354dead34def54 { "name": "frameDetached", "description": "Fired when frame has been detached from its parent.", -@@ -334,12 +442,36 @@ +@@ -334,12 +446,36 @@ { "name": "frameId", "$ref": "Network.FrameId", "description": "Id of the frame that has cleared its scheduled navigation." } ] }, @@ -1958,7 +1962,7 @@ index aecc79bc0ca56fb65fe0330f08e4ee688bf81e89..7b78b5a90004786aee21161bee739c12 + } // namespace WebCore diff --git a/Source/WebCore/inspector/agents/InspectorDOMAgent.h b/Source/WebCore/inspector/agents/InspectorDOMAgent.h -index 51639abeb84f4d95ded3f4fb6409ad8f62a2894e..d651c0ceb58774d446f0201fc1a1bc8646c04860 100644 +index 51639abeb84f4d95ded3f4fb6409ad8f62a2894e..b71b5d196f61406152478180d487c179143397e0 100644 --- a/Source/WebCore/inspector/agents/InspectorDOMAgent.h +++ b/Source/WebCore/inspector/agents/InspectorDOMAgent.h @@ -54,6 +54,7 @@ namespace WebCore { @@ -2005,7 +2009,7 @@ index 51639abeb84f4d95ded3f4fb6409ad8f62a2894e..d651c0ceb58774d446f0201fc1a1bc86 bool handleMousePress(); void mouseDidMoveOverElement(const HitTestResult&, unsigned modifierFlags); void inspect(Node*); -@@ -194,6 +199,7 @@ public: +@@ -194,12 +199,15 @@ public: void reset(); Node* assertNode(ErrorString&, int nodeId); @@ -2013,6 +2017,22 @@ index 51639abeb84f4d95ded3f4fb6409ad8f62a2894e..d651c0ceb58774d446f0201fc1a1bc86 Element* assertElement(ErrorString&, int nodeId); Document* assertDocument(ErrorString&, int nodeId); + bool hasBreakpointForEventListener(EventTarget&, const AtomString& eventType, EventListener&, bool capture); + int idForEventListener(EventTarget&, const AtomString& eventType, EventListener&, bool capture); + ++ Node* nodeForObjectId(const String& objectId); ++ + private: + #if ENABLE(VIDEO) + void mediaMetricsTimerFired(); +@@ -229,7 +237,6 @@ private: + void processAccessibilityChildren(AXCoreObject&, JSON::ArrayOf&); + + Node* nodeForPath(const String& path); +- Node* nodeForObjectId(const String& objectId); + + void discardBindings(); + diff --git a/Source/WebCore/inspector/agents/InspectorDOMStorageAgent.h b/Source/WebCore/inspector/agents/InspectorDOMStorageAgent.h index b578660fbb3ce176e4e0aeb5a22021dc880e47f0..a7c968bc9f88c7d26e1887bb53106b4af2464753 100644 --- a/Source/WebCore/inspector/agents/InspectorDOMStorageAgent.h @@ -2353,7 +2373,7 @@ index a68f84520736977c8b9216616c5a178fbf5275d6..bee832c4c65f9a4487c0d0b7c6fd6985 } // namespace WebCore diff --git a/Source/WebCore/inspector/agents/InspectorPageAgent.cpp b/Source/WebCore/inspector/agents/InspectorPageAgent.cpp -index d4e6b5d1f2151a1f4c16081b2695dd66da416ba2..8e54267226f5fe66c10f1dc7251be9c320b9b062 100644 +index d4e6b5d1f2151a1f4c16081b2695dd66da416ba2..ab2dcf8c4bdbda96e797b8c858ef4a3fb7fc9259 100644 --- a/Source/WebCore/inspector/agents/InspectorPageAgent.cpp +++ b/Source/WebCore/inspector/agents/InspectorPageAgent.cpp @@ -32,6 +32,8 @@ @@ -2572,7 +2592,7 @@ index d4e6b5d1f2151a1f4c16081b2695dd66da416ba2..8e54267226f5fe66c10f1dc7251be9c3 void InspectorPageAgent::archive(ErrorString& errorString, String* data) { #if ENABLE(WEB_ARCHIVE) && USE(CF) -@@ -979,4 +1056,495 @@ void InspectorPageAgent::archive(ErrorString& errorString, String* data) +@@ -979,4 +1056,509 @@ void InspectorPageAgent::archive(ErrorString& errorString, String* data) #endif } @@ -2894,7 +2914,7 @@ index d4e6b5d1f2151a1f4c16081b2695dd66da416ba2..8e54267226f5fe66c10f1dc7251be9c3 + return "Unknown"; +} + -+static RefPtr snapshotForAXObject(RefPtr axObject) { ++static RefPtr snapshotForAXObject(RefPtr axObject, Node* nodeToFind) { + auto axNode = Inspector::Protocol::Page::AXNode::create() + .setRole(roleFromObject(axObject)) + .release(); @@ -2991,17 +3011,20 @@ index d4e6b5d1f2151a1f4c16081b2695dd66da416ba2..8e54267226f5fe66c10f1dc7251be9c3 + if (axObject->isKeyboardFocusable()) + axNode->setFocusable(axObject->isKeyboardFocusable()); + ++ if (nodeToFind && axObject->node() == nodeToFind) ++ axNode->setFound(true); ++ + if (axObject->hasChildren()) { + RefPtr> children = JSON::ArrayOf::create(); + for (auto& childObject : axObject->children()) -+ children->addItem(snapshotForAXObject(childObject)); ++ children->addItem(snapshotForAXObject(childObject, nodeToFind)); + axNode->setChildren(children); + } + return axNode; +} + + -+void InspectorPageAgent::accessibilitySnapshot(ErrorString& errorString, RefPtr& out_axNode) { ++void InspectorPageAgent::accessibilitySnapshot(ErrorString& errorString, const String* objectId, RefPtr& out_axNode) { + if (!WebCore::AXObjectCache::accessibilityEnabled()) + WebCore::AXObjectCache::enableAccessibility(); + auto document = makeRefPtr(m_inspectedPage.mainFrame().document()); @@ -3020,7 +3043,18 @@ index d4e6b5d1f2151a1f4c16081b2695dd66da416ba2..8e54267226f5fe66c10f1dc7251be9c3 + return; + } + -+ out_axNode = snapshotForAXObject(makeRefPtr(axObject)); ++ Node* node = nullptr; ++ if (objectId) { ++ InspectorDOMAgent* domAgent = m_instrumentingAgents.inspectorDOMAgent(); ++ ASSERT(domAgent); ++ node = domAgent->nodeForObjectId(*objectId); ++ if (!node) { ++ errorString = "No Node for objectId"_s; ++ return; ++ } ++ } ++ ++ out_axNode = snapshotForAXObject(makeRefPtr(axObject), node); +} + +void InspectorPageAgent::setInterceptFileChooserDialog(ErrorString&, bool enabled) { @@ -3069,7 +3103,7 @@ index d4e6b5d1f2151a1f4c16081b2695dd66da416ba2..8e54267226f5fe66c10f1dc7251be9c3 + } // namespace WebCore diff --git a/Source/WebCore/inspector/agents/InspectorPageAgent.h b/Source/WebCore/inspector/agents/InspectorPageAgent.h -index 3f3bbb8fce82044c1c230b0ae7186612cc5d45cf..1fcc543029bbc041a3a52e412b0b071e1070d36a 100644 +index 3f3bbb8fce82044c1c230b0ae7186612cc5d45cf..6a67fc9012d258bd6e9c39f5d2a31c8e12c14eb3 100644 --- a/Source/WebCore/inspector/agents/InspectorPageAgent.h +++ b/Source/WebCore/inspector/agents/InspectorPageAgent.h @@ -40,10 +40,15 @@ @@ -3109,7 +3143,7 @@ index 3f3bbb8fce82044c1c230b0ae7186612cc5d45cf..1fcc543029bbc041a3a52e412b0b071e + void snapshotRect(ErrorString&, int x, int y, int width, int height, const String& coordinateSystem, String* outDataURL) override; void archive(ErrorString&, String* data) override; + void insertText(ErrorString&, const String& text) override; -+ void accessibilitySnapshot(ErrorString&, RefPtr& out_axNode) override; ++ void accessibilitySnapshot(ErrorString&, const String* objectId, RefPtr& out_axNode) override; + void setInterceptFileChooserDialog(ErrorString&, bool enabled) override; + void setDefaultBackgroundColorOverride(ErrorString&, const JSON::Object*) override; + void createIsolatedWorld(ErrorString&, const String&, const String*) override;