diff options
Diffstat (limited to 'comm/mail/test/browser/shared-modules/PromptHelpers.jsm')
-rw-r--r-- | comm/mail/test/browser/shared-modules/PromptHelpers.jsm | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/comm/mail/test/browser/shared-modules/PromptHelpers.jsm b/comm/mail/test/browser/shared-modules/PromptHelpers.jsm new file mode 100644 index 0000000000..ca3eaac3b0 --- /dev/null +++ b/comm/mail/test/browser/shared-modules/PromptHelpers.jsm @@ -0,0 +1,271 @@ +/* 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"; + +const EXPORTED_SYMBOLS = [ + "gMockPromptService", + "gMockAuthPromptReg", + "gMockAuthPrompt", +]; + +var { MockObjectReplacer } = ChromeUtils.import( + "resource://testing-common/mozmill/MockObjectHelpers.jsm" +); + +var { XPCOMUtils } = ChromeUtils.importESModule( + "resource://gre/modules/XPCOMUtils.sys.mjs" +); + +var kMockPromptServiceName = "Mock Prompt Service"; +var kPromptServiceContractID = "@mozilla.org/prompter;1"; +var kPromptServiceName = "Prompt Service"; + +var gMockAuthPromptReg = new MockObjectReplacer( + "@mozilla.org/prompter;1", + MockAuthPromptFactoryConstructor +); + +function MockAuthPromptFactoryConstructor() { + return gMockAuthPromptFactory; +} + +var gMockAuthPromptFactory = { + QueryInterface: ChromeUtils.generateQI(["nsIPromptFactory"]), + getPrompt(aParent, aIID, aResult) { + return gMockAuthPrompt.QueryInterface(aIID); + }, +}; + +var gMockAuthPrompt = { + password: "", + + QueryInterface: ChromeUtils.generateQI(["nsIAuthPrompt"]), + + prompt(aTitle, aText, aRealm, aSave, aDefaultText) { + throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED); + }, + + promptUsernameAndPassword(aTitle, aText, aRealm, aSave, aUser, aPwd) { + throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED); + }, + + promptPassword(aTitle, aText, aRealm, aSave, aPwd) { + aPwd.value = this.password; + return true; + }, +}; + +var gMockPromptService = { + _registered: false, + QueryInterface: ChromeUtils.generateQI(["nsIPromptService"]), + _will_return: null, + _inout_value: null, + _promptState: null, + _origFactory: null, + _promptCb: null, + + alert(aParent, aDialogTitle, aText) { + this._promptState = { + method: "alert", + parent: aParent, + dialogTitle: aDialogTitle, + text: aText, + }; + }, + + confirm(aParent, aDialogTitle, aText) { + this._promptState = { + method: "confirm", + parent: aParent, + dialogTitle: aDialogTitle, + text: aText, + }; + + this.fireCb(); + + return this._will_return; + }, + + confirmCheck(aParent, aDialogTitle, aText) { + this._promptState = { + method: "confirmCheck", + parent: aParent, + dialogTitle: aDialogTitle, + text: aText, + }; + + this.fireCb(); + + return this._will_return; + }, + + confirmEx( + aParent, + aDialogTitle, + aText, + aButtonFlags, + aButton0Title, + aButton1Title, + aButton2Title, + aCheckMsg, + aCheckState + ) { + this._promptState = { + method: "confirmEx", + parent: aParent, + dialogTitle: aDialogTitle, + text: aText, + buttonFlags: aButtonFlags, + button0Title: aButton0Title, + button1Title: aButton1Title, + button2Title: aButton2Title, + checkMsg: aCheckMsg, + checkState: aCheckState, + }; + + this.fireCb(); + + return this._will_return; + }, + + prompt(aParent, aDialogTitle, aText, aValue, aCheckMsg, aCheckState) { + this._promptState = { + method: "prompt", + parent: aParent, + dialogTitle: aDialogTitle, + text: aText, + value: aValue, + checkMsg: aCheckMsg, + checkState: aCheckState, + }; + + this.fireCb(); + + if (this._inout_value != null) { + aValue.value = this._inout_value; + } + + return this._will_return; + }, + + // Other dialogs should probably be mocked here, including alert, + // alertCheck, etc. + // See: http://mxr.mozilla.org/mozilla-central/source/embedding/components/ + // windowwatcher/public/nsIPromptService.idl + + /* Sets the value that the alert, confirm, etc dialog will return to + * the caller. + */ + set returnValue(aReturn) { + this._will_return = aReturn; + }, + + set inoutValue(aValue) { + this._inout_value = aValue; + }, + + set onPromptCallback(aCb) { + this._promptCb = aCb; + }, + + promisePrompt() { + return new Promise(resolve => { + this.onPromptCallback = resolve; + }); + }, + + fireCb() { + if (typeof this._promptCb == "function") { + this._promptCb.call(); + } + }, + + /* Wipes out the prompt state and any return values. + */ + reset() { + this._will_return = null; + this._promptState = null; + this._promptCb = null; + this._inout_value = null; + }, + + /* Returns the prompt state if one was observed since registering + * the Mock Prompt Service. + */ + get promptState() { + return this._promptState; + }, + + CID: Components.ID("{404ebfa2-d8f4-4c94-8416-e65a55f9df5b}"), + + get registrar() { + delete this.registrar; + return (this.registrar = Components.manager.QueryInterface( + Ci.nsIComponentRegistrar + )); + }, + + /* Registers the Mock Prompt Service, and stores the original Prompt Service. + */ + register() { + if (!this.originalCID) { + void Components.manager.getClassObject( + Cc[kPromptServiceContractID], + Ci.nsIFactory + ); + + this.originalCID = this.registrar.contractIDToCID( + kPromptServiceContractID + ); + this.registrar.registerFactory( + this.CID, + kMockPromptServiceName, + kPromptServiceContractID, + gMockPromptServiceFactory + ); + this._resetServicesPrompt(); + } + }, + + /* Unregisters the Mock Prompt Service, and re-registers the original + * Prompt Service. + */ + unregister() { + if (this.originalCID) { + // Unregister the mock. + this.registrar.unregisterFactory(this.CID, gMockPromptServiceFactory); + + this.registrar.registerFactory( + this.originalCID, + kPromptServiceName, + kPromptServiceContractID, + null + ); + + delete this.originalCID; + this._resetServicesPrompt(); + } + }, + + _resetServicesPrompt() { + // eslint-disable-next-line mozilla/use-services + XPCOMUtils.defineLazyServiceGetter( + Services, + "prompt", + kPromptServiceContractID, + "nsIPromptService" + ); + }, +}; + +var gMockPromptServiceFactory = { + createInstance(aIID) { + if (!aIID.equals(Ci.nsIPromptService)) { + throw Components.Exception("", Cr.NS_ERROR_NO_INTERFACE); + } + + return gMockPromptService; + }, +}; |