Differential Revision: https://phabricator.services.mozilla.com/D277408
66 lines
1.9 KiB
JavaScript
66 lines
1.9 KiB
JavaScript
/* 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());
|
|
}
|
|
}
|
|
};
|
|
}
|