530 lines
15 KiB
HTML
530 lines
15 KiB
HTML
<html>
|
|
<head>
|
|
<script>
|
|
if (window.testRunner) {
|
|
testRunner.dumpAsText();
|
|
internals.settings.setSmartInsertDeleteEnabled(false);
|
|
internals.settings.setSelectTrailingWhitespaceEnabled(true);
|
|
}
|
|
|
|
function getPositionOfNode(id)
|
|
{
|
|
var n = document.getElementById(id);
|
|
var pos = {x: 0, y: 0};
|
|
|
|
while (n) {
|
|
pos.x += n.offsetLeft + n.clientLeft;
|
|
pos.y += n.offsetTop + n.clientTop;
|
|
n = n.offsetParent;
|
|
}
|
|
return pos;
|
|
}
|
|
|
|
function doubleClickPosition(pos)
|
|
{
|
|
// Our test cases will have at most a single leading tab or four spaces,
|
|
// followed by a word which is wider than 4 "X"s.
|
|
// So, pos.x + CHAR_WIDTH * 4 always hits the words.
|
|
eventSender.mouseMoveTo(pos.x + CHAR_WIDTH * 4, pos.y + LINE_HEIGHT / 2);
|
|
eventSender.mouseDown();
|
|
eventSender.leapForward(1);
|
|
eventSender.mouseUp();
|
|
eventSender.leapForward(50);
|
|
eventSender.mouseDown();
|
|
eventSender.leapForward(1);
|
|
eventSender.mouseUp();
|
|
}
|
|
|
|
function defocus()
|
|
{
|
|
doubleClickPosition({x:0, y:0});
|
|
}
|
|
|
|
function findParentDiv(spanId)
|
|
{
|
|
var n = document.getElementById(spanId);
|
|
while (n) {
|
|
var parent = n.parentNode;
|
|
if (parent && parent.tagName == "DIV")
|
|
return parent;
|
|
n = parent;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
function makeParentBlockEditable(spanId)
|
|
{
|
|
var parent = findParentDiv(spanId);
|
|
parent.contentEditable = true;
|
|
}
|
|
|
|
function hideCaseBlockFor(spanId)
|
|
{
|
|
var n = document.getElementById(spanId);
|
|
while (n) {
|
|
n = n.parentNode;
|
|
if (n && n.className == "case") {
|
|
n.style.display = "none";
|
|
n.style.offsetTop;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
function doTest(testId, expectedText, givenClickPosition)
|
|
{
|
|
// Simulate a double click.
|
|
defocus()
|
|
var pos = givenClickPosition || getPositionOfNode(testId);
|
|
doubleClickPosition(pos);
|
|
|
|
// Get the text of the current selection.
|
|
var sel = window.getSelection();
|
|
var actualText = sel.getRangeAt(0).toString();
|
|
|
|
if (expectedText == actualText) {
|
|
log("Passed " + testId);
|
|
} else {
|
|
log("Failed " + testId);
|
|
log(" Expected: " + expectedText);
|
|
log(" Actual: " + actualText);
|
|
}
|
|
|
|
// Run the same case with contentEditable enabled.
|
|
makeParentBlockEditable(testId);
|
|
|
|
defocus();
|
|
doubleClickPosition(pos);
|
|
|
|
sel = window.getSelection();
|
|
actualText = sel.getRangeAt(0).toString();
|
|
|
|
if (expectedText == actualText) {
|
|
log("Passed " + testId + " (with contentEditable)");
|
|
} else {
|
|
log("Failed " + testId + " (with contentEditable)");
|
|
log(" Expected: " + expectedText);
|
|
log(" Actual: " + actualText);
|
|
}
|
|
|
|
// Hide a container for the case to workaround limited window size
|
|
hideCaseBlockFor(testId);
|
|
}
|
|
|
|
function log(msg)
|
|
{
|
|
var l = document.getElementById('log');
|
|
l.appendChild(document.createTextNode(msg));
|
|
l.appendChild(document.createElement('br'));
|
|
}
|
|
|
|
function initConstants()
|
|
{
|
|
var heightMeasure = document.getElementById("heightMeasure");
|
|
LINE_HEIGHT = heightMeasure.offsetHeight;
|
|
LINE_LEFT = heightMeasure.offsetLeft + heightMeasure.clientLeft;
|
|
CHAR_WIDTH = heightMeasure.offsetWidth;
|
|
heightMeasure.style.display = "none"; // hide for readable test result
|
|
}
|
|
|
|
function getPositionOfNextLineHeadOf(spanId)
|
|
{
|
|
var pos = getPositionOfNode(spanId)
|
|
pos.x = LINE_LEFT;
|
|
pos.y += LINE_HEIGHT;
|
|
return pos;
|
|
}
|
|
|
|
function runTests()
|
|
{
|
|
initConstants();
|
|
|
|
if (window.testRunner) {
|
|
doTest("totest_minimum", "select1");
|
|
// We may have to make EditorClient::isSelectTrailingWhitespaceEnabled false on
|
|
// DumpRenderTree to clarify cases...
|
|
doTest("totest_before_after", "select2 ");
|
|
|
|
doTest("totest_linebreak_out", "select3\n");
|
|
doTest("totest_tab_out", "select4\t");
|
|
doTest("totest_multiple_whitespaces_out", "select5 ");
|
|
doTest("totest_linebreak_in", "select6\n");
|
|
doTest("totest_tab_in", "select7\t");
|
|
doTest("totest_multiple_whitespaces_in", "select8 ");
|
|
|
|
doTest("totest_multiple_word_in_span", "select9 ");
|
|
doTest("totest_word_before_here_in_line", "select10 ");
|
|
doTest("totest_span_first_half", "select11 ");
|
|
doTest("totest_span_second_half", "selectHere12 ");
|
|
|
|
doTest("totest_linebreak_out_pre", "select1");
|
|
doTest("totest_tab_out_pre", "select2\t");
|
|
doTest("totest_multiple_whitespaces_out_pre", "select3 ");
|
|
doTest("totest_linebreak_in_pre", "select4", getPositionOfNextLineHeadOf("totest_linebreak_in_pre"));
|
|
doTest("totest_tab_in_pre", "select5\t");
|
|
doTest("totest_multiple_whitespaces_in_pre", "select6 ");
|
|
|
|
doTest("totest_linebreak_out_prewrap", "select1");
|
|
doTest("totest_tab_out_prewrap", "select2\t");
|
|
doTest("totest_multiple_whitespaces_out_prewrap", "select3 ");
|
|
doTest("totest_linebreak_in_prewrap", "select4", getPositionOfNextLineHeadOf("totest_linebreak_in_prewrap"));
|
|
doTest("totest_tab_in_prewrap", "select5\t", getPositionOfNextLineHeadOf("totest_tab_in_prewrap"));
|
|
doTest("totest_multiple_whitespaces_in_prewrap", "select6 ", getPositionOfNextLineHeadOf("totest_multiple_whitespaces_in_prewrap"));
|
|
|
|
doTest("totest_linebreak_out_preline", "select1\n");
|
|
doTest("totest_tab_out_preline", "select2\t");
|
|
doTest("totest_multiple_whitespaces_out_preline", "select3 ");
|
|
doTest("totest_linebreak_in_preline", "select4\n", getPositionOfNextLineHeadOf("totest_linebreak_in_preline"));
|
|
doTest("totest_tab_in_preline", "select5\t");
|
|
doTest("totest_multiple_whitespaces_in_preline", "select6 ");
|
|
|
|
doTest("totest_linebreak_out_nowrap", "select1\n");
|
|
doTest("totest_tab_out_nowrap", "select2\t");
|
|
doTest("totest_multiple_whitespaces_out_nowrap", "select3 ");
|
|
doTest("totest_linebreak_in_nowrap", "select4\n");
|
|
doTest("totest_tab_in_nowrap", "select5\t");
|
|
doTest("totest_multiple_whitespaces_in_nowrap", "select6 ");
|
|
|
|
}
|
|
}
|
|
|
|
|
|
</script>
|
|
</head>
|
|
<body onload="runTests()">
|
|
|
|
<p>
|
|
This tests that double-clicking a word that follows newline and span
|
|
</p>
|
|
|
|
<div class="case">
|
|
<h3>minimum case</h3>
|
|
<div style="width:100pt">
|
|
abcd efgh ijkl mnop <b id="totest_minimum">select1</b>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>with another word after the span</h3>
|
|
<div style="width:100pt">
|
|
abcd efgh ijkl mnop <b id="totest_before_after">select2</b> nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use linebreak as word separator (outside element)</h3>
|
|
<div style="width:100pt">
|
|
abcd efgh ijkl mnop
|
|
<b id="totest_linebreak_out">select3</b>
|
|
nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use tab as word separator (outside element)</h3>
|
|
<div style="width:100pt">
|
|
abcd efgh ijkl mnop <b id="totest_tab_out">select4</b> nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use multiple whitespaces as word separator (outside element)</h3>
|
|
<div style="width:100pt">
|
|
abcd efgh ijkl mnop <b id="totest_multiple_whitespaces_out">select5</b> nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use linebreak as word separator (inside element)</h3>
|
|
<div style="width:100pt">
|
|
abcd efgh ijkl mnop<b id="totest_linebreak_in">
|
|
select6
|
|
</b>nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use tab as word separator (inside element)</h3>
|
|
<div style="width:100pt">
|
|
abcd efgh ijkl mnop<b id="totest_tab_in"> select7 </b>nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use multiple whitespaces as word separator (inside element)</h3>
|
|
<div style="width:100pt">
|
|
abcd efgh ijkl mnop<b id="totest_multiple_whitespaces_in"> select8 </b>nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>with another word in same the span</h3>
|
|
<div style="width:100pt">
|
|
abcd efgh ijkl mnop <b id="totest_multiple_word_in_span">select9 not</b> notyet
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>with another word before the span, in the same line</h3>
|
|
<div style="width:100pt">
|
|
abcd efgh ijkl mnop qrst <b id="totest_word_before_here_in_line">select10</b> notyet
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>a first half of word is inside b element</h3>
|
|
<div style="width:100pt">
|
|
abcd efgh ijkl mnop qrst <b id="totest_span_first_half">sel</b>ect11 notyet
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>a second half of word is inside b element</h3>
|
|
<!-- We choose selectHere12 instead select12 here
|
|
because <b>ect12</b> would be too short to be clicked by doubleClickPosition(). -->
|
|
<div style="width:150pt">
|
|
abcd efgh ijkl mnop qrst uvwx yz123 sel<b id="totest_span_second_half">ectHere12</b> notyet
|
|
</div>
|
|
</div>
|
|
|
|
<h2>cases for white-space: pre</h2>
|
|
<p>
|
|
Note: Here for pre, we change width value to 200 to prevent layout change on contentEditable enabled.
|
|
</p>
|
|
|
|
<div class="case">
|
|
<h3>use linebreak as word separator (outside element, white-space:pre)</h3>
|
|
<div style="width:200pt;white-space:pre;">
|
|
abcd efgh ijkl mnop
|
|
<b id="totest_linebreak_out_pre">select1</b>
|
|
nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use tab as word separator (outside element, white-space:pre)</h3>
|
|
<div style="width:200pt;white-space:pre;">
|
|
abcd efgh ijkl mnop <b id="totest_tab_out_pre">select2</b> nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use multiple whitespaces as word separator (outside element, white-space:pre)</h3>
|
|
<div style="width:200pt;white-space:pre;">
|
|
abcd efgh ijkl mnop <b id="totest_multiple_whitespaces_out_pre">select3</b> nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use linebreak as word separator (inside element, white-space:pre)</h3>
|
|
<div style="width:200pt;white-space:pre;">
|
|
abcd efgh ijkl mnop<b id="totest_linebreak_in_pre">
|
|
select4
|
|
</b>nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use tab as word separator (inside element, white-space:pre)</h3>
|
|
<div style="width:200pt;white-space:pre;">
|
|
abcd efgh ijkl mnop<b id="totest_tab_in_pre"> select5 </b>nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use multiple whitespaces as word separator (inside element, white-space:pre)</h3>
|
|
<div style="width:200pt;white-space:pre;">
|
|
abcd efgh ijkl mnop<b id="totest_multiple_whitespaces_in_pre"> select6 </b>nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<h2>cases for white-space: pre-wrap</h2>
|
|
|
|
<div class="case">
|
|
<h3>use linebreak as word separator (outside element, white-space:pre-wrap)</h3>
|
|
<div style="width:100pt;white-space:pre-wrap;">
|
|
abcd efgh ijkl mnop
|
|
<b id="totest_linebreak_out_prewrap">select1</b>
|
|
nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use tab as word separator (outside element, white-space:pre-wrap)</h3>
|
|
<div style="width:100pt;white-space:pre-wrap;">
|
|
abcd efgh ijkl mnop <b id="totest_tab_out_prewrap">select2</b> nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use multiple whitespaces as word separator (outside element, white-space:pre-wrap)</h3>
|
|
<div style="width:100pt;white-space:pre-wrap;">
|
|
abcd efgh ijkl mnop <b id="totest_multiple_whitespaces_out_prewrap">select3</b> nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use linebreak as word separator (inside element, white-space:pre-wrap)</h3>
|
|
<div style="width:100pt;white-space:pre-wrap;">
|
|
abcd efgh ijkl mnop<b id="totest_linebreak_in_prewrap">
|
|
select4
|
|
</b>nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use tab as word separator (inside element, white-space:pre-wrap)</h3>
|
|
<div style="width:100pt;white-space:pre-wrap;">
|
|
abcd efgh ijkl mnop<b id="totest_tab_in_prewrap"> select5 </b>nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use multiple whitespaces as word separator (inside element, white-space:pre-wrap)</h3>
|
|
<div style="width:100pt;white-space:pre-wrap;">
|
|
abcd efgh ijkl mnop<b id="totest_multiple_whitespaces_in_prewrap"> select6 </b>nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<h2>cases for white-space: pre-line</h2>
|
|
|
|
<div class="case">
|
|
<h3>use linebreak as word separator (outside element, white-space:pre-line)</h3>
|
|
<div style="width:100pt;white-space:pre-line;">
|
|
abcd efgh ijkl mnop
|
|
<b id="totest_linebreak_out_preline">select1</b>
|
|
nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use tab as word separator (outside element, white-space:pre-line)</h3>
|
|
<div style="width:100pt;white-space:pre-line;">
|
|
abcd efgh ijkl mnop <b id="totest_tab_out_preline">select2</b> nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use multiple whitespaces as word separator (outside element, white-space:pre-line)</h3>
|
|
<div style="width:100pt;white-space:pre-line;">
|
|
abcd efgh ijkl mnop <b id="totest_multiple_whitespaces_out_preline">select3</b> nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use linebreak as word separator (inside element, white-space:pre-line)</h3>
|
|
<div style="width:100pt;white-space:pre-line;">
|
|
abcd efgh ijkl mnop<b id="totest_linebreak_in_preline">
|
|
select4
|
|
</b>nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use tab as word separator (inside element, white-space:pre-line)</h3>
|
|
<div style="width:100pt;white-space:pre-line;">
|
|
abcd efgh ijkl mnop<b id="totest_tab_in_preline"> select5 </b>nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use multiple whitespaces as word separator (inside element, white-space:pre-line)</h3>
|
|
<div style="width:100pt;white-space:pre-line;">
|
|
abcd efgh ijkl mnop<b id="totest_multiple_whitespaces_in_preline"> select6 </b>nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<h2>cases for white-space: nowrap</h2>
|
|
<p>
|
|
Note: Although following cases have no line-breaks that had caused problem reported bug28036,
|
|
we add these for comprehensiveness.
|
|
</p>
|
|
|
|
<div class="case">
|
|
<h3>use linebreak as word separator (outside element, white-space:nowrap)</h3>
|
|
<div style="width:100pt;white-space:nowrap;">
|
|
abcd efgh ijkl mnop
|
|
<b id="totest_linebreak_out_nowrap">select1</b>
|
|
nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use tab as word separator (outside element, white-space:nowrap)</h3>
|
|
<div style="width:100pt;white-space:nowrap;">
|
|
abcd efgh ijkl mnop <b id="totest_tab_out_nowrap">select2</b> nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use multiple whitespaces as word separator (outside element, white-space:nowrap)</h3>
|
|
<div style="width:100pt;white-space:nowrap;">
|
|
abcd efgh ijkl mnop <b id="totest_multiple_whitespaces_out_nowrap">select3</b> nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use linebreak as word separator (inside element, white-space:nowrap)</h3>
|
|
<div style="width:100pt;white-space:nowrap;">
|
|
abcd efgh ijkl mnop<b id="totest_linebreak_in_nowrap">
|
|
select4
|
|
</b>nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use tab as word separator (inside element, white-space:nowrap)</h3>
|
|
<div style="width:100pt;white-space:nowrap;">
|
|
abcd efgh ijkl mnop<b id="totest_tab_in_nowrap"> select5 </b>nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<div class="case">
|
|
<h3>use multiple whitespaces as word separator (inside element, white-space:nowrap)</h3>
|
|
<div style="width:100pt;white-space:nowrap;">
|
|
abcd efgh ijkl mnop<b id="totest_multiple_whitespaces_in_nowrap"> select6 </b>nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<!--
|
|
|
|
<h2>cases for source-originated line-breaks with white-space: pre-* family</h2>
|
|
|
|
<div class="case">
|
|
<h3>white-space:pre</h3>
|
|
<div style="width:200pt;white-space:pre;background-color:lightgray;">
|
|
abcd efgh ijkl mnop
|
|
<b id="totest_sourcebreak_pre">select1</b>
|
|
nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<h3>white-space:pre-wrap</h3>
|
|
<div style="width:200pt;white-space:pre-wrap;background-color:lightgray;">
|
|
abcd efgh ijkl mnop
|
|
<b id="totest_sourcebreak_prewrap">select2</b>
|
|
nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
<h3>white-space:pre-line</h3>
|
|
<div style="width:200pt;white-space:pre-line;background-color:lightgray;">
|
|
abcd efgh ijkl mnop
|
|
<b id="totest_sourcebreak_preline">select3</b>
|
|
nottoselect
|
|
</div>
|
|
</div>
|
|
|
|
-->
|
|
|
|
<div><span id="heightMeasure">x</span></div>
|
|
|
|
<pre id="log">
|
|
</pre>
|
|
|
|
</body>
|
|
</html>
|