This is an automated email from the git hooks/post-receive script.
richard pushed a commit to branch tor-browser-91.8.0esr-11.0-1 in repository tor-browser.
commit 3eeac87680a0daf536e3862a3fe0fdef64395abb Author: Julian Descottes jdescottes@mozilla.com AuthorDate: Mon Nov 8 09:35:48 2021 +0000
Bug 1739008 - [marionette] Monitor navigation using the webprogresslistener for NewSession. r=whimboo, a=RyanVM --- remote/marionette/driver.js | 44 ++++++++++++++++++++++++++++++++++++++----- remote/marionette/navigate.js | 8 +------- 2 files changed, 40 insertions(+), 12 deletions(-)
diff --git a/remote/marionette/driver.js b/remote/marionette/driver.js index 9560b051752c5..133f4dfdd52db 100644 --- a/remote/marionette/driver.js +++ b/remote/marionette/driver.js @@ -576,14 +576,48 @@ GeckoDriver.prototype.newSession = async function(cmd) { if (this.curBrowser.tab) { const browsingContext = this.curBrowser.contentBrowser.browsingContext; this.currentSession.contentBrowsingContext = browsingContext; - // If the currently selected tab is loading, wait until it's done. + + let resolveNavigation; + + // Prepare a promise that will resolve upon a navigation. + const onProgressListenerNavigation = new Promise( + resolve => (resolveNavigation = resolve) + ); + + // Create a basic webprogress listener which will check if the browsing + // context is ready for the new session on every state change. + const navigationListener = { + onStateChange: (progress, request, flag, status) => { + const isStop = flag & Ci.nsIWebProgressListener.STATE_STOP; + if (isStop) { + resolveNavigation(); + } + }, + + QueryInterface: ChromeUtils.generateQI([ + "nsIWebProgressListener", + "nsISupportsWeakReference", + ]), + }; + + // Monitor the webprogress listener before checking isLoadingDocument to + // avoid race conditions. + browsingContext.webProgress.addProgressListener( + navigationListener, + Ci.nsIWebProgress.NOTIFY_STATE_WINDOW | + Ci.nsIWebProgress.NOTIFY_STATE_DOCUMENT + ); + if (browsingContext.webProgress.isLoadingDocument) { - await navigate.waitForNavigationCompleted(this, () => {}, { - loadEventExpected: true, - unknownState: true, - }); + await onProgressListenerNavigation; }
+ browsingContext.webProgress.removeProgressListener( + navigationListener, + Ci.nsIWebProgress.NOTIFY_STATE_WINDOW | + Ci.nsIWebProgress.NOTIFY_STATE_DOCUMENT + ); + this.curBrowser.contentBrowser.focus(); }
diff --git a/remote/marionette/navigate.js b/remote/marionette/navigate.js index dbb02b55fd43a..50a0bce413d5a 100644 --- a/remote/marionette/navigate.js +++ b/remote/marionette/navigate.js @@ -201,9 +201,6 @@ navigate.refresh = async function(browsingContext) { * @param {boolean=} requireBeforeUnload * If false and no beforeunload event is fired, abort waiting * for the navigation. Defaults to true. - * @param {boolean=} unknownState - * Needs to be true if a navigation check is resumed and the current - * state of navigation is unknown. Defaults to false. */ navigate.waitForNavigationCompleted = async function waitForNavigationCompleted( driver, @@ -214,7 +211,6 @@ navigate.waitForNavigationCompleted = async function waitForNavigationCompleted( browsingContextFn = driver.getBrowsingContext.bind(driver), loadEventExpected = true, requireBeforeUnload = true, - unknownState = false, } = options;
const chromeWindow = browsingContextFn().topChromeWindow; @@ -231,9 +227,7 @@ navigate.waitForNavigationCompleted = async function waitForNavigationCompleted(
let browsingContextChanged = false; let seenBeforeUnload = false; - - // With an unknown state assume that unload has already been received. - let seenUnload = unknownState; + let seenUnload = false;
let unloadTimer;