blob: 98be6a14c7171aa0e894062da03f0525aced2ba8 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script src="../../resources/js-test-pre.js"></script>
<style type="text/css">
#tests { font-size: 2.5em; padding: 0px; margin: 0px; }
dt { width: 15ex; padding: 0px 10px; margin: 0px; }
dd { font-size: 0.6em; margin: 0px; padding: 0px 10px; }
.target { background-color: #bbeeff; }
</style>
</head>
<body>
<p>This test ensures WebKit lets user place caret around bidirectional text properly.</p>
<div>Current offset: <span id="log"></span></div>
<dl id="tests">
<dt contenteditable>abcאבג</dt>
<dd>0 1 2 3 5 4 6</dd>
<dt contenteditable>נת12</dt>
<dd>2 3 4 1 4 (There is a bug. Clicking on the left of 12 should result in offset 0.)</dd>
<dt contenteditable>לש<b>נ</b>ת</dt>
<dd>0 3 2 1 4</dd>
<dt contenteditable>aקל12יםd</dt>
<dd>0 1 6 3 4 5 2 7 8</dd>
<dt><span dir="rtl">12<b>קל43</b></span>ab</dt>
<dd>4 5 6 3 0 1 2 7 8</dd>
<dt dir="rtl"><span dir="ltr">abcלשנ</span></dt>
<dd>6 1 2 6 5 4 3</dd>
</dl>
<div id="console"></div>
<pre><script>
// This function converts (node, offset) pair to a global offset (like TextIterator index).
function globalOffsetFromNodeOffsetPair(node, offsetInNode) {
var tests = document.getElementById('tests');
var testContainer = node;
while (testContainer && testContainer.parentNode != tests)
testContainer = testContainer.parentNode;
if (!testContainer)
return 'a node outside of tests';
return testContainer.textContent.indexOf(node.textContent) + offsetInNode;
}
function runTest(target, expectations) {
var y = target.offsetTop + target.offsetHeight / 2;
var previousOffset = -1;
var j = 0;
for (var x = 5; x <= target.offsetWidth - 5; x++) {
// Reset the click count
eventSender.mouseMoveTo(1, 1);
eventSender.mouseDown();
eventSender.mouseUp();
eventSender.mouseMoveTo(target.offsetLeft + x, y);
eventSender.mouseDown();
eventSender.mouseUp();
var currentOffset = globalOffsetFromNodeOffsetPair(getSelection().baseNode, getSelection().baseOffset);
if (!getSelection().isCollapsed)
testFailed('selection was not collapsed');
else if (previousOffset == currentOffset)
continue;
else {
previousOffset = currentOffset;
if (expectations[j] != currentOffset)
testFailed('caret was at ' + currentOffset + ' but expected to be at ' + expectations[j]);
else {
testPassed('caret is at ' + currentOffset);
j++;
}
}
}
if (j < expectations.length)
testFailed('caret never reached offset' + expectations[j]);
}
if (window.testRunner) {
testRunner.dumpAsText();
if (window.internals)
internals.setContinuousSpellCheckingEnabled(false); // For performance.
var tests = document.getElementById('tests').getElementsByTagName('dt');
var testExpectations = document.getElementById('tests').getElementsByTagName('dd');
for (var i = 0; i < tests.length; i++) {
debug('Test "' + tests[i].textContent + '":');
runTest(tests[i], testExpectations[i].textContent.replace(/\s*\(.+\)\s*/, '').split(/\s+/).map(function (x) {return parseInt(x);}));
debug('');
}
} else {
debug('This test requires eventSender');
document.onselectionchange = function () {
var selection = window.getSelection();
document.getElementById('log').textContent = globalOffsetFromNodeOffsetPair(selection.baseNode, selection.baseOffset) + ', ' +
globalOffsetFromNodeOffsetPair(selection.extentNode, selection.extentOffset);
}
}
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>