summaryrefslogtreecommitdiffstats
path: root/comm/suite/base/content/viewApplyThemeOverlay.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--comm/suite/base/content/viewApplyThemeOverlay.js170
1 files changed, 170 insertions, 0 deletions
diff --git a/comm/suite/base/content/viewApplyThemeOverlay.js b/comm/suite/base/content/viewApplyThemeOverlay.js
new file mode 100644
index 0000000000..557dc50a3b
--- /dev/null
+++ b/comm/suite/base/content/viewApplyThemeOverlay.js
@@ -0,0 +1,170 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+
+ * 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 {AddonManager} = ChromeUtils.import("resource://gre/modules/AddonManager.jsm");
+ChromeUtils.defineModuleGetter(this, "LightweightThemeManager",
+ "resource://gre/modules/LightweightThemeManager.jsm");
+
+var gThemes = [];
+var gApplyThemeBundle;
+var gBackgroundIsActive;
+
+function reloadThemes()
+{
+ AddonManager.getAddonsByTypes(["theme"], function(themes) {
+ gThemes = themes.sort(function(a, b) {
+ return a.name.localeCompare(b.name);
+ });
+ });
+}
+
+var gAddonListener = {
+ onEnabling: function(val) {},
+ onEnabled: function(val) {},
+ onDisabling: function(val) {},
+ onDisabled: function(val) {},
+ onInstalling: function(val) {},
+ onInstalled: reloadThemes,
+ onUninstalling: function(val) {},
+ onUninstalled: reloadThemes,
+ onOperationCancelled: reloadThemes
+};
+
+function getNewThemes()
+{
+ // get URL for more themes from prefs
+ try {
+ openURL(Services.urlFormatter.formatURLPref("extensions.getMoreThemesURL"));
+ }
+ catch (e) {
+ dump(e);
+ }
+}
+
+function getPersonas()
+{
+ // get URL for more themes from prefs
+ try {
+ openURL(Services.urlFormatter.formatURLPref("extensions.getPersonasURL"));
+ }
+ catch (e) {
+ dump(e);
+ }
+}
+
+function checkTheme(popup)
+{
+ const ID_SUFFIX = "@personas.mozilla.org";
+ gBackgroundIsActive = false;
+
+ var usedThemes = LightweightThemeManager.usedThemes;
+ usedThemes = new Map(usedThemes.map( x => [x.id + ID_SUFFIX, x] ));
+
+ while (popup.lastChild.localName != 'menuseparator')
+ popup.lastChild.remove();
+ gThemes.forEach(function(theme) {
+ var menuitem = document.createElement('menuitem');
+ menuitem.setAttribute("label", theme.name);
+ menuitem.setAttribute("type", "radio");
+ menuitem.setAttribute("name", "themeGroup");
+ if (theme.description)
+ menuitem.setAttribute("tooltiptext", theme.description);
+ if (!theme.userDisabled)
+ menuitem.setAttribute("checked", "true");
+ else if (!(theme.permissions & AddonManager.PERM_CAN_ENABLE))
+ menuitem.setAttribute("disabled", "true");
+ menuitem.theme = theme;
+
+ var persona = usedThemes.get(theme.id);
+ if (persona) {
+ menuitem.persona = persona;
+ if (theme.isActive)
+ gBackgroundIsActive = true;
+ }
+
+ popup.appendChild(menuitem);
+ });
+}
+
+function previewTheme(event)
+{
+ if (!gBackgroundIsActive || !event.target.persona)
+ return;
+
+ switch (event.type) {
+ case "DOMMenuItemActive":
+ LightweightThemeManager.previewTheme(event.target.persona);
+ break;
+ case "DOMMenuItemInactive":
+ LightweightThemeManager.resetPreview();
+ break;
+ }
+}
+
+function restartApp()
+{
+ // Notify all windows that an application quit has been requested.
+ var cancelQuit = Cc["@mozilla.org/supports-PRBool;1"]
+ .createInstance(Ci.nsISupportsPRBool);
+
+ Services.obs.notifyObservers(cancelQuit, "quit-application-requested", "restart");
+
+ // Something aborted the quit process.
+ if (cancelQuit.data)
+ return;
+
+ Services.prefs.setBoolPref("browser.sessionstore.resume_session_once", true);
+ const appStartup = Services.startup;
+ appStartup.quit(appStartup.eRestart | appStartup.eAttemptQuit);
+}
+
+function applyTheme(menuitem)
+{
+ if (!menuitem.theme)
+ return;
+
+ menuitem.theme.userDisabled = false;
+ if (!menuitem.theme.isActive) {
+ var promptTitle = gApplyThemeBundle.getString("switchskinstitle");
+ // gBrandBundle: bundle_brand stringbundle from overlayed XUL file
+ var brandName = gBrandBundle.getString("brandShortName");
+ var promptMsg = gApplyThemeBundle.getFormattedString("switchskins", [brandName]);
+ var promptNow = gApplyThemeBundle.getString("switchskinsnow");
+ var promptLater = gApplyThemeBundle.getString("switchskinslater");
+ var check = {value: false};
+ var flags = Services.prompt.BUTTON_POS_0 * Services.prompt.BUTTON_TITLE_IS_STRING +
+ Services.prompt.BUTTON_POS_1 * Services.prompt.BUTTON_TITLE_IS_STRING;
+ var pressedVal = Services.prompt.confirmEx(window, promptTitle, promptMsg,
+ flags, promptNow, promptLater,
+ null, null, check);
+ if (pressedVal == 0)
+ restartApp();
+ }
+}
+
+function applyThemeOnLoad()
+{
+ // init globals
+ gApplyThemeBundle = document.getElementById("bundle_viewApplyTheme");
+ AddonManager.addAddonListener(gAddonListener);
+ reloadThemes();
+
+ removeEventListener("load", applyThemeOnLoad, false);
+ addEventListener("unload", applyThemeOnUnload, false);
+ var popup = document.getElementById("menu_viewApplyTheme_Popup");
+ popup.addEventListener("DOMMenuItemActive", previewTheme);
+ popup.addEventListener("DOMMenuItemInactive", previewTheme);
+}
+
+function applyThemeOnUnload()
+{
+ AddonManager.removeAddonListener(gAddonListener);
+ var popup = document.getElementById("menu_viewApplyTheme_Popup");
+ popup.removeEventListener("DOMMenuItemActive", previewTheme);
+ popup.removeEventListener("DOMMenuItemInactive", previewTheme);
+}
+
+addEventListener("load", applyThemeOnLoad, false);