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

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 tests again and be consistent about backendDOMNodeId 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
« no previous file with comments | « no previous file | third_party/WebKit/LayoutTests/inspector-protocol/accessibility/accessibility-getAXNode.html » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..a933495d11430c467e855ec76f006904ad91676f 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,31 @@ 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 rewriteRelatedNodes(msg, id); })
+ .then((msg) => { return dumpTreeStructure(msg); });
+
+ }
+ promise = promise.then(() => { return sendCommandPromise("Accessibility.getPartialAXTree", { "nodeId": id, "fetchRelatives": false }); })
+ .then((msg) => { return rewriteRelatedNodes(msg, id); })
+ .then((msg) => { return dumpNode(msg); });
+
});
return promise;
}
-function describeRelatedNode(nodeData)
+function describeDomNode(nodeData)
{
var description = nodeData.nodeName.toLowerCase();
switch (nodeData.nodeType) {
@@ -75,30 +88,77 @@ function describeRelatedNode(nodeData)
return description;
}
+function rewriteBackendDomNodeId(axNode, selectedNodeId, 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.domNode = "[NODE NOT FOUND]";
+ resolve();
+ return;
+ }
+ var domNode = nodeInfo[nodeId];
+ delete axNode.backendDOMNodeId;
+ axNode.domNode = describeDomNode(domNode);
+ if (nodeId === selectedNodeId)
+ axNode.selected = true;
+ 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)
{
- if (!("backendNodeId" in relatedNode)) {
- reject("Could not find backendNodeId in " + JSON.stringify(relatedNode));
+ if (!("backendDOMNodeId" in relatedNode)) {
+ reject("Could not find backendDOMNodeId in " + JSON.stringify(relatedNode));
return;
}
- var backendNodeId = relatedNode.backendNodeId;
+ var backendDOMNodeId = relatedNode.backendDOMNodeId;
- function onNodeResolved(backendNodeId, message)
+ function onNodeResolved(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)) {
relatedNode.nodeResult = "[NODE NOT FOUND]";
resolve();
return;
}
- var node = nodeInfo[nodeId];
- delete relatedNode.backendNodeId;
- relatedNode.nodeResult = describeRelatedNode(node);
+ var domNode = nodeInfo[nodeId];
+ delete relatedNode.backendDOMNodeId;
+ relatedNode.nodeResult = describeDomNode(domNode);
resolve();
}
- InspectorTest.sendCommand("DOM.pushNodesByBackendIdsToFrontend", { "backendNodeIds": [ backendNodeId ] }, onNodeResolved.bind(null, backendNodeId));
+ var params = { "backendNodeIds": [ backendDOMNodeId ] };
+ InspectorTest.sendCommand("DOM.pushNodesByBackendIdsToFrontend", params, onNodeResolved.bind(null, backendDOMNodeId));
+
}
return new Promise(rewriteRelatedNodePromise);
}
@@ -147,58 +207,120 @@ function rewriteRelatedNodeValue(value, promises)
}
}
-function rewriteRelatedNodes(msg)
+function rewriteRelatedNodes(msg, nodeId)
{
if (msg.error) {
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, nodeId, promises);
}
return Promise.all(promises).then(() => { return msg; });
}
-function dumpNode(selector, msg)
+function dumpNode(msg)
{
function stripIds(key, value)
{
- if (key == "id")
- return "<int>"
- if (key == "backendNodeId")
- return "<string>"
- if (key == "nodeId")
- return "<string>"
+ var stripKeys = ["id", "backendDOMNodeId", "nodeId", "parentId"];
+ if (stripKeys.indexOf(key) !== -1)
+ return "<" + typeof(value) + ">";
+ var deleteKeys = ["selected"];
+ if (deleteKeys.indexOf(key) !== -1)
+ return undefined;
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)
+ {
+ leadingSpace = leadingSpace || "";
+ var string = leadingSpace;
+ if (node.selected)
+ 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));
+}
+
}
« no previous file with comments | « no previous file | third_party/WebKit/LayoutTests/inspector-protocol/accessibility/accessibility-getAXNode.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698