blob: f70548b200ed443eaf848a1cb670db6992928985 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test.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.focus();
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');
runTestsFor('android');
document.getElementById('test').innerHTML = '';
}
</script>
</body>
</html>