Revision control

Copy as Markdown

Other Tools

/* -*- 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",
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);