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

Side by Side 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 unified diff | Download patch
OLDNEW
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698