| Index: chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors.js
|
| diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors.js
|
| index b3e95556bf0f20b6d1b6711937e99fc645581992..7142a0e773bb4b22448e356ac01491c95241af20 100644
|
| --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors.js
|
| +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors.js
|
| @@ -88,12 +88,13 @@ cursors.Cursor = function(node, index) {
|
| node = nextNode;
|
| index = 0;
|
| }
|
| - } else if (node.role == RoleType.GENERIC_CONTAINER &&
|
| - node.state.richlyEditable &&
|
| - (node.firstChild && (node.firstChild.role == RoleType.LINE_BREAK ||
|
| - node.firstChild.role == RoleType.STATIC_TEXT))) {
|
| + } else if (
|
| + node.role == RoleType.GENERIC_CONTAINER && node.state.richlyEditable &&
|
| + (node.firstChild &&
|
| + (node.firstChild.role == RoleType.LINE_BREAK ||
|
| + node.firstChild.role == RoleType.STATIC_TEXT))) {
|
| // Re-interpret this case as pointing to the text under the div.
|
| - node = node.find({ role: RoleType.INLINE_TEXT_BOX }) || node;
|
| + node = node.find({role: RoleType.INLINE_TEXT_BOX}) || node;
|
| }
|
|
|
| /** @type {number} @private */
|
| @@ -126,8 +127,7 @@ cursors.Cursor.prototype = {
|
| * @return {boolean}
|
| */
|
| equals: function(rhs) {
|
| - return this.node === rhs.node &&
|
| - this.index === rhs.index;
|
| + return this.node === rhs.node && this.index === rhs.index;
|
| },
|
|
|
| /**
|
| @@ -142,11 +142,13 @@ cursors.Cursor.prototype = {
|
| // node.
|
| var lNode = this.node;
|
| var rNode = rhs.node;
|
| - while (lNode && (lNode.role == RoleType.INLINE_TEXT_BOX ||
|
| - lNode.role == RoleType.STATIC_TEXT))
|
| + while (lNode &&
|
| + (lNode.role == RoleType.INLINE_TEXT_BOX ||
|
| + lNode.role == RoleType.STATIC_TEXT))
|
| lNode = lNode.parent;
|
| - while (rNode && (rNode.role == RoleType.INLINE_TEXT_BOX ||
|
| - rNode.role == RoleType.STATIC_TEXT))
|
| + while (rNode &&
|
| + (rNode.role == RoleType.INLINE_TEXT_BOX ||
|
| + rNode.role == RoleType.STATIC_TEXT))
|
| rNode = rNode.parent;
|
|
|
| // Ignore indicies for now.
|
| @@ -216,7 +218,8 @@ cursors.Cursor.prototype = {
|
| adjustedNode = grandparent;
|
| } else if (grandparent && grandparent.role == RoleType.LINE_BREAK) {
|
| adjustedNode = grandparent.parent;
|
| - } else if (this.index_ == cursors.NODE_INDEX ||
|
| + } else if (
|
| + this.index_ == cursors.NODE_INDEX ||
|
| adjustedNode.role == RoleType.INLINE_TEXT_BOX ||
|
| adjustedNode.nameFrom != chrome.automation.NameFromType.CONTENTS) {
|
| // A node offset or unselectable character offset.
|
| @@ -245,8 +248,9 @@ cursors.Cursor.prototype = {
|
|
|
| if (this.node.state.editable) {
|
| return this.index_ == cursors.NODE_INDEX ? 0 : this.index_;
|
| - } else if (this.node.role == RoleType.INLINE_TEXT_BOX &&
|
| - // Selections under a line break are broken.
|
| + } else if (
|
| + this.node.role == RoleType.INLINE_TEXT_BOX &&
|
| + // Selections under a line break are broken.
|
| this.node.parent && this.node.parent.role != RoleType.LINE_BREAK) {
|
| if (adjustedIndex == cursors.NODE_INDEX)
|
| adjustedIndex = 0;
|
| @@ -256,7 +260,8 @@ cursors.Cursor.prototype = {
|
| adjustedIndex += sibling.name.length;
|
| sibling = sibling.previousSibling;
|
| }
|
| - } else if (this.index_ == cursors.NODE_INDEX ||
|
| + } else if (
|
| + this.index_ == cursors.NODE_INDEX ||
|
| this.node.nameFrom != chrome.automation.NameFromType.CONTENTS) {
|
| // A node offset or unselectable character offset.
|
|
|
| @@ -312,8 +317,8 @@ cursors.Cursor.prototype = {
|
| newNode, dir, AutomationPredicate.leafWithText);
|
| if (newNode) {
|
| var newText = AutomationUtil.getText(newNode);
|
| - newIndex =
|
| - dir == Dir.FORWARD ? 0 :
|
| + newIndex = dir == Dir.FORWARD ?
|
| + 0 :
|
| StringUtil.previousCodePointOffset(newText, newText.length);
|
| newIndex = Math.max(newIndex, 0);
|
| } else {
|
| @@ -323,10 +328,10 @@ cursors.Cursor.prototype = {
|
| break;
|
| case Unit.WORD:
|
| if (newNode.role != RoleType.INLINE_TEXT_BOX) {
|
| - newNode = AutomationUtil.findNextNode(newNode,
|
| - Dir.FORWARD,
|
| - AutomationPredicate.inlineTextBox,
|
| - {skipInitialSubtree: false}) || newNode;
|
| + newNode = AutomationUtil.findNextNode(
|
| + newNode, Dir.FORWARD, AutomationPredicate.inlineTextBox,
|
| + {skipInitialSubtree: false}) ||
|
| + newNode;
|
| }
|
| switch (movement) {
|
| case Movement.BOUND:
|
| @@ -365,8 +370,8 @@ cursors.Cursor.prototype = {
|
| if (dir == Dir.BACKWARD && newIndex != 0) {
|
| newIndex = 0;
|
| } else {
|
| - newNode = AutomationUtil.findNextNode(newNode, dir,
|
| - AutomationPredicate.leaf);
|
| + newNode = AutomationUtil.findNextNode(
|
| + newNode, dir, AutomationPredicate.leaf);
|
| if (newNode) {
|
| newIndex = 0;
|
| if (dir == Dir.BACKWARD &&
|
| @@ -391,10 +396,10 @@ cursors.Cursor.prototype = {
|
| newIndex = dir == Dir.FORWARD ? this.getText().length - 1 : 0;
|
| break;
|
| case Movement.DIRECTIONAL:
|
| - var pred = unit == Unit.TEXT ?
|
| - AutomationPredicate.leaf : AutomationPredicate.object;
|
| - newNode = AutomationUtil.findNextNode(newNode, dir, pred) ||
|
| - originalNode;
|
| + var pred = unit == Unit.TEXT ? AutomationPredicate.leaf :
|
| + AutomationPredicate.object;
|
| + newNode =
|
| + AutomationUtil.findNextNode(newNode, dir, pred) || originalNode;
|
| newIndex = cursors.NODE_INDEX;
|
| break;
|
| }
|
| @@ -406,8 +411,8 @@ cursors.Cursor.prototype = {
|
|
|
| switch (movement) {
|
| case Movement.BOUND:
|
| - newNode = AutomationUtil.findNodeUntil(newNode, dir,
|
| - AutomationPredicate.linebreak, true);
|
| + newNode = AutomationUtil.findNodeUntil(
|
| + newNode, dir, AutomationPredicate.linebreak, true);
|
| newNode = newNode || originalNode;
|
| newIndex =
|
| dir == Dir.FORWARD ? AutomationUtil.getText(newNode).length : 0;
|
| @@ -416,8 +421,8 @@ cursors.Cursor.prototype = {
|
| newNode = AutomationUtil.findNodeUntil(
|
| newNode, dir, AutomationPredicate.linebreak);
|
| break;
|
| - }
|
| - break;
|
| + }
|
| + break;
|
| default:
|
| throw Error('Unrecognized unit: ' + unit);
|
| }
|
| @@ -450,7 +455,8 @@ cursors.Cursor.prototype = {
|
| newIndex = newIndex - length;
|
| }
|
| break;
|
| - } else if (newNode.role != RoleType.INLINE_TEXT_BOX &&
|
| + } else if (
|
| + newNode.role != RoleType.INLINE_TEXT_BOX &&
|
| newNode.children[newIndex]) {
|
| // Valid node offset.
|
| newNode = newNode.children[newIndex];
|
| @@ -506,8 +512,7 @@ cursors.WrappingCursor.prototype = {
|
| return this;
|
|
|
| // Regular movement.
|
| - if (!AutomationPredicate.root(this.node) ||
|
| - dir == Dir.FORWARD ||
|
| + if (!AutomationPredicate.root(this.node) || dir == Dir.FORWARD ||
|
| movement == Movement.BOUND)
|
| result = cursors.Cursor.prototype.move.call(this, unit, movement, dir);
|
|
|
| @@ -523,8 +528,8 @@ cursors.WrappingCursor.prototype = {
|
| // For 2, place range on the root (if not already there). If at root,
|
| // try to descend to the first leaf-like object.
|
| if (movement == Movement.DIRECTIONAL && result.equals(this)) {
|
| - var pred = unit == Unit.NODE ?
|
| - AutomationPredicate.object : AutomationPredicate.leaf;
|
| + var pred = unit == Unit.NODE ? AutomationPredicate.object :
|
| + AutomationPredicate.leaf;
|
| var endpoint = this.node;
|
| if (!endpoint)
|
| return this;
|
| @@ -539,11 +544,9 @@ cursors.WrappingCursor.prototype = {
|
| // Case 2: backward (sync downwards to a leaf), if already on the root.
|
| if (dir == Dir.BACKWARD && endpoint == this.node) {
|
| playEarcon = true;
|
| - endpoint = AutomationUtil.findNodePre(endpoint,
|
| - dir,
|
| - function(n) {
|
| - return pred(n) && !AutomationPredicate.shouldIgnoreNode(n);
|
| - }) || endpoint;
|
| + endpoint = AutomationUtil.findNodePre(endpoint, dir, function(n) {
|
| + return pred(n) && !AutomationPredicate.shouldIgnoreNode(n);
|
| + }) || endpoint;
|
| }
|
|
|
| if (playEarcon)
|
| @@ -580,7 +583,7 @@ cursors.Range.fromNode = function(node) {
|
| return new cursors.Range(cursor, cursor);
|
| };
|
|
|
| - /**
|
| +/**
|
| * Given |rangeA| and |rangeB| in order, determine which |Dir|
|
| * relates them.
|
| * @param {!cursors.Range} rangeA
|
| @@ -591,8 +594,8 @@ cursors.Range.getDirection = function(rangeA, rangeB) {
|
| if (!rangeA || !rangeB)
|
| return Dir.FORWARD;
|
|
|
| - if (!rangeA.start.node || !rangeA.end.node ||
|
| - !rangeB.start.node || !rangeB.end.node)
|
| + if (!rangeA.start.node || !rangeA.end.node || !rangeB.start.node ||
|
| + !rangeB.end.node)
|
| return Dir.FORWARD;
|
|
|
| // They are the same range.
|
| @@ -601,11 +604,9 @@ cursors.Range.getDirection = function(rangeA, rangeB) {
|
| return Dir.FORWARD;
|
|
|
| var testDirA =
|
| - AutomationUtil.getDirection(
|
| - rangeA.start.node, rangeB.end.node);
|
| + AutomationUtil.getDirection(rangeA.start.node, rangeB.end.node);
|
| var testDirB =
|
| - AutomationUtil.getDirection(
|
| - rangeB.start.node, rangeA.end.node);
|
| + AutomationUtil.getDirection(rangeB.start.node, rangeA.end.node);
|
|
|
| // The two ranges are either partly overlapping or non overlapping.
|
| if (testDirA == Dir.FORWARD && testDirB == Dir.BACKWARD)
|
| @@ -624,8 +625,7 @@ cursors.Range.prototype = {
|
| * @return {boolean}
|
| */
|
| equals: function(rhs) {
|
| - return this.start_.equals(rhs.start) &&
|
| - this.end_.equals(rhs.end);
|
| + return this.start_.equals(rhs.start) && this.end_.equals(rhs.end);
|
| },
|
|
|
| /**
|
| @@ -668,8 +668,7 @@ cursors.Range.prototype = {
|
| * @return {boolean}
|
| */
|
| isSubNode: function() {
|
| - return this.start.node === this.end.node &&
|
| - this.start.index > -1 &&
|
| + return this.start.node === this.end.node && this.start.index > -1 &&
|
| this.end.index > -1;
|
| },
|
|
|
| @@ -679,8 +678,7 @@ cursors.Range.prototype = {
|
| * @return {boolean?}
|
| */
|
| isInlineText: function() {
|
| - return this.start.node &&
|
| - this.end.node &&
|
| + return this.start.node && this.end.node &&
|
| this.start.node.role == this.end.node.role &&
|
| this.start.node.role == RoleType.INLINE_TEXT_BOX;
|
| },
|
| @@ -733,32 +731,32 @@ cursors.Range.prototype = {
|
| return;
|
|
|
| // Only allow selections within the same web tree.
|
| - if (startNode.root &&
|
| - startNode.root.role == RoleType.ROOT_WEB_AREA &&
|
| + if (startNode.root && startNode.root.role == RoleType.ROOT_WEB_AREA &&
|
| startNode.root == endNode.root) {
|
| // We want to adjust to select the entire node for node offsets;
|
| // otherwise, use the plain character offset.
|
| var startIndex = this.start.selectionIndex_;
|
| var endIndex = this.end.index_ == cursors.NODE_INDEX ?
|
| - this.end.selectionIndex_ + 1 : this.end.selectionIndex_;
|
| -
|
| - chrome.automation.setDocumentSelection(
|
| - { anchorObject: startNode,
|
| - anchorOffset: startIndex,
|
| - focusObject: endNode,
|
| - focusOffset: endIndex }
|
| - );
|
| + this.end.selectionIndex_ + 1 :
|
| + this.end.selectionIndex_;
|
| +
|
| + chrome.automation.setDocumentSelection({
|
| + anchorObject: startNode,
|
| + anchorOffset: startIndex,
|
| + focusObject: endNode,
|
| + focusOffset: endIndex
|
| + });
|
| }
|
| },
|
|
|
| /**
|
| * Returns true if this range has either cursor end on web content.
|
| * @return {boolean}
|
| - */
|
| + */
|
| isWebRange: function() {
|
| return this.isValid() &&
|
| (this.start.node.root.role != RoleType.DESKTOP ||
|
| - this.end.node.root.role != RoleType.DESKTOP);
|
| + this.end.node.root.role != RoleType.DESKTOP);
|
| },
|
|
|
| /**
|
|
|