1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/mozapps/extensions/test/xpcshell/test_theme.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,1092 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ 1.6 + */ 1.7 + 1.8 +Components.utils.import("resource://gre/modules/NetUtil.jsm"); 1.9 + 1.10 +// The maximum allowable time since install. If an add-on claims to have been 1.11 +// installed longer ago than this the the test will fail. 1.12 +const MAX_INSTALL_TIME = 10000; 1.13 + 1.14 +// This verifies that themes behave as expected 1.15 + 1.16 +const PREF_GENERAL_SKINS_SELECTEDSKIN = "general.skins.selectedSkin"; 1.17 + 1.18 +Components.utils.import("resource://gre/modules/LightweightThemeManager.jsm"); 1.19 + 1.20 +const profileDir = gProfD.clone(); 1.21 +profileDir.append("extensions"); 1.22 + 1.23 +// Observer to ensure a "lightweight-theme-styling-update" notification is sent 1.24 +// when expected 1.25 +var gLWThemeChanged = false; 1.26 +var LightweightThemeObserver = { 1.27 + observe: function(aSubject, aTopic, aData) { 1.28 + if (aTopic != "lightweight-theme-styling-update") 1.29 + return; 1.30 + 1.31 + gLWThemeChanged = true; 1.32 + } 1.33 +}; 1.34 + 1.35 +AM_Cc["@mozilla.org/observer-service;1"] 1.36 + .getService(Components.interfaces.nsIObserverService) 1.37 + .addObserver(LightweightThemeObserver, "lightweight-theme-styling-update", false); 1.38 + 1.39 + 1.40 +function run_test() { 1.41 + do_test_pending(); 1.42 + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); 1.43 + 1.44 + Services.prefs.setCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN, "theme1/1.0"); 1.45 + writeInstallRDFForExtension({ 1.46 + id: "theme1@tests.mozilla.org", 1.47 + version: "1.0", 1.48 + name: "Test 1", 1.49 + type: 4, 1.50 + skinnable: true, 1.51 + internalName: "theme1/1.0", 1.52 + targetApplications: [{ 1.53 + id: "xpcshell@tests.mozilla.org", 1.54 + minVersion: "1", 1.55 + maxVersion: "2" 1.56 + }] 1.57 + }, profileDir); 1.58 + 1.59 + writeInstallRDFForExtension({ 1.60 + id: "theme2@tests.mozilla.org", 1.61 + version: "1.0", 1.62 + name: "Test 1", 1.63 + skinnable: false, 1.64 + internalName: "theme2/1.0", 1.65 + targetApplications: [{ 1.66 + id: "xpcshell@tests.mozilla.org", 1.67 + minVersion: "1", 1.68 + maxVersion: "2" 1.69 + }] 1.70 + }, profileDir); 1.71 + 1.72 + // We need a default theme for some of these things to work but we have hidden 1.73 + // the one in the application directory. 1.74 + writeInstallRDFForExtension({ 1.75 + id: "default@tests.mozilla.org", 1.76 + version: "1.0", 1.77 + name: "Default", 1.78 + internalName: "classic/1.0", 1.79 + targetApplications: [{ 1.80 + id: "xpcshell@tests.mozilla.org", 1.81 + minVersion: "1", 1.82 + maxVersion: "2" 1.83 + }] 1.84 + }, profileDir); 1.85 + 1.86 + startupManager(); 1.87 + // Make sure we only register once despite multiple calls 1.88 + AddonManager.addInstallListener(InstallListener); 1.89 + AddonManager.addAddonListener(AddonListener); 1.90 + AddonManager.addInstallListener(InstallListener); 1.91 + AddonManager.addAddonListener(AddonListener); 1.92 + AddonManager.addInstallListener(InstallListener); 1.93 + 1.94 + AddonManager.getAddonsByIDs(["default@tests.mozilla.org", 1.95 + "theme1@tests.mozilla.org", 1.96 + "theme2@tests.mozilla.org"], 1.97 + function([d, t1, t2]) { 1.98 + do_check_neq(d, null); 1.99 + do_check_false(d.skinnable); 1.100 + do_check_false(d.foreignInstall); 1.101 + 1.102 + do_check_neq(t1, null); 1.103 + do_check_false(t1.userDisabled); 1.104 + do_check_false(t1.appDisabled); 1.105 + do_check_true(t1.isActive); 1.106 + do_check_true(t1.skinnable); 1.107 + do_check_true(t1.foreignInstall); 1.108 + do_check_eq(t1.screenshots, null); 1.109 + do_check_true(isThemeInAddonsList(profileDir, t1.id)); 1.110 + do_check_false(hasFlag(t1.permissions, AddonManager.PERM_CAN_DISABLE)); 1.111 + do_check_false(hasFlag(t1.permissions, AddonManager.PERM_CAN_ENABLE)); 1.112 + do_check_eq(t1.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_UNINSTALL | 1.113 + AddonManager.OP_NEEDS_RESTART_DISABLE); 1.114 + 1.115 + do_check_neq(t2, null); 1.116 + do_check_true(t2.userDisabled); 1.117 + do_check_false(t2.appDisabled); 1.118 + do_check_false(t2.isActive); 1.119 + do_check_false(t2.skinnable); 1.120 + do_check_true(t2.foreignInstall); 1.121 + do_check_eq(t2.screenshots, null); 1.122 + do_check_false(isThemeInAddonsList(profileDir, t2.id)); 1.123 + do_check_false(hasFlag(t2.permissions, AddonManager.PERM_CAN_DISABLE)); 1.124 + do_check_true(hasFlag(t2.permissions, AddonManager.PERM_CAN_ENABLE)); 1.125 + do_check_eq(t2.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_ENABLE); 1.126 + 1.127 + do_execute_soon(run_test_1); 1.128 + }); 1.129 +} 1.130 + 1.131 +function end_test() { 1.132 + do_execute_soon(do_test_finished); 1.133 +} 1.134 + 1.135 +// Checks enabling one theme disables the others 1.136 +function run_test_1() { 1.137 + prepare_test({ 1.138 + "theme1@tests.mozilla.org": [ 1.139 + "onDisabling" 1.140 + ], 1.141 + "theme2@tests.mozilla.org": [ 1.142 + "onEnabling" 1.143 + ] 1.144 + }); 1.145 + AddonManager.getAddonsByIDs(["theme1@tests.mozilla.org", 1.146 + "theme2@tests.mozilla.org"], function([t1, t2]) { 1.147 + t2.userDisabled = false; 1.148 + 1.149 + ensure_test_completed(); 1.150 + do_check_false(hasFlag(t2.permissions, AddonManager.PERM_CAN_DISABLE)); 1.151 + do_check_false(hasFlag(t2.permissions, AddonManager.PERM_CAN_ENABLE)); 1.152 + 1.153 + do_check_true(t1.userDisabled); 1.154 + do_check_false(hasFlag(t1.permissions, AddonManager.PERM_CAN_DISABLE)); 1.155 + do_check_true(hasFlag(t1.permissions, AddonManager.PERM_CAN_ENABLE)); 1.156 + 1.157 + do_execute_soon(check_test_1); 1.158 + }); 1.159 +} 1.160 + 1.161 +function check_test_1() { 1.162 + restartManager(); 1.163 + do_check_eq(Services.prefs.getCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN), "theme2/1.0"); 1.164 + 1.165 + AddonManager.getAddonsByIDs(["theme1@tests.mozilla.org", 1.166 + "theme2@tests.mozilla.org"], function([t1, t2]) { 1.167 + do_check_neq(t1, null); 1.168 + do_check_true(t1.userDisabled); 1.169 + do_check_false(t1.appDisabled); 1.170 + do_check_false(t1.isActive); 1.171 + do_check_false(isThemeInAddonsList(profileDir, t1.id)); 1.172 + do_check_false(hasFlag(t1.permissions, AddonManager.PERM_CAN_DISABLE)); 1.173 + do_check_true(hasFlag(t1.permissions, AddonManager.PERM_CAN_ENABLE)); 1.174 + do_check_eq(t1.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_ENABLE); 1.175 + 1.176 + do_check_neq(t2, null); 1.177 + do_check_false(t2.userDisabled); 1.178 + do_check_false(t2.appDisabled); 1.179 + do_check_true(t2.isActive); 1.180 + do_check_true(isThemeInAddonsList(profileDir, t2.id)); 1.181 + do_check_false(hasFlag(t2.permissions, AddonManager.PERM_CAN_DISABLE)); 1.182 + do_check_false(hasFlag(t2.permissions, AddonManager.PERM_CAN_ENABLE)); 1.183 + do_check_eq(t2.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_UNINSTALL | 1.184 + AddonManager.OP_NEEDS_RESTART_DISABLE); 1.185 + do_check_false(gLWThemeChanged); 1.186 + 1.187 + do_execute_soon(run_test_2); 1.188 + }); 1.189 +} 1.190 + 1.191 +// Removing the active theme should fall back to the default (not ideal in this 1.192 +// case since we don't have the default theme installed) 1.193 +function run_test_2() { 1.194 + var dest = profileDir.clone(); 1.195 + dest.append(do_get_expected_addon_name("theme2@tests.mozilla.org")); 1.196 + dest.remove(true); 1.197 + 1.198 + restartManager(); 1.199 + do_check_eq(Services.prefs.getCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN), "classic/1.0"); 1.200 + 1.201 + AddonManager.getAddonsByIDs(["theme1@tests.mozilla.org", 1.202 + "theme2@tests.mozilla.org"], function([t1, t2]) { 1.203 + do_check_neq(t1, null); 1.204 + do_check_true(t1.userDisabled); 1.205 + do_check_false(t1.appDisabled); 1.206 + do_check_false(t1.isActive); 1.207 + do_check_false(isThemeInAddonsList(profileDir, t1.id)); 1.208 + do_check_false(hasFlag(t1.permissions, AddonManager.PERM_CAN_DISABLE)); 1.209 + do_check_true(hasFlag(t1.permissions, AddonManager.PERM_CAN_ENABLE)); 1.210 + 1.211 + do_check_eq(t2, null); 1.212 + do_check_false(isThemeInAddonsList(profileDir, "theme2@tests.mozilla.org")); 1.213 + do_check_false(gLWThemeChanged); 1.214 + 1.215 + do_execute_soon(run_test_3); 1.216 + }); 1.217 +} 1.218 + 1.219 +// Installing a lightweight theme should happen instantly and disable the default theme 1.220 +function run_test_3() { 1.221 + writeInstallRDFForExtension({ 1.222 + id: "theme2@tests.mozilla.org", 1.223 + version: "1.0", 1.224 + name: "Test 1", 1.225 + internalName: "theme2/1.0", 1.226 + targetApplications: [{ 1.227 + id: "xpcshell@tests.mozilla.org", 1.228 + minVersion: "1", 1.229 + maxVersion: "2" 1.230 + }] 1.231 + }, profileDir); 1.232 + restartManager(); 1.233 + 1.234 + prepare_test({ 1.235 + "1@personas.mozilla.org": [ 1.236 + ["onInstalling", false], 1.237 + "onInstalled", 1.238 + ["onEnabling", false], 1.239 + "onEnabled" 1.240 + ], 1.241 + "default@tests.mozilla.org": [ 1.242 + ["onDisabling", false], 1.243 + "onDisabled", 1.244 + ] 1.245 + }, [ 1.246 + "onExternalInstall" 1.247 + ]); 1.248 + 1.249 + LightweightThemeManager.currentTheme = { 1.250 + id: "1", 1.251 + version: "1", 1.252 + name: "Test LW Theme", 1.253 + description: "A test theme", 1.254 + author: "Mozilla", 1.255 + homepageURL: "http://localhost/data/index.html", 1.256 + headerURL: "http://localhost/data/header.png", 1.257 + footerURL: "http://localhost/data/footer.png", 1.258 + previewURL: "http://localhost/data/preview.png", 1.259 + iconURL: "http://localhost/data/icon.png" 1.260 + }; 1.261 + 1.262 + ensure_test_completed(); 1.263 + 1.264 + AddonManager.getAddonByID("1@personas.mozilla.org", function(p1) { 1.265 + do_check_neq(null, p1); 1.266 + do_check_eq(p1.name, "Test LW Theme"); 1.267 + do_check_eq(p1.version, "1"); 1.268 + do_check_eq(p1.type, "theme"); 1.269 + do_check_eq(p1.description, "A test theme"); 1.270 + do_check_eq(p1.creator, "Mozilla"); 1.271 + do_check_eq(p1.homepageURL, "http://localhost/data/index.html"); 1.272 + do_check_eq(p1.iconURL, "http://localhost/data/icon.png"); 1.273 + do_check_eq(p1.screenshots.length, 1); 1.274 + do_check_eq(p1.screenshots[0], "http://localhost/data/preview.png"); 1.275 + do_check_false(p1.appDisabled); 1.276 + do_check_false(p1.userDisabled); 1.277 + do_check_true(p1.isCompatible); 1.278 + do_check_true(p1.providesUpdatesSecurely); 1.279 + do_check_eq(p1.blocklistState, 0); 1.280 + do_check_true(p1.isActive); 1.281 + do_check_eq(p1.pendingOperations, 0); 1.282 + do_check_eq(p1.permissions, AddonManager.PERM_CAN_UNINSTALL | AddonManager.PERM_CAN_DISABLE); 1.283 + do_check_eq(p1.scope, AddonManager.SCOPE_PROFILE); 1.284 + do_check_true("isCompatibleWith" in p1); 1.285 + do_check_true("findUpdates" in p1); 1.286 + do_check_eq(p1.installDate.getTime(), p1.updateDate.getTime()); 1.287 + 1.288 + // Should have been installed sometime in the last few seconds. 1.289 + let difference = Date.now() - p1.installDate.getTime(); 1.290 + if (difference > MAX_INSTALL_TIME) 1.291 + do_throw("Add-on was installed " + difference + "ms ago"); 1.292 + else if (difference < 0) 1.293 + do_throw("Add-on was installed " + difference + "ms in the future"); 1.294 + 1.295 + AddonManager.getAddonsByTypes(["theme"], function(addons) { 1.296 + let seen = false; 1.297 + addons.forEach(function(a) { 1.298 + if (a.id == "1@personas.mozilla.org") { 1.299 + seen = true; 1.300 + } 1.301 + else { 1.302 + dump("Checking theme " + a.id + "\n"); 1.303 + do_check_false(a.isActive); 1.304 + do_check_true(a.userDisabled); 1.305 + } 1.306 + }); 1.307 + do_check_true(seen); 1.308 + 1.309 + do_check_true(gLWThemeChanged); 1.310 + gLWThemeChanged = false; 1.311 + 1.312 + do_execute_soon(run_test_4); 1.313 + }); 1.314 + }); 1.315 +} 1.316 + 1.317 +// Installing a second lightweight theme should disable the first with no restart 1.318 +function run_test_4() { 1.319 + prepare_test({ 1.320 + "1@personas.mozilla.org": [ 1.321 + ["onDisabling", false], 1.322 + "onDisabled", 1.323 + ], 1.324 + "2@personas.mozilla.org": [ 1.325 + ["onInstalling", false], 1.326 + "onInstalled", 1.327 + ["onEnabling", false], 1.328 + "onEnabled" 1.329 + ] 1.330 + }, [ 1.331 + "onExternalInstall" 1.332 + ]); 1.333 + 1.334 + LightweightThemeManager.currentTheme = { 1.335 + id: "2", 1.336 + version: "1", 1.337 + name: "Test LW Theme", 1.338 + description: "A second test theme", 1.339 + author: "Mozilla", 1.340 + homepageURL: "http://localhost/data/index.html", 1.341 + headerURL: "http://localhost/data/header.png", 1.342 + footerURL: "http://localhost/data/footer.png", 1.343 + previewURL: "http://localhost/data/preview.png", 1.344 + iconURL: "http://localhost/data/icon.png" 1.345 + }; 1.346 + 1.347 + ensure_test_completed(); 1.348 + 1.349 + AddonManager.getAddonsByIDs(["1@personas.mozilla.org", 1.350 + "2@personas.mozilla.org"], function([p1, p2]) { 1.351 + do_check_neq(null, p2); 1.352 + do_check_false(p2.appDisabled); 1.353 + do_check_false(p2.userDisabled); 1.354 + do_check_true(p2.isActive); 1.355 + do_check_eq(p2.pendingOperations, 0); 1.356 + do_check_eq(p2.permissions, AddonManager.PERM_CAN_UNINSTALL | AddonManager.PERM_CAN_DISABLE); 1.357 + do_check_eq(p2.installDate.getTime(), p2.updateDate.getTime()); 1.358 + 1.359 + // Should have been installed sometime in the last few seconds. 1.360 + let difference = Date.now() - p2.installDate.getTime(); 1.361 + if (difference > MAX_INSTALL_TIME) 1.362 + do_throw("Add-on was installed " + difference + "ms ago"); 1.363 + else if (difference < 0) 1.364 + do_throw("Add-on was installed " + difference + "ms in the future"); 1.365 + 1.366 + do_check_neq(null, p1); 1.367 + do_check_false(p1.appDisabled); 1.368 + do_check_true(p1.userDisabled); 1.369 + do_check_false(p1.isActive); 1.370 + do_check_eq(p1.pendingOperations, 0); 1.371 + do_check_eq(p1.permissions, AddonManager.PERM_CAN_UNINSTALL | AddonManager.PERM_CAN_ENABLE); 1.372 + 1.373 + AddonManager.getAddonsByTypes(["theme"], function(addons) { 1.374 + let seen = false; 1.375 + addons.forEach(function(a) { 1.376 + if (a.id == "2@personas.mozilla.org") { 1.377 + seen = true; 1.378 + } 1.379 + else { 1.380 + dump("Checking theme " + a.id + "\n"); 1.381 + do_check_false(a.isActive); 1.382 + do_check_true(a.userDisabled); 1.383 + } 1.384 + }); 1.385 + do_check_true(seen); 1.386 + 1.387 + do_check_true(gLWThemeChanged); 1.388 + gLWThemeChanged = false; 1.389 + 1.390 + do_execute_soon(run_test_5); 1.391 + }); 1.392 + }); 1.393 +} 1.394 + 1.395 +// Switching to a custom theme should disable the lightweight theme and require 1.396 +// a restart. Cancelling that should also be possible. 1.397 +function run_test_5() { 1.398 + prepare_test({ 1.399 + "2@personas.mozilla.org": [ 1.400 + "onDisabling", 1.401 + ], 1.402 + "theme2@tests.mozilla.org": [ 1.403 + "onEnabling" 1.404 + ] 1.405 + }); 1.406 + 1.407 + AddonManager.getAddonsByIDs(["2@personas.mozilla.org", 1.408 + "theme2@tests.mozilla.org"], function([p2, t2]) { 1.409 + t2.userDisabled = false; 1.410 + 1.411 + ensure_test_completed(); 1.412 + 1.413 + prepare_test({ 1.414 + "2@personas.mozilla.org": [ 1.415 + "onOperationCancelled", 1.416 + ], 1.417 + "theme2@tests.mozilla.org": [ 1.418 + "onOperationCancelled" 1.419 + ] 1.420 + }); 1.421 + 1.422 + p2.userDisabled = false; 1.423 + 1.424 + ensure_test_completed(); 1.425 + 1.426 + prepare_test({ 1.427 + "2@personas.mozilla.org": [ 1.428 + "onDisabling", 1.429 + ], 1.430 + "theme2@tests.mozilla.org": [ 1.431 + "onEnabling" 1.432 + ] 1.433 + }); 1.434 + 1.435 + t2.userDisabled = false; 1.436 + 1.437 + ensure_test_completed(); 1.438 + 1.439 + do_check_false(t2.isActive); 1.440 + do_check_false(t2.userDisabled); 1.441 + do_check_true(hasFlag(AddonManager.PENDING_ENABLE, t2.pendingOperations)); 1.442 + do_check_true(p2.isActive); 1.443 + do_check_true(p2.userDisabled); 1.444 + do_check_true(hasFlag(AddonManager.PENDING_DISABLE, p2.pendingOperations)); 1.445 + do_check_true(hasFlag(AddonManager.PERM_CAN_ENABLE, p2.permissions)); 1.446 + do_check_false(gLWThemeChanged); 1.447 + 1.448 + do_execute_soon(check_test_5); 1.449 + }); 1.450 +} 1.451 + 1.452 +function check_test_5() { 1.453 + restartManager(); 1.454 + 1.455 + AddonManager.getAddonsByIDs(["2@personas.mozilla.org", 1.456 + "theme2@tests.mozilla.org"], function([p2, t2]) { 1.457 + do_check_true(t2.isActive); 1.458 + do_check_false(t2.userDisabled); 1.459 + do_check_false(hasFlag(AddonManager.PENDING_ENABLE, t2.pendingOperations)); 1.460 + do_check_false(p2.isActive); 1.461 + do_check_true(p2.userDisabled); 1.462 + do_check_false(hasFlag(AddonManager.PENDING_DISABLE, p2.pendingOperations)); 1.463 + 1.464 + do_check_true(gLWThemeChanged); 1.465 + gLWThemeChanged = false; 1.466 + 1.467 + do_execute_soon(run_test_6); 1.468 + }); 1.469 +} 1.470 + 1.471 +// Switching from a custom theme to a lightweight theme should require a restart 1.472 +function run_test_6() { 1.473 + prepare_test({ 1.474 + "2@personas.mozilla.org": [ 1.475 + "onEnabling", 1.476 + ], 1.477 + "theme2@tests.mozilla.org": [ 1.478 + "onDisabling" 1.479 + ] 1.480 + }); 1.481 + 1.482 + AddonManager.getAddonsByIDs(["2@personas.mozilla.org", 1.483 + "theme2@tests.mozilla.org"], function([p2, t2]) { 1.484 + p2.userDisabled = false; 1.485 + 1.486 + ensure_test_completed(); 1.487 + 1.488 + prepare_test({ 1.489 + "2@personas.mozilla.org": [ 1.490 + "onOperationCancelled", 1.491 + ], 1.492 + "theme2@tests.mozilla.org": [ 1.493 + "onOperationCancelled" 1.494 + ] 1.495 + }); 1.496 + 1.497 + t2.userDisabled = false; 1.498 + 1.499 + ensure_test_completed(); 1.500 + 1.501 + prepare_test({ 1.502 + "2@personas.mozilla.org": [ 1.503 + "onEnabling", 1.504 + ], 1.505 + "theme2@tests.mozilla.org": [ 1.506 + "onDisabling" 1.507 + ] 1.508 + }); 1.509 + 1.510 + p2.userDisabled = false; 1.511 + 1.512 + ensure_test_completed(); 1.513 + 1.514 + do_check_false(p2.isActive); 1.515 + do_check_false(p2.userDisabled); 1.516 + do_check_true(hasFlag(AddonManager.PENDING_ENABLE, p2.pendingOperations)); 1.517 + do_check_true(t2.isActive); 1.518 + do_check_true(t2.userDisabled); 1.519 + do_check_true(hasFlag(AddonManager.PENDING_DISABLE, t2.pendingOperations)); 1.520 + do_check_false(gLWThemeChanged); 1.521 + 1.522 + do_execute_soon(check_test_6); 1.523 + }); 1.524 +} 1.525 + 1.526 +function check_test_6() { 1.527 + restartManager(); 1.528 + 1.529 + AddonManager.getAddonsByIDs(["2@personas.mozilla.org", 1.530 + "theme2@tests.mozilla.org"], function([p2, t2]) { 1.531 + do_check_true(p2.isActive); 1.532 + do_check_false(p2.userDisabled); 1.533 + do_check_false(hasFlag(AddonManager.PENDING_ENABLE, p2.pendingOperations)); 1.534 + do_check_false(t2.isActive); 1.535 + do_check_true(t2.userDisabled); 1.536 + do_check_false(hasFlag(AddonManager.PENDING_DISABLE, t2.pendingOperations)); 1.537 + 1.538 + do_check_true(gLWThemeChanged); 1.539 + gLWThemeChanged = false; 1.540 + 1.541 + do_execute_soon(run_test_7); 1.542 + }); 1.543 +} 1.544 + 1.545 +// Uninstalling a lightweight theme should not require a restart 1.546 +function run_test_7() { 1.547 + prepare_test({ 1.548 + "1@personas.mozilla.org": [ 1.549 + ["onUninstalling", false], 1.550 + "onUninstalled" 1.551 + ] 1.552 + }); 1.553 + 1.554 + AddonManager.getAddonByID("1@personas.mozilla.org", function(p1) { 1.555 + p1.uninstall(); 1.556 + 1.557 + ensure_test_completed(); 1.558 + do_check_eq(LightweightThemeManager.usedThemes.length, 1); 1.559 + do_check_false(gLWThemeChanged); 1.560 + 1.561 + do_execute_soon(run_test_8); 1.562 + }); 1.563 +} 1.564 + 1.565 +// Uninstalling a lightweight theme in use should not require a restart and it 1.566 +// should reactivate the default theme 1.567 +// Also, uninstalling a lightweight theme in use should send a 1.568 +// "lightweight-theme-styling-update" notification through the observer service 1.569 +function run_test_8() { 1.570 + prepare_test({ 1.571 + "2@personas.mozilla.org": [ 1.572 + ["onUninstalling", false], 1.573 + "onUninstalled" 1.574 + ], 1.575 + "default@tests.mozilla.org": [ 1.576 + ["onEnabling", false], 1.577 + "onEnabled" 1.578 + ] 1.579 + }); 1.580 + 1.581 + AddonManager.getAddonByID("2@personas.mozilla.org", function(p2) { 1.582 + p2.uninstall(); 1.583 + 1.584 + ensure_test_completed(); 1.585 + do_check_eq(LightweightThemeManager.usedThemes.length, 0); 1.586 + 1.587 + do_check_true(gLWThemeChanged); 1.588 + gLWThemeChanged = false; 1.589 + 1.590 + do_execute_soon(run_test_9); 1.591 + }); 1.592 +} 1.593 + 1.594 +// Uninstalling a theme not in use should not require a restart 1.595 +function run_test_9() { 1.596 + AddonManager.getAddonByID("theme1@tests.mozilla.org", function(t1) { 1.597 + prepare_test({ 1.598 + "theme1@tests.mozilla.org": [ 1.599 + ["onUninstalling", false], 1.600 + "onUninstalled" 1.601 + ] 1.602 + }); 1.603 + 1.604 + t1.uninstall(); 1.605 + 1.606 + ensure_test_completed(); 1.607 + 1.608 + AddonManager.getAddonByID("theme1@tests.mozilla.org", function(newt1) { 1.609 + do_check_eq(newt1, null); 1.610 + do_check_false(gLWThemeChanged); 1.611 + 1.612 + do_execute_soon(run_test_10); 1.613 + }); 1.614 + }); 1.615 +} 1.616 + 1.617 +// Uninstalling a custom theme in use should require a restart 1.618 +function run_test_10() { 1.619 + AddonManager.getAddonByID("theme2@tests.mozilla.org", callback_soon(function(oldt2) { 1.620 + prepare_test({ 1.621 + "theme2@tests.mozilla.org": [ 1.622 + "onEnabling", 1.623 + ], 1.624 + "default@tests.mozilla.org": [ 1.625 + "onDisabling" 1.626 + ] 1.627 + }); 1.628 + 1.629 + oldt2.userDisabled = false; 1.630 + 1.631 + ensure_test_completed(); 1.632 + 1.633 + restartManager(); 1.634 + 1.635 + AddonManager.getAddonsByIDs(["default@tests.mozilla.org", 1.636 + "theme2@tests.mozilla.org"], function([d, t2]) { 1.637 + do_check_true(t2.isActive); 1.638 + do_check_false(t2.userDisabled); 1.639 + do_check_false(t2.appDisabled); 1.640 + do_check_false(d.isActive); 1.641 + do_check_true(d.userDisabled); 1.642 + do_check_false(d.appDisabled); 1.643 + 1.644 + prepare_test({ 1.645 + "theme2@tests.mozilla.org": [ 1.646 + "onUninstalling", 1.647 + ], 1.648 + "default@tests.mozilla.org": [ 1.649 + "onEnabling" 1.650 + ] 1.651 + }); 1.652 + 1.653 + t2.uninstall(); 1.654 + 1.655 + ensure_test_completed(); 1.656 + do_check_false(gLWThemeChanged); 1.657 + 1.658 + do_execute_soon(run_test_11); 1.659 + }); 1.660 + })); 1.661 +} 1.662 + 1.663 +// Installing a custom theme not in use should not require a restart 1.664 +function run_test_11() { 1.665 + restartManager(); 1.666 + 1.667 + prepare_test({ }, [ 1.668 + "onNewInstall" 1.669 + ]); 1.670 + 1.671 + AddonManager.getInstallForFile(do_get_addon("test_theme"), function(install) { 1.672 + ensure_test_completed(); 1.673 + 1.674 + do_check_neq(install, null); 1.675 + do_check_eq(install.type, "theme"); 1.676 + do_check_eq(install.version, "1.0"); 1.677 + do_check_eq(install.name, "Test Theme 1"); 1.678 + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); 1.679 + do_check_true(install.addon.skinnable, true); 1.680 + do_check_false(hasFlag(install.addon.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_INSTALL)); 1.681 + 1.682 + prepare_test({ 1.683 + "theme1@tests.mozilla.org": [ 1.684 + ["onInstalling", false], 1.685 + "onInstalled" 1.686 + ] 1.687 + }, [ 1.688 + "onInstallStarted", 1.689 + "onInstallEnded", 1.690 + ], check_test_11); 1.691 + install.install(); 1.692 + }); 1.693 +} 1.694 + 1.695 +function check_test_11() { 1.696 + AddonManager.getAddonByID("theme1@tests.mozilla.org", function(t1) { 1.697 + do_check_neq(t1, null); 1.698 + var previewSpec = do_get_addon_root_uri(profileDir, "theme1@tests.mozilla.org") + "preview.png"; 1.699 + do_check_eq(t1.screenshots.length, 1); 1.700 + do_check_eq(t1.screenshots[0], previewSpec); 1.701 + do_check_true(t1.skinnable); 1.702 + do_check_false(gLWThemeChanged); 1.703 + 1.704 + do_execute_soon(run_test_12); 1.705 + }); 1.706 +} 1.707 + 1.708 +// Updating a custom theme not in use should not require a restart 1.709 +function run_test_12() { 1.710 + prepare_test({ }, [ 1.711 + "onNewInstall" 1.712 + ]); 1.713 + 1.714 + AddonManager.getInstallForFile(do_get_addon("test_theme"), function(install) { 1.715 + ensure_test_completed(); 1.716 + 1.717 + do_check_neq(install, null); 1.718 + do_check_eq(install.type, "theme"); 1.719 + do_check_eq(install.version, "1.0"); 1.720 + do_check_eq(install.name, "Test Theme 1"); 1.721 + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); 1.722 + do_check_false(hasFlag(install.addon.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_INSTALL)); 1.723 + 1.724 + prepare_test({ 1.725 + "theme1@tests.mozilla.org": [ 1.726 + ["onInstalling", false], 1.727 + "onInstalled" 1.728 + ] 1.729 + }, [ 1.730 + "onInstallStarted", 1.731 + "onInstallEnded", 1.732 + ], check_test_12); 1.733 + install.install(); 1.734 + }); 1.735 +} 1.736 + 1.737 +function check_test_12() { 1.738 + AddonManager.getAddonByID("theme1@tests.mozilla.org", function(t1) { 1.739 + do_check_neq(t1, null); 1.740 + do_check_false(gLWThemeChanged); 1.741 + 1.742 + do_execute_soon(run_test_13); 1.743 + }); 1.744 +} 1.745 + 1.746 +// Updating a custom theme in use should require a restart 1.747 +function run_test_13() { 1.748 + AddonManager.getAddonByID("theme1@tests.mozilla.org", callback_soon(function(t1) { 1.749 + prepare_test({ 1.750 + "theme1@tests.mozilla.org": [ 1.751 + "onEnabling", 1.752 + ], 1.753 + "default@tests.mozilla.org": [ 1.754 + "onDisabling" 1.755 + ] 1.756 + }); 1.757 + 1.758 + t1.userDisabled = false; 1.759 + ensure_test_completed(); 1.760 + restartManager(); 1.761 + 1.762 + prepare_test({ }, [ 1.763 + "onNewInstall" 1.764 + ]); 1.765 + 1.766 + AddonManager.getInstallForFile(do_get_addon("test_theme"), function(install) { 1.767 + ensure_test_completed(); 1.768 + 1.769 + do_check_neq(install, null); 1.770 + do_check_eq(install.type, "theme"); 1.771 + do_check_eq(install.version, "1.0"); 1.772 + do_check_eq(install.name, "Test Theme 1"); 1.773 + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); 1.774 + do_check_true(hasFlag(install.addon.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_INSTALL)); 1.775 + 1.776 + prepare_test({ 1.777 + "theme1@tests.mozilla.org": [ 1.778 + "onInstalling", 1.779 + ] 1.780 + }, [ 1.781 + "onInstallStarted", 1.782 + "onInstallEnded", 1.783 + ], callback_soon(check_test_13)); 1.784 + install.install(); 1.785 + }); 1.786 + })); 1.787 +} 1.788 + 1.789 +function check_test_13() { 1.790 + restartManager(); 1.791 + 1.792 + AddonManager.getAddonByID("theme1@tests.mozilla.org", callback_soon(function(t1) { 1.793 + do_check_neq(t1, null); 1.794 + do_check_true(t1.isActive); 1.795 + do_check_false(gLWThemeChanged); 1.796 + t1.uninstall(); 1.797 + restartManager(); 1.798 + 1.799 + do_execute_soon(run_test_14); 1.800 + })); 1.801 +} 1.802 + 1.803 +// Switching from a lightweight theme to the default theme should not require 1.804 +// a restart 1.805 +function run_test_14() { 1.806 + LightweightThemeManager.currentTheme = { 1.807 + id: "1", 1.808 + version: "1", 1.809 + name: "Test LW Theme", 1.810 + description: "A test theme", 1.811 + author: "Mozilla", 1.812 + homepageURL: "http://localhost/data/index.html", 1.813 + headerURL: "http://localhost/data/header.png", 1.814 + footerURL: "http://localhost/data/footer.png", 1.815 + previewURL: "http://localhost/data/preview.png", 1.816 + iconURL: "http://localhost/data/icon.png" 1.817 + }; 1.818 + 1.819 + AddonManager.getAddonByID("default@tests.mozilla.org", function(d) { 1.820 + do_check_true(d.userDisabled); 1.821 + do_check_false(d.isActive); 1.822 + 1.823 + prepare_test({ 1.824 + "1@personas.mozilla.org": [ 1.825 + ["onDisabling", false], 1.826 + "onDisabled" 1.827 + ], 1.828 + "default@tests.mozilla.org": [ 1.829 + ["onEnabling", false], 1.830 + "onEnabled" 1.831 + ] 1.832 + }); 1.833 + 1.834 + d.userDisabled = false; 1.835 + ensure_test_completed(); 1.836 + 1.837 + do_check_false(d.userDisabled); 1.838 + do_check_true(d.isActive); 1.839 + 1.840 + do_check_true(gLWThemeChanged); 1.841 + gLWThemeChanged = false; 1.842 + 1.843 + do_execute_soon(run_test_15); 1.844 + }); 1.845 +} 1.846 + 1.847 +// Upgrading the application with a custom theme in use should not disable it 1.848 +function run_test_15() { 1.849 + restartManager(); 1.850 + 1.851 + installAllFiles([do_get_addon("test_theme")], function() { 1.852 + AddonManager.getAddonByID("theme1@tests.mozilla.org", callback_soon(function(t1) { 1.853 + t1.userDisabled = false; 1.854 + 1.855 + restartManager(); 1.856 + 1.857 + do_check_eq(Services.prefs.getCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN), "theme1/1.0"); 1.858 + AddonManager.getAddonsByIDs(["default@tests.mozilla.org", 1.859 + "theme1@tests.mozilla.org"], 1.860 + callback_soon(function([d, t1]) { 1.861 + do_check_true(d.userDisabled); 1.862 + do_check_false(d.appDisabled); 1.863 + do_check_false(d.isActive); 1.864 + 1.865 + do_check_false(t1.userDisabled); 1.866 + do_check_false(t1.appDisabled); 1.867 + do_check_true(t1.isActive); 1.868 + 1.869 + restartManager("2"); 1.870 + 1.871 + do_check_eq(Services.prefs.getCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN), "theme1/1.0"); 1.872 + AddonManager.getAddonsByIDs(["default@tests.mozilla.org", 1.873 + "theme1@tests.mozilla.org"], function([d, t1]) { 1.874 + do_check_true(d.userDisabled); 1.875 + do_check_false(d.appDisabled); 1.876 + do_check_false(d.isActive); 1.877 + 1.878 + do_check_false(t1.userDisabled); 1.879 + do_check_false(t1.appDisabled); 1.880 + do_check_true(t1.isActive); 1.881 + 1.882 + do_execute_soon(run_test_16); 1.883 + }); 1.884 + })); 1.885 + })); 1.886 + }); 1.887 +} 1.888 + 1.889 +// Upgrading the application with a custom theme in use should disable it if it 1.890 +// is no longer compatible 1.891 +function run_test_16() { 1.892 + restartManager("3"); 1.893 + 1.894 + do_check_eq(Services.prefs.getCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN), "classic/1.0"); 1.895 + AddonManager.getAddonsByIDs(["default@tests.mozilla.org", 1.896 + "theme1@tests.mozilla.org"], function([d, t1]) { 1.897 + do_check_false(d.userDisabled); 1.898 + do_check_false(d.appDisabled); 1.899 + do_check_true(d.isActive); 1.900 + 1.901 + do_check_true(t1.userDisabled); 1.902 + do_check_true(t1.appDisabled); 1.903 + do_check_false(t1.isActive); 1.904 + 1.905 + do_execute_soon(run_test_17); 1.906 + }); 1.907 +} 1.908 + 1.909 +// Verifies that if the selected theme pref is changed by a different version 1.910 +// of the application that we correctly reset it when it points to an 1.911 +// incompatible theme 1.912 +function run_test_17() { 1.913 + restartManager("2"); 1.914 + shutdownManager(); 1.915 + 1.916 + Services.prefs.setCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN, "theme1/1.0"); 1.917 + 1.918 + restartManager("3"); 1.919 + 1.920 + do_check_eq(Services.prefs.getCharPref(PREF_GENERAL_SKINS_SELECTEDSKIN), "classic/1.0"); 1.921 + AddonManager.getAddonsByIDs(["default@tests.mozilla.org", 1.922 + "theme1@tests.mozilla.org"], function([d, t1]) { 1.923 + do_check_false(d.userDisabled); 1.924 + do_check_false(d.appDisabled); 1.925 + do_check_true(d.isActive); 1.926 + 1.927 + do_check_true(t1.userDisabled); 1.928 + do_check_true(t1.appDisabled); 1.929 + do_check_false(t1.isActive); 1.930 + 1.931 + do_execute_soon(run_test_18); 1.932 + }); 1.933 +} 1.934 + 1.935 +// Disabling the active theme should switch back to the default theme 1.936 +function run_test_18() { 1.937 + restartManager(2); 1.938 + 1.939 + AddonManager.getAddonByID("theme1@tests.mozilla.org", callback_soon(function(t1) { 1.940 + t1.userDisabled = false; 1.941 + 1.942 + restartManager(); 1.943 + 1.944 + AddonManager.getAddonsByIDs(["default@tests.mozilla.org", 1.945 + "theme1@tests.mozilla.org"], 1.946 + callback_soon(function([d, t1]) { 1.947 + do_check_true(d.userDisabled); 1.948 + do_check_false(d.appDisabled); 1.949 + do_check_false(d.isActive); 1.950 + 1.951 + do_check_false(t1.userDisabled); 1.952 + do_check_false(t1.appDisabled); 1.953 + do_check_true(t1.isActive); 1.954 + 1.955 + prepare_test({ 1.956 + "theme1@tests.mozilla.org": [ 1.957 + "onDisabling", 1.958 + ], 1.959 + "default@tests.mozilla.org": [ 1.960 + "onEnabling", 1.961 + ] 1.962 + }); 1.963 + t1.userDisabled = true; 1.964 + ensure_test_completed(); 1.965 + 1.966 + do_check_false(d.userDisabled); 1.967 + do_check_false(d.appDisabled); 1.968 + do_check_false(d.isActive); 1.969 + 1.970 + do_check_true(t1.userDisabled); 1.971 + do_check_false(t1.appDisabled); 1.972 + do_check_true(t1.isActive); 1.973 + 1.974 + restartManager(); 1.975 + 1.976 + AddonManager.getAddonsByIDs(["default@tests.mozilla.org", 1.977 + "theme1@tests.mozilla.org"], function([d, t1]) { 1.978 + do_check_false(d.userDisabled); 1.979 + do_check_false(d.appDisabled); 1.980 + do_check_true(d.isActive); 1.981 + 1.982 + do_check_true(t1.userDisabled); 1.983 + do_check_false(t1.appDisabled); 1.984 + do_check_false(t1.isActive); 1.985 + 1.986 + do_execute_soon(run_test_19); 1.987 + }); 1.988 + })); 1.989 + })); 1.990 +} 1.991 + 1.992 +// Disabling the active persona should switch back to the default theme 1.993 +function run_test_19() { 1.994 + AddonManager.getAddonsByIDs(["default@tests.mozilla.org", 1.995 + "1@personas.mozilla.org"], function([d, p1]) { 1.996 + p1.userDisabled = false; 1.997 + 1.998 + do_check_true(d.userDisabled); 1.999 + do_check_false(d.appDisabled); 1.1000 + do_check_false(d.isActive); 1.1001 + 1.1002 + do_check_false(p1.userDisabled); 1.1003 + do_check_false(p1.appDisabled); 1.1004 + do_check_true(p1.isActive); 1.1005 + 1.1006 + prepare_test({ 1.1007 + "1@personas.mozilla.org": [ 1.1008 + ["onDisabling", false], 1.1009 + "onDisabled" 1.1010 + ], 1.1011 + "default@tests.mozilla.org": [ 1.1012 + ["onEnabling", false], 1.1013 + "onEnabled" 1.1014 + ] 1.1015 + }); 1.1016 + p1.userDisabled = true; 1.1017 + ensure_test_completed(); 1.1018 + 1.1019 + do_check_false(d.userDisabled); 1.1020 + do_check_false(d.appDisabled); 1.1021 + do_check_true(d.isActive); 1.1022 + 1.1023 + do_check_true(p1.userDisabled); 1.1024 + do_check_false(p1.appDisabled); 1.1025 + do_check_false(p1.isActive); 1.1026 + 1.1027 + do_execute_soon(run_test_20); 1.1028 + }); 1.1029 +} 1.1030 + 1.1031 +// Tests that you cannot disable the default theme 1.1032 +function run_test_20() { 1.1033 + AddonManager.getAddonByID("default@tests.mozilla.org", function(d) { 1.1034 + do_check_false(d.userDisabled); 1.1035 + do_check_false(d.appDisabled); 1.1036 + do_check_true(d.isActive); 1.1037 + 1.1038 + try { 1.1039 + d.userDisabled = true; 1.1040 + do_throw("Disabling the default theme should throw an exception"); 1.1041 + } 1.1042 + catch (e) { 1.1043 + } 1.1044 + 1.1045 + do_execute_soon(run_test_21); 1.1046 + }); 1.1047 +} 1.1048 + 1.1049 +// Tests that cached copies of a lightweight theme have the right permissions 1.1050 +// and pendingOperations during the onEnabling event 1.1051 +function run_test_21() { 1.1052 + AddonManager.getAddonByID("theme1@tests.mozilla.org", callback_soon(function(t1) { 1.1053 + // Switch to a custom theme so we can test pendingOperations properly. 1.1054 + 1.1055 + prepare_test({ 1.1056 + "theme1@tests.mozilla.org": [ 1.1057 + "onEnabling" 1.1058 + ], 1.1059 + "default@tests.mozilla.org": [ 1.1060 + "onDisabling" 1.1061 + ] 1.1062 + }); 1.1063 + 1.1064 + t1.userDisabled = false; 1.1065 + ensure_test_completed(); 1.1066 + 1.1067 + restartManager(); 1.1068 + 1.1069 + AddonManager.getAddonByID("1@personas.mozilla.org", function(p1) { 1.1070 + AddonManager.addAddonListener({ 1.1071 + onEnabling: function(aAddon) { 1.1072 + do_check_false(hasFlag(aAddon.permissions, AddonManager.PERM_CAN_ENABLE)); 1.1073 + do_check_true(hasFlag(aAddon.pendingOperations, AddonManager.PENDING_ENABLE)); 1.1074 + 1.1075 + do_check_eq(aAddon.permissions, p1.permissions); 1.1076 + do_check_eq(aAddon.pendingOperations, p1.pendingOperations); 1.1077 + } 1.1078 + }); 1.1079 + 1.1080 + prepare_test({ 1.1081 + "1@personas.mozilla.org": [ 1.1082 + "onEnabling" 1.1083 + ], 1.1084 + "theme1@tests.mozilla.org": [ 1.1085 + "onDisabling" 1.1086 + ] 1.1087 + }); 1.1088 + 1.1089 + p1.userDisabled = false; 1.1090 + ensure_test_completed(); 1.1091 + 1.1092 + end_test(); 1.1093 + }); 1.1094 + })); 1.1095 +}