haikuwebkit/LayoutTests/editing/selection/caret-at-bidi-boundary.html

113 lines
3.7 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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>