Bug 1881181 - Wait for mac accessible to be destroyed properly. r=morgan
[gecko.git] / accessible / tests / browser / browser_shutdown_remote_no_reference.js
blob6a38ff15b8907218b3c559fc995a181f20238053
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 "use strict";
7 add_task(async function () {
8   await BrowserTestUtils.withNewTab(
9     {
10       gBrowser,
11       url: `data:text/html,
12       <html>
13         <head>
14           <meta charset="utf-8"/>
15           <title>Accessibility Test</title>
16         </head>
17         <body></body>
18       </html>`,
19     },
20     async function (browser) {
21       info(
22         "Creating a service in parent and waiting for service to be created " +
23           "in content"
24       );
25       await loadContentScripts(browser, {
26         script: "Common.sys.mjs",
27         symbol: "CommonUtils",
28       });
29       // Create a11y service in the main process. This will trigger creating of
30       // the a11y service in parent as well.
31       const [parentA11yInitObserver, parentA11yInit] = initAccService();
32       const [contentA11yInitObserver, contentA11yInit] =
33         initAccService(browser);
34       let [parentConsumersChangedObserver, parentConsumersChanged] =
35         accConsumersChanged();
36       let [contentConsumersChangedObserver, contentConsumersChanged] =
37         accConsumersChanged(browser);
39       await Promise.all([
40         parentA11yInitObserver,
41         contentA11yInitObserver,
42         parentConsumersChangedObserver,
43         contentConsumersChangedObserver,
44       ]);
46       let accService = Cc["@mozilla.org/accessibilityService;1"].getService(
47         Ci.nsIAccessibilityService
48       );
49       ok(accService, "Service initialized in parent");
50       await Promise.all([parentA11yInit, contentA11yInit]);
51       await parentConsumersChanged.then(data =>
52         Assert.deepEqual(
53           data,
54           {
55             XPCOM: true,
56             MainProcess: false,
57             PlatformAPI: false,
58           },
59           "Accessibility service consumers in parent are correct."
60         )
61       );
62       await contentConsumersChanged.then(data =>
63         Assert.deepEqual(
64           data,
65           {
66             XPCOM: false,
67             MainProcess: true,
68             PlatformAPI: false,
69           },
70           "Accessibility service consumers in content are correct."
71         )
72       );
74       Assert.deepEqual(
75         JSON.parse(accService.getConsumers()),
76         {
77           XPCOM: true,
78           MainProcess: false,
79           PlatformAPI: false,
80         },
81         "Accessibility service consumers in parent are correct."
82       );
84       info(
85         "Removing a service in parent and waiting for service to be shut " +
86           "down in content"
87       );
88       // Remove a11y service reference in the main process.
89       const [parentA11yShutdownObserver, parentA11yShutdown] =
90         shutdownAccService();
91       const [contentA11yShutdownObserver, contentA11yShutdown] =
92         shutdownAccService(browser);
93       [parentConsumersChangedObserver, parentConsumersChanged] =
94         accConsumersChanged();
95       [contentConsumersChangedObserver, contentConsumersChanged] =
96         accConsumersChanged(browser);
98       await Promise.all([
99         parentA11yShutdownObserver,
100         contentA11yShutdownObserver,
101         parentConsumersChangedObserver,
102         contentConsumersChangedObserver,
103       ]);
105       accService = null;
106       ok(!accService, "Service is removed in parent");
107       // Force garbage collection that should trigger shutdown in both main and
108       // content process.
109       forceGC();
110       await Promise.all([parentA11yShutdown, contentA11yShutdown]);
111       await parentConsumersChanged.then(data =>
112         Assert.deepEqual(
113           data,
114           {
115             XPCOM: false,
116             MainProcess: false,
117             PlatformAPI: false,
118           },
119           "Accessibility service consumers are correct."
120         )
121       );
122       await contentConsumersChanged.then(data =>
123         Assert.deepEqual(
124           data,
125           {
126             XPCOM: false,
127             MainProcess: false,
128             PlatformAPI: false,
129           },
130           "Accessibility service consumers are correct."
131         )
132       );
133     }
134   );