accessible/tests/mochitest/events/test_docload.html

branch
TOR_BUG_9701
changeset 14
925c144e1f1f
equal deleted inserted replaced
-1:000000000000 0:1de1d4102ecf
1 <html>
2
3 <head>
4 <title>Accessible events testing for document</title>
5
6 <link rel="stylesheet" type="text/css"
7 href="chrome://mochikit/content/tests/SimpleTest/test.css" />
8
9 <script type="application/javascript"
10 src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
11
12 <script type="application/javascript"
13 src="../common.js"></script>
14 <script type="application/javascript"
15 src="../role.js"></script>
16 <script type="application/javascript"
17 src="../states.js"></script>
18
19 <script type="application/javascript">
20 // Front end stuff sometimes likes to stuff things in the hidden window(s)
21 // in which case there's accessibles for that content.
22 Components.utils.import("resource://gre/modules/Services.jsm");
23
24 // Force the creation of an accessible for the hidden window's document.
25 var doc = Services.appShell.hiddenDOMWindow.document;
26 gAccRetrieval.getAccessibleFor(doc);
27
28 // The private hidden window will be lazily created that's why we need to do
29 // it here *before* loading '../events.js' or else we'll have a duplicate
30 // reorder event.
31 var privateDoc = Services.appShell.hiddenPrivateDOMWindow.document;
32
33 // Force the creation of an accessible for the private hidden window's doc.
34 gAccRetrieval.getAccessibleFor(privateDoc);
35 </script>
36
37 <script type="application/javascript"
38 src="../events.js"></script>
39
40 <script type="application/javascript">
41 ////////////////////////////////////////////////////////////////////////////
42 // Invokers
43
44 function changeIframeSrc(aIdentifier, aURL)
45 {
46 this.DOMNode = getNode(aIdentifier);
47
48 this.eventSeq = [
49 new invokerChecker(EVENT_REORDER, getAccessible(this.DOMNode)),
50 new asyncInvokerChecker(EVENT_DOCUMENT_LOAD_COMPLETE, getIframeDoc)
51 ];
52
53 this.invoke = function changeIframeSrc_invoke()
54 {
55 this.DOMNode.src = aURL;
56 }
57
58 this.finalCheck = function changeIframeSrc_finalCheck()
59 {
60 var accTree = {
61 role: ROLE_INTERNAL_FRAME,
62 children: [
63 {
64 role: ROLE_DOCUMENT,
65 name: aURL == "about:" ? "About:" : aURL
66 }
67 ]
68 };
69
70 testAccessibleTree(this.DOMNode, accTree);
71 }
72
73 this.getID = function changeIframeSrc_getID()
74 {
75 return "change iframe src on " + aURL;
76 }
77
78 function getIframeDoc()
79 {
80 return getAccessible(getNode(aIdentifier).contentDocument);
81 }
82 }
83
84 const kHide = 1;
85 const kShow = 2;
86 const kRemove = 3;
87 function morphIFrame(aIdentifier, aAction)
88 {
89 this.DOMNode = getNode(aIdentifier);
90 this.IFrameContainerDOMNode = this.DOMNode.parentNode;
91
92 this.eventSeq = [];
93
94 var checker = null;
95 if (aAction == kShow)
96 checker = new invokerChecker(EVENT_SHOW, this.DOMNode);
97 else
98 checker = new invokerChecker(EVENT_HIDE, this.DOMNode);
99 this.eventSeq.push(checker);
100
101 var reorderChecker =
102 new invokerChecker(EVENT_REORDER, this.IFrameContainerDOMNode);
103 this.eventSeq.push(reorderChecker);
104
105 this.invoke = function morphIFrame_invoke()
106 {
107 if (aAction == kHide) {
108 this.DOMNode.style.display = "none";
109 } else if (aAction == kShow) {
110 this.DOMNode.style.display = "block";
111 } else {
112 this.IFrameContainerDOMNode.removeChild(this.DOMNode);
113 }
114 }
115
116 this.finalCheck = function morphIFrame_finalCheck()
117 {
118 var accTree = {
119 role: ROLE_SECTION,
120 children: (aAction == kHide || aAction == kRemove) ? [ ] :
121 [
122 {
123 role: ROLE_INTERNAL_FRAME,
124 children: [
125 { role: ROLE_DOCUMENT }
126 ]
127 }
128 ]
129 };
130
131 testAccessibleTree(this.IFrameContainerDOMNode, accTree);
132 }
133
134 this.getID = function morphIFrame_getID()
135 {
136 if (aAction == kRemove)
137 return "remove iframe";
138
139 return "change display style of iframe to " +
140 ((aAction == kHide) ? "none" : "block");
141 }
142 }
143
144 function makeIFrameVisible(aID)
145 {
146 this.DOMNode = getNode(aID);
147
148 this.eventSeq = [
149 new invokerChecker(EVENT_REORDER, this.DOMNode.parentNode)
150 ];
151
152 this.invoke = function makeIFrameVisible_invoke()
153 {
154 this.DOMNode.style.visibility = "visible";
155 }
156
157 this.getID = function makeIFrameVisible_getID()
158 {
159 return "The accessible for DOM document loaded before it's shown shouldn't have busy state.";
160 }
161 }
162
163 function openDialogWnd(aURL)
164 {
165 // Get application root accessible.
166 var docAcc = getAccessible(document);
167 while (docAcc) {
168 this.mRootAcc = docAcc;
169 try {
170 docAcc = docAcc.parent;
171 } catch (e) {
172 ok(false, "Can't get parent for " + prettyName(docAcc));
173 throw e;
174 }
175 }
176
177 this.eventSeq = [
178 new invokerChecker(EVENT_REORDER, this.mRootAcc)
179 ];
180
181 this.invoke = function openDialogWnd_invoke()
182 {
183 this.mDialog = window.openDialog(aURL);
184 }
185
186 this.finalCheck = function openDialogWnd_finalCheck()
187 {
188 this.finalCheckImpl();
189 }
190
191 this.finalCheckImpl = function openDialogWnd_finalCheckImpl()
192 {
193 var accTree = {
194 role: ROLE_APP_ROOT,
195 children: [
196 {
197 role: ROLE_CHROME_WINDOW
198 },
199 {
200 role: ROLE_CHROME_WINDOW
201 },
202 {
203 role: ROLE_CHROME_WINDOW
204 },
205 {
206 role: ROLE_CHROME_WINDOW
207 }
208 ]
209 };
210
211 testAccessibleTree(this.mRootAcc, accTree);
212
213 var dlgDoc = this.mDialog.document;
214 ok(isAccessibleInCache(dlgDoc),
215 "The document accessible for '" + aURL + "' is not in cache!");
216
217 this.mDialog.close();
218
219 // close() is asynchronous.
220 SimpleTest.executeSoon(function() {
221 ok(!isAccessibleInCache(dlgDoc),
222 "The document accessible for '" + aURL + "' is in cache still!");
223 });
224 }
225
226 this.getID = function openDialogWnd_getID()
227 {
228 return "open dialog '" + aURL + "'";
229 }
230 }
231
232 function openWndShutdownDoc()
233 {
234 this.__proto__ =
235 new openDialogWnd("../events/docload_wnd.html");
236
237 var thisObj = this;
238 var docChecker = {
239 type: EVENT_HIDE,
240 get target()
241 {
242 var iframe = this.invoker.mDialog.document.getElementById("iframe");
243 this.invoker.iframeDoc = iframe.contentDocument;
244 return iframe;
245 },
246 get targetDescr()
247 {
248 return "inner iframe of docload_wnd.html document";
249 },
250 invoker: thisObj
251 };
252
253 this.eventSeq.push(docChecker);
254
255 this.finalCheck = function openWndShutdownDoc_finalCheck()
256 {
257 // After timeout after event hide for iframe was handled the document
258 // accessible for iframe's document is in cache still.
259 ok(!isAccessibleInCache(this.iframeDoc),
260 "The document accessible for iframe is in cache still after iframe hide!");
261
262 this.finalCheckImpl();
263
264 // After the window is closed all alive subdocument accessibles should
265 // be shut down.
266 ok(!isAccessibleInCache(this.iframeDoc),
267 "The document accessible for iframe is in cache still!");
268 }
269 }
270
271 ////////////////////////////////////////////////////////////////////////////
272 // Do tests
273
274 var gQueue = null;
275
276 // Debug stuff.
277 // gA11yEventDumpID = "eventdump";
278 //gA11yEventDumpToConsole = true;
279
280 function doTests()
281 {
282 gQueue = new eventQueue();
283
284 gQueue.push(new changeIframeSrc("iframe", "about:"));
285 gQueue.push(new changeIframeSrc("iframe", "about:buildconfig"));
286 gQueue.push(new morphIFrame("iframe", kHide));
287 gQueue.push(new morphIFrame("iframe", kShow));
288 gQueue.push(new morphIFrame("iframe", kRemove));
289 gQueue.push(new makeIFrameVisible("iframe2"));
290 gQueue.push(new openDialogWnd("about:"));
291 gQueue.push(new openWndShutdownDoc());
292
293 gQueue.onFinish = doLastCallTests;
294
295 gQueue.invoke(); // Will call SimpleTest.finish();
296 }
297
298 function doLastCallTests()
299 {
300 //////////////////////////////////////////////////////////////////////////
301 // makeIFrameVisible() test, part2
302
303 // The document shouldn't have busy state (the DOM document was loaded
304 // before its accessible was created). Do this test lately to make sure
305 // the content of document accessible was created initially, prior to this
306 // the document accessible keeps busy state. The initial creation happens
307 // asynchronously after document creation, there are no events we could
308 // use to catch it.
309 var iframeDoc = getAccessible("iframe2").firstChild;
310 testStates(iframeDoc, 0, 0, STATE_BUSY);
311 }
312
313 SimpleTest.waitForExplicitFinish();
314 addA11yLoadEvent(doTests);
315 </script>
316 </head>
317
318 <body>
319
320 <a target="_blank"
321 href="https://bugzilla.mozilla.org/show_bug.cgi?id=420845"
322 title="Fire event_reorder on any embedded frames/iframes whos document has just loaded">
323 Mozilla Bug 420845
324 </a><br>
325 <a target="_blank"
326 href="https://bugzilla.mozilla.org/show_bug.cgi?id=506206"
327 title="Fire event_reorder application root accessible">
328 Mozilla Bug 506206
329 </a><br>
330 <a target="_blank"
331 href="https://bugzilla.mozilla.org/show_bug.cgi?id=566103"
332 title="Reorganize accessible document handling">
333 Mozilla Bug 566103
334 </a><br>
335 <a target="_blank"
336 href="https://bugzilla.mozilla.org/show_bug.cgi?id=571459"
337 title="Shutdown document accessible when presshell goes away">
338 Mozilla Bug 571459
339 </a>
340 <a target="_blank"
341 href="https://bugzilla.mozilla.org/show_bug.cgi?id=658185"
342 title="The DOM document loaded before it's shown shouldn't have busy state">
343 Mozilla Bug 658185
344 </a>
345 <a target="_blank"
346 href="https://bugzilla.mozilla.org/show_bug.cgi?id=754165"
347 title="Fire document load events on iframes too">
348 Mozilla Bug 754165
349 </a>
350
351 <p id="display"></p>
352 <div id="content" style="display: none"></div>
353 <pre id="test">
354 </pre>
355
356 <div id="testContainer"><iframe id="iframe"></iframe></div>
357 <div id="testContainer2"><iframe id="iframe2" src="about:" style="visibility: hidden;"></iframe></div>
358 <div id="eventdump"></div>
359 </body>
360 </html>

mercurial