diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /comm/mail/components/newmailaccount/content/provisionerCheckout.js | |
parent | Initial commit. (diff) | |
download | thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.tar.xz thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'comm/mail/components/newmailaccount/content/provisionerCheckout.js')
-rw-r--r-- | comm/mail/components/newmailaccount/content/provisionerCheckout.js | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/comm/mail/components/newmailaccount/content/provisionerCheckout.js b/comm/mail/components/newmailaccount/content/provisionerCheckout.js new file mode 100644 index 0000000000..0fc38c87e5 --- /dev/null +++ b/comm/mail/components/newmailaccount/content/provisionerCheckout.js @@ -0,0 +1,157 @@ +/* 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/. */ + +// mail/base/content/contentAreaClick.js +/* globals hRefForClickEvent, openLinkExternally */ +// mail/base/content/specialTabs.js +/* globals specialTabs */ + +var { ConsoleAPI } = ChromeUtils.importESModule( + "resource://gre/modules/Console.sys.mjs" +); + +/** + * A content tab for the account provisioner. We use Javascript-y magic to + * "subclass" specialTabs.contentTabType, and then override the appropriate + * members. + * + * Also note that provisionerCheckoutTab is a singleton (hence the maxTabs: 1). + */ +var provisionerCheckoutTabType = Object.create(specialTabs.contentTabType, { + name: { value: "provisionerCheckoutTab" }, + modes: { + value: { + provisionerCheckoutTab: { + type: "provisionerCheckoutTab", + maxTabs: 1, + }, + }, + }, + _log: { + value: new ConsoleAPI({ + prefix: "mail.provider", + maxLogLevel: "warn", + maxLogLevelPref: "mail.provider.loglevel", + }), + }, +}); + +/** + * Here, we're overriding openTab - first we call the openTab of contentTab + * (for the context of this provisionerCheckoutTab "aTab") and then passing + * special arguments "realName", "email" and "searchEngine" from the caller + * of openTab, and passing those to our _setMonitoring function. + */ +provisionerCheckoutTabType.openTab = function (aTab, aArgs) { + specialTabs.contentTabType.openTab.call(this, aTab, aArgs); + + // Since there's only one tab of this type ever (see the mode definition), + // we're OK to stash this stuff here. + this._realName = aArgs.realName; + this._email = aArgs.email; + this._searchEngine = aArgs.searchEngine || ""; + + this._setMonitoring( + aTab.browser, + aArgs.realName, + aArgs.email, + aArgs.searchEngine + ); +}; + +/** + * We're overriding closeTab - first, we call the closeTab of contentTab, + * (for the context of this provisionerCheckoutTab "aTab"), and then we + * unregister our observer that was registered in _setMonitoring. + */ +provisionerCheckoutTabType.closeTab = function (aTab) { + specialTabs.contentTabType.closeTab.call(this, aTab); + this._log.info("Performing account provisioner cleanup"); + this._log.info("Removing httpRequestObserver"); + Services.obs.removeObserver(this._observer, "http-on-examine-response"); + Services.obs.removeObserver( + this._observer, + "http-on-examine-cached-response" + ); + Services.obs.removeObserver(this.quitObserver, "mail-unloading-messenger"); + delete this._observer; + this._log.info("Account provisioner cleanup is done."); +}; + +/** + * Serialize our tab into something we can restore later. + */ +provisionerCheckoutTabType.persistTab = function (aTab) { + return { + tabURI: aTab.browser.currentURI.spec, + realName: this._realName, + email: this._email, + searchEngine: this._searchEngine, + }; +}; + +/** + * Re-open the provisionerCheckoutTab with all of the stuff we stashed in + * persistTab. This will automatically hook up our monitoring again. + */ +provisionerCheckoutTabType.restoreTab = function (aTabmail, aPersistedState) { + aTabmail.openTab("provisionerCheckoutTab", { + url: aPersistedState.tabURI, + realName: aPersistedState.realName, + email: aPersistedState.email, + searchEngine: aPersistedState.searchEngine, + background: true, + }); +}; + +/** + * This function registers an observer to watch for HTTP requests where the + * contentType contains text/xml. + */ +provisionerCheckoutTabType._setMonitoring = function ( + aBrowser, + aRealName, + aEmail, + aSearchEngine +) { + let mail3Pane = Services.wm.getMostRecentWindow("mail:3pane"); + + // We'll construct our special observer (defined in urlListener.js) + // that will watch for requests where the contentType contains + // text/xml. + this._observer = new mail3Pane.httpRequestObserver(aBrowser, { + realName: aRealName, + email: aEmail, + searchEngine: aSearchEngine, + }); + + // Register our observer + Services.obs.addObserver(this._observer, "http-on-examine-response"); + Services.obs.addObserver(this._observer, "http-on-examine-cached-response"); + Services.obs.addObserver(this.quitObserver, "mail-unloading-messenger"); + + this._log.info("httpRequestObserver wired up."); +}; + +/** + * This observer listens for the mail-unloading-messenger event fired by each + * mail window before they unload. If the mail window is the same window that + * this provisionerCheckoutTab belongs to, then we stash a pref so that when + * the session restarts, we go straight to the tab, as opposed to showing the + * dialog again. + */ +provisionerCheckoutTabType.quitObserver = { + observe(aSubject, aTopic, aData) { + // Make sure we saw the right topic, and that the window that is closing + // is the 3pane window that the provisionerCheckoutTab belongs to. + if (aTopic == "mail-unloading-messenger" && aSubject === window) { + // We quit while the provisionerCheckoutTab was opened. Set our sneaky + // pref so that we suppress the dialog on startup. + Services.prefs.setBoolPref( + "mail.provider.suppress_dialog_on_startup", + true + ); + } + }, +}; |