diff options
Diffstat (limited to 'browser/components/prompts/PromptCollection.jsm')
-rw-r--r-- | browser/components/prompts/PromptCollection.jsm | 201 |
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", +]); |