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:
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.