5 messages.push(message);
10 document.getElementById("console").appendChild(document.createTextNode(messages.join("")));
16 for (var i = 0; i < string.length; ++i) {
17 var char = string.charCodeAt(i);
20 else if (char == 10) {
24 result += String.fromCharCode(char);
29 function logPositions(positions)
31 for (var i = 0; i < positions.length; ++i) {
33 if (positions[i].node != positions[i - 1].node)
37 if (!i || positions[i].node != positions[i - 1].node)
38 log((positions[i].node instanceof Text ? '"' + fold(positions[i].node.data) + '"' : "<" + positions[i].node.tagName + ">") + "[");
39 log(positions[i].offset);
44 function nodeOfWordBreak(nodeAndOffset)
46 var node = document.getElementById(nodeAndOffset[0]).firstChild;
47 if (nodeAndOffset.length == 3) {
48 var childIndex = nodeAndOffset[2];
49 for (var i = 0; i < childIndex - 1; ++i) {
50 node = node.nextSibling;
58 function logWordBreak(index, first)
60 var withNodeData = false;
61 var wordBreak = wordBreaks[index];
62 if (wordBreak.search(',') == -1)
65 var nodeAndOffset = wordBreak.split(',');
66 var node = nodeOfWordBreak(nodeAndOffset);
68 var differentNode = false;
70 differentNode = nodeOfWordBreak(nodeAndOffset) != nodeOfWordBreak(wordBreaks[index - 1].split(','));
74 if (differentNode == true)
77 if (first == true || differentNode == true) {
78 withNodeData = (node instanceof Text);
79 log((node instanceof Text ? '"' + fold(node.data) + '"' : "<" + node.tagName + ">") + "[");
81 log(nodeAndOffset[1]);
86 function positionEqualToWordBreak(position, wordBreak)
88 if (wordBreak.search(',') == -1)
89 return position.offset == wordBreak;
91 var nodeAndOffset = wordBreak.split(',');
92 return position.node == nodeOfWordBreak(nodeAndOffset) && position.offset == nodeAndOffset[1];
96 function validateData(positions)
99 if (positions.length != wordBreaks.length)
102 for (var i = 0; i < wordBreaks.length - 1; ++i) {
103 if (!positionEqualToWordBreak(positions[i], wordBreaks[i])) {
109 if (equal == false) {
110 log(" FAIL expected: [");
111 for (var i = 0; i < wordBreaks.length; ++i) {
112 logWordBreak(i, i == 0);
113 if (i != wordBreaks.length - 1)
120 function collectWordBreaks(test, searchDirection)
123 if (searchDirection == "right")
124 title = test.title.split("|")[0];
126 title = test.title.split("|")[1];
128 var pattern = /\[(.+?)\]/g;
131 while ((result = pattern.exec(title)) != null) {
132 wordBreaks.push(result[1]);
134 if (wordBreaks.length == 0) {
135 wordBreaks = title.split(" ");
139 function collapse(sel, node, wordBreak)
141 if (wordBreak.search(',') == -1)
142 sel.collapse(node, wordBreak);
144 var nodeAndOffset = wordBreak.split(',');
145 sel.collapse(nodeOfWordBreak(nodeAndOffset), nodeAndOffset[1]);
149 function moveByWord(sel, test, searchDirection, dir)
151 log("Move " + searchDirection + " by one word\n");
152 var prevOffset = sel.anchorOffset;
153 var prevNode = sel.anchorNode;
155 positions.push({ node: sel.anchorNode, offset: sel.anchorOffset });
158 sel.modify("move", searchDirection, "word");
159 if (prevNode == sel.anchorNode && prevOffset == sel.anchorOffset)
161 positions.push({ node: sel.anchorNode, offset: sel.anchorOffset });
162 prevNode = sel.anchorNode;
163 prevOffset = sel.anchorOffset;
165 logPositions(positions);
166 collectWordBreaks(test, searchDirection);
167 validateData(positions);
171 function moveByWordOnEveryChar(sel, test, searchDirection, dir)
173 collectWordBreaks(test, searchDirection);
174 var wordBreakIndex = 1;
175 var prevOffset = sel.anchorOffset;
176 var prevNode = sel.anchorNode;
178 // advance is used to special handling the case that arrow key is not able to reach certain position.
179 // In which case, we will need to manually skip this word break position in order to report correct log.
184 positions.push({ node: sel.anchorNode, offset: sel.anchorOffset });
185 sel.modify("move", searchDirection, "word");
187 var position = { node: sel.anchorNode, offset: sel.anchorOffset };
189 if (wordBreakIndex >= wordBreaks.length) {
190 if (sel.anchorNode != prevNode || sel.anchorOffset != prevOffset) {
191 positions.push(position);
192 logPositions(positions);
193 log(" FAIL expected to stay in the same position\n");
195 } else if (!positionEqualToWordBreak(position, wordBreaks[wordBreakIndex])) {
196 positions.push(position);
197 logPositions(positions);
198 log(" FAIL expected ");
199 var withNodeData = logWordBreak(wordBreakIndex, true);
205 // Restore position and move by 1 character.
206 sel.collapse(prevNode, prevOffset);
207 sel.modify("move", searchDirection, "character");
208 if (prevNode == sel.anchorNode && prevOffset == sel.anchorOffset)
211 position = { node: sel.anchorNode, offset: sel.anchorOffset };
212 if ((wordBreakIndex < wordBreaks.length
213 && positionEqualToWordBreak(position, wordBreaks[wordBreakIndex]))
214 || (test == document.getElementById("notReachablePosition")
215 && sel.anchorOffset > wordBreaks[wordBreakIndex]
217 && searchDirection == "right")) {
222 prevNode = sel.anchorNode;
223 prevOffset = sel.anchorOffset;
227 function moveByWordForEveryPosition(sel, test, dir)
229 // Check ctrl-right-arrow works for every position.
230 sel.collapse(test, 0);
231 var direction = "right";
234 moveByWord(sel, test, direction, dir);
235 sel.collapse(test, 0);
236 moveByWordOnEveryChar(sel, test, direction, dir);
238 sel.modify("move", "forward", "lineBoundary");
239 var position = { node: sel.anchorNode, offset: sel.anchorOffset };
241 // Check ctrl-left-arrow works for every position.
246 moveByWord(sel, test, direction, dir);
248 sel.collapse(position.node, position.offset);
249 moveByWordOnEveryChar(sel, test, direction, dir);
252 function setWidth(test)
254 if (test.className.search("fix_width") != -1) {
255 var span = document.getElementById("span_size");
256 var length = span.offsetWidth;
257 test.style.width = length + "px";
261 function runMoveLeftRight(tests, unit)
263 var sel = getSelection();
264 for (var i = 0; i < tests.length; ++i) {
265 var positionsMovingRight;
266 var positionsMovingLeft;
270 if (tests[i].getAttribute("dir") == 'ltr')
272 log("Test " + (i + 1) + ", LTR:\n");
273 moveByWordForEveryPosition(sel, tests[i], "ltr");
275 log("Test " + (i + 1) + ", RTL:\n");
276 moveByWordForEveryPosition(sel, tests[i], "rtl");
279 if (document.getElementById("testMoveByWord"))
280 document.getElementById("testMoveByWord").style.display = "none";
284 log("\n======== Move By Word ====\n");
285 var tests = document.getElementsByClassName("test_move_by_word");
286 runMoveLeftRight(tests, "word");