From deea787c2efbb9c89caec8d9efc023ffafe75613 Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Sat, 10 Feb 2018 04:00:58 -0500 Subject: Import Tycho's Add-on Manager --- .../mozapps/extensions/test/xpcshell/test_theme.js | 1092 ++++++++++++++++++++ 1 file changed, 1092 insertions(+) create mode 100644 toolkit/mozapps/extensions/test/xpcshell/test_theme.js (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_theme.js') diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_theme.js b/toolkit/mozapps/extensions/test/xpcshell/test_theme.js new file mode 100644 index 000000000..f201c776d --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_theme.js @@ -0,0 +1,1092 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +Components.utils.import("resource://gre/modules/NetUtil.jsm"); + +// The maximum allowable time since install. If an add-on claims to have been +// installed longer ago than this the the test will fail. +const MAX_INSTALL_TIME = 10000; + +// This verifies that themes behave as expected + +const PREF_GENERAL_SKINS_SELECTEDSKIN = "general.skins.selectedSkin"; + +Components.utils.import("resource://gre/modules/LightweightThemeManager.jsm"); + +const profileDir = gProfD.clone(); +profileDir.append("extensions"); + +// Observer to ensure a "lightweight-theme-styling-update" notification is sent +// when expected +var gLWThemeChanged = false; +var LightweightThemeObserver = { + observe: function(aSubject, aTopic, aData) { + if (aTopic != "lightweight-theme-styling-update") + return; + + gLWThemeChanged = true; + } +}; + +AM_Cc["@mozilla.org/observer-service;1"] + .getService(Components.interfaces.nsIObserverService) + .addObserver(LightweightThemeObserver, "lightweight-theme-styling-update", false); + + +function run_test() { + do_test_pending(); + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); + + Services.prefs.setCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN, "theme1/1.0"); + writeInstallRDFForExtension({ + id: "theme1@tests.mozilla.org", + version: "1.0", + name: "Test 1", + type: 4, + skinnable: true, + internalName: "theme1/1.0", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "2" + }] + }, profileDir); + + writeInstallRDFForExtension({ + id: "theme2@tests.mozilla.org", + version: "1.0", + name: "Test 1", + skinnable: false, + internalName: "theme2/1.0", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "2" + }] + }, profileDir); + + // We need a default theme for some of these things to work but we have hidden + // the one in the application directory. + writeInstallRDFForExtension({ + id: "default@tests.mozilla.org", + version: "1.0", + name: "Default", + internalName: "classic/1.0", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "2" + }] + }, profileDir); + + startupManager(); + // Make sure we only register once despite multiple calls + AddonManager.addInstallListener(InstallListener); + AddonManager.addAddonListener(AddonListener); + AddonManager.addInstallListener(InstallListener); + AddonManager.addAddonListener(AddonListener); + AddonManager.addInstallListener(InstallListener); + + AddonManager.getAddonsByIDs(["default@tests.mozilla.org", + "theme1@tests.mozilla.org", + "theme2@tests.mozilla.org"], + function([d, t1, t2]) { + do_check_neq(d, null); + do_check_false(d.skinnable); + do_check_false(d.foreignInstall); + + do_check_neq(t1, null); + do_check_false(t1.userDisabled); + do_check_false(t1.appDisabled); + do_check_true(t1.isActive); + do_check_true(t1.skinnable); + do_check_true(t1.foreignInstall); + do_check_eq(t1.screenshots, null); + do_check_true(isThemeInAddonsList(profileDir, t1.id)); + do_check_false(hasFlag(t1.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_false(hasFlag(t1.permissions, AddonManager.PERM_CAN_ENABLE)); + do_check_eq(t1.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_UNINSTALL | + AddonManager.OP_NEEDS_RESTART_DISABLE); + + do_check_neq(t2, null); + do_check_true(t2.userDisabled); + do_check_false(t2.appDisabled); + do_check_false(t2.isActive); + do_check_false(t2.skinnable); + do_check_true(t2.foreignInstall); + do_check_eq(t2.screenshots, null); + do_check_false(isThemeInAddonsList(profileDir, t2.id)); + do_check_false(hasFlag(t2.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_true(hasFlag(t2.permissions, AddonManager.PERM_CAN_ENABLE)); + do_check_eq(t2.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_ENABLE); + + do_execute_soon(run_test_1); + }); +} + +function end_test() { + do_execute_soon(do_test_finished); +} + +// Checks enabling one theme disables the others +function run_test_1() { + prepare_test({ + "theme1@tests.mozilla.org": [ + "onDisabling" + ], + "theme2@tests.mozilla.org": [ + "onEnabling" + ] + }); + AddonManager.getAddonsByIDs(["theme1@tests.mozilla.org", + "theme2@tests.mozilla.org"], function([t1, t2]) { + t2.userDisabled = false; + + ensure_test_completed(); + do_check_false(hasFlag(t2.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_false(hasFlag(t2.permissions, AddonManager.PERM_CAN_ENABLE)); + + do_check_true(t1.userDisabled); + do_check_false(hasFlag(t1.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_true(hasFlag(t1.permissions, AddonManager.PERM_CAN_ENABLE)); + + do_execute_soon(check_test_1); + }); +} + +function check_test_1() { + restartManager(); + do_check_eq(Services.prefs.getCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN), "theme2/1.0"); + + AddonManager.getAddonsByIDs(["theme1@tests.mozilla.org", + "theme2@tests.mozilla.org"], function([t1, t2]) { + do_check_neq(t1, null); + do_check_true(t1.userDisabled); + do_check_false(t1.appDisabled); + do_check_false(t1.isActive); + do_check_false(isThemeInAddonsList(profileDir, t1.id)); + do_check_false(hasFlag(t1.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_true(hasFlag(t1.permissions, AddonManager.PERM_CAN_ENABLE)); + do_check_eq(t1.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_ENABLE); + + do_check_neq(t2, null); + do_check_false(t2.userDisabled); + do_check_false(t2.appDisabled); + do_check_true(t2.isActive); + do_check_true(isThemeInAddonsList(profileDir, t2.id)); + do_check_false(hasFlag(t2.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_false(hasFlag(t2.permissions, AddonManager.PERM_CAN_ENABLE)); + do_check_eq(t2.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_UNINSTALL | + AddonManager.OP_NEEDS_RESTART_DISABLE); + do_check_false(gLWThemeChanged); + + do_execute_soon(run_test_2); + }); +} + +// Removing the active theme should fall back to the default (not ideal in this +// case since we don't have the default theme installed) +function run_test_2() { + var dest = profileDir.clone(); + dest.append(do_get_expected_addon_name("theme2@tests.mozilla.org")); + dest.remove(true); + + restartManager(); + do_check_eq(Services.prefs.getCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN), "classic/1.0"); + + AddonManager.getAddonsByIDs(["theme1@tests.mozilla.org", + "theme2@tests.mozilla.org"], function([t1, t2]) { + do_check_neq(t1, null); + do_check_true(t1.userDisabled); + do_check_false(t1.appDisabled); + do_check_false(t1.isActive); + do_check_false(isThemeInAddonsList(profileDir, t1.id)); + do_check_false(hasFlag(t1.permissions, AddonManager.PERM_CAN_DISABLE)); + do_check_true(hasFlag(t1.permissions, AddonManager.PERM_CAN_ENABLE)); + + do_check_eq(t2, null); + do_check_false(isThemeInAddonsList(profileDir, "theme2@tests.mozilla.org")); + do_check_false(gLWThemeChanged); + + do_execute_soon(run_test_3); + }); +} + +// Installing a lightweight theme should happen instantly and disable the default theme +function run_test_3() { + writeInstallRDFForExtension({ + id: "theme2@tests.mozilla.org", + version: "1.0", + name: "Test 1", + internalName: "theme2/1.0", + targetApplications: [{ + id: "xpcshell@tests.mozilla.org", + minVersion: "1", + maxVersion: "2" + }] + }, profileDir); + restartManager(); + + prepare_test({ + "1@personas.mozilla.org": [ + ["onInstalling", false], + "onInstalled", + ["onEnabling", false], + "onEnabled" + ], + "default@tests.mozilla.org": [ + ["onDisabling", false], + "onDisabled", + ] + }, [ + "onExternalInstall" + ]); + + LightweightThemeManager.currentTheme = { + id: "1", + version: "1", + name: "Test LW Theme", + description: "A test theme", + author: "Mozilla", + homepageURL: "http://localhost/data/index.html", + headerURL: "http://localhost/data/header.png", + footerURL: "http://localhost/data/footer.png", + previewURL: "http://localhost/data/preview.png", + iconURL: "http://localhost/data/icon.png" + }; + + ensure_test_completed(); + + AddonManager.getAddonByID("1@personas.mozilla.org", function(p1) { + do_check_neq(null, p1); + do_check_eq(p1.name, "Test LW Theme"); + do_check_eq(p1.version, "1"); + do_check_eq(p1.type, "theme"); + do_check_eq(p1.description, "A test theme"); + do_check_eq(p1.creator, "Mozilla"); + do_check_eq(p1.homepageURL, "http://localhost/data/index.html"); + do_check_eq(p1.iconURL, "http://localhost/data/icon.png"); + do_check_eq(p1.screenshots.length, 1); + do_check_eq(p1.screenshots[0], "http://localhost/data/preview.png"); + do_check_false(p1.appDisabled); + do_check_false(p1.userDisabled); + do_check_true(p1.isCompatible); + do_check_true(p1.providesUpdatesSecurely); + do_check_eq(p1.blocklistState, 0); + do_check_true(p1.isActive); + do_check_eq(p1.pendingOperations, 0); + do_check_eq(p1.permissions, AddonManager.PERM_CAN_UNINSTALL | AddonManager.PERM_CAN_DISABLE); + do_check_eq(p1.scope, AddonManager.SCOPE_PROFILE); + do_check_true("isCompatibleWith" in p1); + do_check_true("findUpdates" in p1); + do_check_eq(p1.installDate.getTime(), p1.updateDate.getTime()); + + // Should have been installed sometime in the last few seconds. + let difference = Date.now() - p1.installDate.getTime(); + if (difference > MAX_INSTALL_TIME) + do_throw("Add-on was installed " + difference + "ms ago"); + else if (difference < 0) + do_throw("Add-on was installed " + difference + "ms in the future"); + + AddonManager.getAddonsByTypes(["theme"], function(addons) { + let seen = false; + addons.forEach(function(a) { + if (a.id == "1@personas.mozilla.org") { + seen = true; + } + else { + dump("Checking theme " + a.id + "\n"); + do_check_false(a.isActive); + do_check_true(a.userDisabled); + } + }); + do_check_true(seen); + + do_check_true(gLWThemeChanged); + gLWThemeChanged = false; + + do_execute_soon(run_test_4); + }); + }); +} + +// Installing a second lightweight theme should disable the first with no restart +function run_test_4() { + prepare_test({ + "1@personas.mozilla.org": [ + ["onDisabling", false], + "onDisabled", + ], + "2@personas.mozilla.org": [ + ["onInstalling", false], + "onInstalled", + ["onEnabling", false], + "onEnabled" + ] + }, [ + "onExternalInstall" + ]); + + LightweightThemeManager.currentTheme = { + id: "2", + version: "1", + name: "Test LW Theme", + description: "A second test theme", + author: "Mozilla", + homepageURL: "http://localhost/data/index.html", + headerURL: "http://localhost/data/header.png", + footerURL: "http://localhost/data/footer.png", + previewURL: "http://localhost/data/preview.png", + iconURL: "http://localhost/data/icon.png" + }; + + ensure_test_completed(); + + AddonManager.getAddonsByIDs(["1@personas.mozilla.org", + "2@personas.mozilla.org"], function([p1, p2]) { + do_check_neq(null, p2); + do_check_false(p2.appDisabled); + do_check_false(p2.userDisabled); + do_check_true(p2.isActive); + do_check_eq(p2.pendingOperations, 0); + do_check_eq(p2.permissions, AddonManager.PERM_CAN_UNINSTALL | AddonManager.PERM_CAN_DISABLE); + do_check_eq(p2.installDate.getTime(), p2.updateDate.getTime()); + + // Should have been installed sometime in the last few seconds. + let difference = Date.now() - p2.installDate.getTime(); + if (difference > MAX_INSTALL_TIME) + do_throw("Add-on was installed " + difference + "ms ago"); + else if (difference < 0) + do_throw("Add-on was installed " + difference + "ms in the future"); + + do_check_neq(null, p1); + do_check_false(p1.appDisabled); + do_check_true(p1.userDisabled); + do_check_false(p1.isActive); + do_check_eq(p1.pendingOperations, 0); + do_check_eq(p1.permissions, AddonManager.PERM_CAN_UNINSTALL | AddonManager.PERM_CAN_ENABLE); + + AddonManager.getAddonsByTypes(["theme"], function(addons) { + let seen = false; + addons.forEach(function(a) { + if (a.id == "2@personas.mozilla.org") { + seen = true; + } + else { + dump("Checking theme " + a.id + "\n"); + do_check_false(a.isActive); + do_check_true(a.userDisabled); + } + }); + do_check_true(seen); + + do_check_true(gLWThemeChanged); + gLWThemeChanged = false; + + do_execute_soon(run_test_5); + }); + }); +} + +// Switching to a custom theme should disable the lightweight theme and require +// a restart. Cancelling that should also be possible. +function run_test_5() { + prepare_test({ + "2@personas.mozilla.org": [ + "onDisabling", + ], + "theme2@tests.mozilla.org": [ + "onEnabling" + ] + }); + + AddonManager.getAddonsByIDs(["2@personas.mozilla.org", + "theme2@tests.mozilla.org"], function([p2, t2]) { + t2.userDisabled = false; + + ensure_test_completed(); + + prepare_test({ + "2@personas.mozilla.org": [ + "onOperationCancelled", + ], + "theme2@tests.mozilla.org": [ + "onOperationCancelled" + ] + }); + + p2.userDisabled = false; + + ensure_test_completed(); + + prepare_test({ + "2@personas.mozilla.org": [ + "onDisabling", + ], + "theme2@tests.mozilla.org": [ + "onEnabling" + ] + }); + + t2.userDisabled = false; + + ensure_test_completed(); + + do_check_false(t2.isActive); + do_check_false(t2.userDisabled); + do_check_true(hasFlag(AddonManager.PENDING_ENABLE, t2.pendingOperations)); + do_check_true(p2.isActive); + do_check_true(p2.userDisabled); + do_check_true(hasFlag(AddonManager.PENDING_DISABLE, p2.pendingOperations)); + do_check_true(hasFlag(AddonManager.PERM_CAN_ENABLE, p2.permissions)); + do_check_false(gLWThemeChanged); + + do_execute_soon(check_test_5); + }); +} + +function check_test_5() { + restartManager(); + + AddonManager.getAddonsByIDs(["2@personas.mozilla.org", + "theme2@tests.mozilla.org"], function([p2, t2]) { + do_check_true(t2.isActive); + do_check_false(t2.userDisabled); + do_check_false(hasFlag(AddonManager.PENDING_ENABLE, t2.pendingOperations)); + do_check_false(p2.isActive); + do_check_true(p2.userDisabled); + do_check_false(hasFlag(AddonManager.PENDING_DISABLE, p2.pendingOperations)); + + do_check_true(gLWThemeChanged); + gLWThemeChanged = false; + + do_execute_soon(run_test_6); + }); +} + +// Switching from a custom theme to a lightweight theme should require a restart +function run_test_6() { + prepare_test({ + "2@personas.mozilla.org": [ + "onEnabling", + ], + "theme2@tests.mozilla.org": [ + "onDisabling" + ] + }); + + AddonManager.getAddonsByIDs(["2@personas.mozilla.org", + "theme2@tests.mozilla.org"], function([p2, t2]) { + p2.userDisabled = false; + + ensure_test_completed(); + + prepare_test({ + "2@personas.mozilla.org": [ + "onOperationCancelled", + ], + "theme2@tests.mozilla.org": [ + "onOperationCancelled" + ] + }); + + t2.userDisabled = false; + + ensure_test_completed(); + + prepare_test({ + "2@personas.mozilla.org": [ + "onEnabling", + ], + "theme2@tests.mozilla.org": [ + "onDisabling" + ] + }); + + p2.userDisabled = false; + + ensure_test_completed(); + + do_check_false(p2.isActive); + do_check_false(p2.userDisabled); + do_check_true(hasFlag(AddonManager.PENDING_ENABLE, p2.pendingOperations)); + do_check_true(t2.isActive); + do_check_true(t2.userDisabled); + do_check_true(hasFlag(AddonManager.PENDING_DISABLE, t2.pendingOperations)); + do_check_false(gLWThemeChanged); + + do_execute_soon(check_test_6); + }); +} + +function check_test_6() { + restartManager(); + + AddonManager.getAddonsByIDs(["2@personas.mozilla.org", + "theme2@tests.mozilla.org"], function([p2, t2]) { + do_check_true(p2.isActive); + do_check_false(p2.userDisabled); + do_check_false(hasFlag(AddonManager.PENDING_ENABLE, p2.pendingOperations)); + do_check_false(t2.isActive); + do_check_true(t2.userDisabled); + do_check_false(hasFlag(AddonManager.PENDING_DISABLE, t2.pendingOperations)); + + do_check_true(gLWThemeChanged); + gLWThemeChanged = false; + + do_execute_soon(run_test_7); + }); +} + +// Uninstalling a lightweight theme should not require a restart +function run_test_7() { + prepare_test({ + "1@personas.mozilla.org": [ + ["onUninstalling", false], + "onUninstalled" + ] + }); + + AddonManager.getAddonByID("1@personas.mozilla.org", function(p1) { + p1.uninstall(); + + ensure_test_completed(); + do_check_eq(LightweightThemeManager.usedThemes.length, 1); + do_check_false(gLWThemeChanged); + + do_execute_soon(run_test_8); + }); +} + +// Uninstalling a lightweight theme in use should not require a restart and it +// should reactivate the default theme +// Also, uninstalling a lightweight theme in use should send a +// "lightweight-theme-styling-update" notification through the observer service +function run_test_8() { + prepare_test({ + "2@personas.mozilla.org": [ + ["onUninstalling", false], + "onUninstalled" + ], + "default@tests.mozilla.org": [ + ["onEnabling", false], + "onEnabled" + ] + }); + + AddonManager.getAddonByID("2@personas.mozilla.org", function(p2) { + p2.uninstall(); + + ensure_test_completed(); + do_check_eq(LightweightThemeManager.usedThemes.length, 0); + + do_check_true(gLWThemeChanged); + gLWThemeChanged = false; + + do_execute_soon(run_test_9); + }); +} + +// Uninstalling a theme not in use should not require a restart +function run_test_9() { + AddonManager.getAddonByID("theme1@tests.mozilla.org", function(t1) { + prepare_test({ + "theme1@tests.mozilla.org": [ + ["onUninstalling", false], + "onUninstalled" + ] + }); + + t1.uninstall(); + + ensure_test_completed(); + + AddonManager.getAddonByID("theme1@tests.mozilla.org", function(newt1) { + do_check_eq(newt1, null); + do_check_false(gLWThemeChanged); + + do_execute_soon(run_test_10); + }); + }); +} + +// Uninstalling a custom theme in use should require a restart +function run_test_10() { + AddonManager.getAddonByID("theme2@tests.mozilla.org", callback_soon(function(oldt2) { + prepare_test({ + "theme2@tests.mozilla.org": [ + "onEnabling", + ], + "default@tests.mozilla.org": [ + "onDisabling" + ] + }); + + oldt2.userDisabled = false; + + ensure_test_completed(); + + restartManager(); + + AddonManager.getAddonsByIDs(["default@tests.mozilla.org", + "theme2@tests.mozilla.org"], function([d, t2]) { + do_check_true(t2.isActive); + do_check_false(t2.userDisabled); + do_check_false(t2.appDisabled); + do_check_false(d.isActive); + do_check_true(d.userDisabled); + do_check_false(d.appDisabled); + + prepare_test({ + "theme2@tests.mozilla.org": [ + "onUninstalling", + ], + "default@tests.mozilla.org": [ + "onEnabling" + ] + }); + + t2.uninstall(); + + ensure_test_completed(); + do_check_false(gLWThemeChanged); + + do_execute_soon(run_test_11); + }); + })); +} + +// Installing a custom theme not in use should not require a restart +function run_test_11() { + restartManager(); + + prepare_test({ }, [ + "onNewInstall" + ]); + + AddonManager.getInstallForFile(do_get_addon("test_theme"), function(install) { + ensure_test_completed(); + + do_check_neq(install, null); + do_check_eq(install.type, "theme"); + do_check_eq(install.version, "1.0"); + do_check_eq(install.name, "Test Theme 1"); + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); + do_check_true(install.addon.skinnable, true); + do_check_false(hasFlag(install.addon.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_INSTALL)); + + prepare_test({ + "theme1@tests.mozilla.org": [ + ["onInstalling", false], + "onInstalled" + ] + }, [ + "onInstallStarted", + "onInstallEnded", + ], check_test_11); + install.install(); + }); +} + +function check_test_11() { + AddonManager.getAddonByID("theme1@tests.mozilla.org", function(t1) { + do_check_neq(t1, null); + var previewSpec = do_get_addon_root_uri(profileDir, "theme1@tests.mozilla.org") + "preview.png"; + do_check_eq(t1.screenshots.length, 1); + do_check_eq(t1.screenshots[0], previewSpec); + do_check_true(t1.skinnable); + do_check_false(gLWThemeChanged); + + do_execute_soon(run_test_12); + }); +} + +// Updating a custom theme not in use should not require a restart +function run_test_12() { + prepare_test({ }, [ + "onNewInstall" + ]); + + AddonManager.getInstallForFile(do_get_addon("test_theme"), function(install) { + ensure_test_completed(); + + do_check_neq(install, null); + do_check_eq(install.type, "theme"); + do_check_eq(install.version, "1.0"); + do_check_eq(install.name, "Test Theme 1"); + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); + do_check_false(hasFlag(install.addon.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_INSTALL)); + + prepare_test({ + "theme1@tests.mozilla.org": [ + ["onInstalling", false], + "onInstalled" + ] + }, [ + "onInstallStarted", + "onInstallEnded", + ], check_test_12); + install.install(); + }); +} + +function check_test_12() { + AddonManager.getAddonByID("theme1@tests.mozilla.org", function(t1) { + do_check_neq(t1, null); + do_check_false(gLWThemeChanged); + + do_execute_soon(run_test_13); + }); +} + +// Updating a custom theme in use should require a restart +function run_test_13() { + AddonManager.getAddonByID("theme1@tests.mozilla.org", callback_soon(function(t1) { + prepare_test({ + "theme1@tests.mozilla.org": [ + "onEnabling", + ], + "default@tests.mozilla.org": [ + "onDisabling" + ] + }); + + t1.userDisabled = false; + ensure_test_completed(); + restartManager(); + + prepare_test({ }, [ + "onNewInstall" + ]); + + AddonManager.getInstallForFile(do_get_addon("test_theme"), function(install) { + ensure_test_completed(); + + do_check_neq(install, null); + do_check_eq(install.type, "theme"); + do_check_eq(install.version, "1.0"); + do_check_eq(install.name, "Test Theme 1"); + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); + do_check_true(hasFlag(install.addon.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_INSTALL)); + + prepare_test({ + "theme1@tests.mozilla.org": [ + "onInstalling", + ] + }, [ + "onInstallStarted", + "onInstallEnded", + ], callback_soon(check_test_13)); + install.install(); + }); + })); +} + +function check_test_13() { + restartManager(); + + AddonManager.getAddonByID("theme1@tests.mozilla.org", callback_soon(function(t1) { + do_check_neq(t1, null); + do_check_true(t1.isActive); + do_check_false(gLWThemeChanged); + t1.uninstall(); + restartManager(); + + do_execute_soon(run_test_14); + })); +} + +// Switching from a lightweight theme to the default theme should not require +// a restart +function run_test_14() { + LightweightThemeManager.currentTheme = { + id: "1", + version: "1", + name: "Test LW Theme", + description: "A test theme", + author: "Mozilla", + homepageURL: "http://localhost/data/index.html", + headerURL: "http://localhost/data/header.png", + footerURL: "http://localhost/data/footer.png", + previewURL: "http://localhost/data/preview.png", + iconURL: "http://localhost/data/icon.png" + }; + + AddonManager.getAddonByID("default@tests.mozilla.org", function(d) { + do_check_true(d.userDisabled); + do_check_false(d.isActive); + + prepare_test({ + "1@personas.mozilla.org": [ + ["onDisabling", false], + "onDisabled" + ], + "default@tests.mozilla.org": [ + ["onEnabling", false], + "onEnabled" + ] + }); + + d.userDisabled = false; + ensure_test_completed(); + + do_check_false(d.userDisabled); + do_check_true(d.isActive); + + do_check_true(gLWThemeChanged); + gLWThemeChanged = false; + + do_execute_soon(run_test_15); + }); +} + +// Upgrading the application with a custom theme in use should not disable it +function run_test_15() { + restartManager(); + + installAllFiles([do_get_addon("test_theme")], function() { + AddonManager.getAddonByID("theme1@tests.mozilla.org", callback_soon(function(t1) { + t1.userDisabled = false; + + restartManager(); + + do_check_eq(Services.prefs.getCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN), "theme1/1.0"); + AddonManager.getAddonsByIDs(["default@tests.mozilla.org", + "theme1@tests.mozilla.org"], + callback_soon(function([d, t1]) { + do_check_true(d.userDisabled); + do_check_false(d.appDisabled); + do_check_false(d.isActive); + + do_check_false(t1.userDisabled); + do_check_false(t1.appDisabled); + do_check_true(t1.isActive); + + restartManager("2"); + + do_check_eq(Services.prefs.getCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN), "theme1/1.0"); + AddonManager.getAddonsByIDs(["default@tests.mozilla.org", + "theme1@tests.mozilla.org"], function([d, t1]) { + do_check_true(d.userDisabled); + do_check_false(d.appDisabled); + do_check_false(d.isActive); + + do_check_false(t1.userDisabled); + do_check_false(t1.appDisabled); + do_check_true(t1.isActive); + + do_execute_soon(run_test_16); + }); + })); + })); + }); +} + +// Upgrading the application with a custom theme in use should disable it if it +// is no longer compatible +function run_test_16() { + restartManager("3"); + + do_check_eq(Services.prefs.getCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN), "classic/1.0"); + AddonManager.getAddonsByIDs(["default@tests.mozilla.org", + "theme1@tests.mozilla.org"], function([d, t1]) { + do_check_false(d.userDisabled); + do_check_false(d.appDisabled); + do_check_true(d.isActive); + + do_check_true(t1.userDisabled); + do_check_true(t1.appDisabled); + do_check_false(t1.isActive); + + do_execute_soon(run_test_17); + }); +} + +// Verifies that if the selected theme pref is changed by a different version +// of the application that we correctly reset it when it points to an +// incompatible theme +function run_test_17() { + restartManager("2"); + shutdownManager(); + + Services.prefs.setCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN, "theme1/1.0"); + + restartManager("3"); + + do_check_eq(Services.prefs.getCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN), "classic/1.0"); + AddonManager.getAddonsByIDs(["default@tests.mozilla.org", + "theme1@tests.mozilla.org"], function([d, t1]) { + do_check_false(d.userDisabled); + do_check_false(d.appDisabled); + do_check_true(d.isActive); + + do_check_true(t1.userDisabled); + do_check_true(t1.appDisabled); + do_check_false(t1.isActive); + + do_execute_soon(run_test_18); + }); +} + +// Disabling the active theme should switch back to the default theme +function run_test_18() { + restartManager(2); + + AddonManager.getAddonByID("theme1@tests.mozilla.org", callback_soon(function(t1) { + t1.userDisabled = false; + + restartManager(); + + AddonManager.getAddonsByIDs(["default@tests.mozilla.org", + "theme1@tests.mozilla.org"], + callback_soon(function([d, t1]) { + do_check_true(d.userDisabled); + do_check_false(d.appDisabled); + do_check_false(d.isActive); + + do_check_false(t1.userDisabled); + do_check_false(t1.appDisabled); + do_check_true(t1.isActive); + + prepare_test({ + "theme1@tests.mozilla.org": [ + "onDisabling", + ], + "default@tests.mozilla.org": [ + "onEnabling", + ] + }); + t1.userDisabled = true; + ensure_test_completed(); + + do_check_false(d.userDisabled); + do_check_false(d.appDisabled); + do_check_false(d.isActive); + + do_check_true(t1.userDisabled); + do_check_false(t1.appDisabled); + do_check_true(t1.isActive); + + restartManager(); + + AddonManager.getAddonsByIDs(["default@tests.mozilla.org", + "theme1@tests.mozilla.org"], function([d, t1]) { + do_check_false(d.userDisabled); + do_check_false(d.appDisabled); + do_check_true(d.isActive); + + do_check_true(t1.userDisabled); + do_check_false(t1.appDisabled); + do_check_false(t1.isActive); + + do_execute_soon(run_test_19); + }); + })); + })); +} + +// Disabling the active persona should switch back to the default theme +function run_test_19() { + AddonManager.getAddonsByIDs(["default@tests.mozilla.org", + "1@personas.mozilla.org"], function([d, p1]) { + p1.userDisabled = false; + + do_check_true(d.userDisabled); + do_check_false(d.appDisabled); + do_check_false(d.isActive); + + do_check_false(p1.userDisabled); + do_check_false(p1.appDisabled); + do_check_true(p1.isActive); + + prepare_test({ + "1@personas.mozilla.org": [ + ["onDisabling", false], + "onDisabled" + ], + "default@tests.mozilla.org": [ + ["onEnabling", false], + "onEnabled" + ] + }); + p1.userDisabled = true; + ensure_test_completed(); + + do_check_false(d.userDisabled); + do_check_false(d.appDisabled); + do_check_true(d.isActive); + + do_check_true(p1.userDisabled); + do_check_false(p1.appDisabled); + do_check_false(p1.isActive); + + do_execute_soon(run_test_20); + }); +} + +// Tests that you cannot disable the default theme +function run_test_20() { + AddonManager.getAddonByID("default@tests.mozilla.org", function(d) { + do_check_false(d.userDisabled); + do_check_false(d.appDisabled); + do_check_true(d.isActive); + + try { + d.userDisabled = true; + do_throw("Disabling the default theme should throw an exception"); + } + catch (e) { + } + + do_execute_soon(run_test_21); + }); +} + +// Tests that cached copies of a lightweight theme have the right permissions +// and pendingOperations during the onEnabling event +function run_test_21() { + AddonManager.getAddonByID("theme1@tests.mozilla.org", callback_soon(function(t1) { + // Switch to a custom theme so we can test pendingOperations properly. + + prepare_test({ + "theme1@tests.mozilla.org": [ + "onEnabling" + ], + "default@tests.mozilla.org": [ + "onDisabling" + ] + }); + + t1.userDisabled = false; + ensure_test_completed(); + + restartManager(); + + AddonManager.getAddonByID("1@personas.mozilla.org", function(p1) { + AddonManager.addAddonListener({ + onEnabling: function(aAddon) { + do_check_false(hasFlag(aAddon.permissions, AddonManager.PERM_CAN_ENABLE)); + do_check_true(hasFlag(aAddon.pendingOperations, AddonManager.PENDING_ENABLE)); + + do_check_eq(aAddon.permissions, p1.permissions); + do_check_eq(aAddon.pendingOperations, p1.pendingOperations); + } + }); + + prepare_test({ + "1@personas.mozilla.org": [ + "onEnabling" + ], + "theme1@tests.mozilla.org": [ + "onDisabling" + ] + }); + + p1.userDisabled = false; + ensure_test_completed(); + + end_test(); + }); + })); +} -- cgit v1.2.3