Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: third_party/WebKit/LayoutTests/editing/selection/modify_move/resources/move-by-word-visually.js

Issue 2697313005: Selection API: collapse() should recreate an internal Range. (Closed)
Patch Set: Add NeedsRebaseline for platform-dependent tests Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 function nodeOfWordBreak(nodeAndOffset) 1 function nodeOfWordBreak(nodeAndOffset)
2 { 2 {
3 var node = document.getElementById(nodeAndOffset[0]).firstChild; 3 var node = document.getElementById(nodeAndOffset[0]).firstChild;
4 if (nodeAndOffset.length == 3) { 4 if (nodeAndOffset.length == 3) {
5 var childIndex = nodeAndOffset[2]; 5 var childIndex = nodeAndOffset[2];
6 for (var i = 0; i < childIndex - 1; ++i) { 6 for (var i = 0; i < childIndex - 1; ++i) {
7 node = node.nextSibling; 7 node = node.nextSibling;
8 } 8 }
9 } 9 }
10 return node; 10 return node;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 wordBreaks.push(result[1]); 47 wordBreaks.push(result[1]);
48 } 48 }
49 if (wordBreaks.length == 0) { 49 if (wordBreaks.length == 0) {
50 wordBreaks = title.split(' '); 50 wordBreaks = title.split(' ');
51 } 51 }
52 return wordBreaks; 52 return wordBreaks;
53 } 53 }
54 54
55 function moveByWord(sel, test, searchDirection, dir) 55 function moveByWord(sel, test, searchDirection, dir)
56 { 56 {
57 var prevOffset = sel.anchorOffset; 57 var prevOffset = internals.visibleSelectionAnchorOffset;
58 var prevNode = sel.anchorNode; 58 var prevNode = internals.visibleSelectionAnchorNode;
59 var positions = []; 59 var positions = [];
60 positions.push({ node: sel.anchorNode, offset: sel.anchorOffset }); 60 positions.push({ node: prevNode, offset: prevOffset });
61 61
62 while (1) { 62 while (1) {
63 sel.modify('move', searchDirection, 'word'); 63 sel.modify('move', searchDirection, 'word');
64 if (prevNode == sel.anchorNode && prevOffset == sel.anchorOffset) 64 if (prevNode == internals.visibleSelectionAnchorNode && prevOffset == in ternals.visibleSelectionAnchorOffset)
65 break; 65 break;
66 positions.push({ node: sel.anchorNode, offset: sel.anchorOffset }); 66 prevNode = internals.visibleSelectionAnchorNode;
67 prevNode = sel.anchorNode; 67 prevOffset = internals.visibleSelectionAnchorOffset;
68 prevOffset = sel.anchorOffset; 68 positions.push({ node: prevNode, offset: prevOffset });
69 }; 69 };
70 70
71 var wordBreaks = collectWordBreaks(test, searchDirection); 71 var wordBreaks = collectWordBreaks(test, searchDirection);
72 if (wordBreaks == TEST_FOR_CRASH) 72 if (wordBreaks == TEST_FOR_CRASH)
73 return; 73 return;
74 validateData(positions, wordBreaks); 74 validateData(positions, wordBreaks);
75 } 75 }
76 76
77 function moveByWordOnEveryChar(sel, test, searchDirection, dir) 77 function moveByWordOnEveryChar(sel, test, searchDirection, dir)
78 { 78 {
79 var wordBreaks = collectWordBreaks(test, searchDirection); 79 var wordBreaks = collectWordBreaks(test, searchDirection);
80 var wordBreakIndex = 1; 80 var wordBreakIndex = 1;
81 var prevOffset = sel.anchorOffset; 81 var prevOffset = internals.visibleSelectionAnchorOffset;
82 var prevNode = sel.anchorNode; 82 var prevNode = internals.visibleSelectionAnchorNode;
83 83
84 while (1) { 84 while (1) {
85 sel.modify('move', searchDirection, 'word'); 85 sel.modify('move', searchDirection, 'word');
86 86
87 if (wordBreaks != TEST_FOR_CRASH) { 87 if (wordBreaks != TEST_FOR_CRASH) {
88 if (wordBreakIndex >= wordBreaks.length) { 88 if (wordBreakIndex >= wordBreaks.length) {
89 assert_equals(sel.anchorNode, prevNode, 'expected to stay in the same position'); 89 assert_equals(internals.visibleSelectionAnchorNode, prevNode, 'e xpected to stay in the same position');
90 assert_equals(sel.anchorOffset, prevOffset, 'expected to stay in the same position'); 90 assert_equals(internals.visibleSelectionAnchorOffset, prevOffset , 'expected to stay in the same position');
91 } else { 91 } else {
92 assert_true(positionEqualToWordBreak({ node: sel.anchorNode, off set: sel.anchorOffset }, wordBreaks[wordBreakIndex]), 'positionEqualToWordBreak of ' + wordBreakIndex); 92 assert_true(positionEqualToWordBreak({ node: internals.visibleSe lectionAnchorNode, offset: internals.visibleSelectionAnchorOffset }, wordBreaks[ wordBreakIndex]), 'positionEqualToWordBreak of ' + wordBreakIndex);
93 } 93 }
94 } 94 }
95 95
96 // Restore position and move by 1 character. 96 // Restore position and move by 1 character.
97 sel.collapse(prevNode, prevOffset); 97 sel.collapse(prevNode, prevOffset);
98 sel.modify('move', searchDirection, 'character'); 98 sel.modify('move', searchDirection, 'character');
99 if (prevNode == sel.anchorNode && prevOffset == sel.anchorOffset) 99 if (prevNode == internals.visibleSelectionAnchorNode && prevOffset == in ternals.visibleSelectionAnchorOffset)
100 return; 100 return;
101 101
102 prevNode = internals.visibleSelectionAnchorNode;
103 prevOffset = internals.visibleSelectionAnchorOffset;
102 if (wordBreakIndex < wordBreaks.length && 104 if (wordBreakIndex < wordBreaks.length &&
103 positionEqualToWordBreak({ node: sel.anchorNode, offset: sel.anchorO ffset }, wordBreaks[wordBreakIndex])) { 105 positionEqualToWordBreak({ node: prevNode, offset: prevOffset }, wor dBreaks[wordBreakIndex])) {
104 ++wordBreakIndex; 106 ++wordBreakIndex;
105 } 107 }
106
107 prevNode = sel.anchorNode;
108 prevOffset = sel.anchorOffset;
109 }; 108 };
110 } 109 }
111 110
112 function moveByWordForEveryPosition(sel, test, dir) 111 function moveByWordForEveryPosition(sel, test, dir)
113 { 112 {
114 // Check ctrl-right-arrow works for every position. 113 // Check ctrl-right-arrow works for every position.
115 sel.collapse(test, 0); 114 sel.collapse(test, 0);
116 var direction = 'right'; 115 var direction = 'right';
117 if (dir == 'rtl') 116 if (dir == 'rtl')
118 direction = 'left'; 117 direction = 'left';
119 moveByWord(sel, test, direction, dir); 118 moveByWord(sel, test, direction, dir);
120 sel.collapse(test, 0); 119 sel.collapse(test, 0);
121 moveByWordOnEveryChar(sel, test, direction, dir); 120 moveByWordOnEveryChar(sel, test, direction, dir);
122 121
123 sel.modify('move', 'forward', 'lineBoundary'); 122 sel.modify('move', 'forward', 'lineBoundary');
124 var position = { node: sel.anchorNode, offset: sel.anchorOffset }; 123 var position = { node: internals.visibleSelectionAnchorNode, offset: interna ls.visibleSelectionAnchorOffset };
125 124
126 // Check ctrl-left-arrow works for every position. 125 // Check ctrl-left-arrow works for every position.
127 if (dir == 'ltr') 126 if (dir == 'ltr')
128 direction = 'left'; 127 direction = 'left';
129 else 128 else
130 direction = 'right'; 129 direction = 'right';
131 moveByWord(sel, test, direction, dir); 130 moveByWord(sel, test, direction, dir);
132 131
133 sel.collapse(position.node, position.offset); 132 sel.collapse(position.node, position.offset);
134 moveByWordOnEveryChar(sel, test, direction, dir); 133 moveByWordOnEveryChar(sel, test, direction, dir);
135 } 134 }
136 135
137 function runTest() { 136 function runTest() {
138 div = document.createElement('div'); 137 div = document.createElement('div');
139 div.id = 'log'; 138 div.id = 'log';
140 document.body.appendChild(div); 139 document.body.appendChild(div);
141 140
142 var tests = document.getElementsByClassName('test_move_by_word'); 141 var tests = document.getElementsByClassName('test_move_by_word');
143 var sel = getSelection(); 142 var sel = getSelection();
144 for (var testcase of tests) { 143 for (var testcase of tests) {
145 test(function () { 144 test(function () {
145 assert_exists(window, 'internals');
146 if (testcase.className.search('fix_width') != -1) { 146 if (testcase.className.search('fix_width') != -1) {
147 var span = document.getElementById('span_size'); 147 var span = document.getElementById('span_size');
148 var length = span.offsetWidth; 148 var length = span.offsetWidth;
149 testcase.style.width = length + 'px'; 149 testcase.style.width = length + 'px';
150 } 150 }
151 151
152 if (testcase.getAttribute('dir') == 'ltr') 152 if (testcase.getAttribute('dir') == 'ltr')
153 moveByWordForEveryPosition(sel, testcase, 'ltr'); 153 moveByWordForEveryPosition(sel, testcase, 'ltr');
154 else 154 else
155 moveByWordForEveryPosition(sel, testcase, 'rtl'); 155 moveByWordForEveryPosition(sel, testcase, 'rtl');
156 }, testcase.id); 156 }, testcase.id);
157 } 157 }
158 } 158 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698