summaryrefslogtreecommitdiffstats
path: root/accessible/tests/mochitest/events/test_docload.html
diff options
context:
space:
mode:
Diffstat (limited to 'accessible/tests/mochitest/events/test_docload.html')
-rw-r--r--accessible/tests/mochitest/events/test_docload.html360
1 files changed, 360 insertions, 0 deletions
diff --git a/accessible/tests/mochitest/events/test_docload.html b/accessible/tests/mochitest/events/test_docload.html
new file mode 100644
index 000000000..a530592ee
--- /dev/null
+++ b/accessible/tests/mochitest/events/test_docload.html
@@ -0,0 +1,360 @@
+<html>
+
+<head>
+ <title>Accessible events testing for document</title>
+
+ <link rel="stylesheet" type="text/css"
+ href="chrome://mochikit/content/tests/SimpleTest/test.css" />
+
+ <script type="application/javascript"
+ src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+
+ <script type="application/javascript"
+ src="../common.js"></script>
+ <script type="application/javascript"
+ src="../role.js"></script>
+ <script type="application/javascript"
+ src="../states.js"></script>
+
+ <script type="application/javascript">
+ // Front end stuff sometimes likes to stuff things in the hidden window(s)
+ // in which case there's accessibles for that content.
+ Components.utils.import("resource://gre/modules/Services.jsm");
+
+ // Force the creation of an accessible for the hidden window's document.
+ var doc = Services.appShell.hiddenDOMWindow.document;
+ gAccService.getAccessibleFor(doc);
+
+ // The private hidden window will be lazily created that's why we need to do
+ // it here *before* loading '../events.js' or else we'll have a duplicate
+ // reorder event.
+ var privateDoc = Services.appShell.hiddenPrivateDOMWindow.document;
+
+ // Force the creation of an accessible for the private hidden window's doc.
+ gAccService.getAccessibleFor(privateDoc);
+ </script>
+
+ <script type="application/javascript"
+ src="../events.js"></script>
+
+ <script type="application/javascript">
+ ////////////////////////////////////////////////////////////////////////////
+ // Invokers
+
+ function changeIframeSrc(aIdentifier, aURL)
+ {
+ this.DOMNode = getNode(aIdentifier);
+
+ this.eventSeq = [
+ new invokerChecker(EVENT_REORDER, getAccessible(this.DOMNode)),
+ new asyncInvokerChecker(EVENT_DOCUMENT_LOAD_COMPLETE, getIframeDoc)
+ ];
+
+ this.invoke = function changeIframeSrc_invoke()
+ {
+ this.DOMNode.src = aURL;
+ }
+
+ this.finalCheck = function changeIframeSrc_finalCheck()
+ {
+ var accTree = {
+ role: ROLE_INTERNAL_FRAME,
+ children: [
+ {
+ role: ROLE_DOCUMENT,
+ name: aURL == "about:" ? "About:" : aURL
+ }
+ ]
+ };
+
+ testAccessibleTree(this.DOMNode, accTree);
+ }
+
+ this.getID = function changeIframeSrc_getID()
+ {
+ return "change iframe src on " + aURL;
+ }
+
+ function getIframeDoc()
+ {
+ return getAccessible(getNode(aIdentifier).contentDocument);
+ }
+ }
+
+ const kHide = 1;
+ const kShow = 2;
+ const kRemove = 3;
+ function morphIFrame(aIdentifier, aAction)
+ {
+ this.DOMNode = getNode(aIdentifier);
+ this.IFrameContainerDOMNode = this.DOMNode.parentNode;
+
+ this.eventSeq = [];
+
+ var checker = null;
+ if (aAction == kShow)
+ checker = new invokerChecker(EVENT_SHOW, this.DOMNode);
+ else
+ checker = new invokerChecker(EVENT_HIDE, this.DOMNode);
+ this.eventSeq.push(checker);
+
+ var reorderChecker =
+ new invokerChecker(EVENT_REORDER, this.IFrameContainerDOMNode);
+ this.eventSeq.push(reorderChecker);
+
+ this.invoke = function morphIFrame_invoke()
+ {
+ if (aAction == kHide) {
+ this.DOMNode.style.display = "none";
+ } else if (aAction == kShow) {
+ this.DOMNode.style.display = "block";
+ } else {
+ this.IFrameContainerDOMNode.removeChild(this.DOMNode);
+ }
+ }
+
+ this.finalCheck = function morphIFrame_finalCheck()
+ {
+ var accTree = {
+ role: ROLE_SECTION,
+ children: (aAction == kHide || aAction == kRemove) ? [ ] :
+ [
+ {
+ role: ROLE_INTERNAL_FRAME,
+ children: [
+ { role: ROLE_DOCUMENT }
+ ]
+ }
+ ]
+ };
+
+ testAccessibleTree(this.IFrameContainerDOMNode, accTree);
+ }
+
+ this.getID = function morphIFrame_getID()
+ {
+ if (aAction == kRemove)
+ return "remove iframe";
+
+ return "change display style of iframe to " +
+ ((aAction == kHide) ? "none" : "block");
+ }
+ }
+
+ function makeIFrameVisible(aID)
+ {
+ this.DOMNode = getNode(aID);
+
+ this.eventSeq = [
+ new invokerChecker(EVENT_REORDER, this.DOMNode.parentNode)
+ ];
+
+ this.invoke = function makeIFrameVisible_invoke()
+ {
+ this.DOMNode.style.visibility = "visible";
+ }
+
+ this.getID = function makeIFrameVisible_getID()
+ {
+ return "The accessible for DOM document loaded before it's shown shouldn't have busy state.";
+ }
+ }
+
+ function openDialogWnd(aURL)
+ {
+ // Get application root accessible.
+ var docAcc = getAccessible(document);
+ while (docAcc) {
+ this.mRootAcc = docAcc;
+ try {
+ docAcc = docAcc.parent;
+ } catch (e) {
+ ok(false, "Can't get parent for " + prettyName(docAcc));
+ throw e;
+ }
+ }
+
+ this.eventSeq = [
+ new invokerChecker(EVENT_REORDER, this.mRootAcc)
+ ];
+
+ this.invoke = function openDialogWnd_invoke()
+ {
+ this.mDialog = window.openDialog(aURL);
+ }
+
+ this.finalCheck = function openDialogWnd_finalCheck()
+ {
+ this.finalCheckImpl();
+ }
+
+ this.finalCheckImpl = function openDialogWnd_finalCheckImpl()
+ {
+ var accTree = {
+ role: ROLE_APP_ROOT,
+ children: [
+ {
+ role: ROLE_CHROME_WINDOW
+ },
+ {
+ role: ROLE_CHROME_WINDOW
+ },
+ {
+ role: ROLE_CHROME_WINDOW
+ },
+ {
+ role: ROLE_CHROME_WINDOW
+ }
+ ]
+ };
+
+ testAccessibleTree(this.mRootAcc, accTree);
+
+ var dlgDoc = this.mDialog.document;
+ ok(isAccessibleInCache(dlgDoc),
+ "The document accessible for '" + aURL + "' is not in cache!");
+
+ this.mDialog.close();
+
+ // close() is asynchronous.
+ SimpleTest.executeSoon(function() {
+ ok(!isAccessibleInCache(dlgDoc),
+ "The document accessible for '" + aURL + "' is in cache still!");
+ });
+ }
+
+ this.getID = function openDialogWnd_getID()
+ {
+ return "open dialog '" + aURL + "'";
+ }
+ }
+
+ function openWndShutdownDoc()
+ {
+ this.__proto__ =
+ new openDialogWnd("../events/docload_wnd.html");
+
+ var thisObj = this;
+ var docChecker = {
+ type: EVENT_HIDE,
+ get target()
+ {
+ var iframe = this.invoker.mDialog.document.getElementById("iframe");
+ this.invoker.iframeDoc = iframe.contentDocument;
+ return iframe;
+ },
+ get targetDescr()
+ {
+ return "inner iframe of docload_wnd.html document";
+ },
+ invoker: thisObj
+ };
+
+ this.eventSeq.push(docChecker);
+
+ this.finalCheck = function openWndShutdownDoc_finalCheck()
+ {
+ // After timeout after event hide for iframe was handled the document
+ // accessible for iframe's document is in cache still.
+ ok(!isAccessibleInCache(this.iframeDoc),
+ "The document accessible for iframe is in cache still after iframe hide!");
+
+ this.finalCheckImpl();
+
+ // After the window is closed all alive subdocument accessibles should
+ // be shut down.
+ ok(!isAccessibleInCache(this.iframeDoc),
+ "The document accessible for iframe is in cache still!");
+ }
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ // Do tests
+
+ var gQueue = null;
+
+ // Debug stuff.
+ // gA11yEventDumpID = "eventdump";
+ //gA11yEventDumpToConsole = true;
+
+ function doTests()
+ {
+ gQueue = new eventQueue();
+
+ gQueue.push(new changeIframeSrc("iframe", "about:"));
+ gQueue.push(new changeIframeSrc("iframe", "about:buildconfig"));
+ gQueue.push(new morphIFrame("iframe", kHide));
+ gQueue.push(new morphIFrame("iframe", kShow));
+ gQueue.push(new morphIFrame("iframe", kRemove));
+ gQueue.push(new makeIFrameVisible("iframe2"));
+ gQueue.push(new openDialogWnd("about:"));
+ gQueue.push(new openWndShutdownDoc());
+
+ gQueue.onFinish = doLastCallTests;
+
+ gQueue.invoke(); // Will call SimpleTest.finish();
+ }
+
+ function doLastCallTests()
+ {
+ //////////////////////////////////////////////////////////////////////////
+ // makeIFrameVisible() test, part2
+
+ // The document shouldn't have busy state (the DOM document was loaded
+ // before its accessible was created). Do this test lately to make sure
+ // the content of document accessible was created initially, prior to this
+ // the document accessible keeps busy state. The initial creation happens
+ // asynchronously after document creation, there are no events we could
+ // use to catch it.
+ var iframeDoc = getAccessible("iframe2").firstChild;
+ testStates(iframeDoc, 0, 0, STATE_BUSY);
+ }
+
+ SimpleTest.waitForExplicitFinish();
+ addA11yLoadEvent(doTests);
+ </script>
+</head>
+
+<body>
+
+ <a target="_blank"
+ href="https://bugzilla.mozilla.org/show_bug.cgi?id=420845"
+ title="Fire event_reorder on any embedded frames/iframes whos document has just loaded">
+ Mozilla Bug 420845
+ </a><br>
+ <a target="_blank"
+ href="https://bugzilla.mozilla.org/show_bug.cgi?id=506206"
+ title="Fire event_reorder application root accessible">
+ Mozilla Bug 506206
+ </a><br>
+ <a target="_blank"
+ href="https://bugzilla.mozilla.org/show_bug.cgi?id=566103"
+ title="Reorganize accessible document handling">
+ Mozilla Bug 566103
+ </a><br>
+ <a target="_blank"
+ href="https://bugzilla.mozilla.org/show_bug.cgi?id=571459"
+ title="Shutdown document accessible when presshell goes away">
+ Mozilla Bug 571459
+ </a>
+ <a target="_blank"
+ href="https://bugzilla.mozilla.org/show_bug.cgi?id=658185"
+ title="The DOM document loaded before it's shown shouldn't have busy state">
+ Mozilla Bug 658185
+ </a>
+ <a target="_blank"
+ href="https://bugzilla.mozilla.org/show_bug.cgi?id=754165"
+ title="Fire document load events on iframes too">
+ Mozilla Bug 754165
+ </a>
+
+ <p id="display"></p>
+ <div id="content" style="display: none"></div>
+ <pre id="test">
+ </pre>
+
+ <div id="testContainer"><iframe id="iframe"></iframe></div>
+ <div id="testContainer2"><iframe id="iframe2" src="about:" style="visibility: hidden;"></iframe></div>
+ <div id="eventdump"></div>
+</body>
+</html>