| OLD | NEW |
| 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 Loading... |
| 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 } |
| OLD | NEW |