From 4f13dddba314638afbb10cae819a4c46f13f15d9 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Tue, 16 Jan 2018 11:26:40 -0800 Subject: [PATCH] Bug 1355354 - Keep a reference to the progress listener to keep it from being gc'ed prematurely. r=mossop MozReview-Commit-ID: A6WM1Bj3Z5L --HG-- extra : rebase_source : d4c7d43ca1bc16149ee532c5ab2bf0739bc5011d --- browser/components/shell/HeadlessShell.jsm | 6 ++++++ widget/headless/tests/test_headless.js | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/browser/components/shell/HeadlessShell.jsm b/browser/components/shell/HeadlessShell.jsm index c89322c350aa..2dd0114585bf 100644 --- a/browser/components/shell/HeadlessShell.jsm +++ b/browser/components/shell/HeadlessShell.jsm @@ -12,6 +12,10 @@ Components.utils.import("resource://gre/modules/osfile.jsm"); const Ci = Components.interfaces; +// Refrences to the progress listeners to keep them from being gc'ed +// before they are called. +const progressListeners = new Map(); + function loadContentWindow(webNavigation, uri) { return new Promise((resolve, reject) => { webNavigation.loadURI(uri, Ci.nsIWebNavigation.LOAD_FLAGS_NONE, null, null, null); @@ -31,6 +35,7 @@ function loadContentWindow(webNavigation, uri) { } let contentWindow = docShell.QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIDOMWindow); + progressListeners.delete(progressListener); webProgress.removeProgressListener(progressListener); contentWindow.addEventListener("load", (event) => { resolve(contentWindow); @@ -39,6 +44,7 @@ function loadContentWindow(webNavigation, uri) { QueryInterface: XPCOMUtils.generateQI(["nsIWebProgressListener", "nsISupportsWeakReference"]) }; + progressListeners.set(progressListener, progressListener); webProgress.addProgressListener(progressListener, Ci.nsIWebProgress.NOTIFY_LOCATION); }); diff --git a/widget/headless/tests/test_headless.js b/widget/headless/tests/test_headless.js index 47839a919386..07c1f911398e 100644 --- a/widget/headless/tests/test_headless.js +++ b/widget/headless/tests/test_headless.js @@ -15,6 +15,10 @@ const HEADLESS_URL = `${BASE}/headless.html`; const HEADLESS_BUTTON_URL = `${BASE}/headless_button.html`; registerCleanupFunction(() => { server.stop(() => {})}); +// Refrences to the progress listeners to keep them from being gc'ed +// before they are called. +const progressListeners = new Map(); + function loadContentWindow(webNavigation, uri) { return new Promise((resolve, reject) => { webNavigation.loadURI(uri, Ci.nsIWebNavigation.LOAD_FLAGS_NONE, null, null, null); @@ -37,6 +41,7 @@ function loadContentWindow(webNavigation, uri) { let contentWindow = docShell.QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIDOMWindow); webProgress.removeProgressListener(progressListener); + progressListeners.delete(progressListener); contentWindow.addEventListener("load", (event) => { resolve(contentWindow); }, { once: true }); @@ -44,6 +49,7 @@ function loadContentWindow(webNavigation, uri) { QueryInterface: XPCOMUtils.generateQI(["nsIWebProgressListener", "nsISupportsWeakReference"]) }; + progressListeners.set(progressListener, progressListener); webProgress.addProgressListener(progressListener, Ci.nsIWebProgress.NOTIFY_LOCATION); });