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(testRunner, session) { |
| 6 |
| 7 function trackGetChildNodesEvents(nodeInfo, callback) |
| 8 { |
| 9 session.protocol.DOM.onSetChildNodes(setChildNodes); |
| 10 |
| 11 function setChildNodes(message) |
| 12 { |
| 13 var nodes = message.params.nodes; |
| 14 for (var i = 0; i < nodes.length; ++i) |
| 15 addNode(nodeInfo, nodes[i]); |
| 16 if (callback) |
| 17 callback(); |
| 18 } |
| 19 } |
| 20 |
| 21 function addNode(nodeInfo, node) |
| 22 { |
| 23 nodeInfo[node.nodeId] = node; |
| 24 delete node.nodeId; |
| 25 var children = node.children || []; |
| 26 for (var i = 0; i < children.length; ++i) |
| 27 addNode(nodeInfo, children[i]); |
| 28 var shadowRoots = node.shadowRoots || []; |
| 29 for (var i = 0; i < shadowRoots.length; ++i) |
| 30 addNode(nodeInfo, shadowRoots[i]); |
| 31 } |
| 32 |
| 33 async function requestDocumentNodeId(callback) |
| 34 { |
| 35 var result = (await session.protocol.DOM.getDocument()).result; |
| 36 if (callback) |
| 37 callback(result.root.nodeId); |
| 38 return result.root.nodeId; |
| 39 }; |
| 40 |
| 41 async function requestNodeId(documentNodeId, selector, callback) |
| 42 { |
| 43 var result = (await session.protocol.DOM.querySelector({"nodeId": documentNo
deId , "selector": selector})).result; |
| 44 if (callback) |
| 45 callback(result.nodeId); |
| 46 return result.nodeId; |
| 47 }; |
6 | 48 |
7 var nodeInfo = {}; | 49 var nodeInfo = {}; |
8 InspectorTest.trackGetChildNodesEvents(nodeInfo); | 50 trackGetChildNodesEvents(nodeInfo); |
9 | 51 |
10 InspectorTest.dumpAccessibilityNodesBySelectorAndCompleteTest = function(selecto
r, fetchRelatives, msg) { | 52 function dumpAccessibilityNodesBySelectorAndCompleteTest(selector, fetchRelative
s, msg) { |
11 if (msg.error) { | 53 if (msg.error) { |
12 InspectorTest.log(msg.error.message); | 54 testRunner.log(msg.error.message); |
13 InspectorTest.completeTest(); | 55 testRunner.completeTest(); |
14 return; | 56 return; |
15 } | 57 } |
16 | 58 |
17 var rootNode = msg.result.root; | 59 var rootNode = msg.result.root; |
18 var rootNodeId = rootNode.nodeId; | 60 var rootNodeId = rootNode.nodeId; |
19 InspectorTest.addNode(nodeInfo, rootNode); | 61 addNode(nodeInfo, rootNode); |
20 | 62 |
21 sendQuerySelectorAll(rootNodeId, selector) | 63 sendQuerySelectorAll(rootNodeId, selector) |
22 .then((msg) => { return getAXNodes(msg, fetchRelatives || false) } ) | 64 .then((msg) => { return getAXNodes(msg, fetchRelatives || false) } ) |
23 .then(() => { done(); }) | 65 .then(() => { done(); }) |
24 .then(() => { | 66 .then(() => { |
25 InspectorTest.completeTest(); | 67 testRunner.completeTest(); |
26 }) | 68 }) |
27 .catch((msg) => { InspectorTest.log("Error: " + JSON.stringify(msg)); }) | 69 .catch((msg) => { testRunner.log("Error: " + JSON.stringify(msg)); }) |
28 } | |
29 | |
30 function sendCommandPromise(command, params) | |
31 { | |
32 return new Promise(function(resolve, reject) { | |
33 InspectorTest.sendCommand(command, params, function(msg) { | |
34 if (msg.error) { | |
35 reject(msg.error); | |
36 return; | |
37 } | |
38 | |
39 resolve(msg); | |
40 }) | |
41 }); | |
42 } | 70 } |
43 | 71 |
44 function done() | 72 function done() |
45 { | 73 { |
46 sendCommandPromise("Runtime.evaluate", { expression: "done();" }); | 74 session.protocol.Runtime.evaluate({expression: "done();"}); |
47 } | 75 } |
48 | 76 |
49 function sendQuerySelectorAll(nodeId, selector) | 77 function sendQuerySelectorAll(nodeId, selector) |
50 { | 78 { |
51 return sendCommandPromise("DOM.querySelectorAll", { "nodeId": nodeId, "selec
tor": | 79 return session.protocol.DOM.querySelectorAll({"nodeId": nodeId, "selector":
selector }); |
52 selector }); | |
53 } | 80 } |
54 | 81 |
55 function getAXNodes(msg, fetchRelatives) | 82 function getAXNodes(msg, fetchRelatives) |
56 { | 83 { |
57 var promise = Promise.resolve(); | 84 var promise = Promise.resolve(); |
58 if (!msg.result || !msg.result.nodeIds) { | 85 if (!msg.result || !msg.result.nodeIds) { |
59 InspectorTest.log("Unexpected result: " + JSON.stringify(msg)); | 86 testRunner.log("Unexpected result: " + JSON.stringify(msg)); |
60 InspectorTest.completeTest(); | 87 testRunner.completeTest(); |
61 } | 88 } |
62 msg.result.nodeIds.forEach((id) => { | 89 msg.result.nodeIds.forEach((id) => { |
63 if (fetchRelatives) { | 90 if (fetchRelatives) { |
64 promise = promise.then(() => { | 91 promise = promise.then(() => { |
65 return sendCommandPromise("Accessibility.getPartialAXTree", { "n
odeId": id, "fetchRelatives": true }); | 92 return session.protocol.Accessibility.getPartialAXTree({ "nodeId
": id, "fetchRelatives": true }); |
66 }); | 93 }); |
67 promise = promise.then((msg) => { return rewriteRelatedNodes(msg, id
); }) | 94 promise = promise.then((msg) => { return rewriteRelatedNodes(msg, id
); }) |
68 .then((msg) => { return dumpTreeStructure(msg); }); | 95 .then((msg) => { return dumpTreeStructure(msg); }); |
69 | 96 |
70 } | 97 } |
71 promise = promise.then(() => { return sendCommandPromise("Accessibility.
getPartialAXTree", { "nodeId": id, "fetchRelatives": false }); }) | 98 promise = promise.then(() => { return session.protocol.Accessibility.get
PartialAXTree({ "nodeId": id, "fetchRelatives": false }); }) |
72 .then((msg) => { return rewriteRelatedNodes(msg, id); }
) | 99 .then((msg) => { return rewriteRelatedNodes(msg, id); }
) |
73 .then((msg) => { return dumpNode(msg); }); | 100 .then((msg) => { return dumpNode(msg); }); |
74 | 101 |
75 }); | 102 }); |
76 return promise; | 103 return promise; |
77 } | 104 } |
78 | 105 |
79 function describeDomNode(nodeData) | 106 function describeDomNode(nodeData) |
80 { | 107 { |
81 var description = nodeData.nodeName.toLowerCase(); | 108 var description = nodeData.nodeName.toLowerCase(); |
(...skipping 15 matching lines...) Expand all Loading... |
97 { | 124 { |
98 if (!("backendDOMNodeId" in axNode)) { | 125 if (!("backendDOMNodeId" in axNode)) { |
99 resolve(); | 126 resolve(); |
100 return; | 127 return; |
101 } | 128 } |
102 var backendDOMNodeId = axNode.backendDOMNodeId; | 129 var backendDOMNodeId = axNode.backendDOMNodeId; |
103 | 130 |
104 function onDomNodeResolved(backendDOMNodeId, message) | 131 function onDomNodeResolved(backendDOMNodeId, message) |
105 { | 132 { |
106 if (!message.result || !message.result.nodeIds) { | 133 if (!message.result || !message.result.nodeIds) { |
107 InspectorTest.log("Unexpected result for pushNodesByBackendIdsTo
Frontend: " + JSON.stringify(message)); | 134 testRunner.log("Unexpected result for pushNodesByBackendIdsToFro
ntend: " + JSON.stringify(message)); |
108 InspectorTest.completeTest(); | 135 testRunner.completeTest(); |
109 return; | 136 return; |
110 } | 137 } |
111 var nodeId = message.result.nodeIds[0]; | 138 var nodeId = message.result.nodeIds[0]; |
112 if (!(nodeId in nodeInfo)) { | 139 if (!(nodeId in nodeInfo)) { |
113 axNode.domNode = "[NODE NOT FOUND]"; | 140 axNode.domNode = "[NODE NOT FOUND]"; |
114 resolve(); | 141 resolve(); |
115 return; | 142 return; |
116 } | 143 } |
117 var domNode = nodeInfo[nodeId]; | 144 var domNode = nodeInfo[nodeId]; |
118 delete axNode.backendDOMNodeId; | 145 delete axNode.backendDOMNodeId; |
119 axNode.domNode = describeDomNode(domNode); | 146 axNode.domNode = describeDomNode(domNode); |
120 if (nodeId === selectedNodeId) | 147 if (nodeId === selectedNodeId) |
121 axNode.selected = true; | 148 axNode.selected = true; |
122 resolve(); | 149 resolve(); |
123 } | 150 } |
124 | 151 |
125 var params = { "backendNodeIds": [ backendDOMNodeId ] }; | 152 var params = { "backendNodeIds": [ backendDOMNodeId ] }; |
126 InspectorTest.sendCommand("DOM.pushNodesByBackendIdsToFrontend", params
, onDomNodeResolved.bind(null, backendDOMNodeId)); | 153 session.protocol.DOM.pushNodesByBackendIdsToFrontend(params).then(onDomN
odeResolved.bind(null, backendDOMNodeId)); |
127 } | 154 } |
128 promises.push(new Promise(rewriteBackendDomNodeIdPromise)); | 155 promises.push(new Promise(rewriteBackendDomNodeIdPromise)); |
129 } | 156 } |
130 | 157 |
131 function rewriteRelatedNode(relatedNode) | 158 function rewriteRelatedNode(relatedNode) |
132 { | 159 { |
133 function rewriteRelatedNodePromise(resolve, reject) | 160 function rewriteRelatedNodePromise(resolve, reject) |
134 { | 161 { |
135 if (!("backendDOMNodeId" in relatedNode)) { | 162 if (!("backendDOMNodeId" in relatedNode)) { |
136 reject("Could not find backendDOMNodeId in " + JSON.stringify(relate
dNode)); | 163 reject("Could not find backendDOMNodeId in " + JSON.stringify(relate
dNode)); |
137 return; | 164 return; |
138 } | 165 } |
139 var backendDOMNodeId = relatedNode.backendDOMNodeId; | 166 var backendDOMNodeId = relatedNode.backendDOMNodeId; |
140 | 167 |
141 function onNodeResolved(backendDOMNodeId, message) | 168 function onNodeResolved(backendDOMNodeId, message) |
142 { | 169 { |
143 if (!message.result || !message.result.nodeIds) { | 170 if (!message.result || !message.result.nodeIds) { |
144 InspectorTest.log("Unexpected result for pushNodesByBackendIdsTo
Frontend: " + JSON.stringify(message)); | 171 testRunner.log("Unexpected result for pushNodesByBackendIdsToFro
ntend: " + JSON.stringify(message)); |
145 InspectorTest.completeTest(); | 172 testRunner.completeTest(); |
146 return; | 173 return; |
147 } | 174 } |
148 var nodeId = message.result.nodeIds[0]; | 175 var nodeId = message.result.nodeIds[0]; |
149 if (!(nodeId in nodeInfo)) { | 176 if (!(nodeId in nodeInfo)) { |
150 relatedNode.nodeResult = "[NODE NOT FOUND]"; | 177 relatedNode.nodeResult = "[NODE NOT FOUND]"; |
151 resolve(); | 178 resolve(); |
152 return; | 179 return; |
153 } | 180 } |
154 var domNode = nodeInfo[nodeId]; | 181 var domNode = nodeInfo[nodeId]; |
155 delete relatedNode.backendDOMNodeId; | 182 delete relatedNode.backendDOMNodeId; |
156 relatedNode.nodeResult = describeDomNode(domNode); | 183 relatedNode.nodeResult = describeDomNode(domNode); |
157 resolve(); | 184 resolve(); |
158 } | 185 } |
159 var params = { "backendNodeIds": [ backendDOMNodeId ] }; | 186 var params = { "backendNodeIds": [ backendDOMNodeId ] }; |
160 InspectorTest.sendCommand("DOM.pushNodesByBackendIdsToFrontend", params,
onNodeResolved.bind(null, backendDOMNodeId)); | 187 session.protocol.DOM.pushNodesByBackendIdsToFrontend(params).then(onNode
Resolved.bind(null, backendDOMNodeId)); |
161 | 188 |
162 } | 189 } |
163 return new Promise(rewriteRelatedNodePromise); | 190 return new Promise(rewriteRelatedNodePromise); |
164 } | 191 } |
165 | 192 |
166 function checkExists(path, obj) | 193 function checkExists(path, obj) |
167 { | 194 { |
168 var pathComponents = path.split("."); | 195 var pathComponents = path.split("."); |
169 var currentPath = []; | 196 var currentPath = []; |
170 var currentObject = obj; | 197 var currentObject = obj; |
171 for (var component of pathComponents) { | 198 for (var component of pathComponents) { |
172 var isArray = false; | 199 var isArray = false; |
173 var index = -1; | 200 var index = -1; |
174 var matches = component.match(/(\w+)\[(\d+)\]/); | 201 var matches = component.match(/(\w+)\[(\d+)\]/); |
175 if (matches) { | 202 if (matches) { |
176 isArray = true; | 203 isArray = true; |
177 component = matches[1]; | 204 component = matches[1]; |
178 index = Number.parseInt(matches[2], 10); | 205 index = Number.parseInt(matches[2], 10); |
179 } | 206 } |
180 currentPath.push(component); | 207 currentPath.push(component); |
181 if (!(component in currentObject)) { | 208 if (!(component in currentObject)) { |
182 InspectorTest.log("Could not find " + currentPath.join(".") + " in "
+ JSON.stringify(obj, null, " ")); | 209 testRunner.log("Could not find " + currentPath.join(".") + " in " +
JSON.stringify(obj, null, " ")); |
183 InspectorTest.completeTest(); | 210 testRunner.completeTest(); |
184 } | 211 } |
185 if (isArray) | 212 if (isArray) |
186 currentObject = currentObject[component][index]; | 213 currentObject = currentObject[component][index]; |
187 else | 214 else |
188 currentObject = currentObject[component]; | 215 currentObject = currentObject[component]; |
189 } | 216 } |
190 return true; | 217 return true; |
191 } | 218 } |
192 | 219 |
193 function check(condition, errorMsg, obj) | 220 function check(condition, errorMsg, obj) |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
254 { | 281 { |
255 var stripKeys = ["id", "backendDOMNodeId", "nodeId", "parentId"]; | 282 var stripKeys = ["id", "backendDOMNodeId", "nodeId", "parentId"]; |
256 if (stripKeys.indexOf(key) !== -1) | 283 if (stripKeys.indexOf(key) !== -1) |
257 return "<" + typeof(value) + ">"; | 284 return "<" + typeof(value) + ">"; |
258 var deleteKeys = ["selected"]; | 285 var deleteKeys = ["selected"]; |
259 if (deleteKeys.indexOf(key) !== -1) | 286 if (deleteKeys.indexOf(key) !== -1) |
260 return undefined; | 287 return undefined; |
261 return value; | 288 return value; |
262 } | 289 } |
263 if (!msg.result || !msg.result.nodes || msg.result.nodes.length !== 1) { | 290 if (!msg.result || !msg.result.nodes || msg.result.nodes.length !== 1) { |
264 InspectorTest.log("Expected exactly one node in " + JSON.stringify(msg,
null, " ")); | 291 testRunner.log("Expected exactly one node in " + JSON.stringify(msg, nul
l, " ")); |
265 return; | 292 return; |
266 } | 293 } |
267 InspectorTest.log(JSON.stringify(msg.result.nodes[0], stripIds, " ")); | 294 testRunner.log(JSON.stringify(msg.result.nodes[0], stripIds, " ")); |
268 } | 295 } |
269 | 296 |
270 function dumpTreeStructure(msg) | 297 function dumpTreeStructure(msg) |
271 { | 298 { |
272 function printNodeAndChildren(node, leadingSpace) | 299 function printNodeAndChildren(node, leadingSpace) |
273 { | 300 { |
274 leadingSpace = leadingSpace || ""; | 301 leadingSpace = leadingSpace || ""; |
275 var string = leadingSpace; | 302 var string = leadingSpace; |
276 if (node.selected) | 303 if (node.selected) |
277 string += "*"; | 304 string += "*"; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 if (!node.childIds.length) | 340 if (!node.childIds.length) |
314 delete node.childIds; | 341 delete node.childIds; |
315 if (!node.children.length) | 342 if (!node.children.length) |
316 delete node.children; | 343 delete node.children; |
317 } | 344 } |
318 } | 345 } |
319 var rootNode = Object.values(nodeMap).find((node) => !("parentId" in node)); | 346 var rootNode = Object.values(nodeMap).find((node) => !("parentId" in node)); |
320 for (var node of Object.values(nodeMap)) | 347 for (var node of Object.values(nodeMap)) |
321 delete node.parentId; | 348 delete node.parentId; |
322 | 349 |
323 InspectorTest.log("\n" + printNodeAndChildren(rootNode)); | 350 testRunner.log("\n" + printNodeAndChildren(rootNode)); |
324 } | 351 } |
325 | 352 |
326 } | 353 return dumpAccessibilityNodesBySelectorAndCompleteTest; |
| 354 |
| 355 }) |
OLD | NEW |