| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 function initialize_DumpAccessibilityNodesTest() { | 5 function initialize_DumpAccessibilityNodesTest() { |
| 6 | 6 |
| 7 var nodeInfo = {}; | 7 var nodeInfo = {}; |
| 8 InspectorTest.trackGetChildNodesEvents(nodeInfo); | 8 InspectorTest.trackGetChildNodesEvents(nodeInfo); |
| 9 | 9 |
| 10 InspectorTest.dumpAccessibilityNodesBySelectorAndCompleteTest = function(selecto
r, msg) { | 10 InspectorTest.dumpAccessibilityNodesBySelectorAndCompleteTest = function(selecto
r, fetchRelatives, msg) { |
| 11 if (msg.error) { | 11 if (msg.error) { |
| 12 InspectorTest.log(msg.error.message); | 12 InspectorTest.log(msg.error.message); |
| 13 InspectorTest.completeTest(); | 13 InspectorTest.completeTest(); |
| 14 return; | 14 return; |
| 15 } | 15 } |
| 16 | 16 |
| 17 var rootNode = msg.result.root; | 17 var rootNode = msg.result.root; |
| 18 sendQuerySelectorAll(rootNode.nodeId, selector) | 18 var rootNodeId = rootNode.nodeId; |
| 19 .then((msg) => { return getAXNodes(msg) } ) | 19 InspectorTest.addNode(nodeInfo, rootNode); |
| 20 |
| 21 sendQuerySelectorAll(rootNodeId, selector) |
| 22 .then((msg) => { return getAXNodes(msg, fetchRelatives || false) } ) |
| 20 .then(() => { done(); }) | 23 .then(() => { done(); }) |
| 21 .then(() => { | 24 .then(() => { |
| 22 InspectorTest.completeTest(); | 25 InspectorTest.completeTest(); |
| 23 }) | 26 }) |
| 24 .catch((msg) => { InspectorTest.log("Error: " + JSON.stringify(msg)); }) | 27 .catch((msg) => { InspectorTest.log("Error: " + JSON.stringify(msg)); }) |
| 25 } | 28 } |
| 26 | 29 |
| 27 function sendCommandPromise(command, params) | 30 function sendCommandPromise(command, params) |
| 28 { | 31 { |
| 29 return new Promise(function(resolve, reject) { | 32 return new Promise(function(resolve, reject) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 42 { | 45 { |
| 43 sendCommandPromise("Runtime.evaluate", { expression: "done();" }); | 46 sendCommandPromise("Runtime.evaluate", { expression: "done();" }); |
| 44 } | 47 } |
| 45 | 48 |
| 46 function sendQuerySelectorAll(nodeId, selector) | 49 function sendQuerySelectorAll(nodeId, selector) |
| 47 { | 50 { |
| 48 return sendCommandPromise("DOM.querySelectorAll", { "nodeId": nodeId, "selec
tor": | 51 return sendCommandPromise("DOM.querySelectorAll", { "nodeId": nodeId, "selec
tor": |
| 49 selector }); | 52 selector }); |
| 50 } | 53 } |
| 51 | 54 |
| 52 function getAXNodes(msg) | 55 function getAXNodes(msg, fetchRelatives) |
| 53 { | 56 { |
| 54 var promise; | 57 var promise = Promise.resolve(); |
| 58 if (!msg.result || !msg.result.nodeIds) { |
| 59 InspectorTest.log("Unexpected result: " + JSON.stringify(msg)); |
| 60 InspectorTest.completeTest(); |
| 61 } |
| 55 msg.result.nodeIds.forEach((id) => { | 62 msg.result.nodeIds.forEach((id) => { |
| 56 if (promise) | 63 if (fetchRelatives) { |
| 57 promise = promise.then(() => { return sendCommandPromise("Accessibil
ity.getAXNodeChain", { "nodeId": id, "fetchAncestors": false }); }); | 64 promise = promise.then(() => { |
| 58 else | 65 return sendCommandPromise("Accessibility.getPartialAXTree", { "n
odeId": id, "fetchRelatives": true }); |
| 59 promise = sendCommandPromise("Accessibility.getAXNodeChain", { "node
Id": id, "fetchAncestors": false }); | 66 }); |
| 60 promise = promise.then((msg) => { return rewriteRelatedNodes(msg); }) | 67 promise = promise.then((msg) => { return dumpTreeStructure(msg); }); |
| 61 .then((msg) => { return dumpNode(null, msg); }); | 68 |
| 69 } |
| 70 promise = promise.then(() => { return sendCommandPromise("Accessibility.
getPartialAXTree", { "nodeId": id, "fetchRelatives": false }); }) |
| 71 .then((msg) => { return rewriteRelatedNodes(msg); }) |
| 72 .then((msg) => { return dumpNode(msg); }); |
| 73 |
| 62 }); | 74 }); |
| 63 return promise; | 75 return promise; |
| 64 } | 76 } |
| 65 | 77 |
| 66 function describeRelatedNode(nodeData) | 78 function describeDomNode(nodeData) |
| 67 { | 79 { |
| 68 var description = nodeData.nodeName.toLowerCase(); | 80 var description = nodeData.nodeName.toLowerCase(); |
| 69 switch (nodeData.nodeType) { | 81 switch (nodeData.nodeType) { |
| 70 case Node.ELEMENT_NODE: | 82 case Node.ELEMENT_NODE: |
| 71 var p = nodeData.attributes.indexOf("id"); | 83 var p = nodeData.attributes.indexOf("id"); |
| 72 if (p >= 0) | 84 if (p >= 0) |
| 73 description += "#" + nodeData.attributes[p + 1]; | 85 description += "#" + nodeData.attributes[p + 1]; |
| 74 } | 86 } |
| 75 return description; | 87 return description; |
| 76 } | 88 } |
| 77 | 89 |
| 90 function rewriteBackendDomNodeId(axNode, promises) |
| 91 { |
| 92 if (!("backendDomNodeId" in axNode)) |
| 93 return; |
| 94 |
| 95 function rewriteBackendDomNodeIdPromise(resolve, reject) |
| 96 { |
| 97 if (!("backendDomNodeId" in axNode)) { |
| 98 resolve(); |
| 99 return; |
| 100 } |
| 101 var backendDomNodeId = axNode.backendDomNodeId; |
| 102 |
| 103 function onDomNodeResolved(backendDomNodeId, message) |
| 104 { |
| 105 if (!message.result || !message.result.nodeIds) { |
| 106 InspectorTest.log("Unexpected result for pushNodesByBackendIdsTo
Frontend: " + JSON.stringify(message)); |
| 107 InspectorTest.completeTest(); |
| 108 return; |
| 109 } |
| 110 var nodeId = message.result.nodeIds[0]; |
| 111 if (!(nodeId in nodeInfo)) { |
| 112 axNode.backendDomNode = "[NODE NOT FOUND]"; |
| 113 resolve(); |
| 114 return; |
| 115 } |
| 116 var domNode = nodeInfo[nodeId]; |
| 117 delete axNode.backendDomNodeId; |
| 118 axNode.backendDomNode = describeDomNode(domNode); |
| 119 resolve(); |
| 120 } |
| 121 |
| 122 var params = { "backendNodeIds": [ backendDomNodeId ] }; |
| 123 InspectorTest.sendCommand("DOM.pushNodesByBackendIdsToFrontend", params
, onDomNodeResolved.bind(null, backendDomNodeId)); |
| 124 } |
| 125 promises.push(new Promise(rewriteBackendDomNodeIdPromise)); |
| 126 } |
| 127 |
| 78 function rewriteRelatedNode(relatedNode) | 128 function rewriteRelatedNode(relatedNode) |
| 79 { | 129 { |
| 80 function rewriteRelatedNodePromise(resolve, reject) | 130 function rewriteRelatedNodePromise(resolve, reject) |
| 81 { | 131 { |
| 82 if (!("backendNodeId" in relatedNode)) { | 132 if (!("backendNodeId" in relatedNode)) { |
| 83 reject("Could not find backendNodeId in " + JSON.stringify(relatedNo
de)); | 133 reject("Could not find backendNodeId in " + JSON.stringify(relatedNo
de)); |
| 84 return; | 134 return; |
| 85 } | 135 } |
| 86 var backendNodeId = relatedNode.backendNodeId; | 136 var backendNodeId = relatedNode.backendNodeId; |
| 87 | 137 |
| 88 function onNodeResolved(backendNodeId, message) | 138 function onNodeResolved(backendNodeId, message) |
| 89 { | 139 { |
| 140 if (!message.result || !message.result.nodeIds) { |
| 141 InspectorTest.log("Unexpected result for pushNodesByBackendIdsTo
Frontend: " + JSON.stringify(message)); |
| 142 InspectorTest.completeTest(); |
| 143 return; |
| 144 } |
| 90 var nodeId = message.result.nodeIds[0]; | 145 var nodeId = message.result.nodeIds[0]; |
| 91 if (!(nodeId in nodeInfo)) { | 146 if (!(nodeId in nodeInfo)) { |
| 92 relatedNode.nodeResult = "[NODE NOT FOUND]"; | 147 relatedNode.nodeResult = "[NODE NOT FOUND]"; |
| 93 resolve(); | 148 resolve(); |
| 94 return; | 149 return; |
| 95 } | 150 } |
| 96 var node = nodeInfo[nodeId]; | 151 var domNode = nodeInfo[nodeId]; |
| 97 delete relatedNode.backendNodeId; | 152 delete relatedNode.backendNodeId; |
| 98 relatedNode.nodeResult = describeRelatedNode(node); | 153 relatedNode.nodeResult = describeDomNode(domNode); |
| 99 resolve(); | 154 resolve(); |
| 100 } | 155 } |
| 101 InspectorTest.sendCommand("DOM.pushNodesByBackendIdsToFrontend", { "back
endNodeIds": [ backendNodeId ] }, onNodeResolved.bind(null, backendNodeId)); | 156 var params = { "backendNodeIds": [ backendNodeId ] }; |
| 157 InspectorTest.sendCommand("DOM.pushNodesByBackendIdsToFrontend", params,
onNodeResolved.bind(null, backendNodeId)); |
| 158 |
| 102 } | 159 } |
| 103 return new Promise(rewriteRelatedNodePromise); | 160 return new Promise(rewriteRelatedNodePromise); |
| 104 } | 161 } |
| 105 | 162 |
| 106 function checkExists(path, obj) | 163 function checkExists(path, obj) |
| 107 { | 164 { |
| 108 var pathComponents = path.split("."); | 165 var pathComponents = path.split("."); |
| 109 var currentPath = []; | 166 var currentPath = []; |
| 110 var currentObject = obj; | 167 var currentObject = obj; |
| 111 for (var component of pathComponents) { | 168 for (var component of pathComponents) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 promises.push(rewriteRelatedNode(relatedNode)); | 203 promises.push(rewriteRelatedNode(relatedNode)); |
| 147 } | 204 } |
| 148 } | 205 } |
| 149 | 206 |
| 150 function rewriteRelatedNodes(msg) | 207 function rewriteRelatedNodes(msg) |
| 151 { | 208 { |
| 152 if (msg.error) { | 209 if (msg.error) { |
| 153 throw new Error(msg.error.message); | 210 throw new Error(msg.error.message); |
| 154 } | 211 } |
| 155 | 212 |
| 156 var node = msg.result.nodes[0]; | |
| 157 | |
| 158 if (node.ignored) { | |
| 159 checkExists("result.nodes[0].ignoredReasons", msg); | |
| 160 var properties = node.ignoredReasons; | |
| 161 } else { | |
| 162 checkExists("result.nodes[0].properties", msg); | |
| 163 var properties = node.properties; | |
| 164 } | |
| 165 var promises = []; | 213 var promises = []; |
| 166 if (node.name && node.name.sources) { | 214 for (var node of msg.result.nodes) { |
| 167 for (var source of node.name.sources) { | 215 if (node.ignored) { |
| 216 checkExists("ignoredReasons", node); |
| 217 var properties = node.ignoredReasons; |
| 218 } else { |
| 219 checkExists("properties", node); |
| 220 var properties = node.properties; |
| 221 } |
| 222 if (node.name && node.name.sources) { |
| 223 for (var source of node.name.sources) { |
| 168 var value; | 224 var value; |
| 169 if (source.value) | 225 if (source.value) |
| 170 value = source.value; | 226 value = source.value; |
| 171 if (source.attributeValue) | 227 if (source.attributeValue) |
| 172 value = source.attributeValue; | 228 value = source.attributeValue; |
| 173 if (!value) | 229 if (!value) |
| 174 continue; | 230 continue; |
| 175 if (value.type === "idrefList" || | 231 if (value.type === "idrefList" || |
| 176 value.type === "idref" || | 232 value.type === "idref" || |
| 177 value.type === "nodeList") | 233 value.type === "nodeList") |
| 178 rewriteRelatedNodeValue(value, promises); | 234 rewriteRelatedNodeValue(value, promises); |
| 235 } |
| 179 } | 236 } |
| 180 } | 237 for (var property of properties) { |
| 181 for (var property of properties) { | 238 if (property.value.type === "idrefList" || |
| 182 if (property.value.type === "idrefList" || | 239 property.value.type === "idref" || |
| 183 property.value.type === "idref" || | 240 property.value.type === "nodeList") |
| 184 property.value.type === "nodeList") | 241 rewriteRelatedNodeValue(property.value, promises); |
| 185 rewriteRelatedNodeValue(property.value, promises); | 242 } |
| 243 rewriteBackendDomNodeId(node, promises); |
| 186 } | 244 } |
| 187 return Promise.all(promises).then(() => { return msg; }); | 245 return Promise.all(promises).then(() => { return msg; }); |
| 188 } | 246 } |
| 189 | 247 |
| 190 function dumpNode(selector, msg) | 248 function dumpNode(msg) |
| 191 { | 249 { |
| 192 function stripIds(key, value) | 250 function stripIds(key, value) |
| 193 { | 251 { |
| 194 if (key == "id") | 252 if (key == "id") |
| 195 return "<int>" | 253 return "<int>"; |
| 254 if (key == "backendDomNodeId") |
| 255 return "<int>"; |
| 196 if (key == "backendNodeId") | 256 if (key == "backendNodeId") |
| 197 return "<string>" | 257 return "<int>"; |
| 198 if (key == "nodeId") | 258 if (key == "nodeId") |
| 199 return "<string>" | 259 return "<string>"; |
| 260 if (key == "parentId") |
| 261 return "<string>"; |
| 200 return value; | 262 return value; |
| 201 } | 263 } |
| 202 InspectorTest.log((selector ? selector + ": " : "") + JSON.stringify(msg, st
ripIds, " ")); | 264 if (!msg.result || !msg.result.nodes || msg.result.nodes.length !== 1) { |
| 265 InspectorTest.log("Expected exactly one node in " + JSON.stringify(msg,
null, " ")); |
| 266 return; |
| 267 } |
| 268 InspectorTest.log(JSON.stringify(msg.result.nodes[0], stripIds, " ")); |
| 203 } | 269 } |
| 270 |
| 271 function dumpTreeStructure(msg) |
| 272 { |
| 273 function printNodeAndChildren(node, leadingSpace) |
| 274 { |
| 275 var string = leadingSpace || ""; |
| 276 if (node.ignored) |
| 277 string += "*" |
| 278 if (node.role) |
| 279 string += node.role.value; |
| 280 else |
| 281 string += "<no role>"; |
| 282 string += (node.name && node.name.value !== "" ? " \"" + node.name.value
+ "\"" : ""); |
| 283 if (node.children) { |
| 284 for (var child of node.children) |
| 285 string += "\n" + printNodeAndChildren(child, (leadingSpace || ""
) + " "); |
| 286 } |
| 287 return string; |
| 288 } |
| 289 |
| 290 var rawMsg = JSON.stringify(msg, null, " "); |
| 291 var nodeMap = {}; |
| 292 if ("result" in msg && "nodes" in msg.result) { |
| 293 for (var node of msg.result.nodes) |
| 294 nodeMap[node.nodeId] = node; |
| 295 } |
| 296 for (var nodeId in nodeMap) { |
| 297 var node = nodeMap[nodeId]; |
| 298 if (node.childIds) { |
| 299 node.children = []; |
| 300 for (var i = 0; i < node.childIds.length && node.childIds.length > 0
;) { |
| 301 var childId = node.childIds[i]; |
| 302 if (childId in nodeMap) { |
| 303 var child = nodeMap[childId]; |
| 304 child.parentId = nodeId; |
| 305 node.children.push(child); |
| 306 |
| 307 node.childIds.splice(i, 1); |
| 308 } else { |
| 309 node.childIds[i] = "<string>"; |
| 310 i++; |
| 311 } |
| 312 } |
| 313 if (!node.childIds.length) |
| 314 delete node.childIds; |
| 315 if (!node.children.length) |
| 316 delete node.children; |
| 317 } |
| 318 } |
| 319 var rootNode = Object.values(nodeMap).find((node) => !("parentId" in node)); |
| 320 for (var node of Object.values(nodeMap)) |
| 321 delete node.parentId; |
| 322 |
| 323 InspectorTest.log("\n" + printNodeAndChildren(rootNode)); |
| 204 } | 324 } |
| 325 |
| 326 } |
| OLD | NEW |