1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/mozapps/extensions/test/xpcshell/test_update.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,1318 @@ 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 +// This verifies that add-on update checks work 1.9 + 1.10 +const PREF_MATCH_OS_LOCALE = "intl.locale.matchOS"; 1.11 +const PREF_SELECTED_LOCALE = "general.useragent.locale"; 1.12 +const PREF_GETADDONS_CACHE_ENABLED = "extensions.getAddons.cache.enabled"; 1.13 + 1.14 +// The test extension uses an insecure update url. 1.15 +Services.prefs.setBoolPref(PREF_EM_CHECK_UPDATE_SECURITY, false); 1.16 +Services.prefs.setBoolPref(PREF_EM_STRICT_COMPATIBILITY, false); 1.17 +// This test requires lightweight themes update to be enabled even if the app 1.18 +// doesn't support lightweight themes. 1.19 +Services.prefs.setBoolPref("lightweightThemes.update.enabled", true); 1.20 + 1.21 +Components.utils.import("resource://gre/modules/LightweightThemeManager.jsm"); 1.22 + 1.23 +const PARAMS = "?%REQ_VERSION%/%ITEM_ID%/%ITEM_VERSION%/%ITEM_MAXAPPVERSION%/" + 1.24 + "%ITEM_STATUS%/%APP_ID%/%APP_VERSION%/%CURRENT_APP_VERSION%/" + 1.25 + "%APP_OS%/%APP_ABI%/%APP_LOCALE%/%UPDATE_TYPE%"; 1.26 + 1.27 +var gInstallDate; 1.28 + 1.29 +Components.utils.import("resource://testing-common/httpd.js"); 1.30 +var testserver = new HttpServer(); 1.31 +testserver.start(-1); 1.32 +gPort = testserver.identity.primaryPort; 1.33 +mapFile("/data/test_update.rdf", testserver); 1.34 +mapFile("/data/test_update.xml", testserver); 1.35 +testserver.registerDirectory("/addons/", do_get_file("addons")); 1.36 + 1.37 +const profileDir = gProfD.clone(); 1.38 +profileDir.append("extensions"); 1.39 + 1.40 +let originalSyncGUID; 1.41 + 1.42 +function run_test() { 1.43 + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); 1.44 + Services.prefs.setBoolPref(PREF_MATCH_OS_LOCALE, false); 1.45 + Services.prefs.setCharPref(PREF_SELECTED_LOCALE, "fr-FR"); 1.46 + 1.47 + writeInstallRDFForExtension({ 1.48 + id: "addon1@tests.mozilla.org", 1.49 + version: "1.0", 1.50 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.51 + targetApplications: [{ 1.52 + id: "xpcshell@tests.mozilla.org", 1.53 + minVersion: "1", 1.54 + maxVersion: "1" 1.55 + }], 1.56 + name: "Test Addon 1", 1.57 + }, profileDir); 1.58 + 1.59 + writeInstallRDFForExtension({ 1.60 + id: "addon2@tests.mozilla.org", 1.61 + version: "1.0", 1.62 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.63 + targetApplications: [{ 1.64 + id: "xpcshell@tests.mozilla.org", 1.65 + minVersion: "0", 1.66 + maxVersion: "0" 1.67 + }], 1.68 + name: "Test Addon 2", 1.69 + }, profileDir); 1.70 + 1.71 + writeInstallRDFForExtension({ 1.72 + id: "addon3@tests.mozilla.org", 1.73 + version: "1.0", 1.74 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.75 + targetApplications: [{ 1.76 + id: "xpcshell@tests.mozilla.org", 1.77 + minVersion: "5", 1.78 + maxVersion: "5" 1.79 + }], 1.80 + name: "Test Addon 3", 1.81 + }, profileDir); 1.82 + 1.83 + startupManager(); 1.84 + 1.85 + do_test_pending(); 1.86 + run_test_1(); 1.87 +} 1.88 + 1.89 +function end_test() { 1.90 + testserver.stop(do_test_finished); 1.91 +} 1.92 + 1.93 +// Verify that an update is available and can be installed. 1.94 +function run_test_1() { 1.95 + AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { 1.96 + do_check_neq(a1, null); 1.97 + do_check_eq(a1.version, "1.0"); 1.98 + do_check_eq(a1.applyBackgroundUpdates, AddonManager.AUTOUPDATE_DEFAULT); 1.99 + do_check_eq(a1.releaseNotesURI, null); 1.100 + do_check_true(a1.foreignInstall); 1.101 + do_check_neq(a1.syncGUID, null); 1.102 + 1.103 + originalSyncGUID = a1.syncGUID; 1.104 + a1.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DEFAULT; 1.105 + 1.106 + prepare_test({ 1.107 + "addon1@tests.mozilla.org": [ 1.108 + ["onPropertyChanged", ["applyBackgroundUpdates"]] 1.109 + ] 1.110 + }); 1.111 + a1.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DISABLE; 1.112 + check_test_completed(); 1.113 + 1.114 + a1.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DISABLE; 1.115 + 1.116 + prepare_test({}, [ 1.117 + "onNewInstall", 1.118 + ]); 1.119 + 1.120 + a1.findUpdates({ 1.121 + onNoCompatibilityUpdateAvailable: function(addon) { 1.122 + do_throw("Should not have seen onNoCompatibilityUpdateAvailable notification"); 1.123 + }, 1.124 + 1.125 + onUpdateAvailable: function(addon, install) { 1.126 + ensure_test_completed(); 1.127 + 1.128 + AddonManager.getAllInstalls(function(aInstalls) { 1.129 + do_check_eq(aInstalls.length, 1); 1.130 + do_check_eq(aInstalls[0], install); 1.131 + 1.132 + do_check_eq(addon, a1); 1.133 + do_check_eq(install.name, addon.name); 1.134 + do_check_eq(install.version, "2.0"); 1.135 + do_check_eq(install.state, AddonManager.STATE_AVAILABLE); 1.136 + do_check_eq(install.existingAddon, addon); 1.137 + do_check_eq(install.releaseNotesURI.spec, "http://example.com/updateInfo.xhtml"); 1.138 + 1.139 + // Verify that another update check returns the same AddonInstall 1.140 + a1.findUpdates({ 1.141 + onNoCompatibilityUpdateAvailable: function(addon) { 1.142 + do_throw("Should not have seen onNoCompatibilityUpdateAvailable notification"); 1.143 + }, 1.144 + 1.145 + onUpdateAvailable: function(newAddon, newInstall) { 1.146 + AddonManager.getAllInstalls(function(aInstalls) { 1.147 + do_check_eq(aInstalls.length, 1); 1.148 + do_check_eq(aInstalls[0], install); 1.149 + do_check_eq(newAddon, addon); 1.150 + do_check_eq(newInstall, install); 1.151 + 1.152 + prepare_test({}, [ 1.153 + "onDownloadStarted", 1.154 + "onDownloadEnded", 1.155 + ], check_test_1); 1.156 + install.install(); 1.157 + }); 1.158 + }, 1.159 + 1.160 + onNoUpdateAvailable: function(addon) { 1.161 + do_throw("Should not have seen onNoUpdateAvailable notification"); 1.162 + } 1.163 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.164 + }); 1.165 + }, 1.166 + 1.167 + onNoUpdateAvailable: function(addon) { 1.168 + do_throw("Should not have seen onNoUpdateAvailable notification"); 1.169 + } 1.170 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.171 + }); 1.172 +} 1.173 + 1.174 +function check_test_1(install) { 1.175 + ensure_test_completed(); 1.176 + do_check_eq(install.state, AddonManager.STATE_DOWNLOADED); 1.177 + run_test_2(install); 1.178 + return false; 1.179 +} 1.180 + 1.181 +// Continue installing the update. 1.182 +function run_test_2(install) { 1.183 + // Verify that another update check returns no new update 1.184 + install.existingAddon.findUpdates({ 1.185 + onNoCompatibilityUpdateAvailable: function(addon) { 1.186 + do_throw("Should not have seen onNoCompatibilityUpdateAvailable notification"); 1.187 + }, 1.188 + 1.189 + onUpdateAvailable: function(addon, install) { 1.190 + do_throw("Should find no available update when one is already downloading"); 1.191 + }, 1.192 + 1.193 + onNoUpdateAvailable: function(addon) { 1.194 + AddonManager.getAllInstalls(function(aInstalls) { 1.195 + do_check_eq(aInstalls.length, 1); 1.196 + do_check_eq(aInstalls[0], install); 1.197 + 1.198 + prepare_test({ 1.199 + "addon1@tests.mozilla.org": [ 1.200 + "onInstalling" 1.201 + ] 1.202 + }, [ 1.203 + "onInstallStarted", 1.204 + "onInstallEnded", 1.205 + ], check_test_2); 1.206 + install.install(); 1.207 + }); 1.208 + } 1.209 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.210 +} 1.211 + 1.212 +function check_test_2() { 1.213 + ensure_test_completed(); 1.214 + 1.215 + AddonManager.getAddonByID("addon1@tests.mozilla.org", callback_soon(function(olda1) { 1.216 + do_check_neq(olda1, null); 1.217 + do_check_eq(olda1.version, "1.0"); 1.218 + do_check_true(isExtensionInAddonsList(profileDir, olda1.id)); 1.219 + 1.220 + shutdownManager(); 1.221 + 1.222 + startupManager(); 1.223 + 1.224 + do_check_true(isExtensionInAddonsList(profileDir, olda1.id)); 1.225 + 1.226 + AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { 1.227 + do_check_neq(a1, null); 1.228 + do_check_eq(a1.version, "2.0"); 1.229 + do_check_true(isExtensionInAddonsList(profileDir, a1.id)); 1.230 + do_check_eq(a1.applyBackgroundUpdates, AddonManager.AUTOUPDATE_DISABLE); 1.231 + do_check_eq(a1.releaseNotesURI.spec, "http://example.com/updateInfo.xhtml"); 1.232 + do_check_true(a1.foreignInstall); 1.233 + do_check_neq(a1.syncGUID, null); 1.234 + do_check_eq(originalSyncGUID, a1.syncGUID); 1.235 + 1.236 + a1.uninstall(); 1.237 + do_execute_soon(run_test_3); 1.238 + }); 1.239 + })); 1.240 +} 1.241 + 1.242 + 1.243 +// Check that an update check finds compatibility updates and applies them 1.244 +function run_test_3() { 1.245 + restartManager(); 1.246 + 1.247 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { 1.248 + do_check_neq(a2, null); 1.249 + do_check_true(a2.isActive); 1.250 + do_check_true(a2.isCompatible); 1.251 + do_check_false(a2.appDisabled); 1.252 + do_check_true(a2.isCompatibleWith("0")); 1.253 + 1.254 + a2.findUpdates({ 1.255 + onCompatibilityUpdateAvailable: function(addon) { 1.256 + do_check_true(a2.isCompatible); 1.257 + do_check_false(a2.appDisabled); 1.258 + do_check_true(a2.isActive); 1.259 + }, 1.260 + 1.261 + onUpdateAvailable: function(addon, install) { 1.262 + do_throw("Should not have seen an available update"); 1.263 + }, 1.264 + 1.265 + onNoUpdateAvailable: function(addon) { 1.266 + do_check_eq(addon, a2); 1.267 + do_execute_soon(check_test_3); 1.268 + } 1.269 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.270 + }); 1.271 +} 1.272 + 1.273 +function check_test_3() { 1.274 + restartManager(); 1.275 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { 1.276 + do_check_neq(a2, null); 1.277 + do_check_true(a2.isActive); 1.278 + do_check_true(a2.isCompatible); 1.279 + do_check_false(a2.appDisabled); 1.280 + a2.uninstall(); 1.281 + 1.282 + run_test_4(); 1.283 + }); 1.284 +} 1.285 + 1.286 +// Checks that we see no compatibility information when there is none. 1.287 +function run_test_4() { 1.288 + AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) { 1.289 + do_check_neq(a3, null); 1.290 + do_check_false(a3.isActive); 1.291 + do_check_false(a3.isCompatible); 1.292 + do_check_true(a3.appDisabled); 1.293 + do_check_true(a3.isCompatibleWith("5")); 1.294 + do_check_false(a3.isCompatibleWith("2")); 1.295 + 1.296 + a3.findUpdates({ 1.297 + sawUpdate: false, 1.298 + onCompatibilityUpdateAvailable: function(addon) { 1.299 + do_throw("Should not have seen compatibility information"); 1.300 + }, 1.301 + 1.302 + onNoCompatibilityUpdateAvailable: function(addon) { 1.303 + this.sawUpdate = true; 1.304 + }, 1.305 + 1.306 + onUpdateAvailable: function(addon, install) { 1.307 + do_throw("Should not have seen an available update"); 1.308 + }, 1.309 + 1.310 + onNoUpdateAvailable: function(addon) { 1.311 + do_check_true(this.sawUpdate); 1.312 + run_test_5(); 1.313 + } 1.314 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.315 + }); 1.316 +} 1.317 + 1.318 +// Checks that compatibility info for future apps are detected but don't make 1.319 +// the item compatibile. 1.320 +function run_test_5() { 1.321 + AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) { 1.322 + do_check_neq(a3, null); 1.323 + do_check_false(a3.isActive); 1.324 + do_check_false(a3.isCompatible); 1.325 + do_check_true(a3.appDisabled); 1.326 + do_check_true(a3.isCompatibleWith("5")); 1.327 + do_check_false(a3.isCompatibleWith("2")); 1.328 + 1.329 + a3.findUpdates({ 1.330 + sawUpdate: false, 1.331 + onCompatibilityUpdateAvailable: function(addon) { 1.332 + do_check_false(a3.isCompatible); 1.333 + do_check_true(a3.appDisabled); 1.334 + do_check_false(a3.isActive); 1.335 + this.sawUpdate = true; 1.336 + }, 1.337 + 1.338 + onNoCompatibilityUpdateAvailable: function(addon) { 1.339 + do_throw("Should have seen some compatibility information"); 1.340 + }, 1.341 + 1.342 + onUpdateAvailable: function(addon, install) { 1.343 + do_throw("Should not have seen an available update"); 1.344 + }, 1.345 + 1.346 + onNoUpdateAvailable: function(addon) { 1.347 + do_check_true(this.sawUpdate); 1.348 + do_execute_soon(check_test_5); 1.349 + } 1.350 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED, "3.0"); 1.351 + }); 1.352 +} 1.353 + 1.354 +function check_test_5() { 1.355 + restartManager(); 1.356 + AddonManager.getAddonByID("addon3@tests.mozilla.org", function(a3) { 1.357 + do_check_neq(a3, null); 1.358 + do_check_false(a3.isActive); 1.359 + do_check_false(a3.isCompatible); 1.360 + do_check_true(a3.appDisabled); 1.361 + 1.362 + a3.uninstall(); 1.363 + do_execute_soon(run_test_6); 1.364 + }); 1.365 +} 1.366 + 1.367 +// Test that background update checks work 1.368 +function run_test_6() { 1.369 + restartManager(); 1.370 + 1.371 + writeInstallRDFForExtension({ 1.372 + id: "addon1@tests.mozilla.org", 1.373 + version: "1.0", 1.374 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.375 + targetApplications: [{ 1.376 + id: "xpcshell@tests.mozilla.org", 1.377 + minVersion: "1", 1.378 + maxVersion: "1" 1.379 + }], 1.380 + name: "Test Addon 1", 1.381 + }, profileDir); 1.382 + restartManager(); 1.383 + 1.384 + prepare_test({}, [ 1.385 + "onNewInstall", 1.386 + "onDownloadStarted", 1.387 + "onDownloadEnded" 1.388 + ], continue_test_6); 1.389 + 1.390 + // Fake a timer event to cause a background update and wait for the magic to 1.391 + // happen 1.392 + gInternalManager.notify(null); 1.393 +} 1.394 + 1.395 +function continue_test_6(install) { 1.396 + do_check_neq(install.existingAddon, null); 1.397 + do_check_eq(install.existingAddon.id, "addon1@tests.mozilla.org"); 1.398 + 1.399 + prepare_test({ 1.400 + "addon1@tests.mozilla.org": [ 1.401 + "onInstalling" 1.402 + ] 1.403 + }, [ 1.404 + "onInstallStarted", 1.405 + "onInstallEnded", 1.406 + ], callback_soon(check_test_6)); 1.407 +} 1.408 + 1.409 +function check_test_6(install) { 1.410 + do_check_eq(install.existingAddon.pendingUpgrade.install, install); 1.411 + 1.412 + restartManager(); 1.413 + AddonManager.getAddonByID("addon1@tests.mozilla.org", function(a1) { 1.414 + do_check_neq(a1, null); 1.415 + do_check_eq(a1.version, "2.0"); 1.416 + do_check_eq(a1.releaseNotesURI.spec, "http://example.com/updateInfo.xhtml"); 1.417 + a1.uninstall(); 1.418 + do_execute_soon(run_test_7); 1.419 + }); 1.420 +} 1.421 + 1.422 +// Test that background update checks work for lightweight themes 1.423 +function run_test_7() { 1.424 + restartManager(); 1.425 + 1.426 + LightweightThemeManager.currentTheme = { 1.427 + id: "1", 1.428 + version: "1", 1.429 + name: "Test LW Theme", 1.430 + description: "A test theme", 1.431 + author: "Mozilla", 1.432 + homepageURL: "http://localhost:" + gPort + "/data/index.html", 1.433 + headerURL: "http://localhost:" + gPort + "/data/header.png", 1.434 + footerURL: "http://localhost:" + gPort + "/data/footer.png", 1.435 + previewURL: "http://localhost:" + gPort + "/data/preview.png", 1.436 + iconURL: "http://localhost:" + gPort + "/data/icon.png", 1.437 + updateURL: "http://localhost:" + gPort + "/data/lwtheme.js" 1.438 + }; 1.439 + 1.440 + // XXX The lightweight theme manager strips non-https updateURLs so hack it 1.441 + // back in. 1.442 + let themes = JSON.parse(Services.prefs.getCharPref("lightweightThemes.usedThemes")); 1.443 + do_check_eq(themes.length, 1); 1.444 + themes[0].updateURL = "http://localhost:" + gPort + "/data/lwtheme.js"; 1.445 + Services.prefs.setCharPref("lightweightThemes.usedThemes", JSON.stringify(themes)); 1.446 + 1.447 + testserver.registerPathHandler("/data/lwtheme.js", function(request, response) { 1.448 + // Server will specify an expiry in one year. 1.449 + let expiry = new Date(); 1.450 + expiry.setFullYear(expiry.getFullYear() + 1); 1.451 + response.setHeader("Expires", expiry.toUTCString(), false); 1.452 + response.write(JSON.stringify({ 1.453 + id: "1", 1.454 + version: "2", 1.455 + name: "Updated Theme", 1.456 + description: "A test theme", 1.457 + author: "Mozilla", 1.458 + homepageURL: "http://localhost:" + gPort + "/data/index2.html", 1.459 + headerURL: "http://localhost:" + gPort + "/data/header.png", 1.460 + footerURL: "http://localhost:" + gPort + "/data/footer.png", 1.461 + previewURL: "http://localhost:" + gPort + "/data/preview.png", 1.462 + iconURL: "http://localhost:" + gPort + "/data/icon2.png", 1.463 + updateURL: "http://localhost:" + gPort + "/data/lwtheme.js" 1.464 + })); 1.465 + }); 1.466 + 1.467 + AddonManager.getAddonByID("1@personas.mozilla.org", function(p1) { 1.468 + do_check_neq(p1, null); 1.469 + do_check_eq(p1.version, "1"); 1.470 + do_check_eq(p1.name, "Test LW Theme"); 1.471 + do_check_true(p1.isActive); 1.472 + do_check_eq(p1.installDate.getTime(), p1.updateDate.getTime()); 1.473 + 1.474 + // 5 seconds leeway seems like a lot, but tests can run slow and really if 1.475 + // this is within 5 seconds it is fine. If it is going to be wrong then it 1.476 + // is likely to be hours out at least 1.477 + do_check_true((Date.now() - p1.installDate.getTime()) < 5000); 1.478 + 1.479 + gInstallDate = p1.installDate.getTime(); 1.480 + 1.481 + prepare_test({ 1.482 + "1@personas.mozilla.org": [ 1.483 + ["onInstalling", false], 1.484 + "onInstalled" 1.485 + ] 1.486 + }, [ 1.487 + "onExternalInstall" 1.488 + ], check_test_7); 1.489 + 1.490 + // Fake a timer event to cause a background update and wait for the magic to 1.491 + // happen 1.492 + gInternalManager.notify(null); 1.493 + }); 1.494 +} 1.495 + 1.496 +function check_test_7() { 1.497 + AddonManager.getAddonByID("1@personas.mozilla.org", function(p1) { 1.498 + do_check_neq(p1, null); 1.499 + do_check_eq(p1.version, "2"); 1.500 + do_check_eq(p1.name, "Updated Theme"); 1.501 + do_check_eq(p1.installDate.getTime(), gInstallDate); 1.502 + do_check_true(p1.installDate.getTime() < p1.updateDate.getTime()); 1.503 + 1.504 + // 5 seconds leeway seems like a lot, but tests can run slow and really if 1.505 + // this is within 5 seconds it is fine. If it is going to be wrong then it 1.506 + // is likely to be hours out at least 1.507 + do_check_true((Date.now() - p1.updateDate.getTime()) < 5000); 1.508 + 1.509 + gInstallDate = p1.installDate.getTime(); 1.510 + 1.511 + run_test_7_cache(); 1.512 + }); 1.513 +} 1.514 + 1.515 +// Test that background update checks for lightweight themes do not use the cache 1.516 +// The update body from test 7 shouldn't be used since the cache should be bypassed. 1.517 +function run_test_7_cache() { 1.518 + // XXX The lightweight theme manager strips non-https updateURLs so hack it 1.519 + // back in. 1.520 + let themes = JSON.parse(Services.prefs.getCharPref("lightweightThemes.usedThemes")); 1.521 + do_check_eq(themes.length, 1); 1.522 + themes[0].updateURL = "http://localhost:" + gPort + "/data/lwtheme.js"; 1.523 + Services.prefs.setCharPref("lightweightThemes.usedThemes", JSON.stringify(themes)); 1.524 + 1.525 + testserver.registerPathHandler("/data/lwtheme.js", function(request, response) { 1.526 + response.write(JSON.stringify({ 1.527 + id: "1", 1.528 + version: "3", 1.529 + name: "Updated Theme v.3", 1.530 + description: "A test theme v.3", 1.531 + author: "John Smith", 1.532 + homepageURL: "http://localhost:" + gPort + "/data/index3.html?v=3", 1.533 + headerURL: "http://localhost:" + gPort + "/data/header.png?v=3", 1.534 + footerURL: "http://localhost:" + gPort + "/data/footer.png?v=3", 1.535 + previewURL: "http://localhost:" + gPort + "/data/preview.png?v=3", 1.536 + iconURL: "http://localhost:" + gPort + "/data/icon2.png?v=3", 1.537 + updateURL: "https://localhost:" + gPort + "/data/lwtheme.js?v=3" 1.538 + })); 1.539 + }); 1.540 + 1.541 + AddonManager.getAddonByID("1@personas.mozilla.org", function(p1) { 1.542 + do_check_neq(p1, null); 1.543 + do_check_eq(p1.version, "2"); 1.544 + do_check_eq(p1.name, "Updated Theme"); 1.545 + do_check_true(p1.isActive); 1.546 + do_check_eq(p1.installDate.getTime(), gInstallDate); 1.547 + do_check_true(p1.installDate.getTime() < p1.updateDate.getTime()); 1.548 + 1.549 + prepare_test({ 1.550 + "1@personas.mozilla.org": [ 1.551 + ["onInstalling", false], 1.552 + "onInstalled" 1.553 + ] 1.554 + }, [ 1.555 + "onExternalInstall" 1.556 + ], check_test_7_cache); 1.557 + 1.558 + // Fake a timer event to cause a background update and wait for the magic to 1.559 + // happen 1.560 + gInternalManager.notify(null); 1.561 + }); 1.562 +} 1.563 + 1.564 +function check_test_7_cache() { 1.565 + AddonManager.getAddonByID("1@personas.mozilla.org", function(p1) { 1.566 + let currentTheme = LightweightThemeManager.currentTheme; 1.567 + do_check_neq(p1, null); 1.568 + do_check_eq(p1.version, "3"); 1.569 + do_check_eq(p1.name, "Updated Theme v.3"); 1.570 + do_check_eq(p1.description, "A test theme v.3"); 1.571 + do_print(JSON.stringify(p1)); 1.572 + do_check_eq(p1.creator.name, "John Smith"); 1.573 + do_check_eq(p1.homepageURL, "http://localhost:" + gPort + "/data/index3.html?v=3"); 1.574 + do_check_eq(p1.screenshots[0].url, "http://localhost:" + gPort + "/data/preview.png?v=3"); 1.575 + do_check_eq(p1.iconURL, "http://localhost:" + gPort + "/data/icon2.png?v=3"); 1.576 + do_check_eq(currentTheme.headerURL, "http://localhost:" + gPort + "/data/header.png?v=3"); 1.577 + do_check_eq(currentTheme.footerURL, "http://localhost:" + gPort + "/data/footer.png?v=3"); 1.578 + do_check_eq(currentTheme.updateURL, "https://localhost:" + gPort + "/data/lwtheme.js?v=3"); 1.579 + 1.580 + do_check_eq(p1.installDate.getTime(), gInstallDate); 1.581 + do_check_true(p1.installDate.getTime() < p1.updateDate.getTime()); 1.582 + 1.583 + do_execute_soon(run_test_8); 1.584 + }); 1.585 +} 1.586 + 1.587 +// Verify the parameter escaping in update urls. 1.588 +function run_test_8() { 1.589 + writeInstallRDFForExtension({ 1.590 + id: "addon1@tests.mozilla.org", 1.591 + version: "5.0", 1.592 + updateURL: "http://localhost:" + gPort + "/data/param_test.rdf" + PARAMS, 1.593 + targetApplications: [{ 1.594 + id: "xpcshell@tests.mozilla.org", 1.595 + minVersion: "1", 1.596 + maxVersion: "2" 1.597 + }], 1.598 + name: "Test Addon 1", 1.599 + }, profileDir); 1.600 + 1.601 + writeInstallRDFForExtension({ 1.602 + id: "addon2@tests.mozilla.org", 1.603 + version: "67.0.5b1", 1.604 + updateURL: "http://localhost:" + gPort + "/data/param_test.rdf" + PARAMS, 1.605 + targetApplications: [{ 1.606 + id: "toolkit@mozilla.org", 1.607 + minVersion: "0", 1.608 + maxVersion: "3" 1.609 + }], 1.610 + name: "Test Addon 2", 1.611 + }, profileDir); 1.612 + 1.613 + writeInstallRDFForExtension({ 1.614 + id: "addon3@tests.mozilla.org", 1.615 + version: "1.3+", 1.616 + updateURL: "http://localhost:" + gPort + "/data/param_test.rdf" + PARAMS, 1.617 + targetApplications: [{ 1.618 + id: "xpcshell@tests.mozilla.org", 1.619 + minVersion: "0", 1.620 + maxVersion: "0" 1.621 + }, { 1.622 + id: "toolkit@mozilla.org", 1.623 + minVersion: "0", 1.624 + maxVersion: "3" 1.625 + }], 1.626 + name: "Test Addon 3", 1.627 + }, profileDir); 1.628 + 1.629 + writeInstallRDFForExtension({ 1.630 + id: "addon4@tests.mozilla.org", 1.631 + version: "0.5ab6", 1.632 + updateURL: "http://localhost:" + gPort + "/data/param_test.rdf" + PARAMS, 1.633 + targetApplications: [{ 1.634 + id: "xpcshell@tests.mozilla.org", 1.635 + minVersion: "1", 1.636 + maxVersion: "5" 1.637 + }], 1.638 + name: "Test Addon 4", 1.639 + }, profileDir); 1.640 + 1.641 + writeInstallRDFForExtension({ 1.642 + id: "addon5@tests.mozilla.org", 1.643 + version: "1.0", 1.644 + updateURL: "http://localhost:" + gPort + "/data/param_test.rdf" + PARAMS, 1.645 + targetApplications: [{ 1.646 + id: "xpcshell@tests.mozilla.org", 1.647 + minVersion: "1", 1.648 + maxVersion: "1" 1.649 + }], 1.650 + name: "Test Addon 5", 1.651 + }, profileDir); 1.652 + 1.653 + writeInstallRDFForExtension({ 1.654 + id: "addon6@tests.mozilla.org", 1.655 + version: "1.0", 1.656 + updateURL: "http://localhost:" + gPort + "/data/param_test.rdf" + PARAMS, 1.657 + targetApplications: [{ 1.658 + id: "xpcshell@tests.mozilla.org", 1.659 + minVersion: "1", 1.660 + maxVersion: "1" 1.661 + }], 1.662 + name: "Test Addon 6", 1.663 + }, profileDir); 1.664 + 1.665 + restartManager(); 1.666 + 1.667 + AddonManager.getAddonByID("addon2@tests.mozilla.org", callback_soon(function(a2) { 1.668 + a2.userDisabled = true; 1.669 + restartManager(); 1.670 + 1.671 + testserver.registerPathHandler("/data/param_test.rdf", function(request, response) { 1.672 + do_check_neq(request.queryString, ""); 1.673 + let [req_version, item_id, item_version, 1.674 + item_maxappversion, item_status, 1.675 + app_id, app_version, current_app_version, 1.676 + app_os, app_abi, app_locale, update_type] = 1.677 + [decodeURIComponent(a) for each (a in request.queryString.split("/"))]; 1.678 + 1.679 + do_check_eq(req_version, "2"); 1.680 + 1.681 + switch(item_id) { 1.682 + case "addon1@tests.mozilla.org": 1.683 + do_check_eq(item_version, "5.0"); 1.684 + do_check_eq(item_maxappversion, "2"); 1.685 + do_check_eq(item_status, "userEnabled"); 1.686 + do_check_eq(app_version, "1"); 1.687 + do_check_eq(update_type, "97"); 1.688 + break; 1.689 + case "addon2@tests.mozilla.org": 1.690 + do_check_eq(item_version, "67.0.5b1"); 1.691 + do_check_eq(item_maxappversion, "3"); 1.692 + do_check_eq(item_status, "userDisabled"); 1.693 + do_check_eq(app_version, "1"); 1.694 + do_check_eq(update_type, "49"); 1.695 + break; 1.696 + case "addon3@tests.mozilla.org": 1.697 + do_check_eq(item_version, "1.3+"); 1.698 + do_check_eq(item_maxappversion, "0"); 1.699 + do_check_eq(item_status, "userEnabled"); 1.700 + do_check_eq(app_version, "1"); 1.701 + do_check_eq(update_type, "112"); 1.702 + break; 1.703 + case "addon4@tests.mozilla.org": 1.704 + do_check_eq(item_version, "0.5ab6"); 1.705 + do_check_eq(item_maxappversion, "5"); 1.706 + do_check_eq(item_status, "userEnabled"); 1.707 + do_check_eq(app_version, "2"); 1.708 + do_check_eq(update_type, "98"); 1.709 + break; 1.710 + case "addon5@tests.mozilla.org": 1.711 + do_check_eq(item_version, "1.0"); 1.712 + do_check_eq(item_maxappversion, "1"); 1.713 + do_check_eq(item_status, "userEnabled"); 1.714 + do_check_eq(app_version, "1"); 1.715 + do_check_eq(update_type, "35"); 1.716 + break; 1.717 + case "addon6@tests.mozilla.org": 1.718 + do_check_eq(item_version, "1.0"); 1.719 + do_check_eq(item_maxappversion, "1"); 1.720 + do_check_eq(item_status, "userEnabled"); 1.721 + do_check_eq(app_version, "1"); 1.722 + do_check_eq(update_type, "99"); 1.723 + break; 1.724 + default: 1.725 + do_throw("Update request for unexpected add-on " + item_id); 1.726 + } 1.727 + 1.728 + do_check_eq(app_id, "xpcshell@tests.mozilla.org"); 1.729 + do_check_eq(current_app_version, "1"); 1.730 + do_check_eq(app_os, "XPCShell"); 1.731 + do_check_eq(app_abi, "noarch-spidermonkey"); 1.732 + do_check_eq(app_locale, "fr-FR"); 1.733 + 1.734 + request.setStatusLine(null, 500, "Server Error"); 1.735 + }); 1.736 + 1.737 + AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", 1.738 + "addon2@tests.mozilla.org", 1.739 + "addon3@tests.mozilla.org", 1.740 + "addon4@tests.mozilla.org", 1.741 + "addon5@tests.mozilla.org", 1.742 + "addon6@tests.mozilla.org"], 1.743 + function([a1, a2, a3, a4, a5, a6]) { 1.744 + let count = 6; 1.745 + 1.746 + function run_next_test() { 1.747 + a1.uninstall(); 1.748 + a2.uninstall(); 1.749 + a3.uninstall(); 1.750 + a4.uninstall(); 1.751 + a5.uninstall(); 1.752 + a6.uninstall(); 1.753 + 1.754 + restartManager(); 1.755 + run_test_9(); 1.756 + } 1.757 + 1.758 + let compatListener = { 1.759 + onUpdateFinished: function(addon, error) { 1.760 + if (--count == 0) 1.761 + do_execute_soon(run_next_test); 1.762 + } 1.763 + }; 1.764 + 1.765 + let updateListener = { 1.766 + onUpdateAvailable: function(addon, update) { 1.767 + // Dummy so the update checker knows we care about new versions 1.768 + }, 1.769 + 1.770 + onUpdateFinished: function(addon, error) { 1.771 + if (--count == 0) 1.772 + do_execute_soon(run_next_test); 1.773 + } 1.774 + }; 1.775 + 1.776 + a1.findUpdates(updateListener, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.777 + a2.findUpdates(compatListener, AddonManager.UPDATE_WHEN_ADDON_INSTALLED); 1.778 + a3.findUpdates(updateListener, AddonManager.UPDATE_WHEN_PERIODIC_UPDATE); 1.779 + a4.findUpdates(updateListener, AddonManager.UPDATE_WHEN_NEW_APP_DETECTED, "2"); 1.780 + a5.findUpdates(compatListener, AddonManager.UPDATE_WHEN_NEW_APP_INSTALLED); 1.781 + a6.findUpdates(updateListener, AddonManager.UPDATE_WHEN_NEW_APP_INSTALLED); 1.782 + }); 1.783 + })); 1.784 +} 1.785 + 1.786 +// Tests that if an install.rdf claims compatibility then the add-on will be 1.787 +// seen as compatible regardless of what the update.rdf says. 1.788 +function run_test_9() { 1.789 + writeInstallRDFForExtension({ 1.790 + id: "addon4@tests.mozilla.org", 1.791 + version: "5.0", 1.792 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.793 + targetApplications: [{ 1.794 + id: "xpcshell@tests.mozilla.org", 1.795 + minVersion: "0", 1.796 + maxVersion: "1" 1.797 + }], 1.798 + name: "Test Addon 1", 1.799 + }, profileDir); 1.800 + 1.801 + restartManager(); 1.802 + 1.803 + AddonManager.getAddonByID("addon4@tests.mozilla.org", function(a4) { 1.804 + do_check_true(a4.isActive); 1.805 + do_check_true(a4.isCompatible); 1.806 + 1.807 + run_test_10(); 1.808 + }); 1.809 +} 1.810 + 1.811 +// Tests that a normal update check won't decrease a targetApplication's 1.812 +// maxVersion. 1.813 +function run_test_10() { 1.814 + AddonManager.getAddonByID("addon4@tests.mozilla.org", function(a4) { 1.815 + a4.findUpdates({ 1.816 + onUpdateFinished: function(addon) { 1.817 + do_check_true(addon.isCompatible); 1.818 + 1.819 + run_test_11(); 1.820 + } 1.821 + }, AddonManager.UPDATE_WHEN_PERIODIC_UPDATE); 1.822 + }); 1.823 +} 1.824 + 1.825 +// Tests that an update check for a new application will decrease a 1.826 +// targetApplication's maxVersion. 1.827 +function run_test_11() { 1.828 + AddonManager.getAddonByID("addon4@tests.mozilla.org", function(a4) { 1.829 + a4.findUpdates({ 1.830 + onUpdateFinished: function(addon) { 1.831 + do_check_true(addon.isCompatible); 1.832 + 1.833 + do_execute_soon(run_test_12); 1.834 + } 1.835 + }, AddonManager.UPDATE_WHEN_NEW_APP_INSTALLED); 1.836 + }); 1.837 +} 1.838 + 1.839 +// Check that the decreased maxVersion applied and disables the add-on 1.840 +function run_test_12() { 1.841 + restartManager(); 1.842 + 1.843 + AddonManager.getAddonByID("addon4@tests.mozilla.org", function(a4) { 1.844 + do_check_true(a4.isActive); 1.845 + do_check_true(a4.isCompatible); 1.846 + 1.847 + a4.uninstall(); 1.848 + do_execute_soon(run_test_13); 1.849 + }); 1.850 +} 1.851 + 1.852 +// Tests that a compatibility update is passed to the listener when there is 1.853 +// compatibility info for the current version of the app but not for the 1.854 +// version of the app that the caller requested an update check for, when 1.855 +// strict compatibility checking is disabled. 1.856 +function run_test_13() { 1.857 + restartManager(); 1.858 + 1.859 + // Not initially compatible but the update check will make it compatible 1.860 + writeInstallRDFForExtension({ 1.861 + id: "addon7@tests.mozilla.org", 1.862 + version: "1.0", 1.863 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.864 + targetApplications: [{ 1.865 + id: "xpcshell@tests.mozilla.org", 1.866 + minVersion: "0", 1.867 + maxVersion: "0" 1.868 + }], 1.869 + name: "Test Addon 7", 1.870 + }, profileDir); 1.871 + restartManager(); 1.872 + 1.873 + AddonManager.getAddonByID("addon7@tests.mozilla.org", function(a7) { 1.874 + do_check_neq(a7, null); 1.875 + do_check_true(a7.isActive); 1.876 + do_check_true(a7.isCompatible); 1.877 + do_check_false(a7.appDisabled); 1.878 + do_check_true(a7.isCompatibleWith("0")); 1.879 + 1.880 + a7.findUpdates({ 1.881 + sawUpdate: false, 1.882 + onNoCompatibilityUpdateAvailable: function(addon) { 1.883 + do_throw("Should have seen compatibility information"); 1.884 + }, 1.885 + 1.886 + onUpdateAvailable: function(addon, install) { 1.887 + do_throw("Should not have seen an available update"); 1.888 + }, 1.889 + 1.890 + onUpdateFinished: function(addon) { 1.891 + do_check_true(addon.isCompatible); 1.892 + do_execute_soon(check_test_13); 1.893 + } 1.894 + }, AddonManager.UPDATE_WHEN_NEW_APP_DETECTED, "3.0"); 1.895 + }); 1.896 +} 1.897 + 1.898 +function check_test_13() { 1.899 + restartManager(); 1.900 + AddonManager.getAddonByID("addon7@tests.mozilla.org", function(a7) { 1.901 + do_check_neq(a7, null); 1.902 + do_check_true(a7.isActive); 1.903 + do_check_true(a7.isCompatible); 1.904 + do_check_false(a7.appDisabled); 1.905 + 1.906 + a7.uninstall(); 1.907 + do_execute_soon(run_test_14); 1.908 + }); 1.909 +} 1.910 + 1.911 +// Test that background update checks doesn't update an add-on that isn't 1.912 +// allowed to update automatically. 1.913 +function run_test_14() { 1.914 + restartManager(); 1.915 + 1.916 + // Have an add-on there that will be updated so we see some events from it 1.917 + writeInstallRDFForExtension({ 1.918 + id: "addon1@tests.mozilla.org", 1.919 + version: "1.0", 1.920 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.921 + targetApplications: [{ 1.922 + id: "xpcshell@tests.mozilla.org", 1.923 + minVersion: "1", 1.924 + maxVersion: "1" 1.925 + }], 1.926 + name: "Test Addon 1", 1.927 + }, profileDir); 1.928 + 1.929 + writeInstallRDFForExtension({ 1.930 + id: "addon8@tests.mozilla.org", 1.931 + version: "1.0", 1.932 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.933 + targetApplications: [{ 1.934 + id: "xpcshell@tests.mozilla.org", 1.935 + minVersion: "1", 1.936 + maxVersion: "1" 1.937 + }], 1.938 + name: "Test Addon 8", 1.939 + }, profileDir); 1.940 + restartManager(); 1.941 + 1.942 + AddonManager.getAddonByID("addon8@tests.mozilla.org", function(a8) { 1.943 + a8.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DISABLE; 1.944 + 1.945 + // The background update check will find updates for both add-ons but only 1.946 + // proceed to install one of them. 1.947 + AddonManager.addInstallListener({ 1.948 + onNewInstall: function(aInstall) { 1.949 + if (aInstall.existingAddon.id != "addon1@tests.mozilla.org" && 1.950 + aInstall.existingAddon.id != "addon8@tests.mozilla.org") 1.951 + do_throw("Saw unexpected onNewInstall for " + aInstall.existingAddon.id); 1.952 + }, 1.953 + 1.954 + onDownloadStarted: function(aInstall) { 1.955 + do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org"); 1.956 + }, 1.957 + 1.958 + onDownloadEnded: function(aInstall) { 1.959 + do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org"); 1.960 + }, 1.961 + 1.962 + onDownloadFailed: function(aInstall) { 1.963 + do_throw("Should not have seen onDownloadFailed event"); 1.964 + }, 1.965 + 1.966 + onDownloadCancelled: function(aInstall) { 1.967 + do_throw("Should not have seen onDownloadCancelled event"); 1.968 + }, 1.969 + 1.970 + onInstallStarted: function(aInstall) { 1.971 + do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org"); 1.972 + }, 1.973 + 1.974 + onInstallEnded: function(aInstall) { 1.975 + do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org"); 1.976 + do_check_eq(aInstall.existingAddon.pendingUpgrade.install, aInstall); 1.977 + 1.978 + do_execute_soon(check_test_14); 1.979 + }, 1.980 + 1.981 + onInstallFailed: function(aInstall) { 1.982 + do_throw("Should not have seen onInstallFailed event"); 1.983 + }, 1.984 + 1.985 + onInstallCancelled: function(aInstall) { 1.986 + do_throw("Should not have seen onInstallCancelled event"); 1.987 + }, 1.988 + }); 1.989 + 1.990 + // Fake a timer event 1.991 + gInternalManager.notify(null); 1.992 + }); 1.993 +} 1.994 + 1.995 +function check_test_14() { 1.996 + restartManager(); 1.997 + AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", 1.998 + "addon8@tests.mozilla.org"], function([a1, a8]) { 1.999 + do_check_neq(a1, null); 1.1000 + do_check_eq(a1.version, "2.0"); 1.1001 + a1.uninstall(); 1.1002 + 1.1003 + do_check_neq(a8, null); 1.1004 + do_check_eq(a8.version, "1.0"); 1.1005 + a8.uninstall(); 1.1006 + 1.1007 + do_execute_soon(run_test_15); 1.1008 + }); 1.1009 +} 1.1010 + 1.1011 +// Test that background update checks doesn't update an add-on that is 1.1012 +// pending uninstall 1.1013 +function run_test_15() { 1.1014 + restartManager(); 1.1015 + 1.1016 + // Have an add-on there that will be updated so we see some events from it 1.1017 + writeInstallRDFForExtension({ 1.1018 + id: "addon1@tests.mozilla.org", 1.1019 + version: "1.0", 1.1020 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.1021 + targetApplications: [{ 1.1022 + id: "xpcshell@tests.mozilla.org", 1.1023 + minVersion: "1", 1.1024 + maxVersion: "1" 1.1025 + }], 1.1026 + name: "Test Addon 1", 1.1027 + }, profileDir); 1.1028 + 1.1029 + writeInstallRDFForExtension({ 1.1030 + id: "addon8@tests.mozilla.org", 1.1031 + version: "1.0", 1.1032 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.1033 + targetApplications: [{ 1.1034 + id: "xpcshell@tests.mozilla.org", 1.1035 + minVersion: "1", 1.1036 + maxVersion: "1" 1.1037 + }], 1.1038 + name: "Test Addon 8", 1.1039 + }, profileDir); 1.1040 + restartManager(); 1.1041 + 1.1042 + AddonManager.getAddonByID("addon8@tests.mozilla.org", function(a8) { 1.1043 + a8.uninstall(); 1.1044 + do_check_false(hasFlag(a8.permissions, AddonManager.PERM_CAN_UPGRADE)); 1.1045 + 1.1046 + // The background update check will find updates for both add-ons but only 1.1047 + // proceed to install one of them. 1.1048 + AddonManager.addInstallListener({ 1.1049 + onNewInstall: function(aInstall) { 1.1050 + if (aInstall.existingAddon.id != "addon1@tests.mozilla.org" && 1.1051 + aInstall.existingAddon.id != "addon8@tests.mozilla.org") 1.1052 + do_throw("Saw unexpected onNewInstall for " + aInstall.existingAddon.id); 1.1053 + }, 1.1054 + 1.1055 + onDownloadStarted: function(aInstall) { 1.1056 + do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org"); 1.1057 + }, 1.1058 + 1.1059 + onDownloadEnded: function(aInstall) { 1.1060 + do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org"); 1.1061 + }, 1.1062 + 1.1063 + onDownloadFailed: function(aInstall) { 1.1064 + do_throw("Should not have seen onDownloadFailed event"); 1.1065 + }, 1.1066 + 1.1067 + onDownloadCancelled: function(aInstall) { 1.1068 + do_throw("Should not have seen onDownloadCancelled event"); 1.1069 + }, 1.1070 + 1.1071 + onInstallStarted: function(aInstall) { 1.1072 + do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org"); 1.1073 + }, 1.1074 + 1.1075 + onInstallEnded: function(aInstall) { 1.1076 + do_check_eq(aInstall.existingAddon.id, "addon1@tests.mozilla.org"); 1.1077 + do_execute_soon(check_test_15); 1.1078 + }, 1.1079 + 1.1080 + onInstallFailed: function(aInstall) { 1.1081 + do_throw("Should not have seen onInstallFailed event"); 1.1082 + }, 1.1083 + 1.1084 + onInstallCancelled: function(aInstall) { 1.1085 + do_throw("Should not have seen onInstallCancelled event"); 1.1086 + }, 1.1087 + }); 1.1088 + 1.1089 + // Fake a timer event 1.1090 + gInternalManager.notify(null); 1.1091 + }); 1.1092 +} 1.1093 + 1.1094 +function check_test_15() { 1.1095 + restartManager(); 1.1096 + AddonManager.getAddonsByIDs(["addon1@tests.mozilla.org", 1.1097 + "addon8@tests.mozilla.org"], function([a1, a8]) { 1.1098 + do_check_neq(a1, null); 1.1099 + do_check_eq(a1.version, "2.0"); 1.1100 + a1.uninstall(); 1.1101 + 1.1102 + do_check_eq(a8, null); 1.1103 + 1.1104 + do_execute_soon(run_test_16); 1.1105 + }); 1.1106 +} 1.1107 + 1.1108 +function run_test_16() { 1.1109 + restartManager(); 1.1110 + 1.1111 + restartManager(); 1.1112 + 1.1113 + let url = "http://localhost:" + gPort + "/addons/test_install2_1.xpi"; 1.1114 + AddonManager.getInstallForURL(url, function(aInstall) { 1.1115 + aInstall.addListener({ 1.1116 + onInstallEnded: function() { 1.1117 + do_execute_soon(function install_2_1_ended() { 1.1118 + restartManager(); 1.1119 + 1.1120 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a1) { 1.1121 + do_check_neq(a1.syncGUID, null); 1.1122 + let oldGUID = a1.syncGUID; 1.1123 + 1.1124 + let url = "http://localhost:" + gPort + "/addons/test_install2_2.xpi"; 1.1125 + AddonManager.getInstallForURL(url, function(aInstall) { 1.1126 + aInstall.addListener({ 1.1127 + onInstallEnded: function() { 1.1128 + do_execute_soon(function install_2_2_ended() { 1.1129 + restartManager(); 1.1130 + 1.1131 + AddonManager.getAddonByID("addon2@tests.mozilla.org", function(a2) { 1.1132 + do_check_neq(a2.syncGUID, null); 1.1133 + do_check_eq(oldGUID, a2.syncGUID); 1.1134 + 1.1135 + a2.uninstall(); 1.1136 + do_execute_soon(run_test_17); 1.1137 + }); 1.1138 + }); 1.1139 + } 1.1140 + }); 1.1141 + aInstall.install(); 1.1142 + }, "application/x-xpinstall"); 1.1143 + }); 1.1144 + }); 1.1145 + } 1.1146 + }); 1.1147 + aInstall.install(); 1.1148 + }, "application/x-xpinstall"); 1.1149 +} 1.1150 + 1.1151 +// Test that the update check correctly observes the 1.1152 +// extensions.strictCompatibility pref and compatibility overrides. 1.1153 +function run_test_17() { 1.1154 + restartManager(); 1.1155 + 1.1156 + writeInstallRDFForExtension({ 1.1157 + id: "addon9@tests.mozilla.org", 1.1158 + version: "1.0", 1.1159 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.1160 + targetApplications: [{ 1.1161 + id: "xpcshell@tests.mozilla.org", 1.1162 + minVersion: "0.1", 1.1163 + maxVersion: "0.2" 1.1164 + }], 1.1165 + name: "Test Addon 9", 1.1166 + }, profileDir); 1.1167 + restartManager(); 1.1168 + 1.1169 + AddonManager.addInstallListener({ 1.1170 + onNewInstall: function(aInstall) { 1.1171 + if (aInstall.existingAddon.id != "addon9@tests.mozilla.org") 1.1172 + do_throw("Saw unexpected onNewInstall for " + aInstall.existingAddon.id); 1.1173 + do_check_eq(aInstall.version, "3.0"); 1.1174 + }, 1.1175 + onDownloadFailed: function(aInstall) { 1.1176 + AddonManager.getAddonByID("addon9@tests.mozilla.org", function(a9) { 1.1177 + a9.uninstall(); 1.1178 + do_execute_soon(run_test_18); 1.1179 + }); 1.1180 + } 1.1181 + }); 1.1182 + 1.1183 + Services.prefs.setCharPref(PREF_GETADDONS_BYIDS, 1.1184 + "http://localhost:" + gPort + "/data/test_update.xml"); 1.1185 + Services.prefs.setCharPref(PREF_GETADDONS_BYIDS_PERFORMANCE, 1.1186 + "http://localhost:" + gPort + "/data/test_update.xml"); 1.1187 + Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, true); 1.1188 + // Fake a timer event 1.1189 + gInternalManager.notify(null); 1.1190 +} 1.1191 + 1.1192 +// Tests that compatibility updates are applied to addons when the updated 1.1193 +// compatibility data wouldn't match with strict compatibility enabled. 1.1194 +function run_test_18() { 1.1195 + restartManager(); 1.1196 + writeInstallRDFForExtension({ 1.1197 + id: "addon10@tests.mozilla.org", 1.1198 + version: "1.0", 1.1199 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.1200 + targetApplications: [{ 1.1201 + id: "xpcshell@tests.mozilla.org", 1.1202 + minVersion: "0.1", 1.1203 + maxVersion: "0.2" 1.1204 + }], 1.1205 + name: "Test Addon 10", 1.1206 + }, profileDir); 1.1207 + restartManager(); 1.1208 + 1.1209 + AddonManager.getAddonByID("addon10@tests.mozilla.org", function(a10) { 1.1210 + do_check_neq(a10, null); 1.1211 + 1.1212 + a10.findUpdates({ 1.1213 + onNoCompatibilityUpdateAvailable: function() { 1.1214 + do_throw("Should have seen compatibility information"); 1.1215 + }, 1.1216 + 1.1217 + onUpdateAvailable: function() { 1.1218 + do_throw("Should not have seen an available update"); 1.1219 + }, 1.1220 + 1.1221 + onUpdateFinished: function() { 1.1222 + a10.uninstall(); 1.1223 + do_execute_soon(run_test_19); 1.1224 + } 1.1225 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.1226 + }); 1.1227 +} 1.1228 + 1.1229 +// Test that the update check correctly observes when an addon opts-in to 1.1230 +// strict compatibility checking. 1.1231 +function run_test_19() { 1.1232 + restartManager(); 1.1233 + writeInstallRDFForExtension({ 1.1234 + id: "addon11@tests.mozilla.org", 1.1235 + version: "1.0", 1.1236 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.1237 + targetApplications: [{ 1.1238 + id: "xpcshell@tests.mozilla.org", 1.1239 + minVersion: "0.1", 1.1240 + maxVersion: "0.2" 1.1241 + }], 1.1242 + name: "Test Addon 11", 1.1243 + }, profileDir); 1.1244 + restartManager(); 1.1245 + 1.1246 + AddonManager.getAddonByID("addon11@tests.mozilla.org", function(a11) { 1.1247 + do_check_neq(a11, null); 1.1248 + 1.1249 + a11.findUpdates({ 1.1250 + onCompatibilityUpdateAvailable: function() { 1.1251 + do_throw("Should have not have seen compatibility information"); 1.1252 + }, 1.1253 + 1.1254 + onUpdateAvailable: function() { 1.1255 + do_throw("Should not have seen an available update"); 1.1256 + }, 1.1257 + 1.1258 + onUpdateFinished: function() { 1.1259 + a11.uninstall(); 1.1260 + do_execute_soon(run_test_20); 1.1261 + } 1.1262 + }, AddonManager.UPDATE_WHEN_USER_REQUESTED); 1.1263 + }); 1.1264 +} 1.1265 + 1.1266 +// Test that the update succeeds when the update.rdf URN contains a type prefix 1.1267 +// different from the add-on type 1.1268 +function run_test_20() { 1.1269 + restartManager(); 1.1270 + writeInstallRDFForExtension({ 1.1271 + id: "addon12@tests.mozilla.org", 1.1272 + version: "1.0", 1.1273 + updateURL: "http://localhost:" + gPort + "/data/test_update.rdf", 1.1274 + targetApplications: [{ 1.1275 + id: "xpcshell@tests.mozilla.org", 1.1276 + minVersion: "1", 1.1277 + maxVersion: "1" 1.1278 + }], 1.1279 + name: "Test Addon 12", 1.1280 + }, profileDir); 1.1281 + restartManager(); 1.1282 + 1.1283 + prepare_test({}, [ 1.1284 + "onNewInstall", 1.1285 + "onDownloadStarted", 1.1286 + "onDownloadEnded" 1.1287 + ], continue_test_20); 1.1288 + 1.1289 + AddonManagerPrivate.backgroundUpdateCheck(); 1.1290 +} 1.1291 + 1.1292 +function continue_test_20(install) { 1.1293 + do_check_neq(install.existingAddon, null); 1.1294 + do_check_eq(install.existingAddon.id, "addon12@tests.mozilla.org"); 1.1295 + 1.1296 + prepare_test({ 1.1297 + "addon12@tests.mozilla.org": [ 1.1298 + "onInstalling" 1.1299 + ] 1.1300 + }, [ 1.1301 + "onInstallStarted", 1.1302 + "onInstallEnded", 1.1303 + ], callback_soon(check_test_20)); 1.1304 +} 1.1305 + 1.1306 +function check_test_20(install) { 1.1307 + do_check_eq(install.existingAddon.pendingUpgrade.install, install); 1.1308 + 1.1309 + restartManager(); 1.1310 + AddonManager.getAddonByID("addon12@tests.mozilla.org", function(a12) { 1.1311 + do_check_neq(a12, null); 1.1312 + do_check_eq(a12.version, "2.0"); 1.1313 + do_check_eq(a12.type, "extension"); 1.1314 + a12.uninstall(); 1.1315 + 1.1316 + do_execute_soon(() => { 1.1317 + restartManager(); 1.1318 + end_test(); 1.1319 + }); 1.1320 + }); 1.1321 +}