Only grant permissions to new extensions from sync if they have the expected version
[chromium-blink-merge.git] / chrome / browser / resources / chromeos / chromevox / cvox2 / background / automation_predicate.js
blob28b90a622572b2c42e7f17dd49daba6b61cd59d9
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  * @param {chrome.automation.AutomationNode} first
162  * @param {chrome.automation.AutomationNode} second
163  * @return {boolean}
164  */
165 AutomationPredicate.linebreak = function(first, second) {
166   // TODO(dtseng): Use next/previousOnLin once available.
167   var fl = first.location;
168   var sl = second.location;
169   return fl.top != sl.top ||
170       (fl.top + fl.height != sl.top + sl.height);
174  * Leaf nodes that should be ignored while traversing the automation tree. For
175  * example, apply this predicate when moving to the next element.
176  * @param {chrome.automation.AutomationNode} node
177  * @return {boolean}
178  */
179 AutomationPredicate.shouldIgnoreLeaf = function(node) {
180   if (node.name || node.value)
181     return false;
183   return AutomationPredicate.leaf(node) &&
184       (node.role == RoleType.client ||
185        node.role == RoleType.div ||
186        node.role == RoleType.group ||
187        node.role == RoleType.image ||
188        node.role == RoleType.staticText);
191 });  // goog.scope