blob: 5a17cb0c2c82ca40c6b69978c299cca081d2a4bb [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<script src="resources/js-test-selection-shared.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script>
description('For Bug 72939: Asynchronous SpellChecker should consider multiple requests.');
jsTestIsAsync = true;
if (window.internals)
internals.settings.setAsynchronousSpellCheckingEnabled(true);
var testRoot = document.createElement("div");
document.body.insertBefore(testRoot, document.body.firstChild);
var source1 = document.createElement("div");
source1.innerHTML = "foo bar";
testRoot.appendChild(source1);
var source2 = document.createElement("div");
source2.innerHTML = "zz apple orange";
testRoot.appendChild(source2);
function createInput(testRoot) {
var e = document.createElement('input');
e.setAttribute("type", "text");
testRoot.appendChild(e);
return e;
}
function createTextArea(testRoot) {
var e = document.createElement("textarea");
testRoot.appendChild(e);
return e;
}
function createContentEditable(testRoot) {
var e = document.createElement("div");
e.setAttribute("contentEditable", "true");
testRoot.appendChild(e);
return e;
}
var destinations = [
createInput(testRoot),
createTextArea(testRoot),
createContentEditable(testRoot),
createInput(testRoot),
createTextArea(testRoot),
createContentEditable(testRoot),
createInput(testRoot),
createTextArea(testRoot),
createContentEditable(testRoot),
];
var sel = window.getSelection();
var tests = [];
for (var i = 0; i < destinations.length; ++i) {
var t = function(i) {
return function() { verify(source2, destinations[i], ["zz"]); }
}(i);
tests.push(t);
}
function verifyIfAny()
{
var next = tests.shift();
if (next) {
next();
return;
}
testRoot.style.display = "none";
finishJSTest();
}
function findFirstTextNode(node)
{
function iterToFindFirstTextNode(node)
{
if (node instanceof Text)
return node;
var childNodes = node.childNodes;
for (var i = 0; i < childNodes.length; ++i) {
var n = iterToFindFirstTextNode(childNodes[i]);
if (n)
return n;
}
return null;
}
if (node instanceof HTMLInputElement || node instanceof HTMLTextAreaElement)
return iterToFindFirstTextNode(internals.shadowRoot(node));
else
return iterToFindFirstTextNode(node);
}
function verifyMarker(node, expectedMarked)
{
if (!window.testRunner || !window.internals)
return false;
var textNode = findFirstTextNode(node);
var num = internals.markerCountForNode(textNode, "spelling");
if (num != expectedMarked.length)
return false;
for (var i = 0; i < num; ++i) {
var range = internals.markerRangeForNode(textNode, "spelling", i);
if (range.toString() != expectedMarked[i])
return false;
}
return true;
}
function copyAndPaste(source, dest)
{
sel.selectAllChildren(source);
document.execCommand("Copy");
if (dest instanceof HTMLInputElement || dest instanceof HTMLTextAreaElement) {
dest.value = "";
dest.focus();
} else {
dest.innerHTML = "";
sel.selectAllChildren(dest);
}
document.execCommand("Paste");
}
function verify(source, dest, expectedMarked)
{
var nretry = 10;
var nsleep = 1;
function trial() {
var verified = verifyMarker(dest, expectedMarked);
if (verified) {
testPassed(dest.tagName + " has a marker on '" + source.innerHTML + "'");
verifyIfAny();
return;
}
nretry--;
if (0 == nretry) {
testFailed(dest.tagName + " should have a marker on for '" + source.innerHTML + "'");
verifyIfAny();
return;
}
nsleep *= 2;
window.setTimeout(trial, nsleep);
};
trial();
}
// paste "foo bar"
for (var i = 0; i < destinations.length; ++i)
copyAndPaste(source1, destinations[i]);
// paste "zz apple orange"
for (var i = 0; i < destinations.length; ++i)
copyAndPaste(source2, destinations[i]);
verifyIfAny();
var successfullyParsed = true;
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>