| 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 5339a636ed7c2911b81e209022ffddac726c0f0d..f7bb07fc9e8998f11ced0030d1bca3b4abdb7f52 100644
|
| --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors.js
|
| +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors.js
|
| @@ -130,38 +130,38 @@ cursors.Cursor.prototype = {
|
| * @return {!cursors.Cursor} The moved cursor.
|
| */
|
| move: function(unit, movement, dir) {
|
| - var newNode, newIndex;
|
| + var newNode = this.node_;
|
| + var newIndex = this.index_;
|
| +
|
| + if (unit != Unit.NODE && newIndex === cursors.NODE_INDEX)
|
| + newIndex = 0;
|
| +
|
| switch (unit) {
|
| case Unit.CHARACTER:
|
| // BOUND and DIRECTIONAL are the same for characters.
|
| - var node = this.node_;
|
| - var nextIndex = dir == Dir.FORWARD ? this.index_ + 1 : this.index_ - 1;
|
| - if (nextIndex < 0 || nextIndex >= this.getText().length) {
|
| - node = AutomationUtil.findNextNode(
|
| - node, dir, AutomationPredicate.leaf);
|
| - if (node) {
|
| - nextIndex =
|
| - dir == Dir.FORWARD ? 0 : this.getText(node).length - 1;
|
| + newIndex = dir == Dir.FORWARD ? newIndex + 1 : newIndex - 1;
|
| + if (newIndex < 0 || newIndex >= this.getText().length) {
|
| + newNode = AutomationUtil.findNextNode(
|
| + newNode, dir, AutomationPredicate.leaf);
|
| + if (newNode) {
|
| + newIndex =
|
| + dir == Dir.FORWARD ? 0 : this.getText(newNode).length - 1;
|
| + newIndex = newIndex == -1 ? 0 : newIndex;
|
| } else {
|
| - node = this.node_;
|
| - nextIndex = this.index_;
|
| + newIndex = this.index_;
|
| }
|
| }
|
| - newNode = node;
|
| - newIndex = nextIndex;
|
| break;
|
| case Unit.WORD:
|
| switch (movement) {
|
| case Movement.BOUND:
|
| - if (this.node_.role == Role.inlineTextBox) {
|
| + if (newNode.role == Role.inlineTextBox) {
|
| var start, end;
|
| - for (var i = 0;
|
| - i < this.node_.attributes.wordStarts.length;
|
| - i++) {
|
| - if (this.index_ >= this.node_.attributes.wordStarts[i] &&
|
| - this.index_ <= this.node_.attributes.wordEnds[i]) {
|
| - start = this.node_.attributes.wordStarts[i];
|
| - end = this.node_.attributes.wordEnds[i];
|
| + for (var i = 0; i < newNode.attributes.wordStarts.length; i++) {
|
| + if (newIndex >= newNode.attributes.wordStarts[i] &&
|
| + newIndex <= newNode.attributes.wordEnds[i]) {
|
| + start = newNode.attributes.wordStarts[i];
|
| + end = newNode.attributes.wordEnds[i];
|
| break;
|
| }
|
| }
|
| @@ -172,16 +172,14 @@ cursors.Cursor.prototype = {
|
| }
|
| break;
|
| case Movement.DIRECTIONAL:
|
| - if (this.node_.role == Role.inlineTextBox) {
|
| + if (newNode.role == Role.inlineTextBox) {
|
| var start, end;
|
| - for (var i = 0;
|
| - i < this.node_.attributes.wordStarts.length;
|
| - i++) {
|
| - if (this.index_ >= this.node_.attributes.wordStarts[i] &&
|
| - this.index_ <= this.node_.attributes.wordEnds[i]) {
|
| + for (var i = 0; i < newNode.attributes.wordStarts.length; i++) {
|
| + if (newIndex >= newNode.attributes.wordStarts[i] &&
|
| + newIndex <= newNode.attributes.wordEnds[i]) {
|
| var nextIndex = dir == Dir.FORWARD ? i + 1 : i - 1;
|
| - start = this.node_.attributes.wordStarts[nextIndex];
|
| - end = this.node_.attributes.wordEnds[nextIndex];
|
| + start = newNode.attributes.wordStarts[nextIndex];
|
| + end = newNode.attributes.wordEnds[nextIndex];
|
| break;
|
| }
|
| }
|
| @@ -189,17 +187,16 @@ cursors.Cursor.prototype = {
|
| newIndex = start;
|
| } else {
|
| // The backward case is special at the beginning of nodes.
|
| - if (dir == Dir.BACKWARD && this.index_ != 0) {
|
| - this.index_ = 0;
|
| + if (dir == Dir.BACKWARD && newIndex != 0) {
|
| + newIndex = 0;
|
| } else {
|
| - var node = AutomationUtil.findNextNode(this.node_, dir,
|
| + newNode = AutomationUtil.findNextNode(newNode, dir,
|
| AutomationPredicate.leaf);
|
| - if (node) {
|
| - newNode = node;
|
| + if (newNode) {
|
| newIndex = 0;
|
| if (dir == Dir.BACKWARD &&
|
| - node.role == Role.inlineTextBox) {
|
| - var starts = node.attributes.wordStarts;
|
| + newNode.role == Role.inlineTextBox) {
|
| + var starts = newNode.attributes.wordStarts;
|
| newIndex = starts[starts.length - 1] || 0;
|
| } else {
|
| // TODO(dtseng): Figure out what to do for general nodes.
|
| @@ -219,7 +216,7 @@ cursors.Cursor.prototype = {
|
| break;
|
| case Movement.DIRECTIONAL:
|
| newNode = AutomationUtil.findNextNode(
|
| - this.node_, dir, AutomationPredicate.leaf) || this.node_;
|
| + newNode, dir, AutomationPredicate.leaf) || this.node_;
|
| newIndex = cursors.NODE_INDEX;
|
| break;
|
| }
|
| @@ -228,21 +225,16 @@ cursors.Cursor.prototype = {
|
| newIndex = 0;
|
| switch (movement) {
|
| case Movement.BOUND:
|
| - newNode = AutomationUtil.findNodeUntil(this.node_, dir,
|
| + newNode = AutomationUtil.findNodeUntil(newNode, dir,
|
| AutomationPredicate.linebreak, {before: true});
|
| newNode = newNode || this.node_;
|
| newIndex =
|
| dir == Dir.FORWARD ? this.getText(newNode).length - 1 : 0;
|
| + newIndex = newIndex == -1 ? 0 : newIndex;
|
| break;
|
| case Movement.DIRECTIONAL:
|
| newNode = AutomationUtil.findNodeUntil(
|
| - this.node_, dir, AutomationPredicate.linebreak);
|
| -
|
| - // We stick to the beginning of lines out of convention.
|
| - if (newNode && dir == Dir.BACKWARD) {
|
| - newNode = AutomationUtil.findNodeUntil(newNode, dir,
|
| - AutomationPredicate.linebreak, {before: true}) || node;
|
| - }
|
| + newNode, dir, AutomationPredicate.linebreak);
|
| break;
|
| }
|
| break;
|
| @@ -335,10 +327,13 @@ cursors.Range.prototype = {
|
| break;
|
| case Unit.WORD:
|
| case Unit.LINE:
|
| + newStart = newStart.move(unit, Movement.DIRECTIONAL, dir);
|
| + newStart = newStart.move(unit, Movement.BOUND, Dir.BACKWARD);
|
| + newEnd = newStart.move(unit, Movement.BOUND, Dir.FORWARD);
|
| + break;
|
| case Unit.NODE:
|
| - newEnd = newEnd.move(unit, Movement.DIRECTIONAL, dir);
|
| - newStart = newEnd;
|
| - newEnd = newEnd.move(unit, Movement.BOUND, Dir.FORWARD);
|
| + newStart = newStart.move(unit, Movement.DIRECTIONAL, dir);
|
| + newEnd = newStart;
|
| break;
|
| }
|
| return new cursors.Range(newStart, newEnd);
|
|
|