summaryrefslogtreecommitdiffstats
path: root/accessible/tests/mochitest/events/docload/test_docload_shutdown.html
blob: 5838b80083bcf20826822d9e62e7a0228d216ccb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<html>

<head>
  <title>Accessible events testing for document</title>

  <link rel="stylesheet" type="text/css"
        href="chrome://mochikit/content/tests/SimpleTest/test.css" />

  <script 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="../../events.js"></script>

  <script type="application/javascript">
    // //////////////////////////////////////////////////////////////////////////
    // Invokers

    let gDialog;
    let gDialogDoc;
    let gRootAcc;
    let gIframeDoc;

    function openWndShutdownDoc(aURL) {
      // Get application root accessible.
      let docAcc = getAccessible(document);
      while (docAcc) {
        gRootAcc = docAcc;
        try {
          docAcc = docAcc.parent;
        } catch (e) {
          ok(false, `Can't get parent for ${prettyName(docAcc)}`);
          throw e;
        }
      }

      this.eventSeq = [
        new invokerChecker(EVENT_REORDER, gRootAcc),
        {
          type: EVENT_HIDE,
          get target() {
            gDialogDoc = gDialog.document;
            const iframe = gDialogDoc.getElementById("iframe");
            gIframeDoc = iframe.contentDocument;
            return iframe;
          },
          get targetDescr() {
            return "inner iframe of docload_wnd.html document";
          },
        },
      ];


      this.invoke = () => gDialog = window.browsingContext.topChromeWindow.openDialog(aURL);

      this.finalCheck = () => {
        const accTree = {
          role: ROLE_APP_ROOT,
          children: [
            {
              role: ROLE_CHROME_WINDOW,
            },
            {
              role: ROLE_CHROME_WINDOW,
            },
          ],
        };

        testAccessibleTree(gRootAcc, accTree);
        // After timeout after event hide for iframe was handled the document
        // accessible for iframe's document should no longer be in cache.
        ok(!isAccessibleInCache(gIframeDoc),
          "The document accessible for iframe is in cache still after iframe hide!");
        ok(isAccessibleInCache(gDialogDoc),
          `The document accessible for '${aURL}' is not in cache!`);
      };

      this.getID = () => `open dialog '${aURL}'`;
    }

    function closeWndShutdownDoc() {
      this.eventSeq = [ new invokerChecker(EVENT_FOCUS, getAccessible(document)) ];

      this.invoke = () => {
        gDialog.close();
        window.focus();
      };

      this.finalCheck = () => {
        ok(!isAccessibleInCache(gDialogDoc),
          "The document accessible for dialog is in cache still!");
        // After the window is closed all alive subdocument accessibles should
        // be shut down.
        ok(!isAccessibleInCache(gIframeDoc),
          "The document accessible for iframe is in cache still!");

        gDialog = gDialogDoc = gRootAcc = gIframeDoc = null;
      };

      this.getID = () => "close dialog";
    }

    // //////////////////////////////////////////////////////////////////////////
    // Do tests

    function doTests() {
      // Front end stuff sometimes likes to stuff things in the hidden window(s)
      // in which case we should repress all accessibles for those.
      const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");

      // Try to create an accessible for the hidden window's document.
      let doc = Services.appShell.hiddenDOMWindow.document;
      let hiddenDocAcc = gAccService.getAccessibleFor(doc);
      ok(!hiddenDocAcc, "hiddenDOMWindow should not have an accessible.");

      const gQueue = new eventQueue();
      gQueue.push(new openWndShutdownDoc("../../events/docload/docload_wnd.html"));
      gQueue.push(new closeWndShutdownDoc());
      gQueue.invoke(); // Will call SimpleTest.finish();
    }

    SimpleTest.waitForExplicitFinish();
    addA11yLoadEvent(doTests);
  </script>
</head>

<body>

  <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>

  <p id="display"></p>
  <div id="content" style="display: none"></div>
  <pre id="test">
  </pre>
</body>
</html>