summaryrefslogtreecommitdiffstats
path: root/testing/mochitest/ShutdownLeaksCollector.sys.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'testing/mochitest/ShutdownLeaksCollector.sys.mjs')
-rw-r--r--testing/mochitest/ShutdownLeaksCollector.sys.mjs61
1 files changed, 61 insertions, 0 deletions
diff --git a/testing/mochitest/ShutdownLeaksCollector.sys.mjs b/testing/mochitest/ShutdownLeaksCollector.sys.mjs
new file mode 100644
index 0000000000..44b2025429
--- /dev/null
+++ b/testing/mochitest/ShutdownLeaksCollector.sys.mjs
@@ -0,0 +1,61 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import { setTimeout } from "resource://gre/modules/Timer.sys.mjs";
+
+// This listens for the message "browser-test:collect-request". When it gets it,
+// it runs some GCs and CCs, then prints out a message indicating the collections
+// are complete. Mochitest uses this information to determine when windows and
+// docshells should be destroyed.
+
+export var ContentCollector = {
+ init() {
+ let processType = Services.appinfo.processType;
+ if (processType == Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT) {
+ // In the main process, we handle triggering collections in browser-test.js
+ return;
+ }
+
+ Services.cpmm.addMessageListener("browser-test:collect-request", this);
+ },
+
+ receiveMessage(aMessage) {
+ switch (aMessage.name) {
+ case "browser-test:collect-request":
+ Services.obs.notifyObservers(null, "memory-pressure", "heap-minimize");
+
+ Cu.forceGC();
+ Cu.forceCC();
+
+ let shutdownCleanup = aCallback => {
+ Cu.schedulePreciseShrinkingGC(() => {
+ // Run the GC and CC a few times to make sure that as much
+ // as possible is freed.
+ Cu.forceGC();
+ Cu.forceCC();
+ aCallback();
+ });
+ };
+
+ shutdownCleanup(() => {
+ setTimeout(() => {
+ shutdownCleanup(() => {
+ this.finish();
+ });
+ }, 1000);
+ });
+
+ break;
+ }
+ },
+
+ finish() {
+ let pid = Services.appinfo.processID;
+ dump("Completed ShutdownLeaks collections in process " + pid + "\n");
+
+ Services.cpmm.removeMessageListener("browser-test:collect-request", this);
+ },
+};
+
+ContentCollector.init();