Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / chrome / browser / resources / chromeos / chromevox / cvox2 / background / automation_predicate.js
blobf0ce021c40b0e79a2e354ad62e0fddbcaf7f93e7
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
3 // found in the LICENSE file.
5 /**
6  * @fileoverview ChromeVox predicates for the automation extension API.
7  */
9 goog.provide('AutomationPredicate');
10 goog.provide('AutomationPredicate.Binary');
11 goog.provide('AutomationPredicate.Unary');
13 goog.scope(function() {
14 var RoleType = chrome.automation.RoleType;
16 /**
17  * @constructor
18  */
19 AutomationPredicate = function() {};
21 /**
22  * @typedef {function(chrome.automation.AutomationNode) : boolean}
23  */
24 AutomationPredicate.Unary;
26 /**
27  * @typedef {function(chrome.automation.AutomationNode,
28  *                    chrome.automation.AutomationNode) : boolean}
29  */
30 AutomationPredicate.Binary;
32 /**
33  * Constructs a predicate given a role.
34  * @param {RoleType} role
35  * @return {AutomationPredicate.Unary}
36  */
37 AutomationPredicate.withRole = function(role) {
38   return function(node) {
39     return node.role == role;
40   };
43 /** @type {AutomationPredicate.Unary} */
44 AutomationPredicate.checkBox = AutomationPredicate.withRole(RoleType.checkBox);
45 /** @type {AutomationPredicate.Unary} */
46 AutomationPredicate.comboBox = AutomationPredicate.withRole(RoleType.comboBox);
47 /** @type {AutomationPredicate.Unary} */
48 AutomationPredicate.editText = AutomationPredicate.withRole(RoleType.textField);
49 /** @type {AutomationPredicate.Unary} */
50 AutomationPredicate.heading = AutomationPredicate.withRole(RoleType.heading);
51 /** @type {AutomationPredicate.Unary} */
52 AutomationPredicate.inlineTextBox =
53     AutomationPredicate.withRole(RoleType.inlineTextBox);
54 /** @type {AutomationPredicate.Unary} */
55 AutomationPredicate.link = AutomationPredicate.withRole(RoleType.link);
56 /** @type {AutomationPredicate.Unary} */
57 AutomationPredicate.table = AutomationPredicate.withRole(RoleType.table);
59 /**
60  * @param {chrome.automation.AutomationNode} node
61  * @return {boolean}
62  */
63 AutomationPredicate.button = function(node) {
64   return /button/i.test(node.role);
67 /**
68  * @param {chrome.automation.AutomationNode} node
69  * @return {boolean}
70  */
71 AutomationPredicate.formField = function(node) {
72   switch (node.role) {
73     case 'button':
74     case 'buttonDropDown':
75     case 'checkBox':
76     case 'comboBox':
77     case 'date':
78     case 'dateTime':
79     case 'details':
80     case 'disclosureTriangle':
81     case 'form':
82     case 'menuButton':
83     case 'menuListPopup':
84     case 'popUpButton':
85     case 'radioButton':
86     case 'searchBox':
87     case 'slider':
88     case 'spinButton':
89     case 'switch':
90     case 'tab':
91     case 'textField':
92     case 'time':
93     case 'toggleButton':
94     case 'tree':
95       return true;
96   }
97   return false;
101  * @param {chrome.automation.AutomationNode} node
102  * @return {boolean}
103  */
104 AutomationPredicate.landmark = function(node) {
105   switch (node.role) {
106     case 'application':
107     case 'banner':
108     case 'complementary':
109     case 'contentInfo':
110     case 'form':
111     case 'main':
112     case 'navigation':
113     case 'search':
114       return true;
115   }
116   return false;
120  * @param {chrome.automation.AutomationNode} node
121  * @return {boolean}
122  */
123 AutomationPredicate.visitedLink = function(node) {
124   return node.state.visited;
128  * @param {chrome.automation.AutomationNode} node
129  * @return {boolean}
130  */
131 AutomationPredicate.focused = function(node) {
132   return node.state.focused;
136  * @param {chrome.automation.AutomationNode} node
137  * @return {boolean}
138  */
139 AutomationPredicate.leaf = function(node) {
140   return !node.firstChild ||
141       node.role == RoleType.button ||
142       node.role == RoleType.buttonDropDown ||
143       node.role == RoleType.popUpButton ||
144       node.role == RoleType.slider ||
145       node.role == RoleType.textField ||
146       node.children.every(function(n) {
147         return n.state.invisible;
148       });
152  * @param {chrome.automation.AutomationNode} node
153  * @return {boolean}
154  */
155 AutomationPredicate.leafWithText = function(node) {
156   return AutomationPredicate.leaf(node) &&
157       !!(node.name || node.value);
161  * Matches against non-inline textbox 'nodes' which have an equivalent in the
162  *     DOM.
163  * @param {chrome.automation.AutomationNode} node
164  * @return {boolean}
165  */
166 AutomationPredicate.leafDomNode = function(node) {
167   return AutomationPredicate.leaf(node) ||
168       node.role == RoleType.staticText;
172  * @param {chrome.automation.AutomationNode} first
173  * @param {chrome.automation.AutomationNode} second
174  * @return {boolean}
175  */
176 AutomationPredicate.linebreak = function(first, second) {
177   // TODO(dtseng): Use next/previousOnLin once available.
178   var fl = first.location;
179   var sl = second.location;
180   return fl.top != sl.top ||
181       (fl.top + fl.height != sl.top + sl.height);
185  * Leaf nodes that should be ignored while traversing the automation tree. For
186  * example, apply this predicate when moving to the next element.
187  * @param {chrome.automation.AutomationNode} node
188  * @return {boolean}
189  */
190 AutomationPredicate.shouldIgnoreLeaf = function(node) {
191   if (node.name || node.value)
192     return false;
194   return AutomationPredicate.leaf(node) &&
195       (node.role == RoleType.client ||
196        node.role == RoleType.div ||
197        node.role == RoleType.group ||
198        node.role == RoleType.image ||
199        node.role == RoleType.staticText);
202 });  // goog.scope