Editing tests should use testRunner instead of layoutTestController
[WebKit-https.git] / LayoutTests / editing / spelling / spellcheck-queue.html
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>
11 description('For Bug 72939: Asynchronous SpellChecker should consider multiple requests.');
12
13 if (window.testRunner) {
14     testRunner.waitUntilDone();
15     testRunner.setAsynchronousSpellCheckingEnabled(true);
16 }
17
18 var testRoot = document.createElement("div");
19 document.body.insertBefore(testRoot, document.body.firstChild);
20
21 var source1 = document.createElement("div");
22 source1.innerHTML = "foo bar";
23 testRoot.appendChild(source1);
24
25 var source2 = document.createElement("div");
26 source2.innerHTML = "zz apple orange";
27 testRoot.appendChild(source2);
28
29 function createInput(testRoot) {
30     var e = document.createElement('input');
31     e.setAttribute("type", "text");
32     testRoot.appendChild(e);
33
34     return e;
35 }
36
37 function createTextArea(testRoot) {
38     var e = document.createElement("textarea");
39     testRoot.appendChild(e);
40
41     return e;
42 }
43
44 function createContentEditable(testRoot) {
45     var e = document.createElement("div");
46     e.setAttribute("contentEditable", "true");
47     testRoot.appendChild(e);
48
49     return e;
50 }
51
52 var 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
64 var sel = window.getSelection();
65
66 var tests = [];
67 for (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
74 function verifyIfAny()
75 {
76     var next = tests.shift();
77     if (next) {
78         next();
79         return;
80     }
81
82     testRoot.style.display = "none";
83     if (window.testRunner) {
84         testRunner.setAsynchronousSpellCheckingEnabled(false);
85         testRunner.notifyDone();
86     }
87 }
88
89 function 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
113 function verifyMarker(node, expectedMarked)
114 {
115     if (!window.testRunner || !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
132 function 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
147 function 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"
174 for (var i = 0; i < destinations.length; ++i)
175     copyAndPaste(source1, destinations[i]);
176
177 // paste "zz apple orange"
178 for (var i = 0; i < destinations.length; ++i)
179     copyAndPaste(source2, destinations[i]);
180
181 verifyIfAny();
182
183 var successfullyParsed = true;
184
185 </script>
186 <script src="../../fast/js/resources/js-test-post.js"></script>
187 </body>
188 </html>