tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 94019fef135ba71b75afc72acb43927a03cc2036
parent 504734701a107d60a1f08d44b0c985b20a07bccb
Author: Julian Descottes <jdescottes@mozilla.com>
Date:   Fri, 12 Dec 2025 16:27:53 +0000

Bug 2005673 - [bidi] Only dismiss file pickers for BiDi sessions with dismiss preference set r=whimboo

Adds a new hidden preference to enable dismissing file pickers: remote.bidi.dismiss_file_pickers.enabled , defaults to false.
Dismissing file pickers is now only ever possible for sessions handling bidi commands
The FilePickerHandler.allowFilePickers is now a no-op if there was no matching call for dismissFilePickers

Differential Revision: https://phabricator.services.mozilla.com/D276167

Diffstat:
Mremote/shared/webdriver/FilePickerHandler.sys.mjs | 4++++
Mremote/shared/webdriver/Session.sys.mjs | 32+++++++++++++++++++++++++-------
Mtesting/profiles/web-platform/user.js | 2++
3 files changed, 31 insertions(+), 7 deletions(-)

diff --git a/remote/shared/webdriver/FilePickerHandler.sys.mjs b/remote/shared/webdriver/FilePickerHandler.sys.mjs @@ -39,6 +39,10 @@ class FilePickerHandlerClass { * A reference to identify the caller which requested to dismiss pickers. */ allowFilePickers(caller) { + if (!this.#callers.has(caller)) { + return; + } + this.#callers.delete(caller); if (this.#callers.size || !this.#registeredFactory) { diff --git a/remote/shared/webdriver/Session.sys.mjs b/remote/shared/webdriver/Session.sys.mjs @@ -36,6 +36,16 @@ ChromeUtils.defineESModuleGetters(lazy, { ChromeUtils.defineLazyGetter(lazy, "logger", () => lazy.Log.get()); +// Bug 1999693: This preference is a temporary workaround until clients can use +// the unhandledPromptBehavior capability to decide if file pickers should be +// dismissed or not. +XPCOMUtils.defineLazyPreferenceGetter( + lazy, + "dismissFilePickersEnabled", + "remote.bidi.dismiss_file_pickers.enabled", + false +); + XPCOMUtils.defineLazyServiceGetter( lazy, "aomStartup", @@ -286,11 +296,6 @@ export class WebDriverSession { // Start the tracking of browsing contexts to create Navigable ids. lazy.NavigableManager.startTracking(); - // Temporarily dismiss all file pickers. - // Bug 1999693: File pickers should only be dismissed when the unhandled - // prompt behaviour for type "file" is not set to "ignore". - lazy.FilePickerHandler.dismissFilePickers(this); - webDriverSessions.set(this.#id, this); } @@ -301,8 +306,6 @@ export class WebDriverSession { // session exists anymore. lazy.NavigableManager.stopTracking(); - lazy.FilePickerHandler.allowFilePickers(this); - lazy.unregisterProcessDataActor(); this.#navigableSeenNodes = null; @@ -328,6 +331,12 @@ export class WebDriverSession { this._onMessageHandlerProtocolEvent ); this.#messageHandler.destroy(); + + // Note: do not check lazy.dismissFilePickersEnabled, the preference might + // have been updated at runtime. allowFilePickers(this) is safe to call, + // if there was no corresponding dismissFilePickers(this), it will be a + // no-op. + lazy.FilePickerHandler.allowFilePickers(this); } for (const id of this.#chromeProtocolHandles.keys()) { @@ -373,6 +382,15 @@ export class WebDriverSession { "message-handler-protocol-event", this._onMessageHandlerProtocolEvent ); + + // Bug 2005673: Only enable dismissing file pickers lazily if the session + // explicitly starts handling BiDi commands. + if (lazy.dismissFilePickersEnabled) { + // Temporarily dismiss all file pickers. + // Bug 1999693: File pickers should only be dismissed when the unhandled + // prompt behaviour for type "file" is not set to "ignore". + lazy.FilePickerHandler.dismissFilePickers(this); + } } return this.#messageHandler; diff --git a/testing/profiles/web-platform/user.js b/testing/profiles/web-platform/user.js @@ -71,6 +71,8 @@ user_pref("layout.css.prefers-color-scheme.content-override", 1); user_pref("dom.reporting.enabled", true); // Enable WebDriver BiDi experimental commands and events during tests. user_pref("remote.experimental.enabled", true); +// Dismiss file pickers for WebDriver BiDi sessions. +user_pref("remote.bidi.dismiss_file_pickers.enabled", true); // Disable OCSP checks in WPT (webtransport triggers these occasionally) user_pref("security.OCSP.enabled", 0); // Disable download of intermediate certificates.