Source code

Revision control

Copy as Markdown

Other Tools

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
EventPromise: "chrome://remote/content/shared/Sync.sys.mjs",
PromptListener:
"chrome://remote/content/shared/listeners/PromptListener.sys.mjs",
TabManager: "chrome://remote/content/shared/TabManager.sys.mjs",
UserPromptType:
"chrome://remote/content/webdriver-bidi/modules/root/browsingContext.sys.mjs",
});
export class UserPromptHandlerManager {
#handler;
#promptListener;
constructor(handler) {
this.#handler = handler;
this.#promptListener = new lazy.PromptListener();
this.#promptListener.on("opened", this.#onPromptOpened);
this.#promptListener.startListening();
}
destroy() {
this.#promptListener.stopListening();
this.#promptListener.off("opened", this.#onPromptOpened);
this.#promptListener.destroy();
this.#handler = null;
}
#onPromptOpened = async (eventName, data) => {
const { browsingContext, prompt } = data;
const { promptType } = prompt;
const type = promptType === "beforeunload" ? "beforeUnload" : promptType;
const handlerConfig = this.#handler.getPromptHandler(type);
const { handler } = handlerConfig;
if (promptType in lazy.UserPromptType && handler !== "ignore") {
const tab = lazy.TabManager.getTabForBrowsingContext(browsingContext);
const window = lazy.TabManager.getWindowForTab(tab);
const closePrompt = async callback => {
const dialogClosed = new lazy.EventPromise(
window,
"DOMModalDialogClosed"
);
callback();
await dialogClosed;
};
if (type === "alert" || handler === "accept") {
await closePrompt(() => prompt.accept());
} else {
await closePrompt(() => prompt.dismiss());
}
}
};
}