summaryrefslogtreecommitdiffstats
path: root/browser/components/prompts/PromptCollection.jsm
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/prompts/PromptCollection.jsm')
-rw-r--r--browser/components/prompts/PromptCollection.jsm201
1 files changed, 201 insertions, 0 deletions
diff --git a/browser/components/prompts/PromptCollection.jsm b/browser/components/prompts/PromptCollection.jsm
new file mode 100644
index 0000000000..ac042486ac
--- /dev/null
+++ b/browser/components/prompts/PromptCollection.jsm
@@ -0,0 +1,201 @@
+/* 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/. */
+
+"use strict";
+
+var EXPORTED_SYMBOLS = ["PromptCollection"];
+
+const { XPCOMUtils } = ChromeUtils.importESModule(
+ "resource://gre/modules/XPCOMUtils.sys.mjs"
+);
+
+/**
+ * Implements nsIPromptCollection
+ * @class PromptCollection
+ */
+class PromptCollection {
+ confirmRepost(browsingContext) {
+ let brandName;
+ try {
+ brandName = this.stringBundles.brand.GetStringFromName("brandShortName");
+ } catch (exception) {
+ // That's ok, we'll use a generic version of the prompt
+ }
+
+ let message;
+ let resendLabel;
+ try {
+ if (brandName) {
+ message = this.stringBundles.app.formatStringFromName(
+ "confirmRepostPrompt",
+ [brandName]
+ );
+ } else {
+ // Use a generic version of this prompt.
+ message = this.stringBundles.app.GetStringFromName(
+ "confirmRepostPrompt"
+ );
+ }
+ resendLabel = this.stringBundles.app.GetStringFromName(
+ "resendButton.label"
+ );
+ } catch (exception) {
+ Cu.reportError("Failed to get strings from appstrings.properties");
+ return false;
+ }
+
+ let contentViewer = browsingContext?.docShell?.contentViewer;
+ let modalType = contentViewer?.isTabModalPromptAllowed
+ ? Ci.nsIPromptService.MODAL_TYPE_CONTENT
+ : Ci.nsIPromptService.MODAL_TYPE_WINDOW;
+ let buttonFlags =
+ (Ci.nsIPromptService.BUTTON_TITLE_IS_STRING *
+ Ci.nsIPromptService.BUTTON_POS_0) |
+ (Ci.nsIPromptService.BUTTON_TITLE_CANCEL *
+ Ci.nsIPromptService.BUTTON_POS_1);
+ let buttonPressed = Services.prompt.confirmExBC(
+ browsingContext,
+ modalType,
+ null,
+ message,
+ buttonFlags,
+ resendLabel,
+ null,
+ null,
+ null,
+ {}
+ );
+
+ return buttonPressed === 0;
+ }
+
+ async asyncBeforeUnloadCheck(browsingContext) {
+ let title;
+ let message;
+ let leaveLabel;
+ let stayLabel;
+
+ try {
+ title = this.stringBundles.dom.GetStringFromName("OnBeforeUnloadTitle");
+ message = this.stringBundles.dom.GetStringFromName(
+ "OnBeforeUnloadMessage2"
+ );
+ leaveLabel = this.stringBundles.dom.GetStringFromName(
+ "OnBeforeUnloadLeaveButton"
+ );
+ stayLabel = this.stringBundles.dom.GetStringFromName(
+ "OnBeforeUnloadStayButton"
+ );
+ } catch (exception) {
+ Cu.reportError("Failed to get strings from dom.properties");
+ return false;
+ }
+
+ let contentViewer = browsingContext?.docShell?.contentViewer;
+
+ if (
+ (contentViewer && !contentViewer.isTabModalPromptAllowed) ||
+ !browsingContext.ancestorsAreCurrent
+ ) {
+ Cu.reportError("Can't prompt from inactive content viewer");
+ return true;
+ }
+
+ let buttonFlags =
+ Ci.nsIPromptService.BUTTON_POS_0_DEFAULT |
+ (Ci.nsIPromptService.BUTTON_TITLE_IS_STRING *
+ Ci.nsIPromptService.BUTTON_POS_0) |
+ (Ci.nsIPromptService.BUTTON_TITLE_IS_STRING *
+ Ci.nsIPromptService.BUTTON_POS_1);
+
+ let result = await Services.prompt.asyncConfirmEx(
+ browsingContext,
+ Services.prompt.MODAL_TYPE_CONTENT,
+ title,
+ message,
+ buttonFlags,
+ leaveLabel,
+ stayLabel,
+ null,
+ null,
+ false,
+ // Tell the prompt service that this is a permit unload prompt
+ // so that it can set the appropriate flag on the detail object
+ // of the events it dispatches.
+ { inPermitUnload: true }
+ );
+
+ return (
+ result.QueryInterface(Ci.nsIPropertyBag2).get("buttonNumClicked") == 0
+ );
+ }
+
+ confirmFolderUpload(browsingContext, directoryName) {
+ let title;
+ let message;
+ let acceptLabel;
+
+ try {
+ title = this.stringBundles.dom.GetStringFromName(
+ "FolderUploadPrompt.title"
+ );
+ message = this.stringBundles.dom.formatStringFromName(
+ "FolderUploadPrompt.message",
+ [directoryName]
+ );
+ acceptLabel = this.stringBundles.dom.GetStringFromName(
+ "FolderUploadPrompt.acceptButtonLabel"
+ );
+ } catch (exception) {
+ Cu.reportError("Failed to get strings from dom.properties");
+ return false;
+ }
+
+ let buttonFlags =
+ Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_0 +
+ Services.prompt.BUTTON_TITLE_CANCEL * Services.prompt.BUTTON_POS_1 +
+ Services.prompt.BUTTON_POS_1_DEFAULT;
+
+ return (
+ Services.prompt.confirmExBC(
+ browsingContext,
+ Services.prompt.MODAL_TYPE_TAB,
+ title,
+ message,
+ buttonFlags,
+ acceptLabel,
+ null,
+ null,
+ null,
+ {}
+ ) === 0
+ );
+ }
+}
+
+const BUNDLES = {
+ dom: "chrome://global/locale/dom/dom.properties",
+ app: "chrome://global/locale/appstrings.properties",
+ brand: "chrome://branding/locale/brand.properties",
+};
+
+PromptCollection.prototype.stringBundles = {};
+
+for (const [bundleName, bundleUrl] of Object.entries(BUNDLES)) {
+ XPCOMUtils.defineLazyGetter(
+ PromptCollection.prototype.stringBundles,
+ bundleName,
+ function() {
+ let bundle = Services.strings.createBundle(bundleUrl);
+ if (!bundle) {
+ throw new Error("String bundle for dom not present!");
+ }
+ return bundle;
+ }
+ );
+}
+
+PromptCollection.prototype.QueryInterface = ChromeUtils.generateQI([
+ "nsIPromptCollection",
+]);