gecko/layout/generic/test/test_word_movement.html

311 lines
10 KiB
HTML

<!DOCTYPE HTML>
<html>
<head>
<title>Test Word Movement (including nsTextFrame::PeekOffsetWord)</title>
<script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<p id="display"></p>
<div id="content" style="display: block">
<div contentEditable id="editor"></div>
</div>
<p id="catch">Catch-all
<pre id="test"><script class="testbody" type="text/javascript;version=1.7">
/** Test for Bug 384147 **/
SimpleTest.waitForExplicitFinish();
// This seems to be necessary because the selection is not set up properly otherwise
setTimeout(test, 0);
var eatSpace;
function getPrefs() {
const prefSvcContractID = "@mozilla.org/preferences-service;1";
const prefSvcIID = Components.interfaces.nsIPrefService;
return Components.classes[prefSvcContractID].getService(prefSvcIID)
.getBranch("layout.word_select.");
}
function setPrefs(eat_space, stop_at_punctuation) {
getPrefs().setBoolPref("eat_space_to_next_word", eat_space);
getPrefs().setBoolPref("stop_at_punctuation", stop_at_punctuation);
eatSpace = eat_space;
}
function restorePrefs() {
try {
getPrefs().clearUserPref("eat_space_to_next_word");
} catch(ex) {}
try {
getPrefs().clearUserPref("stop_at_punctuation");
} catch(ex) {}
}
function test() {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var wordModifiers =
(navigator.platform.indexOf("Mac") >= 0) ? {altKey:true} : {ctrlKey:true};
var sel = window.getSelection();
var editor = document.getElementById("editor");
function errString(dir) {
return dir + " movement broken with eatSpace=" + eatSpace + " in \"" + editor.innerHTML +
"\"; sel.anchorNode.parentNode=" + sel.anchorNode.parentNode;
}
function testRight(node, offset) {
synthesizeKey("VK_RIGHT", wordModifiers);
is(sel.anchorNode, node, errString("Right"));
is(sel.anchorOffset, offset, errString("Right"));
}
function testLeft(node, offset) {
synthesizeKey("VK_LEFT", wordModifiers);
is(sel.anchorNode, node, errString("Left"));
is(sel.anchorOffset, offset, errString("Left"));
}
var afterEditorNode = document.getElementById("catch").firstChild;
setPrefs(false, true);
editor.innerHTML = "Hello Kitty";
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 5);
testRight(editor.firstChild, 11);
testLeft(editor.firstChild, 6);
testLeft(editor.firstChild, 0);
editor.innerHTML = "<b>Hello</b> Kitty";
sel.collapse(editor.firstChild.firstChild, 0);
testRight(editor.firstChild.nextSibling, 0);
testRight(editor.firstChild.nextSibling, 6);
testLeft(editor.firstChild.nextSibling, 1);
testLeft(editor.firstChild.firstChild, 0);
editor.innerHTML = "<b>Hello </b>Kitty";
sel.collapse(editor.firstChild.firstChild, 0);
testRight(editor.firstChild.firstChild, 5);
testRight(editor.firstChild.nextSibling, 5);
testLeft(editor.firstChild.firstChild, 6);
testLeft(editor.firstChild.firstChild, 0);
editor.innerHTML = "<b>Log out</b> roc";
sel.collapse(editor.firstChild.firstChild, 0);
testRight(editor.firstChild.firstChild, 3);
testRight(editor.firstChild.nextSibling, 0);
testRight(editor.firstChild.nextSibling, 5);
// In the next test, we expect to be at the end of the
// space that is not collapsed away
testLeft(editor.firstChild.nextSibling, 1);
testLeft(editor.firstChild.firstChild, 4);
testLeft(editor.firstChild.firstChild, 0);
editor.innerHTML = "http://www.mozilla.org";
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 7);
testRight(editor.firstChild, 11);
testRight(editor.firstChild, 19);
testLeft(editor.firstChild, 11);
testLeft(editor.firstChild, 7);
testLeft(editor.firstChild, 0);
editor.innerHTML = "Set .rc to <b>'</b>quiz'";
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 3);
testRight(editor.firstChild, 7);
testRight(editor.firstChild, 10);
testRight(editor.firstChild.nextSibling.nextSibling, 5);
testLeft(editor.firstChild.nextSibling.firstChild, 1);
testLeft(editor.firstChild, 10);
testLeft(editor.firstChild, 8);
testLeft(editor.firstChild, 5);
testLeft(editor.firstChild, 3);
testLeft(editor.firstChild, 0);
var ChineseChars = "&#x6F22;&#x5B57;";
var HiraganaChars = "&#x3072;&#x3089;&#x304C;&#x306A;";
var KatakanaChars = "&#x30AB;&#x30BF;&#x30AB;&#x30CA;";
var JapaneseFullStop = "&#x3002;";
var JapaneseComma = "&#x3001";
editor.innerHTML = ChineseChars + HiraganaChars + ChineseChars;
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 2);
testRight(editor.firstChild, 6);
testRight(editor.firstChild, 8);
testLeft(editor.firstChild, 6);
testLeft(editor.firstChild, 2);
testLeft(editor.firstChild, 0);
editor.innerHTML = ChineseChars + KatakanaChars + ChineseChars;
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 2);
testRight(editor.firstChild, 6);
testRight(editor.firstChild, 8);
testLeft(editor.firstChild, 6);
testLeft(editor.firstChild, 2);
testLeft(editor.firstChild, 0);
editor.innerHTML = KatakanaChars + HiraganaChars + KatakanaChars;
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 4);
testRight(editor.firstChild, 8);
testRight(editor.firstChild, 12);
testLeft(editor.firstChild, 8);
testLeft(editor.firstChild, 4);
testLeft(editor.firstChild, 0);
editor.innerHTML = HiraganaChars + JapaneseComma + HiraganaChars + JapaneseFullStop + HiraganaChars;
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 5);
testRight(editor.firstChild, 10);
testRight(editor.firstChild, 14);
testLeft(editor.firstChild, 10);
testLeft(editor.firstChild, 5);
testLeft(editor.firstChild, 0);
editor.innerHTML = KatakanaChars + JapaneseComma + KatakanaChars + JapaneseFullStop + KatakanaChars;
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 5);
testRight(editor.firstChild, 10);
testRight(editor.firstChild, 14);
testLeft(editor.firstChild, 10);
testLeft(editor.firstChild, 5);
testLeft(editor.firstChild, 0);
editor.innerHTML = ChineseChars + JapaneseComma + ChineseChars + JapaneseFullStop + ChineseChars;
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 3);
testRight(editor.firstChild, 6);
testRight(editor.firstChild, 8);
testLeft(editor.firstChild, 6);
testLeft(editor.firstChild, 3);
testLeft(editor.firstChild, 0);
setPrefs(true, true);
// test basic word movement with eat_space_next_to_word true.
editor.innerHTML = "Hello Kitty";
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 6);
testRight(afterEditorNode, 0);
testLeft(editor.firstChild, 6);
testLeft(editor.firstChild, 0);
editor.innerHTML = "<b>Hello</b> Kitty";
sel.collapse(editor.firstChild.firstChild, 0);
testRight(editor.firstChild.nextSibling, 1);
testRight(afterEditorNode, 0);
testLeft(editor.firstChild.nextSibling, 1);
testLeft(editor.firstChild.firstChild, 0);
editor.innerHTML = "<b>Hello </b>Kitty";
sel.collapse(editor.firstChild.firstChild, 0);
testRight(editor.firstChild.nextSibling, 0);
testRight(afterEditorNode, 0);
testLeft(editor.firstChild.firstChild, 6);
testLeft(editor.firstChild.firstChild, 0);
editor.innerHTML = "<b>Log out</b> roc";
sel.collapse(editor.firstChild.firstChild, 0);
testRight(editor.firstChild.firstChild, 4);
testRight(editor.firstChild.nextSibling, 2);
testRight(afterEditorNode, 0);
testLeft(editor.firstChild.nextSibling, 1);
testLeft(editor.firstChild.firstChild, 4);
testLeft(editor.firstChild.firstChild, 0);
editor.innerHTML = "http://www.mozilla.org";
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 7);
testRight(editor.firstChild, 11);
testRight(editor.firstChild, 19);
testLeft(editor.firstChild, 11);
testLeft(editor.firstChild, 7);
testLeft(editor.firstChild, 0);
editor.innerHTML = "Set .rc to <b>'</b>quiz'";
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 4);
testRight(editor.firstChild, 8);
testRight(editor.firstChild.nextSibling.firstChild, 0);
testRight(afterEditorNode, 0);
testLeft(editor.firstChild.nextSibling.firstChild, 1);
testLeft(editor.firstChild, 10);
testLeft(editor.firstChild, 8);
testLeft(editor.firstChild, 5);
testLeft(editor.firstChild, 3);
testLeft(editor.firstChild, 0);
editor.innerHTML = ChineseChars + HiraganaChars + ChineseChars;
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 2);
testRight(editor.firstChild, 6);
testRight(afterEditorNode, 0);
testLeft(editor.firstChild, 6);
testLeft(editor.firstChild, 2);
testLeft(editor.firstChild, 0);
editor.innerHTML = ChineseChars + KatakanaChars + ChineseChars;
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 2);
testRight(editor.firstChild, 6);
testRight(afterEditorNode, 0);
testLeft(editor.firstChild, 6);
testLeft(editor.firstChild, 2);
testLeft(editor.firstChild, 0);
editor.innerHTML = KatakanaChars + HiraganaChars + KatakanaChars;
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 4);
testRight(editor.firstChild, 8);
testRight(afterEditorNode, 0);
testLeft(editor.firstChild, 8);
testLeft(editor.firstChild, 4);
testLeft(editor.firstChild, 0);
editor.innerHTML = HiraganaChars + JapaneseComma + HiraganaChars + JapaneseFullStop + HiraganaChars;
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 5);
testRight(editor.firstChild, 10);
testRight(afterEditorNode, 0);
testLeft(editor.firstChild, 10);
testLeft(editor.firstChild, 5);
testLeft(editor.firstChild, 0);
editor.innerHTML = KatakanaChars + JapaneseComma + KatakanaChars + JapaneseFullStop + KatakanaChars;
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 5);
testRight(editor.firstChild, 10);
testRight(afterEditorNode, 0);
testLeft(editor.firstChild, 10);
testLeft(editor.firstChild, 5);
testLeft(editor.firstChild, 0);
editor.innerHTML = ChineseChars + JapaneseComma + ChineseChars + JapaneseFullStop + ChineseChars;
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 3);
testRight(editor.firstChild, 6);
testRight(afterEditorNode, 0);
testLeft(editor.firstChild, 6);
testLeft(editor.firstChild, 3);
testLeft(editor.firstChild, 0);
restorePrefs();
SimpleTest.finish();
}
</script></pre>
</body>
</html>