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
--- a/testing/mochitest/ShutdownLeaksCollector.jsm
+++ b/testing/mochitest/ShutdownLeaksCollector.jsm
@@ -2,16 +2,17 @@
* 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.
@@ -31,24 +32,41 @@ var ContentCollector = {
receiveMessage: function(aMessage) {
switch (aMessage.name) {
case "browser-test:collect-request":
Services.obs.notifyObservers(null, "memory-pressure", "heap-minimize");
Cu.forceGC();
Cu.forceCC();
- Cu.schedulePreciseShrinkingGC(() => {
- 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();
+ });
+ };
- 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);
+ 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();