1<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
2<html>
3<head>
4<script src="../../fast/js/resources/js-test-pre.js"></script>
5<script src="resources/js-test-selection-shared.js"></script>
6</head>
7<body>
8<p id="description"></p>
9<div id="console"></div>
10<script>
11description('For Bug 72939: Asynchronous SpellChecker should consider multiple requests.');
12
13if (window.layoutTestController) {
14 layoutTestController.waitUntilDone();
15 layoutTestController.setAsynchronousSpellCheckingEnabled(true);
16}
17
18var testRoot = document.createElement("div");
19document.body.insertBefore(testRoot, document.body.firstChild);
20
21var source1 = document.createElement("div");
22source1.innerHTML = "foo bar";
23testRoot.appendChild(source1);
24
25var source2 = document.createElement("div");
26source2.innerHTML = "zz apple orange";
27testRoot.appendChild(source2);
28
29function createInput(testRoot) {
30 var e = document.createElement('input');
31 e.setAttribute("type", "text");
32 testRoot.appendChild(e);
33
34 return e;
35}
36
37function createTextArea(testRoot) {
38 var e = document.createElement("textarea");
39 testRoot.appendChild(e);
40
41 return e;
42}
43
44function createContentEditable(testRoot) {
45 var e = document.createElement("div");
46 e.setAttribute("contentEditable", "true");
47 testRoot.appendChild(e);
48
49 return e;
50}
51
52var destinations = [
53 createInput(testRoot),
54 createTextArea(testRoot),
55 createContentEditable(testRoot),
56 createInput(testRoot),
57 createTextArea(testRoot),
58 createContentEditable(testRoot),
59 createInput(testRoot),
60 createTextArea(testRoot),
61 createContentEditable(testRoot),
62];
63
64var sel = window.getSelection();
65
66var tests = [];
67for (var i = 0; i < destinations.length; ++i) {
68 var t = function(i) {
69 return function() { verify(source2, destinations[i], ["zz"]); }
70 }(i);
71 tests.push(t);
72}
73
74function verifyIfAny()
75{
76 var next = tests.shift();
77 if (next) {
78 next();
79 return;
80 }
81
82 testRoot.style.display = "none";
83 if (window.layoutTestController) {
84 layoutTestController.setAsynchronousSpellCheckingEnabled(false);
85 layoutTestController.notifyDone();
86 }
87}
88
89function findFirstTextNode(node)
90{
91 function iterToFindFirstTextNode(node)
92 {
93 if (node instanceof Text)
94 return node;
95
96 var childNodes = node.childNodes;
97 for (var i = 0; i < childNodes.length; ++i) {
98 var n = iterToFindFirstTextNode(childNodes[i]);
99 if (n)
100 return n;
101 }
102
103 return null;
104 }
105
106
107 if (node instanceof HTMLInputElement || node instanceof HTMLTextAreaElement)
108 return iterToFindFirstTextNode(internals.shadowRoot(node));
109 else
110 return iterToFindFirstTextNode(node);
111}
112
113function verifyMarker(node, expectedMarked)
114{
115 if (!window.layoutTestController || !window.internals)
116 return false;
117
118 var textNode = findFirstTextNode(node);
119
120 var num = internals.markerCountForNode(textNode, "spelling");
121 if (num != expectedMarked.length)
122 return false;
123 for (var i = 0; i < num; ++i) {
124 var range = internals.markerRangeForNode(textNode, "spelling", i);
125 if (range.toString() != expectedMarked[i])
126 return false;
127 }
128
129 return true;
130}
131
132function copyAndPaste(source, dest)
133{
134 sel.selectAllChildren(source);
135 document.execCommand("Copy");
136
137 if (dest instanceof HTMLInputElement || dest instanceof HTMLTextAreaElement) {
138 dest.value = "";
139 dest.focus();
140 } else {
141 dest.innerHTML = "";
142 sel.selectAllChildren(dest);
143 }
144 document.execCommand("Paste");
145}
146
147function verify(source, dest, expectedMarked)
148{
149 var nretry = 10;
150 var nsleep = 1;
151 function trial() {
152 var verified = verifyMarker(dest, expectedMarked);
153 if (verified) {
154 testPassed(dest.tagName + " has a marker on '" + source.innerHTML + "'");
155 verifyIfAny();
156 return;
157 }
158
159 nretry--;
160 if (0 == nretry) {
161 testFailed(dest.tagName + " should have a marker on for '" + source.innerHTML + "'");
162 verifyIfAny();
163 return;
164 }
165
166 nsleep *= 2;
167 window.setTimeout(trial, nsleep);
168 };
169 trial();
170}
171
172
173// paste "foo bar"
174for (var i = 0; i < destinations.length; ++i)
175 copyAndPaste(source1, destinations[i]);
176
177// paste "zz apple orange"
178for (var i = 0; i < destinations.length; ++i)
179 copyAndPaste(source2, destinations[i]);
180
181verifyIfAny();
182
183var successfullyParsed = true;
184
185</script>
186<script src="../../fast/js/resources/js-test-post.js"></script>
187</body>
188</html>