| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <script src="../../fast/js/resources/js-test-pre.js"></script> | |
| <script src="resources/js-test-selection-shared.js"></script> | |
| </head> | |
| <body> | |
| <p id="description"></p> | |
| <div id="console"></div> | |
| <div id="test"> | |
| <div id="regular-div"> | |
| line 1<br> | |
| line 2<br> | |
| line 3 | |
| </div> | |
| <div contenteditable="true" id="editable-div"> | |
| line 1<br> | |
| line 2<br> | |
| line 3 | |
| </div> | |
| <textarea id="text-area" cols="60" rows="7"> | |
| line 1 | |
| line 2 | |
| line 3</textarea> | |
| <input type="text" id="text-input" value="line 2"/> | |
| </div> | |
| <script> | |
| description("This test ensures that programmatically set selections are directionless on mac, and that they are not on other platforms."); | |
| function selectLine(node) { | |
| var selection = window.getSelection(); | |
| selection.empty(); | |
| if (node.localName == 'div') { | |
| var container = node.childNodes[2]; | |
| var range = document.createRange(); | |
| range.setStart(container, container.data.search('ine 2')); | |
| range.setEnd(container, range.startOffset + 'in'.length); | |
| selection.addRange(range); | |
| } else { | |
| node.selectionDirection = 'none'; | |
| node.selectionStart = node.value.search('ine 2'); | |
| node.selectionEnd = node.selectionStart + 'in'.length; | |
| } | |
| } | |
| function runTestsAndVerify(name, selectionModifier, expectedDirection, expectedText) { | |
| var currentTest = makeTest(name, selectionModifier, expectedDirection, expectedText); | |
| currentTest('no action'); | |
| currentTest('delete'); | |
| currentTest('forwardDelete'); | |
| currentTest('cut'); | |
| currentTest('bold'); | |
| currentTest('insertText'); | |
| } | |
| function makeTest(name, selectionModifier, expectedDirection, expectedText) { | |
| return function (action) { | |
| selectLine(name); | |
| var actionString = ''; | |
| if (action != 'no action') { | |
| document.execCommand(action, false, 'word'); | |
| document.execCommand('undo'); | |
| actionString = ', after undoing ' + action; | |
| } | |
| var description = selectionModifier() + ' in ' + name.id + actionString; | |
| var selection = window.getSelection(); | |
| var actualDirection = selection.baseOffset < selection.extentOffset ? 'forward' : (selection.baseOffset > selection.extentOffset ? 'backward' : 'none'); | |
| if (selection.toString() != expectedText) | |
| testFailed(description + ', expected "' + expectedText + '" but got "' + selection.toString() + '"'); | |
| else if (description.split(' ')[4] == 'div' && expectedDirection != actualDirection) | |
| testFailed(description + ', expected ' + expectedDirection + ' direction but got ' + actualDirection); | |
| else | |
| testPassed(description); | |
| } | |
| } | |
| function makeSelectionModifier(direction, granularity) { | |
| return function() { | |
| window.getSelection().modify('extend', direction, granularity); | |
| var testDescription = direction + ' by ' + granularity; | |
| return testDescription; | |
| } | |
| } | |
| function runTestsOn(platform, node) { | |
| var macOrNonMac = platform == 'mac' ? 'mac' : 'non-mac'; | |
| var backwardOnMacAndForwardOtherwise = {'mac': 'backward', 'non-mac': 'forward'}[macOrNonMac]; | |
| var extendSelectionLeftByCharacter = makeSelectionModifier('left', 'character'); | |
| var extendSelectionRightByCharacter = makeSelectionModifier('right', 'character'); | |
| var extendSelectionLeftByLine = makeSelectionModifier('left', 'line'); | |
| var extendSelectionRightByLine = makeSelectionModifier('right', 'line'); | |
| runTestsAndVerify(node, extendSelectionLeftByCharacter, backwardOnMacAndForwardOtherwise, {'mac': 'lin', 'non-mac': 'i'}[macOrNonMac]); | |
| runTestsAndVerify(node, extendSelectionRightByCharacter, 'forward', 'ine'); | |
| if (node.localName == 'input') | |
| expectedResult = {'mac': 'lin', 'non-mac': 'l'}; | |
| else if (node.localName == 'textarea') | |
| expectedResult = {'mac': 'ine 1\nlin', 'non-mac': 'e 1\nl'} | |
| else if (node.localName == 'div') | |
| expectedResult = {'mac': 'ine 1\nlin', 'non-mac': 'e 1\nl'} | |
| runTestsAndVerify(node, extendSelectionLeftByLine, backwardOnMacAndForwardOtherwise, expectedResult[macOrNonMac]); | |
| if (node.localName == 'input') | |
| expectedResult = 'ine 2'; | |
| else if (node.localName == 'textarea') | |
| expectedResult = 'ine 2\nlin'; | |
| else if (node.localName == 'div') | |
| expectedResult = 'ine 2\nlin'; | |
| runTestsAndVerify(node, extendSelectionRightByLine, 'forward', expectedResult); | |
| } | |
| function runTestsFor(platform) { | |
| debug(platform + ':'); | |
| internals.settings.setEditingBehavior(platform); | |
| var listOfTestNodes = document.getElementById('test').childNodes; | |
| for (var i = 0; i < listOfTestNodes.length; i++) { | |
| if (listOfTestNodes[i].nodeName != '#text') | |
| runTestsOn(platform, listOfTestNodes[i]); | |
| } | |
| } | |
| if (window.internals) { | |
| runTestsFor('mac'); | |
| runTestsFor('win'); | |
| runTestsFor('unix'); | |
| document.getElementById('test').innerHTML = ''; | |
| } | |
| </script> | |
| <script src="../../fast/js/resources/js-test-post.js"></script> | |
| </body> | |
| </html> |