| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 /** | 5 /** |
| 6 * @fileoverview Processes events related to editing text and emits the | 6 * @fileoverview Processes events related to editing text and emits the |
| 7 * appropriate spoken and braille feedback. | 7 * appropriate spoken and braille feedback. |
| 8 */ | 8 */ |
| 9 | 9 |
| 10 goog.provide('editing.TextEditHandler'); | 10 goog.provide('editing.TextEditHandler'); |
| (...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 655 /** @private {AutomationNode|undefined} */ | 655 /** @private {AutomationNode|undefined} */ |
| 656 this.startContainer_; | 656 this.startContainer_; |
| 657 /** @private {AutomationNode|undefined} */ | 657 /** @private {AutomationNode|undefined} */ |
| 658 this.lineStartContainer_; | 658 this.lineStartContainer_; |
| 659 /** @private {number} */ | 659 /** @private {number} */ |
| 660 this.localLineStartContainerOffset_ = 0; | 660 this.localLineStartContainerOffset_ = 0; |
| 661 /** @private {AutomationNode|undefined} */ | 661 /** @private {AutomationNode|undefined} */ |
| 662 this.lineEndContainer_; | 662 this.lineEndContainer_; |
| 663 /** @private {number} */ | 663 /** @private {number} */ |
| 664 this.localLineEndContainerOffset_ = 0; | 664 this.localLineEndContainerOffset_ = 0; |
| 665 /** @type {Cursor} */ |
| 666 this.lineStartContainerCursor_; |
| 665 | 667 |
| 666 this.computeLineData_(opt_baseLineOnStart); | 668 this.computeLineData_(opt_baseLineOnStart); |
| 667 }; | 669 }; |
| 668 | 670 |
| 669 editing.EditableLine.prototype = { | 671 editing.EditableLine.prototype = { |
| 670 /** @private */ | 672 /** @private */ |
| 671 computeLineData_: function(opt_baseLineOnStart) { | 673 computeLineData_: function(opt_baseLineOnStart) { |
| 672 // Note that we calculate the line based only upon anchor or focus even if | 674 // Note that we calculate the line based only upon anchor or focus even if |
| 673 // they do not fall on the same line. It is up to the caller to specify | 675 // they do not fall on the same line. It is up to the caller to specify |
| 674 // which end to base this line upon since it requires reasoning about two | 676 // which end to base this line upon since it requires reasoning about two |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 760 // Note that both line start and end needs to account for | 762 // Note that both line start and end needs to account for |
| 761 // potential offsets into the static texts as follows. | 763 // potential offsets into the static texts as follows. |
| 762 var textCountBeforeLineStart = 0, textCountAfterLineEnd = 0; | 764 var textCountBeforeLineStart = 0, textCountAfterLineEnd = 0; |
| 763 var finder = this.lineStart_; | 765 var finder = this.lineStart_; |
| 764 while (finder.previousSibling) { | 766 while (finder.previousSibling) { |
| 765 finder = finder.previousSibling; | 767 finder = finder.previousSibling; |
| 766 textCountBeforeLineStart += finder.name.length; | 768 textCountBeforeLineStart += finder.name.length; |
| 767 } | 769 } |
| 768 this.localLineStartContainerOffset_ = textCountBeforeLineStart; | 770 this.localLineStartContainerOffset_ = textCountBeforeLineStart; |
| 769 | 771 |
| 772 if (this.lineStartContainer_) { |
| 773 this.lineStartContainerCursor_ = new Cursor( |
| 774 this.lineStartContainer_, this.localLineStartContainerOffset_); |
| 775 } |
| 776 |
| 770 finder = this.lineEnd_; | 777 finder = this.lineEnd_; |
| 771 while (finder.nextSibling) { | 778 while (finder.nextSibling) { |
| 772 finder = finder.nextSibling; | 779 finder = finder.nextSibling; |
| 773 textCountAfterLineEnd += finder.name.length; | 780 textCountAfterLineEnd += finder.name.length; |
| 774 } | 781 } |
| 775 | 782 |
| 776 if (this.lineEndContainer_.name) { | 783 if (this.lineEndContainer_.name) { |
| 777 this.localLineEndContainerOffset_ = | 784 this.localLineEndContainerOffset_ = |
| 778 this.lineEndContainer_.name.length - textCountAfterLineEnd; | 785 this.lineEndContainer_.name.length - textCountAfterLineEnd; |
| 779 } | 786 } |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 902 */ | 909 */ |
| 903 isSameLine: function(otherLine) { | 910 isSameLine: function(otherLine) { |
| 904 // Equality is intentionally loose here as any of the state nodes can be | 911 // Equality is intentionally loose here as any of the state nodes can be |
| 905 // invalidated at any time. We rely upon the start/anchor of the line | 912 // invalidated at any time. We rely upon the start/anchor of the line |
| 906 // staying the same. | 913 // staying the same. |
| 907 return (otherLine.lineStartContainer_ == this.lineStartContainer_ && | 914 return (otherLine.lineStartContainer_ == this.lineStartContainer_ && |
| 908 otherLine.localLineStartContainerOffset_ == | 915 otherLine.localLineStartContainerOffset_ == |
| 909 this.localLineStartContainerOffset_) || | 916 this.localLineStartContainerOffset_) || |
| 910 (otherLine.lineEndContainer_ == this.lineEndContainer_ && | 917 (otherLine.lineEndContainer_ == this.lineEndContainer_ && |
| 911 otherLine.localLineEndContainerOffset_ == | 918 otherLine.localLineEndContainerOffset_ == |
| 912 this.localLineEndContainerOffset_); | 919 this.localLineEndContainerOffset_) || |
| 920 (otherLine.lineStartContainerCursor_.recoveryNode == |
| 921 this.lineStartContainerCursor_.recoveryNode && |
| 922 otherLine.lineStartContainerCursor_.index == |
| 923 this.lineStartContainerCursor_.index); |
| 913 }, | 924 }, |
| 914 | 925 |
| 915 /** | 926 /** |
| 916 * Returns true if |otherLine| surrounds the same line as |this| and has the | 927 * Returns true if |otherLine| surrounds the same line as |this| and has the |
| 917 * same selection. | 928 * same selection. |
| 918 * @param {editing.EditableLine} otherLine | 929 * @param {editing.EditableLine} otherLine |
| 919 * @return {boolean} | 930 * @return {boolean} |
| 920 */ | 931 */ |
| 921 isSameLineAndSelection: function(otherLine) { | 932 isSameLineAndSelection: function(otherLine) { |
| 922 return this.isSameLine(otherLine) && | 933 return this.isSameLine(otherLine) && |
| 923 this.startOffset == otherLine.startOffset && | 934 this.startOffset == otherLine.startOffset && |
| 924 this.endOffset == otherLine.endOffset; | 935 this.endOffset == otherLine.endOffset; |
| 925 }, | 936 }, |
| 926 | 937 |
| 927 /** | 938 /** |
| 928 * Returns whether this line comes before |otherLine| in document order. | 939 * Returns whether this line comes before |otherLine| in document order. |
| 929 * @return {boolean} | 940 * @return {boolean} |
| 930 */ | 941 */ |
| 931 isBeforeLine: function(otherLine) { | 942 isBeforeLine: function(otherLine) { |
| 932 if (this.isSameLine(otherLine) || !this.lineStartContainer_ || | 943 if (this.isSameLine(otherLine) || !this.lineStartContainer_ || |
| 933 !otherLine.lineStartContainer_) | 944 !otherLine.lineStartContainer_) |
| 934 return false; | 945 return false; |
| 935 return AutomationUtil.getDirection( | 946 return AutomationUtil.getDirection( |
| 936 this.lineStartContainer_, otherLine.lineStartContainer_) == | 947 this.lineStartContainer_, otherLine.lineStartContainer_) == |
| 937 Dir.FORWARD; | 948 Dir.FORWARD; |
| 938 } | 949 } |
| 939 }; | 950 }; |
| 940 | 951 |
| 941 }); | 952 }); |
| OLD | NEW |