gecko-dev/widget/tests/test_input_events_on_deactive_window.xul

259 lines
8.3 KiB
XML

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
type="text/css"?>
<window title="Testing composition, text and query content events"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/javascript"
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
<script type="application/javascript"
src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js" />
<script type="text/javascript" src="chrome://mochikit/content/tests/SimpleTest/ChromeUtils.js"></script>
<body xmlns="http://www.w3.org/1999/xhtml">
<div id="content" style="display: none">
</div>
<p id="display">
<textarea id="textarea"></textarea>
</p>
<pre id="test">
</pre>
</body>
<script class="testbody" type="application/javascript">
<![CDATA[
SimpleTest.waitForExplicitFinish();
SimpleTest.waitForFocus(runTests, window);
var fm = Components.classes["@mozilla.org/focus-manager;1"].
getService(Components.interfaces.nsIFocusManager);
var textarea = document.getElementById("textarea");
var otherWindow;
var timer;
function runTests()
{
textarea.focus();
is(fm.focusedElement, textarea, "we're deactive");
if (fm.focusedElement != textarea) {
SimpleTest.finish();
return;
}
otherWindow =
window.open("data:text/plain,this is an active window.", "_blank",
"chrome,width=100,height=100");
ok(otherWindow, "failed to open other window");
if (!otherWindow) {
SimpleTest.finish();
return;
}
SimpleTest.waitForFocus(startTests, otherWindow);
otherWindow.focus();
}
function startTests()
{
clearTimeout(timer);
isnot(fm.focusedWindow, window, "we're not deactive");
if (fm.focusedWindow == window) {
otherWindow.close();
SimpleTest.finish();
return;
}
var keydownHandled, keypressHandled, keyupHandled, compositionstartHandled,
compositionendHandled, compositionupdateHandled, inputHandled;
function clear()
{
keydownHandled = false;
keypressHandled = false;
keyupHandled = false;
compositionstartHandled = false;
compositionendHandled = false;
compositionupdateHandled = false;
inputHandled = false;
}
function onEvent(aEvent)
{
if (aEvent.type == "keydown") {
keydownHandled = true;
} else if (aEvent.type == "keypress") {
keypressHandled = true;
} else if (aEvent.type == "keyup") {
keyupHandled = true;
} else if (aEvent.type == "compositionstart") {
compositionstartHandled = true;
} else if (aEvent.type == "compositionend") {
compositionendHandled = true;
} else if (aEvent.type == "compositionupdate") {
compositionupdateHandled = true;
} else if (aEvent.type == "input") {
inputHandled = true;
} else {
ok(false, "handled unknown event: " + aEvent.type);
}
}
textarea.addEventListener("keydown", onEvent, false);
textarea.addEventListener("keypress", onEvent, false);
textarea.addEventListener("keyup", onEvent, false);
textarea.addEventListener("compositionstart", onEvent, false);
textarea.addEventListener("compositionend", onEvent, false);
textarea.addEventListener("compositionupdate", onEvent, false);
textarea.addEventListener("input", onEvent, false);
startTestsInternal();
function startTestsInternal()
{
// key events
function checkKeyEvents(aKeydown, aKeypress, aKeyup, aInput, aDescription)
{
is(keydownHandled, aKeydown,
"keydown event is (not) handled: " + aDescription);
is(keypressHandled, aKeypress,
"keypress event is (not) handled: " + aDescription);
is(keyupHandled, aKeyup,
"keyup event is (not) handled: " + aDescription);
is(inputHandled, aInput,
"input event is (not) handled: " + aDescription);
}
function checkCompositionEvents(aStart, aEnd, aUpdate, aInput, aDescription)
{
is(compositionstartHandled, aStart,
"compositionstart event is (not) handled: " + aDescription);
is(compositionendHandled, aEnd,
"compositionend event is (not) handled: " + aDescription);
is(compositionupdateHandled, aUpdate,
"compositionupdate event is (not) handled: " + aDescription);
is(inputHandled, aInput,
"input event is (not) handled: " + aDescription);
}
clear();
synthesizeKey("a", { type: "keydown" });
checkKeyEvents(true, false, false, false, "a keydown");
clear();
synthesizeKey("a", { type: "keypress" });
checkKeyEvents(false, true, false, true, "a keypress");
is(textarea.value, "a", "textarea value isn't 'a'");
clear();
synthesizeKey("a", { type: "keyup" });
checkKeyEvents(false, false, true, false, "a keyup");
clear();
synthesizeKey("VK_BACK_SPACE", {});
checkKeyEvents(true, true, true, true, "VK_BACK_SPACE key events");
is(textarea.value, "", "textarea value isn't empty");
// IME events
const nsIDOMWindowUtils = Components.interfaces.nsIDOMWindowUtils;
clear();
// start composition
synthesizeComposition({ type: "compositionstart" });
checkCompositionEvents(true, false, false, false, "compositionstart");
clear();
// input first character
synthesizeComposition({ type: "compositionupdate", data: "\u3089" });
synthesizeText(
{ "composition":
{ "string": "\u3089",
"clauses":
[
{ "length": 1, "attr": nsIDOMWindowUtils.COMPOSITION_ATTR_RAWINPUT }
]
},
"caret": { "start": 1, "length": 0 }
});
checkCompositionEvents(false, false, true, true, "composing");
var queryText = synthesizeQueryTextContent(0, 100);
ok(queryText, "query text event result is null");
if (!queryText) {
return;
}
ok(queryText.succeeded, "query text event failed");
if (!queryText.succeeded) {
return;
}
is(queryText.text, "\u3089", "composing text is incorrect");
var querySelectedText = synthesizeQuerySelectedText();
ok(querySelectedText, "query selected text event result is null");
if (!querySelectedText) {
return;
}
ok(querySelectedText.succeeded, "query selected text event failed");
if (!querySelectedText.succeeded) {
return;
}
is(querySelectedText.offset, 1,
"query selected text event returns wrong offset");
is(querySelectedText.text, "",
"query selected text event returns wrong selected text");
clear();
// commit composition
synthesizeText(
{ "composition":
{ "string": "\u3089",
"clauses":
[
{ "length": 0, "attr": 0 }
]
},
"caret": { "start": 1, "length": 0 }
});
checkCompositionEvents(false, false, false, false, "commit composition");
queryText = synthesizeQueryTextContent(0, 100);
ok(queryText, "query text event result is null after commit");
if (!queryText) {
return;
}
ok(queryText.succeeded, "query text event failed after commit");
if (!queryText.succeeded) {
return;
}
is(queryText.text, "\u3089", "composing text is incorrect after commit");
querySelectedText = synthesizeQuerySelectedText();
ok(querySelectedText,
"query selected text event result is null after commit");
if (!querySelectedText) {
return;
}
ok(querySelectedText.succeeded,
"query selected text event failed after commit");
if (!querySelectedText.succeeded) {
return;
}
is(querySelectedText.offset, 1,
"query selected text event returns wrong offset after commit");
is(querySelectedText.text, "",
"query selected text event returns wrong selected text after commit");
clear();
// end composition
synthesizeComposition({ type: "compositionend", data: "\u3089" });
checkCompositionEvents(false, true, false, true, "compositionend");
}
textarea.removeEventListener("keydown", onEvent, false);
textarea.removeEventListener("keypress", onEvent, false);
textarea.removeEventListener("keyup", onEvent, false);
textarea.removeEventListener("compositionstart", onEvent, false);
textarea.removeEventListener("compositionupdate", onEvent, false);
textarea.removeEventListener("compositionend", onEvent, false);
textarea.removeEventListener("input", onEvent, false);
otherWindow.close();
SimpleTest.finish();
}
]]>
</script>
</window>