blob: 8b3845535f37c6573e2a458108f9f3c1d5430392 [file] [log] [blame]
<!doctype html>
<script src="../../resources/ahem.js"></script>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../assert_selection.js"></script>
<script>
// This tests that double-clicking a word that follows newline and span.
if (window.internals) {
internals.settings.setSmartInsertDeleteEnabled(false);
internals.settings.setSelectTrailingWhitespaceEnabled(true);
}
function doubleClick(selection) {
if (!window.eventSender)
throw 'This test requires eventSender.';
const target = selection.document.querySelector('b');
const [x, y] = target.offsetHeight > 15
? [
selection.computeLeft(target.parentNode) + 5,
selection.computeTop(target) + 15
]
: [
selection.computeLeft(target) + 45,
selection.computeTop(target) + 5
];
eventSender.leapForward(9999); // Reset mouse click
eventSender.mouseMoveTo(x, y);
eventSender.mouseDown();
eventSender.leapForward(1);
eventSender.mouseUp();
eventSender.leapForward(50);
eventSender.mouseDown();
eventSender.leapForward(1);
eventSender.mouseUp();
if (!selection.window.getSelection().anchorNode)
throw 'No selection';
}
function doTest(whiteSpace, title, input, expected) {
const kStyle = [
'font: 10px/10px Ahem;',
'outline: none;',
`white-space: ${whiteSpace};`,
'width: 20ch;',
].join(' ');
selection_test(
`<div style="${kStyle}">${input}</div>`,
doubleClick,
`<div style="${kStyle}">${expected}</div>`,
`${whiteSpace}: ${title}`);
selection_test(
`<div contenteditable style="${kStyle}">${input}</div>`,
doubleClick,
`<div contenteditable style="${kStyle}">${expected}</div>`,
`${whiteSpace}: ${title} [editable]`);
}
doTest('normal', '1 minimum case',
'abcd efgh ijkl mnop <b>select1</b>',
'abcd efgh ijkl mnop <b>^select1|</b>');
// We may have to make EditorClient::isSelectTrailingWhitespaceEnabled false on
// DumpRenderTree to clarify cases...
doTest('normal', '2 with another word after the span',
'abcd efgh ijkl mnop <b>select2</b> nottoselect',
'abcd efgh ijkl mnop <b>^select2</b> |nottoselect');
doTest('normal', '3 use linebreak as word separator (outside element)',
'abcd efgh ijkl mnop\n<b>select3</b>\nnottoselect',
'abcd efgh ijkl mnop\n<b>^select3</b>\n|nottoselect');
doTest('normal', '4 use tab as word separator (outside element)',
'abcd efgh ijkl mnop\t<b>select4</b>\tnottoselect',
'abcd efgh ijkl mnop\t<b>^select4</b>\t|nottoselect');
doTest('normal', '5 use multiple whitespaces as word separator (outside element)',
'abcd efgh ijkl mnop <b>select5</b> nottoselect',
'abcd efgh ijkl mnop <b>^select5</b> | nottoselect');
doTest('normal', '6 use linebreak as word separator (inside element)',
'abcd efgh ijkl mnop<b>\nselect6\n</b>nottoselect',
'abcd efgh ijkl mnop<b>\n^select6\n|</b>nottoselect');
doTest('normal', '7 use tab as word separator (inside element)',
'abcd efgh ijkl mnop<b>\tselect7\t</b>nottoselect',
'abcd efgh ijkl mnop<b>\t^select7\t|</b>nottoselect');
doTest('normal', '8 use multiple whitespaces as word separator (inside element)',
'abcd efgh ijkl mnop<b> select8 </b>nottoselect',
'abcd efgh ijkl mnop<b> ^select8 | </b>nottoselect');
doTest('normal', '9 with another word in same the span',
'abcd efgh ijkl mnop <b>select9 not</b> notyet',
'abcd efgh ijkl mnop <b>^select9 |not</b> notyet');
doTest('normal', '10 with another word before the span, in the same line',
'abcd efgh ijkl mnop qrst <b>select10</b> notyet',
'abcd efgh ijkl mnop qrst <b>^select10</b> |notyet');
doTest('normal', '11 a first half of word is inside b element',
'abcd efgh ijkl mnop qrst <b>sel</b>ect11 notyet',
'abcd efgh ijkl mnop qrst <b>^sel</b>ect11 |notyet');
// We choose selectHere12 instead select12 here because <b>ect12</b> would be
// too short to be clicked by |doubleClick()|.
doTest('normal', '12 a second half of word is inside b element',
'abcd efgh ijkl mnop qrst uvwx yz123 sel<b>ectHere12</b> notyet',
'abcd efgh ijkl mnop qrst uvwx yz123 ^sel<b>ectHere12</b> |notyet');
// white-space:pre
doTest('pre', '1 use linebreak as word separator (outside element)',
'abcd efgh ijkl mnop\n<b>select1</b>',
'abcd efgh ijkl mnop\n<b>^select1|</b>',
'pre');
doTest('pre', '2 use tab as word separator (outside element)',
'abcd efgh ijkl mnop\t<b>select2</b>\tnottoselect',
'abcd efgh ijkl mnop\t<b>^select2</b>\t|nottoselect');
doTest('pre', '3 use multiple whitespaces as word separator (outside element)',
'abcd efgh ijkl mnop <b>select3</b> nottoselect',
'abcd efgh ijkl mnop <b>^select3</b> |nottoselect');
doTest('pre', '4 use linebreak as word separator (inside element)',
'abcd efgh ijkl mnop<b>\nselect4\n</b>nottoselect',
'abcd efgh ijkl mnop<b>\n^select4|\n</b>nottoselect');
doTest('pre', '5 use tab as word separator (inside element)',
'abcd efgh ijkl mnop<b>\tselect5\t</b>nottoselect',
'abcd efgh ijkl mnop<b>\t^select5\t|</b>nottoselect');
doTest('pre', '6 use multiple whitespaces as word separator (inside element)',
'abcd efgh ijkl mnop<b> select6 </b>nottoselect',
'abcd efgh ijkl mnop<b> ^select6 |</b>nottoselect');
// white-space: pre-wrwap
doTest('pre-wrwap', '1 use linebreak as word separator (outside element)',
'abcd efgh ijkl mnop\n<b>select1</b>\nnottoselect',
'abcd efgh ijkl mnop\n<b>^select1</b>\n|nottoselect');
doTest('pre-wrap', '2 use tab as word separator (outside element)',
'abcd efgh ijkl mnop\t<b>select2</b>\tnottoselect',
'abcd efgh ijkl mnop\t<b>^select2</b>\t|nottoselect');
doTest('pre-wrap', '3 use multiple whitespaces as word separator (outside element)',
'abcd efgh ijkl mnop <b>select3</b> nottoselect',
'abcd efgh ijkl mnop <b>^select3</b> |nottoselect');
doTest('pre-wrap', '4 use linebreak as word separator (inside element)',
'abcd efgh ijkl mnop<b>\nselect4\n</b>nottoselect',
'abcd efgh ijkl mnop<b>\n^select4|\n</b>nottoselect');
doTest('pre-wrap', '5 use tab as word separator (inside element)',
'abcd efgh ijkl mnop<b>\tselect5\t</b>nottoselect',
'abcd efgh ijkl mnop<b>\t^select5\t|</b>nottoselect');
doTest('pre-wrap', '6 use multiple whitespaces as word separator (inside element)',
'abcd efgh ijkl mnop<b> select6 </b>nottoselect',
'abcd efgh ijkl mnop<b> ^select6 |</b>nottoselect');
// white-space: pre-line
doTest('pre-line', '1 use linebreak as word separator (outside element)',
'abcd efgh ijkl mnop\n<b>select1</b>\nnottoselect',
'abcd efgh ijkl mnop\n<b>^select1|</b>\nnottoselect');
doTest('pre-line', '2 use tab as word separator (outside element)',
'abcd efgh ijkl mnop\t<b>select2</b>\tnottoselect',
'abcd efgh ijkl mnop\t<b>^select2</b>\t|nottoselect');
doTest('pre-line', '3 use multiple whitespaces as word separator (outside element)',
'abcd efgh ijkl mnop <b>select3</b> nottoselect',
'abcd efgh ijkl mnop <b>^select3</b> | nottoselect');
doTest('pre-line', '4 use linebreak as word separator (inside element)',
'abcd efgh ijkl mnop<b>\nselect4\n</b>nottoselect',
'abcd efgh ijkl mnop<b>\n^select4|\n</b>nottoselect');
doTest('pre-line', '5 use tab as word separator (inside element)',
'abcd efgh ijkl mnop<b>\tselect5\t</b>nottoselect',
'abcd efgh ijkl mnop<b>\t^select5\t|</b>nottoselect');
doTest('pre-line', '6 use multiple whitespaces as word separator (inside element)',
'abcd efgh ijkl mnop<b> select6 </b>nottoselect',
'abcd efgh ijkl mnop<b> ^select6 | </b>nottoselect');
// white-space: nowrap
// Note: Although following cases have no line-breaks that had caused problem
// reported bug28036, we add these for comprehensiveness.
doTest('nowrap', '1 use linebreak as word separator (outside element)',
'abcd efgh ijkl mnop\n<b>select1</b>\nnottoselect',
'abcd efgh ijkl mnop\n<b>^select1</b>\n|nottoselect');
doTest('nowrap', '2 use tab as word separator (outside element)',
'abcd efgh ijkl mnop\t<b>select2</b>\tnottoselect',
'abcd efgh ijkl mnop\t<b>^select2</b>\t|nottoselect');
doTest('nowrap', '3 use multiple whitespaces as word separator (outside element)',
'abcd efgh ijkl mnop <b>select3</b> nottoselect',
'abcd efgh ijkl mnop <b>^select3</b> | nottoselect');
doTest('nowrap', '4 use linebreak as word separator (inside element)',
'abcd efgh ijkl mnop<b>\nselect4\n</b>nottoselect',
'abcd efgh ijkl mnop<b>\n^select4\n|</b>nottoselect');
doTest('nowrap', '5 use tab as word separator (inside element)',
'abcd efgh ijkl mnop<b>\tselect5\t</b>nottoselect',
'abcd efgh ijkl mnop<b>\t^select5\t|</b>nottoselect');
doTest('nowrap', '6 use multiple whitespaces as word separator (inside element)',
'abcd efgh ijkl mnop<b> select6 </b>nottoselect',
'abcd efgh ijkl mnop<b> ^select6 | </b>nottoselect');
// cases for source-originated line-breaks with white-space: pre-* family
doTest('pre', 'source break',
'abcd efgh ijkl mnop\n<b>select1</b>\nnottoselect',
'abcd efgh ijkl mnop\n<b>^select1|</b>\nnottoselect');
doTest('pre-wrap', 'source break',
'abcd efgh ijkl mnop\n<b>select1</b>\nnottoselect',
'abcd efgh ijkl mnop\n<b>^select1|</b>\nnottoselect');
doTest('pre-line', 'source break',
'abcd efgh ijkl mnop\n<b>select1</b>\nnottoselect',
'abcd efgh ijkl mnop\n<b>^select1|</b>\nnottoselect');
</script>