From 10c76ff56f3c56572393efa60dcf6494bf035faf Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Fri, 23 Apr 2021 16:05:37 -0700 Subject: [PATCH] browser(firefox): fix race between idleTasksFinishedPromise and window closure (#6308) --- browser_patches/firefox/BUILD_NUMBER | 4 ++-- .../juggler/protocol/BrowserHandler.js | 23 ++++++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/browser_patches/firefox/BUILD_NUMBER b/browser_patches/firefox/BUILD_NUMBER index 01d8949b80..358b8dbc3a 100644 --- a/browser_patches/firefox/BUILD_NUMBER +++ b/browser_patches/firefox/BUILD_NUMBER @@ -1,2 +1,2 @@ -1246 -Changed: lushnikov@chromium.org Tue 20 Apr 2021 10:26:28 AM PDT +1247 +Changed: dgozman@gmail.com Fri Apr 23 15:46:40 PDT 2021 diff --git a/browser_patches/firefox/juggler/protocol/BrowserHandler.js b/browser_patches/firefox/juggler/protocol/BrowserHandler.js index a084b3389c..92dea19214 100644 --- a/browser_patches/firefox/juggler/protocol/BrowserHandler.js +++ b/browser_patches/firefox/juggler/protocol/BrowserHandler.js @@ -138,7 +138,12 @@ class BrowserHandler { "navigator:browser" ); if (browserWindow && browserWindow.gBrowserInit) { - await browserWindow.gBrowserInit.idleTasksFinishedPromise; + // idleTasksFinishedPromise does not resolve when the window + // is closed early enough, so we race against window closure. + await Promise.race([ + browserWindow.gBrowserInit.idleTasksFinishedPromise, + waitForWindowClosed(browserWindow), + ]); } // Try to fully initialize browser before closing. // See comment in `Browser.enable`. @@ -281,6 +286,22 @@ async function waitForAddonManager() { }); } +async function waitForWindowClosed(browserWindow) { + if (browserWindow.closed) + return; + await new Promise((resolve => { + const listener = { + onCloseWindow: window => { + if (window === browserWindow) { + Services.wm.removeListener(listener); + resolve(); + } + }, + }; + Services.wm.addListener(listener); + })); +} + function nullToUndefined(value) { return value === null ? undefined : value; }