|
1 <!DOCTYPE HTML> |
|
2 <html> |
|
3 <head> |
|
4 <title>Tests for browser context menu</title> |
|
5 <script type="text/javascript" src="/MochiKit/packed.js"></script> |
|
6 <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> |
|
7 <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script> |
|
8 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> |
|
9 </head> |
|
10 <body> |
|
11 Browser context menu tests for input. |
|
12 <p id="display"></p> |
|
13 |
|
14 <div id="content"> |
|
15 </div> |
|
16 |
|
17 <pre id="test"> |
|
18 <script type="text/javascript" src="contextmenu_common.js"></script> |
|
19 <script class="testbody" type="text/javascript"> |
|
20 |
|
21 const Ci = SpecialPowers.Ci; |
|
22 |
|
23 /* |
|
24 * runTest |
|
25 * |
|
26 * Called by a popupshowing event handler. Each test checks for expected menu |
|
27 * contents, closes the popup, and finally triggers the popup on a new element |
|
28 * (thus kicking off another cycle). |
|
29 * |
|
30 */ |
|
31 function runTest(testNum) { |
|
32 ok(true, "Starting test #" + testNum); |
|
33 |
|
34 switch (testNum) { |
|
35 case 1: |
|
36 openContextMenuFor(input); // Invoke context menu for next test. |
|
37 break; |
|
38 |
|
39 case 2: |
|
40 // Context menu for text input field. |
|
41 checkContextMenu(["context-undo", false, |
|
42 "---", null, |
|
43 "context-cut", false, |
|
44 "context-copy", false, |
|
45 "context-paste", null, // ignore clipboard state |
|
46 "context-delete", false, |
|
47 "---", null, |
|
48 "context-selectall", false, |
|
49 "---", null, |
|
50 "spell-check-enabled", true, |
|
51 "---", null, |
|
52 "context-inspect", true]); |
|
53 closeContextMenu(); |
|
54 input.setAttribute('spellcheck', 'true'); |
|
55 openContextMenuFor(input); // Invoke context menu for next test. |
|
56 break; |
|
57 |
|
58 case 3: |
|
59 var value = SpecialPowers.Services.appinfo.OS != "Darwin"; |
|
60 // Context menu for spell-check input. |
|
61 checkContextMenu(["context-undo", value, |
|
62 "---", null, |
|
63 "context-cut", value, |
|
64 "context-copy", value, |
|
65 "context-paste", null, // ignore clipboard state |
|
66 "context-delete", value, |
|
67 "---", null, |
|
68 "context-selectall", value, |
|
69 "---", null, |
|
70 "spell-check-enabled", true, |
|
71 "spell-dictionaries", true, |
|
72 [/*"spell-check-dictionary-en-US", true,*/ |
|
73 "---", null, |
|
74 "spell-add-dictionaries", true], null, |
|
75 "---", null, |
|
76 "context-inspect", true]); |
|
77 |
|
78 closeContextMenu(); |
|
79 input.removeAttribute('spellcheck'); |
|
80 openContextMenuFor(inputspellwrong); // Invoke context menu for next test. |
|
81 break; |
|
82 |
|
83 case 4: |
|
84 var value = SpecialPowers.Services.appinfo.OS != "Darwin"; |
|
85 // Context menu for spell-check input with a unknwon word. |
|
86 checkContextMenu([/*"*prodigality", true,*/ // spelling suggestion |
|
87 /*"spell-add-to-dictionary", true,*/ |
|
88 /*"---", null,*/ |
|
89 "context-undo", value, |
|
90 "---", null, |
|
91 "context-cut", value, |
|
92 "context-copy", value, |
|
93 "context-paste", null, // ignore clipboard state |
|
94 "context-delete", value, |
|
95 "---", null, |
|
96 "context-selectall", true, |
|
97 "---", null, |
|
98 "spell-check-enabled", true, |
|
99 "spell-dictionaries", true, |
|
100 [/*"spell-check-dictionary-en-US", true,*/ |
|
101 "---", null, |
|
102 "spell-add-dictionaries", true], null, |
|
103 "---", null, |
|
104 "context-inspect", true]); |
|
105 |
|
106 closeContextMenu(); |
|
107 openContextMenuFor(inputspellcorrect); // Invoke context menu for next test. |
|
108 break; |
|
109 |
|
110 case 5: |
|
111 var value = SpecialPowers.Services.appinfo.OS != "Darwin"; |
|
112 // Context menu for spell-check input with a known word. |
|
113 checkContextMenu(["context-undo", value, |
|
114 "---", null, |
|
115 "context-cut", value, |
|
116 "context-copy", value, |
|
117 "context-paste", null, // ignore clipboard state |
|
118 "context-delete", value, |
|
119 "---", null, |
|
120 "context-selectall", true, |
|
121 "---", null, |
|
122 "spell-check-enabled", true, |
|
123 "spell-dictionaries", true, |
|
124 [/*"spell-check-dictionary-en-US", true,*/ |
|
125 "---", null, |
|
126 "spell-add-dictionaries", true], null, |
|
127 "---", null, |
|
128 "context-inspect", true]); |
|
129 |
|
130 closeContextMenu(); |
|
131 input.disabled = true; |
|
132 openContextMenuFor(input); // Invoke context menu for next test. |
|
133 break; |
|
134 |
|
135 case 6: |
|
136 // Context menu for disabled input. |
|
137 checkContextMenu(["context-undo", false, |
|
138 "---", null, |
|
139 "context-cut", false, |
|
140 "context-copy", false, |
|
141 "context-paste", null, // ignore clipboard state |
|
142 "context-delete", false, |
|
143 "---", null, |
|
144 "context-selectall", true, |
|
145 "---", null, |
|
146 "spell-check-enabled", true, |
|
147 "---", null, |
|
148 "context-inspect", true]); |
|
149 |
|
150 closeContextMenu(); |
|
151 input.disabled = false; |
|
152 input.type = 'password'; |
|
153 openContextMenuFor(input); // Invoke context menu for next test. |
|
154 break; |
|
155 |
|
156 case 7: // password |
|
157 case 8: // email |
|
158 case 9: // url |
|
159 case 10: // tel |
|
160 // Context menu for tel, password, email and url input fields. |
|
161 checkContextMenu(["context-undo", false, |
|
162 "---", null, |
|
163 "context-cut", false, |
|
164 "context-copy", false, |
|
165 "context-paste", null, // ignore clipboard state |
|
166 "context-delete", false, |
|
167 "---", null, |
|
168 "context-selectall", false, |
|
169 "---", null, |
|
170 "context-inspect", true]); |
|
171 |
|
172 closeContextMenu(); |
|
173 |
|
174 if (testNum == 7) { |
|
175 input.type = 'email'; |
|
176 } else if (testNum == 8) { |
|
177 input.type = 'url'; |
|
178 } else if (testNum == 9) { |
|
179 input.type = 'tel'; |
|
180 } else if (testNum == 10) { |
|
181 input.type = 'date'; |
|
182 } |
|
183 |
|
184 openContextMenuFor(input); // Invoke context menu for next test. |
|
185 break; |
|
186 |
|
187 case 11: // type='date' |
|
188 case 12: // type='time' |
|
189 case 13: // type='number' |
|
190 case 14: // type='color' |
|
191 case 15: // type='range' |
|
192 checkContextMenu(["context-back", false, |
|
193 "context-forward", false, |
|
194 "context-reload", true, |
|
195 "---", null, |
|
196 "context-bookmarkpage", true, |
|
197 "context-savepage", true, |
|
198 "---", null, |
|
199 "context-viewbgimage", false, |
|
200 "context-selectall", null, |
|
201 "---", null, |
|
202 "context-viewsource", true, |
|
203 "context-viewinfo", true, |
|
204 "---", null, |
|
205 "context-inspect", true]); |
|
206 closeContextMenu(); |
|
207 |
|
208 if (testNum == 11) { |
|
209 input.type = 'time'; |
|
210 } else if (testNum == 12) { |
|
211 input.type = 'number'; |
|
212 } else if (testNum == 13) { |
|
213 input.type = 'color'; |
|
214 } else if (testNum == 14) { |
|
215 input.type = 'range'; |
|
216 } else { |
|
217 input.type = 'search'; |
|
218 } |
|
219 |
|
220 openContextMenuFor(input); |
|
221 break; |
|
222 |
|
223 case 16: // type='search' |
|
224 // Context menu for search input fields. |
|
225 checkContextMenu(["context-undo", false, |
|
226 "---", null, |
|
227 "context-cut", false, |
|
228 "context-copy", false, |
|
229 "context-paste", null, // ignore clipboard state |
|
230 "context-delete", false, |
|
231 "---", null, |
|
232 "context-selectall", false, |
|
233 "---", null, |
|
234 "spell-check-enabled", true, |
|
235 "---", null, |
|
236 "context-inspect", true]); |
|
237 |
|
238 closeContextMenu(); |
|
239 |
|
240 // Add some todos to make sure all input fields got a test. |
|
241 var todos = [ "datetime", "month", "week", "datetime-local" ]; |
|
242 todos.forEach(function(type) { |
|
243 input.type = type; |
|
244 todo_is(input.type, type, "TODO: add test for " + type + " input fields"); |
|
245 }); |
|
246 |
|
247 input.type = 'text'; |
|
248 input.readOnly = true; |
|
249 openContextMenuFor(input); |
|
250 break; |
|
251 |
|
252 case 17: |
|
253 // Context menu for a read-only input. |
|
254 checkContextMenu(["context-undo", false, |
|
255 "---", null, |
|
256 "context-cut", false, |
|
257 "context-copy", false, |
|
258 "context-paste", null, // ignore clipboard state |
|
259 "context-delete", false, |
|
260 "---", null, |
|
261 "context-selectall", false, |
|
262 "---", null, |
|
263 "context-inspect", true]); |
|
264 closeContextMenu(); |
|
265 |
|
266 // Clean-up. |
|
267 subwindow.close(); |
|
268 SimpleTest.finish(); |
|
269 return; |
|
270 |
|
271 default: |
|
272 ok(false, "Unexpected invocation of test #" + testNum); |
|
273 subwindow.close(); |
|
274 SimpleTest.finish(); |
|
275 return; |
|
276 } |
|
277 |
|
278 } |
|
279 |
|
280 |
|
281 var gTestNum = 1; |
|
282 var subwindow, chromeWin, contextMenu; |
|
283 var input, inputspellwrong, inputspellcorrect; |
|
284 |
|
285 function startTest() { |
|
286 chromeWin = SpecialPowers.wrap(subwindow) |
|
287 .QueryInterface(Ci.nsIInterfaceRequestor) |
|
288 .getInterface(Ci.nsIWebNavigation) |
|
289 .QueryInterface(Ci.nsIDocShellTreeItem) |
|
290 .rootTreeItem |
|
291 .QueryInterface(Ci.nsIInterfaceRequestor) |
|
292 .getInterface(Ci.nsIDOMWindow) |
|
293 .QueryInterface(Ci.nsIDOMChromeWindow); |
|
294 contextMenu = chromeWin.document.getElementById("contentAreaContextMenu"); |
|
295 ok(contextMenu, "Got context menu XUL"); |
|
296 |
|
297 if (chromeWin.document.getElementById("Browser:Stop").getAttribute("disabled") != "true") { |
|
298 SimpleTest.executeSoon(startTest); |
|
299 return; |
|
300 } |
|
301 |
|
302 var inputs = subwindow.document.getElementsByTagName('input'); |
|
303 input = inputs[0]; |
|
304 inputspellwrong = inputs[1]; |
|
305 inputspellcorrect = inputs[2]; |
|
306 |
|
307 contextMenu.addEventListener("popupshown", function() { runTest(++gTestNum); }, false); |
|
308 runTest(1); |
|
309 } |
|
310 |
|
311 // We open this in a separate window, because the Mochitests run inside a frame. |
|
312 // The frame causes an extra menu item, and prevents running the test |
|
313 // standalone (ie, clicking the test name in the Mochitest window) to see |
|
314 // success/failure messages. |
|
315 var painted = false, loaded = false; |
|
316 |
|
317 function waitForEvents(event) |
|
318 { |
|
319 if (event.type == "MozAfterPaint") |
|
320 painted = true; |
|
321 else if (event.type == "load") |
|
322 loaded = true; |
|
323 if (painted && loaded) { |
|
324 subwindow.removeEventListener("MozAfterPaint", waitForEvents, false); |
|
325 subwindow.onload = null; |
|
326 startTest(); |
|
327 } |
|
328 } |
|
329 |
|
330 var subwindow = window.open("data:text/html,<!DOCTYPE html><input><input spellcheck='true' value='prodkjfgigrty'><input spellcheck='true' value='foo'><input readonly spellcheck='false'>", "contextmenu-subtext", "width=600,height=700"); |
|
331 subwindow.addEventListener("MozAfterPaint", waitForEvents, false); |
|
332 subwindow.onload = waitForEvents; |
|
333 |
|
334 SimpleTest.waitForExplicitFinish(); |
|
335 </script> |
|
336 </pre> |
|
337 </body> |
|
338 </html> |