gecko-dev/testing/mochitest/ShutdownLeaksCollector.jsm
Mike Conley 60b9bd178c Bug 1256472 - Make ShutdownLeaksCollector do more aggressive GCing and CCing to avoid erroneous shutdown leak reports in tests. r=mccr8
With bug 1256472 fixed, we have greater probability of out-of-process browsers being in the midst
of teardown and destruction when tests complete. There's already TabDestroyObserver in the parent
process making sure that the TabParent's are properly cleaned up, but we need to be more aggressive
about clearing out remaining nsIDOMWindow's and DocShells in the content processes.

This change more or less mirrors what's already going on in browser-test.js.

MozReview-Commit-ID: FZnNLpbfTEY

--HG--
extra : rebase_source : b31ce374f22d851d742b20086ff6676d82663c02
2017-03-18 12:48:42 -04:00

73 lines
2.3 KiB
JavaScript

/* 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/. */
var Ci = Components.interfaces;
var Cc = Components.classes;
var Cu = Components.utils;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Timer.jsm");
this.EXPORTED_SYMBOLS = ["ContentCollector"];
// 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.
var ContentCollector = {
init: function() {
let processType = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).processType;
if (processType == Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT) {
// In the main process, we handle triggering collections in browser-test.js
return;
}
let cpmm = Cc["@mozilla.org/childprocessmessagemanager;1"]
.getService(Ci.nsISyncMessageSender);
cpmm.addMessageListener("browser-test:collect-request", this);
},
receiveMessage: function(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 = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).processID;
dump("Completed ShutdownLeaks collections in process " + pid + "\n");
let cpmm = Cc["@mozilla.org/childprocessmessagemanager;1"]
.getService(Ci.nsISyncMessageSender);
cpmm.removeMessageListener("browser-test:collect-request", this);
},
};
ContentCollector.init();