| Index: chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_predicate.js
|
| diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_predicate.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_predicate.js
|
| index c7bc3d2f772897c702de244ce530495c7a045836..f44c602bb0b227d739863e6bef66626ea9ca732e 100644
|
| --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_predicate.js
|
| +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_predicate.js
|
| @@ -15,7 +15,7 @@ goog.require('constants');
|
| goog.scope(function() {
|
| var AutomationNode = chrome.automation.AutomationNode;
|
| var Dir = constants.Dir;
|
| -var RoleType = chrome.automation.RoleType;
|
| +var Role = chrome.automation.RoleType;
|
|
|
| /**
|
| * @constructor
|
| @@ -33,31 +33,45 @@ AutomationPredicate.Unary;
|
| AutomationPredicate.Binary;
|
|
|
| /**
|
| - * Constructs a predicate given a role.
|
| - * @param {RoleType} role
|
| + * Constructs a predicate given a list of roles.
|
| + * @param {!Array<Role>} roles
|
| * @return {AutomationPredicate.Unary}
|
| */
|
| -AutomationPredicate.withRole = function(role) {
|
| +AutomationPredicate.roles = function(roles) {
|
| + return AutomationPredicate.match({anyRole: roles });
|
| +};
|
| +
|
| +/**
|
| + * Constructs a predicate given a list of roles or predicates.
|
| + * @param {{anyRole: (Array<Role>|undefined),
|
| + * anyPredicate: (Array<AutomationPredicate.Unary>|undefined)}} params
|
| + * @return {AutomationPredicate.Unary}
|
| + */
|
| +AutomationPredicate.match = function(params) {
|
| + var anyRole = params.anyRole || [];
|
| + var anyPredicate = params.anyPredicate || [];
|
| return function(node) {
|
| - return node.role == role;
|
| + return anyRole.some(function(role) { return role == node.role; }) ||
|
| + anyPredicate.some(function(p) { return p(node); });
|
| };
|
| };
|
|
|
| /** @type {AutomationPredicate.Unary} */
|
| -AutomationPredicate.checkBox = AutomationPredicate.withRole(RoleType.checkBox);
|
| +AutomationPredicate.checkBox = AutomationPredicate.roles([Role.checkBox]);
|
| /** @type {AutomationPredicate.Unary} */
|
| -AutomationPredicate.comboBox = AutomationPredicate.withRole(RoleType.comboBox);
|
| +AutomationPredicate.comboBox = AutomationPredicate.roles(
|
| + [Role.comboBox, Role.popUpButton, Role.menuListPopup]);
|
| /** @type {AutomationPredicate.Unary} */
|
| -AutomationPredicate.heading = AutomationPredicate.withRole(RoleType.heading);
|
| +AutomationPredicate.heading = AutomationPredicate.roles([Role.heading]);
|
| /** @type {AutomationPredicate.Unary} */
|
| AutomationPredicate.inlineTextBox =
|
| - AutomationPredicate.withRole(RoleType.inlineTextBox);
|
| + AutomationPredicate.roles([Role.inlineTextBox]);
|
| /** @type {AutomationPredicate.Unary} */
|
| -AutomationPredicate.link = AutomationPredicate.withRole(RoleType.link);
|
| +AutomationPredicate.link = AutomationPredicate.roles([Role.link]);
|
| /** @type {AutomationPredicate.Unary} */
|
| -AutomationPredicate.row = AutomationPredicate.withRole(RoleType.row);
|
| +AutomationPredicate.row = AutomationPredicate.roles([Role.row]);
|
| /** @type {AutomationPredicate.Unary} */
|
| -AutomationPredicate.table = AutomationPredicate.withRole(RoleType.table);
|
| +AutomationPredicate.table = AutomationPredicate.roles([Role.table]);
|
|
|
| /**
|
| * @param {!AutomationNode} node
|
| @@ -67,7 +81,6 @@ AutomationPredicate.button = function(node) {
|
| return /button/i.test(node.role);
|
| };
|
|
|
| -
|
| /**
|
| * @param {!AutomationNode} node
|
| * @return {boolean}
|
| @@ -78,57 +91,33 @@ AutomationPredicate.editText = function(node) {
|
| !node.parent.state.editable;
|
| };
|
|
|
| -/**
|
| - * @param {!AutomationNode} node
|
| - * @return {boolean}
|
| - */
|
| -AutomationPredicate.formField = function(node) {
|
| - switch (node.role) {
|
| - case 'button':
|
| - case 'buttonDropDown':
|
| - case 'checkBox':
|
| - case 'comboBox':
|
| - case 'date':
|
| - case 'dateTime':
|
| - case 'details':
|
| - case 'disclosureTriangle':
|
| - case 'form':
|
| - case 'menuButton':
|
| - case 'menuListPopup':
|
| - case 'popUpButton':
|
| - case 'radioButton':
|
| - case 'searchBox':
|
| - case 'slider':
|
| - case 'spinButton':
|
| - case 'switch':
|
| - case 'tab':
|
| - case 'textField':
|
| - case 'time':
|
| - case 'toggleButton':
|
| - case 'tree':
|
| - return true;
|
| - }
|
| - return false;
|
| -};
|
| +/** @type {AutomationPredicate.Unary} */
|
| +AutomationPredicate.formField = AutomationPredicate.match({
|
| + anyPredicate: [
|
| + AutomationPredicate.button,
|
| + AutomationPredicate.comboBox,
|
| + AutomationPredicate.editText
|
| + ],
|
| + anyRole: [
|
| + Role.checkBox,
|
| + Role.listBox,
|
| + Role.slider,
|
| + Role.tab,
|
| + Role.tree
|
| + ]
|
| +});
|
|
|
| -/**
|
| - * @param {!AutomationNode} node
|
| - * @return {boolean}
|
| - */
|
| -AutomationPredicate.landmark = function(node) {
|
| - switch (node.role) {
|
| - case 'application':
|
| - case 'banner':
|
| - case 'complementary':
|
| - case 'contentInfo':
|
| - case 'form':
|
| - case 'main':
|
| - case 'navigation':
|
| - case 'search':
|
| - return true;
|
| - }
|
| - return false;
|
| -};
|
| +/** @type {AutomationPredicate.Unary} */
|
| +AutomationPredicate.landmark = AutomationPredicate.roles([
|
| + Role.application,
|
| + Role.banner,
|
| + Role.complementary,
|
| + Role.contentInfo,
|
| + Role.form,
|
| + Role.main,
|
| + Role.navigation,
|
| + Role.region,
|
| + Role.search]);
|
|
|
| /**
|
| * @param {!AutomationNode} node
|
| @@ -152,11 +141,11 @@ AutomationPredicate.focused = function(node) {
|
| */
|
| AutomationPredicate.leaf = function(node) {
|
| return !node.firstChild ||
|
| - node.role == RoleType.button ||
|
| - node.role == RoleType.buttonDropDown ||
|
| - node.role == RoleType.popUpButton ||
|
| - node.role == RoleType.slider ||
|
| - node.role == RoleType.textField ||
|
| + node.role == Role.button ||
|
| + node.role == Role.buttonDropDown ||
|
| + node.role == Role.popUpButton ||
|
| + node.role == Role.slider ||
|
| + node.role == Role.textField ||
|
| node.state.invisible ||
|
| node.children.every(function(n) {
|
| return n.state.invisible;
|
| @@ -181,7 +170,7 @@ AutomationPredicate.leafWithText = function(node) {
|
| */
|
| AutomationPredicate.leafOrStaticText = function(node) {
|
| return AutomationPredicate.leaf(node) ||
|
| - node.role == RoleType.staticText;
|
| + node.role == Role.staticText;
|
| };
|
|
|
| /**
|
| @@ -202,9 +191,9 @@ AutomationPredicate.object = function(node) {
|
| return node.state.focusable ||
|
| (AutomationPredicate.leafOrStaticText(node) &&
|
| (/\S+/.test(node.name) ||
|
| - (node.role != RoleType.lineBreak &&
|
| - node.role != RoleType.staticText &&
|
| - node.role != RoleType.inlineTextBox)));
|
| + (node.role != Role.lineBreak &&
|
| + node.role != Role.staticText &&
|
| + node.role != Role.inlineTextBox)));
|
| };
|
|
|
| /**
|
| @@ -228,14 +217,14 @@ AutomationPredicate.linebreak = function(first, second) {
|
| */
|
| AutomationPredicate.container = function(node) {
|
| return AutomationPredicate.structuralContainer(node) ||
|
| - node.role == RoleType.div ||
|
| - node.role == RoleType.document ||
|
| - node.role == RoleType.group ||
|
| - node.role == RoleType.listItem ||
|
| - node.role == RoleType.toolbar ||
|
| - node.role == RoleType.window ||
|
| + node.role == Role.div ||
|
| + node.role == Role.document ||
|
| + node.role == Role.group ||
|
| + node.role == Role.listItem ||
|
| + node.role == Role.toolbar ||
|
| + node.role == Role.window ||
|
| // For example, crosh.
|
| - (node.role == RoleType.textField && node.state.readOnly) ||
|
| + (node.role == Role.textField && node.state.readOnly) ||
|
| (node.state.editable && node.parent && !node.parent.state.editable);
|
| };
|
|
|
| @@ -246,10 +235,10 @@ AutomationPredicate.container = function(node) {
|
| * @return {boolean}
|
| */
|
| AutomationPredicate.structuralContainer = function(node) {
|
| - return node.role == RoleType.rootWebArea ||
|
| - node.role == RoleType.embeddedObject ||
|
| - node.role == RoleType.iframe ||
|
| - node.role == RoleType.iframePresentational;
|
| + return node.role == Role.rootWebArea ||
|
| + node.role == Role.embeddedObject ||
|
| + node.role == Role.iframe ||
|
| + node.role == Role.iframePresentational;
|
| };
|
|
|
| /**
|
| @@ -260,13 +249,13 @@ AutomationPredicate.structuralContainer = function(node) {
|
| */
|
| AutomationPredicate.root = function(node) {
|
| switch (node.role) {
|
| - case RoleType.dialog:
|
| - case RoleType.window:
|
| + case Role.dialog:
|
| + case Role.window:
|
| return true;
|
| - case RoleType.toolbar:
|
| - return node.root.role == RoleType.desktop;
|
| - case RoleType.rootWebArea:
|
| - return !node.parent || node.parent.root.role == RoleType.desktop;
|
| + case Role.toolbar:
|
| + return node.root.role == Role.desktop;
|
| + case Role.rootWebArea:
|
| + return !node.parent || node.parent.root.role == Role.desktop;
|
| default:
|
| return false;
|
| }
|
| @@ -289,7 +278,7 @@ AutomationPredicate.shouldIgnoreNode = function(node) {
|
| return true;
|
|
|
| // Ignore list markers since we already announce listitem role.
|
| - if (node.role == RoleType.listMarker)
|
| + if (node.role == Role.listMarker)
|
| return true;
|
|
|
| // Don't ignore nodes with names.
|
| @@ -298,28 +287,26 @@ AutomationPredicate.shouldIgnoreNode = function(node) {
|
|
|
| // Ignore some roles.
|
| return AutomationPredicate.leaf(node) &&
|
| - (node.role == RoleType.client ||
|
| - node.role == RoleType.column ||
|
| - node.role == RoleType.div ||
|
| - node.role == RoleType.group ||
|
| - node.role == RoleType.image ||
|
| - node.role == RoleType.staticText ||
|
| - node.role == RoleType.tableHeaderContainer);
|
| + (AutomationPredicate.roles([Role.client,
|
| + Role.column,
|
| + Role.div,
|
| + Role.group,
|
| + Role.image,
|
| + Role.staticText,
|
| + Role.tableHeaderContainer])(node));
|
| };
|
|
|
| -
|
| /**
|
| * Returns if the node has a meaningful checked state.
|
| * @param {!AutomationNode} node
|
| * @return {boolean}
|
| */
|
| -AutomationPredicate.checkable = function(node) {
|
| - return node.role == RoleType.checkBox ||
|
| - node.role == RoleType.radioButton ||
|
| - node.role == RoleType.menuItemCheckBox ||
|
| - node.role == RoleType.menuItemRadio ||
|
| - node.role == RoleType.treeItem;
|
| -};
|
| +AutomationPredicate.checkable = AutomationPredicate.roles([
|
| + Role.checkBox,
|
| + Role.radioButton,
|
| + Role.menuItemCheckBox,
|
| + Role.menuItemRadio,
|
| + Role.treeItem]);
|
|
|
| // Table related predicates.
|
| /**
|
| @@ -327,11 +314,10 @@ AutomationPredicate.checkable = function(node) {
|
| * @param {!AutomationNode} node
|
| * @return {boolean}
|
| */
|
| -AutomationPredicate.cellLike = function(node) {
|
| - return node.role == RoleType.cell ||
|
| - node.role == RoleType.rowHeader ||
|
| - node.role == RoleType.columnHeader;
|
| -};
|
| +AutomationPredicate.cellLike = AutomationPredicate.roles([
|
| + Role.cell,
|
| + Role.rowHeader,
|
| + Role.columnHeader]);
|
|
|
| /**
|
| * Returns a predicate that will match against the directed next cell taking
|
| @@ -411,7 +397,7 @@ AutomationPredicate.makeTableCellPredicate = function(start, opts) {
|
| */
|
| AutomationPredicate.makeHeadingPredicate = function(level) {
|
| return function(node) {
|
| - return node.role == RoleType.heading && node.hierarchicalLevel == level;
|
| + return node.role == Role.heading && node.hierarchicalLevel == level;
|
| };
|
| };
|
|
|
|
|