113 lines
3.7 KiB
HTML
113 lines
3.7 KiB
HTML
<!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>
|