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

Unified Diff: third_party/WebKit/Source/devtools/front_end/accessibility/AccessibilityModel.js

Issue 2390783006: [DevTools] Accessibility: Show siblings and children of selected node (Closed)
Patch Set: UI feedback from Chris 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/Source/devtools/front_end/accessibility/AccessibilityModel.js
diff --git a/third_party/WebKit/Source/devtools/front_end/accessibility/AccessibilityModel.js b/third_party/WebKit/Source/devtools/front_end/accessibility/AccessibilityModel.js
index efb9675c35e8a38c02f15f83c5706184b18bf524..be60c7dc5a5fdcdc6c02d088877a865083cd1346 100644
--- a/third_party/WebKit/Source/devtools/front_end/accessibility/AccessibilityModel.js
+++ b/third_party/WebKit/Source/devtools/front_end/accessibility/AccessibilityModel.js
@@ -26,9 +26,9 @@ WebInspector.AccessibilityNode = class extends WebInspector.SDKObject {
this._description = payload.description || null;
this._value = payload.value || null;
this._properties = payload.properties || null;
- this._parentId = payload.parentId || null;
this._childIds = payload.childIds || null;
- this._domNodeId = payload.domNodeId || null;
+ this._backendDomNodeId = payload.backendDomNodeId || null;
+ this._parentNode = null;
}
/**
@@ -100,9 +100,112 @@ WebInspector.AccessibilityNode = class extends WebInspector.SDKObject {
* @return {?WebInspector.AccessibilityNode}
*/
parentNode() {
- if (!this._parentId)
- return null;
- return this._accessibilityModel.axNodeForId(this._parentId);
+ return this._parentNode;
+ }
+
+ /**
+ * @param {?WebInspector.AccessibilityNode} parentNode
+ */
+ _setParentNode(parentNode) {
+ this._parentNode = parentNode;
+ }
+
+ /**
+ * @return {boolean}
+ */
+ isDOMNode() {
+ return !!this._backendDomNodeId;
+ }
+
+ /**
+ * @return {?WebInspector.DOMNode}
+ */
+ domNode() {
+ return this._domNode || null;
+ }
+
+ /**
+ * @param {?WebInspector.DOMNode} domNode
+ */
+ _setDOMNode(domNode) {
+ this._domNode = domNode;
+ if (domNode)
+ this._accessibilityModel.setAXNodeForDOMNode(domNode, this);
+ }
+
+ /**
+ * @return {!Promise<?WebInspector.DOMNode>}
+ */
+ resolveDOMNode() {
+ if (this._domNode)
+ return Promise.resolve(this._domNode);
+ if (!this._backendDomNodeId)
+ return Promise.resolve(/** @type {?WebInspector.DOMNode} */ (null));
+
+ var deferredNode = new WebInspector.DeferredDOMNode(this.target(), this._backendDomNodeId);
+ return deferredNode.resolvePromise().then((domNode) => {
+ this._setDOMNode(domNode);
+ return domNode;
+ });
+ }
+
+ /**
+ * @return {!Array<!WebInspector.AccessibilityNode>}
+ */
+ children() {
+ var children = [];
+ if (!this._childIds)
+ return children;
+
+ for (var childId of this._childIds) {
+ var child = this._accessibilityModel.axNodeForId(childId);
+ if (child)
+ children.push(child);
+ }
+
+ return children;
+ }
+
+ /**
+ * @return {number}
+ */
+ numChildren() {
+ if (!this._childIds)
+ return 0;
+ return this._childIds.length;
+ }
+
+ /**
+ * @return {boolean}
+ */
+ hasOnlyUnloadedChildren() {
+ if (!this._childIds || !this._childIds.length)
+ return false;
+
+ return !this._childIds.some((id) => this._accessibilityModel.axNodeForId(id) !== undefined);
+ }
+
+ /**
+ * TODO(aboxhall): Remove once protocol is stable.
+ * @param {!WebInspector.AccessibilityNode} inspectedNode
+ * @param {string=} leadingSpace
+ * @return {string}
+ */
+ printSelfAndChildren(inspectedNode, leadingSpace) {
+ var string = leadingSpace || '';
+ if (this._role)
+ string += this._role.value;
+ else
+ string += '<no role>';
+ string += (this._name ? ' ' + this._name.value : '');
+ string += ' ' + this._id;
+ if (this._domNode)
+ string += ' (' + this._domNode.nodeName() + ')';
+ if (this === inspectedNode)
+ string += ' *';
+ for (var child of this.children())
+ string += '\n' + child.printSelfAndChildren(inspectedNode, (leadingSpace || '') + ' ');
+ return string;
}
};
@@ -119,6 +222,7 @@ WebInspector.AccessibilityModel = class extends WebInspector.SDKModel {
/** @type {!Map<string, !WebInspector.AccessibilityNode>} */
this._axIdToAXNode = new Map();
+ this._domNodeToAXNode = new Map();
}
/**
@@ -133,33 +237,25 @@ WebInspector.AccessibilityModel = class extends WebInspector.SDKModel {
}
/**
- * @param {string} axId
- * @return {?WebInspector.AccessibilityNode}
+ * @param {!WebInspector.DOMNode} node
+ * @return {!Promise<?WebInspector.AccessibilityNode>}
*/
- axNodeForId(axId) {
- return this._axIdToAXNode.get(axId);
- }
+ setDOMNode(node) {
+ this._axIdToAXNode.clear();
+ this._inspectedDOMNode = node;
- /**
- * @param {string} axId
- * @param {!WebInspector.AccessibilityNode} axNode
- */
- _setAXNodeForAXId(axId, axNode) {
- this._axIdToAXNode.set(axId, axNode);
+ return this._requestPartialAXTree(node);
}
/**
* @param {!WebInspector.DOMNode} node
- * @return {!Promise<?Array<!WebInspector.AccessibilityNode>>}
+ * @return {!Promise}
*/
- getAXNodeChain(node) {
- this._axIdToAXNode.clear();
-
+ _requestPartialAXTree(node) {
/**
* @this {WebInspector.AccessibilityModel}
* @param {?string} error
* @param {!Array<!AccessibilityAgent.AXNode>=} payloads
- * @return {?Array<!WebInspector.AccessibilityNode>}
*/
function parsePayload(error, payloads) {
if (error) {
@@ -168,15 +264,78 @@ WebInspector.AccessibilityModel = class extends WebInspector.SDKModel {
}
if (!payloads)
- return null;
+ return;
- var nodes = [];
for (var payload of payloads)
- nodes.push(new WebInspector.AccessibilityNode(this, payload));
+ new WebInspector.AccessibilityNode(this, payload);
- return nodes;
+ for (var axNode of this._axIdToAXNode.values()) {
+ for (var axChild of axNode.children()) {
+ axChild._setParentNode(axNode);
+ }
+ }
}
- return this._agent.getAXNodeChain(node.id, true, parsePayload.bind(this));
+ return this._agent.getPartialAXTree(node.id, true, parsePayload.bind(this));
+ }
+
+ /**
+ * @return {?WebInspector.AccessibilityNode}
+ */
+ getInspectedAXNode() {
+ return this._domNodeToAXNode.get(this._inspectedDOMNode);
+ }
+
+ /**
+ * @param {string} axId
+ * @return {?WebInspector.AccessibilityNode}
+ */
+ axNodeForId(axId) {
+ return this._axIdToAXNode.get(axId);
+ }
+
+ /**
+ * @param {string} axId
+ * @param {!WebInspector.AccessibilityNode} axNode
+ */
+ _setAXNodeForAXId(axId, axNode) {
+ this._axIdToAXNode.set(axId, axNode);
+ }
+
+ /**
+ * @param {!WebInspector.DOMNode} domNode
+ * @return {?WebInspector.AccessibilityNode}
+ */
+ axNodeForDOMNode(domNode) {
+ return this._domNodeToAXNode.get(domNode);
+ }
+
+ /**
+ * @param {!WebInspector.DOMNode} domNode
+ * @param {!WebInspector.AccessibilityNode} axNode
+ */
+ setAXNodeForDOMNode(domNode, axNode) {
+ this._domNodeToAXNode.set(domNode, axNode);
+ }
+
+ // TODO(aboxhall): Remove once protocol is stable.
+ logTree() {
+ var inspectedNode = this._domNodeToAXNode.get(this._inspectedDOMNode);
+ if (!inspectedNode)
+ return;
+ var rootNode = inspectedNode;
+ while (rootNode.parentNode())
+ rootNode = rootNode.parentNode();
+ console.log(rootNode.printSelfAndChildren(inspectedNode));
+ }
+
+ /**
+ * @return {!Promise}
+ */
+ resolveAllDOMNodes() {
+ var promises = [];
+ for (var axNode of this._axIdToAXNode.values())
+ promises.push(axNode.resolveDOMNode());
+ return Promise.all(promises);
}
};

Powered by Google App Engine
This is Rietveld 408576698