| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 /** | 5 /** |
| 6 * @fileoverview ChromeVox utilities for the automation extension API. | 6 * @fileoverview ChromeVox utilities for the automation extension API. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 goog.provide('AutomationUtil'); | 9 goog.provide('AutomationUtil'); |
| 10 | 10 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 return null; | 35 return null; |
| 36 | 36 |
| 37 if (pred(cur) && !AutomationPredicate.shouldIgnoreNode(cur)) | 37 if (pred(cur) && !AutomationPredicate.shouldIgnoreNode(cur)) |
| 38 return cur; | 38 return cur; |
| 39 | 39 |
| 40 var child = dir == Dir.BACKWARD ? cur.lastChild : cur.firstChild; | 40 var child = dir == Dir.BACKWARD ? cur.lastChild : cur.firstChild; |
| 41 while (child) { | 41 while (child) { |
| 42 var ret = AutomationUtil.findNodePre(child, dir, pred); | 42 var ret = AutomationUtil.findNodePre(child, dir, pred); |
| 43 if (ret) | 43 if (ret) |
| 44 return ret; | 44 return ret; |
| 45 child = dir == Dir.BACKWARD ? | 45 child = dir == Dir.BACKWARD ? child.previousSibling : child.nextSibling; |
| 46 child.previousSibling : child.nextSibling; | |
| 47 } | 46 } |
| 48 return null; | 47 return null; |
| 49 }; | 48 }; |
| 50 | 49 |
| 51 /** | 50 /** |
| 52 * Find a node in subtree of |cur| satisfying |pred| using post-order traversal. | 51 * Find a node in subtree of |cur| satisfying |pred| using post-order traversal. |
| 53 * @param {AutomationNode} cur Node to begin the search from. | 52 * @param {AutomationNode} cur Node to begin the search from. |
| 54 * @param {Dir} dir | 53 * @param {Dir} dir |
| 55 * @param {AutomationPredicate.Unary} pred A predicate to apply | 54 * @param {AutomationPredicate.Unary} pred A predicate to apply |
| 56 * to a candidate node. | 55 * to a candidate node. |
| 57 * @return {AutomationNode} | 56 * @return {AutomationNode} |
| 58 */ | 57 */ |
| 59 AutomationUtil.findNodePost = function(cur, dir, pred) { | 58 AutomationUtil.findNodePost = function(cur, dir, pred) { |
| 60 if (!cur) | 59 if (!cur) |
| 61 return null; | 60 return null; |
| 62 | 61 |
| 63 var child = dir == Dir.BACKWARD ? cur.lastChild : cur.firstChild; | 62 var child = dir == Dir.BACKWARD ? cur.lastChild : cur.firstChild; |
| 64 while (child) { | 63 while (child) { |
| 65 var ret = AutomationUtil.findNodePost(child, dir, pred); | 64 var ret = AutomationUtil.findNodePost(child, dir, pred); |
| 66 if (ret) | 65 if (ret) |
| 67 return ret; | 66 return ret; |
| 68 child = dir == Dir.BACKWARD ? | 67 child = dir == Dir.BACKWARD ? child.previousSibling : child.nextSibling; |
| 69 child.previousSibling : child.nextSibling; | |
| 70 } | 68 } |
| 71 | 69 |
| 72 if (pred(cur) && !AutomationPredicate.shouldIgnoreNode(cur)) | 70 if (pred(cur) && !AutomationPredicate.shouldIgnoreNode(cur)) |
| 73 return cur; | 71 return cur; |
| 74 | 72 |
| 75 return null; | 73 return null; |
| 76 }; | 74 }; |
| 77 | 75 |
| 78 /** | 76 /** |
| 79 * Find the next node in the given direction in depth first order. | 77 * Find the next node in the given direction in depth first order. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 94 * By default: | 92 * By default: |
| 95 * the root predicate ges set to |AutomationPredicate.root|. | 93 * the root predicate ges set to |AutomationPredicate.root|. |
| 96 * |skipInitialSubtree| is false if |cur| is a container or matches | 94 * |skipInitialSubtree| is false if |cur| is a container or matches |
| 97 * |pred|. This alleviates the caller from syncing forwards. | 95 * |pred|. This alleviates the caller from syncing forwards. |
| 98 * Leaves are nodes matched by |prred| which are not also containers. | 96 * Leaves are nodes matched by |prred| which are not also containers. |
| 99 * This takes care of syncing backwards. | 97 * This takes care of syncing backwards. |
| 100 * @return {AutomationNode} | 98 * @return {AutomationNode} |
| 101 */ | 99 */ |
| 102 AutomationUtil.findNextNode = function(cur, dir, pred, opt_restrictions) { | 100 AutomationUtil.findNextNode = function(cur, dir, pred, opt_restrictions) { |
| 103 var restrictions = {}; | 101 var restrictions = {}; |
| 104 opt_restrictions = opt_restrictions || {leaf: undefined, | 102 opt_restrictions = opt_restrictions || { |
| 105 root: undefined, | 103 leaf: undefined, |
| 106 visit: undefined, | 104 root: undefined, |
| 107 skipInitialSubtree: !AutomationPredicate.container(cur) && pred(cur)}; | 105 visit: undefined, |
| 106 skipInitialSubtree: !AutomationPredicate.container(cur) && pred(cur) |
| 107 }; |
| 108 | 108 |
| 109 restrictions.root = opt_restrictions.root || AutomationPredicate.root; | 109 restrictions.root = opt_restrictions.root || AutomationPredicate.root; |
| 110 restrictions.leaf = opt_restrictions.leaf || function(node) { | 110 restrictions.leaf = opt_restrictions.leaf || function(node) { |
| 111 // Treat nodes matched by |pred| as leaves except for containers. | 111 // Treat nodes matched by |pred| as leaves except for containers. |
| 112 return !AutomationPredicate.container(node) && pred(node); | 112 return !AutomationPredicate.container(node) && pred(node); |
| 113 }; | 113 }; |
| 114 | 114 |
| 115 restrictions.skipInitialSubtree = opt_restrictions.skipInitialSubtree; | 115 restrictions.skipInitialSubtree = opt_restrictions.skipInitialSubtree; |
| 116 restrictions.skipInitialAncestry = opt_restrictions.skipInitialAncestry; | 116 restrictions.skipInitialAncestry = opt_restrictions.skipInitialAncestry; |
| 117 | 117 |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 /** | 281 /** |
| 282 * Gets a top level root. | 282 * Gets a top level root. |
| 283 * @param {!AutomationNode} node | 283 * @param {!AutomationNode} node |
| 284 * @return {AutomationNode} | 284 * @return {AutomationNode} |
| 285 */ | 285 */ |
| 286 AutomationUtil.getTopLevelRoot = function(node) { | 286 AutomationUtil.getTopLevelRoot = function(node) { |
| 287 var root = node.root; | 287 var root = node.root; |
| 288 if (!root || root.role == RoleType.DESKTOP) | 288 if (!root || root.role == RoleType.DESKTOP) |
| 289 return null; | 289 return null; |
| 290 | 290 |
| 291 while (root && | 291 while (root && root.parent && root.parent.root && |
| 292 root.parent && | 292 root.parent.root.role != RoleType.DESKTOP) { |
| 293 root.parent.root && | |
| 294 root.parent.root.role != RoleType.DESKTOP) { | |
| 295 root = root.parent.root; | 293 root = root.parent.root; |
| 296 } | 294 } |
| 297 return root; | 295 return root; |
| 298 }; | 296 }; |
| 299 | 297 |
| 300 /** | 298 /** |
| 301 * @param {!AutomationNode} prevNode | 299 * @param {!AutomationNode} prevNode |
| 302 * @param {!AutomationNode} node | 300 * @param {!AutomationNode} node |
| 303 * @return {AutomationNode} | 301 * @return {AutomationNode} |
| 304 */ | 302 */ |
| (...skipping 16 matching lines...) Expand all Loading... |
| 321 AutomationUtil.getText = function(node) { | 319 AutomationUtil.getText = function(node) { |
| 322 if (!node) | 320 if (!node) |
| 323 return ''; | 321 return ''; |
| 324 | 322 |
| 325 if (node.role === RoleType.TEXT_FIELD) | 323 if (node.role === RoleType.TEXT_FIELD) |
| 326 return node.value || ''; | 324 return node.value || ''; |
| 327 return node.name || ''; | 325 return node.name || ''; |
| 328 }; | 326 }; |
| 329 | 327 |
| 330 }); // goog.scope | 328 }); // goog.scope |
| OLD | NEW |