toolkit/mozapps/extensions/test/xpcshell/test_update_strictcompat.js

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

mercurial