Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(37)

Unified Diff: third_party/WebKit/LayoutTests/inspector-protocol/accessibility/accessibility-dumpAccessibilityNodes.js

Issue 2390783006: [DevTools] Accessibility: Show siblings and children of selected node (Closed)
Patch Set: Rebase, address comments, revert images Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/LayoutTests/inspector-protocol/accessibility/accessibility-dumpAccessibilityNodes.js
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/accessibility/accessibility-dumpAccessibilityNodes.js b/third_party/WebKit/LayoutTests/inspector-protocol/accessibility/accessibility-dumpAccessibilityNodes.js
index 46d31fde737a6c5c52c0bbb0f94f6baf1b3fd0bd..e0d1890b969263027bca6535ff756be5c91507bf 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/accessibility/accessibility-dumpAccessibilityNodes.js
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/accessibility/accessibility-dumpAccessibilityNodes.js
@@ -7,7 +7,7 @@ function initialize_DumpAccessibilityNodesTest() {
var nodeInfo = {};
InspectorTest.trackGetChildNodesEvents(nodeInfo);
-InspectorTest.dumpAccessibilityNodesBySelectorAndCompleteTest = function(selector, msg) {
+InspectorTest.dumpAccessibilityNodesBySelectorAndCompleteTest = function(selector, fetchRelatives, msg) {
if (msg.error) {
InspectorTest.log(msg.error.message);
InspectorTest.completeTest();
@@ -15,8 +15,11 @@ InspectorTest.dumpAccessibilityNodesBySelectorAndCompleteTest = function(selecto
}
var rootNode = msg.result.root;
- sendQuerySelectorAll(rootNode.nodeId, selector)
- .then((msg) => { return getAXNodes(msg) } )
+ var rootNodeId = rootNode.nodeId;
+ InspectorTest.addNode(nodeInfo, rootNode);
+
+ sendQuerySelectorAll(rootNodeId, selector)
+ .then((msg) => { return getAXNodes(msg, fetchRelatives || false) } )
.then(() => { done(); })
.then(() => {
InspectorTest.completeTest();
@@ -49,21 +52,30 @@ function sendQuerySelectorAll(nodeId, selector)
selector });
}
-function getAXNodes(msg)
+function getAXNodes(msg, fetchRelatives)
{
- var promise;
+ var promise = Promise.resolve();
+ if (!msg.result || !msg.result.nodeIds) {
+ InspectorTest.log("Unexpected result: " + JSON.stringify(msg));
+ InspectorTest.completeTest();
+ }
msg.result.nodeIds.forEach((id) => {
- if (promise)
- promise = promise.then(() => { return sendCommandPromise("Accessibility.getAXNodeChain", { "nodeId": id, "fetchAncestors": false }); });
- else
- promise = sendCommandPromise("Accessibility.getAXNodeChain", { "nodeId": id, "fetchAncestors": false });
- promise = promise.then((msg) => { return rewriteRelatedNodes(msg); })
- .then((msg) => { return dumpNode(null, msg); });
+ if (fetchRelatives) {
+ promise = promise.then(() => {
+ return sendCommandPromise("Accessibility.getPartialAXTree", { "nodeId": id, "fetchRelatives": true });
+ });
+ promise = promise.then((msg) => { return dumpTreeStructure(msg); });
+
+ }
+ promise = promise.then(() => { return sendCommandPromise("Accessibility.getPartialAXTree", { "nodeId": id, "fetchRelatives": false }); })
+ .then((msg) => { return rewriteRelatedNodes(msg); })
+ .then((msg) => { return dumpNode(msg); });
+
});
return promise;
}
-function describeRelatedNode(nodeData)
+function describeDomNode(nodeData)
{
var description = nodeData.nodeName.toLowerCase();
switch (nodeData.nodeType) {
@@ -75,6 +87,44 @@ function describeRelatedNode(nodeData)
return description;
}
+function rewriteBackendDomNodeId(axNode, promises)
+{
+ if (!("backendDomNodeId" in axNode))
+ return;
+
+ function rewriteBackendDomNodeIdPromise(resolve, reject)
+ {
+ if (!("backendDomNodeId" in axNode)) {
+ resolve();
+ return;
+ }
+ var backendDomNodeId = axNode.backendDomNodeId;
+
+ function onDomNodeResolved(backendDomNodeId, message)
+ {
+ if (!message.result || !message.result.nodeIds) {
+ InspectorTest.log("Unexpected result for pushNodesByBackendIdsToFrontend: " + JSON.stringify(message));
+ InspectorTest.completeTest();
+ return;
+ }
+ var nodeId = message.result.nodeIds[0];
+ if (!(nodeId in nodeInfo)) {
+ axNode.backendDomNode = "[NODE NOT FOUND]";
+ resolve();
+ return;
+ }
+ var domNode = nodeInfo[nodeId];
+ delete axNode.backendDomNodeId;
+ axNode.backendDomNode = describeDomNode(domNode);
+ resolve();
+ }
+
+ var params = { "backendNodeIds": [ backendDomNodeId ] };
+ InspectorTest.sendCommand("DOM.pushNodesByBackendIdsToFrontend", params , onDomNodeResolved.bind(null, backendDomNodeId));
+ }
+ promises.push(new Promise(rewriteBackendDomNodeIdPromise));
+}
+
function rewriteRelatedNode(relatedNode)
{
function rewriteRelatedNodePromise(resolve, reject)
@@ -87,18 +137,25 @@ function rewriteRelatedNode(relatedNode)
function onNodeResolved(backendNodeId, message)
{
+ if (!message.result || !message.result.nodeIds) {
+ InspectorTest.log("Unexpected result for pushNodesByBackendIdsToFrontend: " + JSON.stringify(message));
+ InspectorTest.completeTest();
+ return;
+ }
var nodeId = message.result.nodeIds[0];
if (!(nodeId in nodeInfo)) {
relatedNode.nodeResult = "[NODE NOT FOUND]";
resolve();
return;
}
- var node = nodeInfo[nodeId];
+ var domNode = nodeInfo[nodeId];
delete relatedNode.backendNodeId;
- relatedNode.nodeResult = describeRelatedNode(node);
+ relatedNode.nodeResult = describeDomNode(domNode);
resolve();
}
- InspectorTest.sendCommand("DOM.pushNodesByBackendIdsToFrontend", { "backendNodeIds": [ backendNodeId ] }, onNodeResolved.bind(null, backendNodeId));
+ var params = { "backendNodeIds": [ backendNodeId ] };
+ InspectorTest.sendCommand("DOM.pushNodesByBackendIdsToFrontend", params, onNodeResolved.bind(null, backendNodeId));
+
}
return new Promise(rewriteRelatedNodePromise);
}
@@ -153,52 +210,117 @@ function rewriteRelatedNodes(msg)
throw new Error(msg.error.message);
}
- var node = msg.result.nodes[0];
-
- if (node.ignored) {
- checkExists("result.nodes[0].ignoredReasons", msg);
- var properties = node.ignoredReasons;
- } else {
- checkExists("result.nodes[0].properties", msg);
- var properties = node.properties;
- }
var promises = [];
- if (node.name && node.name.sources) {
- for (var source of node.name.sources) {
+ for (var node of msg.result.nodes) {
+ if (node.ignored) {
+ checkExists("ignoredReasons", node);
+ var properties = node.ignoredReasons;
+ } else {
+ checkExists("properties", node);
+ var properties = node.properties;
+ }
+ if (node.name && node.name.sources) {
+ for (var source of node.name.sources) {
var value;
- if (source.value)
- value = source.value;
- if (source.attributeValue)
- value = source.attributeValue;
- if (!value)
- continue;
- if (value.type === "idrefList" ||
- value.type === "idref" ||
- value.type === "nodeList")
- rewriteRelatedNodeValue(value, promises);
+ if (source.value)
+ value = source.value;
+ if (source.attributeValue)
+ value = source.attributeValue;
+ if (!value)
+ continue;
+ if (value.type === "idrefList" ||
+ value.type === "idref" ||
+ value.type === "nodeList")
+ rewriteRelatedNodeValue(value, promises);
+ }
}
- }
- for (var property of properties) {
- if (property.value.type === "idrefList" ||
- property.value.type === "idref" ||
- property.value.type === "nodeList")
- rewriteRelatedNodeValue(property.value, promises);
+ for (var property of properties) {
+ if (property.value.type === "idrefList" ||
+ property.value.type === "idref" ||
+ property.value.type === "nodeList")
+ rewriteRelatedNodeValue(property.value, promises);
+ }
+ rewriteBackendDomNodeId(node, promises);
}
return Promise.all(promises).then(() => { return msg; });
}
-function dumpNode(selector, msg)
+function dumpNode(msg)
{
function stripIds(key, value)
{
if (key == "id")
- return "<int>"
+ return "<int>";
+ if (key == "backendDomNodeId")
+ return "<int>";
if (key == "backendNodeId")
- return "<string>"
+ return "<int>";
if (key == "nodeId")
- return "<string>"
+ return "<string>";
+ if (key == "parentId")
+ return "<string>";
return value;
}
- InspectorTest.log((selector ? selector + ": " : "") + JSON.stringify(msg, stripIds, " "));
+ if (!msg.result || !msg.result.nodes || msg.result.nodes.length !== 1) {
+ InspectorTest.log("Expected exactly one node in " + JSON.stringify(msg, null, " "));
+ return;
+ }
+ InspectorTest.log(JSON.stringify(msg.result.nodes[0], stripIds, " "));
}
+
+function dumpTreeStructure(msg)
+{
+ function printNodeAndChildren(node, leadingSpace)
+ {
+ var string = leadingSpace || "";
+ if (node.ignored)
+ string += "*"
+ if (node.role)
+ string += node.role.value;
+ else
+ string += "<no role>";
+ string += (node.name && node.name.value !== "" ? " \"" + node.name.value + "\"" : "");
+ if (node.children) {
+ for (var child of node.children)
+ string += "\n" + printNodeAndChildren(child, (leadingSpace || "") + " ");
+ }
+ return string;
+ }
+
+ var rawMsg = JSON.stringify(msg, null, " ");
+ var nodeMap = {};
+ if ("result" in msg && "nodes" in msg.result) {
+ for (var node of msg.result.nodes)
+ nodeMap[node.nodeId] = node;
+ }
+ for (var nodeId in nodeMap) {
+ var node = nodeMap[nodeId];
+ if (node.childIds) {
+ node.children = [];
+ for (var i = 0; i < node.childIds.length && node.childIds.length > 0;) {
+ var childId = node.childIds[i];
+ if (childId in nodeMap) {
+ var child = nodeMap[childId];
+ child.parentId = nodeId;
+ node.children.push(child);
+
+ node.childIds.splice(i, 1);
+ } else {
+ node.childIds[i] = "<string>";
+ i++;
+ }
+ }
+ if (!node.childIds.length)
+ delete node.childIds;
+ if (!node.children.length)
+ delete node.children;
+ }
+ }
+ var rootNode = Object.values(nodeMap).find((node) => !("parentId" in node));
+ for (var node of Object.values(nodeMap))
+ delete node.parentId;
+
+ InspectorTest.log("\n" + printNodeAndChildren(rootNode));
+}
+
}

Powered by Google App Engine
This is Rietveld 408576698