forked from mirrors/gecko-dev
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
This commit is contained in:
parent
e9cbe9727b
commit
4f13dddba3
2 changed files with 12 additions and 0 deletions
|
|
@ -12,6 +12,10 @@ Components.utils.import("resource://gre/modules/osfile.jsm");
|
||||||
|
|
||||||
const Ci = Components.interfaces;
|
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) {
|
function loadContentWindow(webNavigation, uri) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
webNavigation.loadURI(uri, Ci.nsIWebNavigation.LOAD_FLAGS_NONE, null, null, null);
|
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)
|
let contentWindow = docShell.QueryInterface(Ci.nsIInterfaceRequestor)
|
||||||
.getInterface(Ci.nsIDOMWindow);
|
.getInterface(Ci.nsIDOMWindow);
|
||||||
|
progressListeners.delete(progressListener);
|
||||||
webProgress.removeProgressListener(progressListener);
|
webProgress.removeProgressListener(progressListener);
|
||||||
contentWindow.addEventListener("load", (event) => {
|
contentWindow.addEventListener("load", (event) => {
|
||||||
resolve(contentWindow);
|
resolve(contentWindow);
|
||||||
|
|
@ -39,6 +44,7 @@ function loadContentWindow(webNavigation, uri) {
|
||||||
QueryInterface: XPCOMUtils.generateQI(["nsIWebProgressListener",
|
QueryInterface: XPCOMUtils.generateQI(["nsIWebProgressListener",
|
||||||
"nsISupportsWeakReference"])
|
"nsISupportsWeakReference"])
|
||||||
};
|
};
|
||||||
|
progressListeners.set(progressListener, progressListener);
|
||||||
webProgress.addProgressListener(progressListener,
|
webProgress.addProgressListener(progressListener,
|
||||||
Ci.nsIWebProgress.NOTIFY_LOCATION);
|
Ci.nsIWebProgress.NOTIFY_LOCATION);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,10 @@ const HEADLESS_URL = `${BASE}/headless.html`;
|
||||||
const HEADLESS_BUTTON_URL = `${BASE}/headless_button.html`;
|
const HEADLESS_BUTTON_URL = `${BASE}/headless_button.html`;
|
||||||
registerCleanupFunction(() => { server.stop(() => {})});
|
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) {
|
function loadContentWindow(webNavigation, uri) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
webNavigation.loadURI(uri, Ci.nsIWebNavigation.LOAD_FLAGS_NONE, null, null, null);
|
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)
|
let contentWindow = docShell.QueryInterface(Ci.nsIInterfaceRequestor)
|
||||||
.getInterface(Ci.nsIDOMWindow);
|
.getInterface(Ci.nsIDOMWindow);
|
||||||
webProgress.removeProgressListener(progressListener);
|
webProgress.removeProgressListener(progressListener);
|
||||||
|
progressListeners.delete(progressListener);
|
||||||
contentWindow.addEventListener("load", (event) => {
|
contentWindow.addEventListener("load", (event) => {
|
||||||
resolve(contentWindow);
|
resolve(contentWindow);
|
||||||
}, { once: true });
|
}, { once: true });
|
||||||
|
|
@ -44,6 +49,7 @@ function loadContentWindow(webNavigation, uri) {
|
||||||
QueryInterface: XPCOMUtils.generateQI(["nsIWebProgressListener",
|
QueryInterface: XPCOMUtils.generateQI(["nsIWebProgressListener",
|
||||||
"nsISupportsWeakReference"])
|
"nsISupportsWeakReference"])
|
||||||
};
|
};
|
||||||
|
progressListeners.set(progressListener, progressListener);
|
||||||
webProgress.addProgressListener(progressListener,
|
webProgress.addProgressListener(progressListener,
|
||||||
Ci.nsIWebProgress.NOTIFY_LOCATION);
|
Ci.nsIWebProgress.NOTIFY_LOCATION);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue