guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

02/02: gnu: icecat: Add fixes from Firefox ESR 45.5.0.


From: Mark H. Weaver
Subject: 02/02: gnu: icecat: Add fixes from Firefox ESR 45.5.0.
Date: Wed, 16 Nov 2016 18:05:54 +0000 (UTC)

mhw pushed a commit to branch master
in repository guix.

commit 1a87aa75671ad6567cd57fce0936220862107478
Author: Mark H Weaver <address@hidden>
Date:   Wed Nov 16 04:38:27 2016 -0500

    gnu: icecat: Add fixes from Firefox ESR 45.5.0.
    
    Includes fixes for CVE-2016-5290, CVE-2016-5291, CVE-2016-5297, 
CVE-2016-9064,
    and CVE-2016-9066.
    
    * gnu/packages/gnuzilla.scm (icecat)[source][patches]: Add fixes for
    aforementioned CVEs and other selected fixes from Firefox ESR 45.5.0.  Note
    that the first six patches of CVE-2016-5290 and the patch for CVE-2016-9066
    were already present, but were labeled by mozilla bug number instead of CVE.
    * gnu/packages/patches/icecat-CVE-2016-9064.patch: New file.
    * gnu/local.mk (dist_patch_DATA): Add it.
---
 gnu/local.mk                                    |    1 +
 gnu/packages/gnuzilla.scm                       |   30 +-
 gnu/packages/patches/icecat-CVE-2016-9064.patch |  996 +++++++++++++++++++++++
 3 files changed, 1020 insertions(+), 7 deletions(-)

diff --git a/gnu/local.mk b/gnu/local.mk
index 8a8b743..3989cb8 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -612,6 +612,7 @@ dist_patch_DATA =                                           
\
   %D%/packages/patches/hypre-ldflags.patch                     \
   %D%/packages/patches/icecat-avoid-bundled-libraries.patch    \
   %D%/packages/patches/icecat-binutils.patch                   \
+  %D%/packages/patches/icecat-CVE-2016-9064.patch              \
   %D%/packages/patches/icu4c-CVE-2014-6585.patch               \
   %D%/packages/patches/icu4c-CVE-2015-1270.patch               \
   %D%/packages/patches/icu4c-CVE-2015-4760.patch               \
diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm
index 6bfe90f..267c621 100644
--- a/gnu/packages/gnuzilla.scm
+++ b/gnu/packages/gnuzilla.scm
@@ -346,13 +346,29 @@ standards.")
          ,(mozilla-patch "icecat-CVE-2016-5284-pt5.patch" "0799490f4e6f" 
"1ypv6i48nabbhcqbach8fbgz9bmnhm7q5z9dnfid44z8g54l3f33")
          ,(mozilla-patch "icecat-CVE-2016-5284-pt6.patch" "fc990e4ae8bc" 
"1s2cj505ajwwiy4xvn5zlmyzqpgahxmqqvis0a6xm6mjbjh02gm4")
          ,(mozilla-patch "icecat-bug-1251088.patch"       "5ffa912ed83e" 
"0v5lpv3c89c2d4y5acn0kyijv096axdnrvaj5ya5yypzfcaqxv24")
-         ,(mozilla-patch "icecat-bug-1292590.patch"       "d4b5b8f3e373" 
"0w8cxn6ryhgxryy8k8i06yw4mknv509ns9ff1avd0hmgxa83mcdp")
-         ,(mozilla-patch "icecat-bug-1298169.patch"       "adce603ae36d" 
"0mgs85cwx61bk17r7npl311l4m8yn4667wyhgjmm2ajiys6nn0yl")
-         ,(mozilla-patch "icecat-bug-1301496.patch"       "97268426bb6f" 
"1z7hg796cgag025gm9pp2szz7w870s7naagdri1dlsilj797v8hr")
-         ,(mozilla-patch "icecat-bug-1299519.patch"       "fc055950b6b8" 
"05iml5k3rzc653jk4imd111sh18625jxfxkcj12kjdihl0gdr4x4")
-         ,(mozilla-patch "icecat-bug-1303710.patch"       "6f845c23565b" 
"01dlbnmpsnwr448fajs276y62gl03r74k1hxnwsg6ihwhnfdvn5a")
-         ,(mozilla-patch "icecat-bug-1301343.patch"       "e5d51ca7a3c0" 
"0hshcz24hc6pkz5pcqxhajm17ibwrlfn1s00frfnpjjy56vacfz0")
-         ,(mozilla-patch "icecat-bug-1299686.patch"       "576f1725a57e" 
"1lic9d3r8r1vcniw1g3ca71390lw3dmwjsw55dp6z96hyjbcq3fd")))
+         ,(mozilla-patch "icecat-CVE-2016-5290-pt1.patch" "d4b5b8f3e373" 
"0w8cxn6ryhgxryy8k8i06yw4mknv509ns9ff1avd0hmgxa83mcdp")
+         ,(mozilla-patch "icecat-CVE-2016-5290-pt2.patch" "adce603ae36d" 
"0mgs85cwx61bk17r7npl311l4m8yn4667wyhgjmm2ajiys6nn0yl")
+         ,(mozilla-patch "icecat-CVE-2016-5290-pt3.patch" "97268426bb6f" 
"1z7hg796cgag025gm9pp2szz7w870s7naagdri1dlsilj797v8hr")
+         ,(mozilla-patch "icecat-CVE-2016-5290-pt4.patch" "fc055950b6b8" 
"05iml5k3rzc653jk4imd111sh18625jxfxkcj12kjdihl0gdr4x4")
+         ,(mozilla-patch "icecat-CVE-2016-5290-pt5.patch" "6f845c23565b" 
"01dlbnmpsnwr448fajs276y62gl03r74k1hxnwsg6ihwhnfdvn5a")
+         ,(mozilla-patch "icecat-CVE-2016-5290-pt6.patch" "e5d51ca7a3c0" 
"0hshcz24hc6pkz5pcqxhajm17ibwrlfn1s00frfnpjjy56vacfz0")
+         ,(mozilla-patch "icecat-CVE-2016-5290-pt7.patch" "61d1463acd04" 
"1iig4a79dxmfcr6w82mdhyl88wy7d36g5n4p24632kbabgl9j9sz")
+         ,(mozilla-patch "icecat-CVE-2016-5290-pt8.patch" "8e0bab4216de" 
"1knq8h5ni8crfndi3p78b2pyj5lzchqw67vk0yx061r76mq4wp4r")
+         ,(mozilla-patch "icecat-CVE-2016-5290-pt9.patch" "bb10104dc89e" 
"1flvagckrzfk7hs2xzb5j3s5i0ck57ygyskh5494xmpa2a1nnsqj")
+         ,(mozilla-patch "icecat-CVE-2016-5290-pt10.patch" "7006b275b829" 
"0sqagm247wx94mf51fyhdkn0vf1a1qy9i829shjnhssd79srxmnn")
+         ,(mozilla-patch "icecat-CVE-2016-5290-pt11.patch" "32ce7be98543" 
"1y2r9i4p1qpqi75mlwmibr51whz5h1vj28c6mh6ik57dxkqxbclb")
+         ,(mozilla-patch "icecat-CVE-2016-5291.patch"     "3ff0c89f3b26" 
"1prn74aglshaj27jfrpd2s2i4slpljw4rbzjxc1qgwjvkq4m6j6f")
+         ,(mozilla-patch "icecat-CVE-2016-5296.patch"     "5e39c1c2fded" 
"0rjza37gvpzhbqfmpad33kljnpl1yfd9wm8xf7ll6bay3m8cqj6j")
+         ,(mozilla-patch "icecat-CVE-2016-5297.patch"     "46b07bdbf8b2" 
"1n8y1c5l0ms81dra7jsx8mp633ak5qvx105drvlg9hn3m0fwv1lj")
+         ,(search-patch  "icecat-CVE-2016-9064.patch") ; adapted for icecat 
based on:
+                                        ;                 "00c2b7baaa0b" 
"0y02yb7r62656nq9dji9dnwils2lxqasjz5byv62j1xa87r7f9hp"
+         ,(mozilla-patch "icecat-CVE-2016-9066.patch"     "576f1725a57e" 
"1lic9d3r8r1vcniw1g3ca71390lw3dmwjsw55dp6z96hyjbcq3fd")
+         ,(mozilla-patch "icecat-bug-1212939.patch"       "4a0e851f83e4" 
"182vx1qxrr7r2175jjf0bcixwwm1khdj4sq0c8wnsyry7p9waq5q")
+         ,(mozilla-patch "icecat-bug-1168743.patch"       "a1e06af61ab3" 
"07llk1ba6axjasiv30vicz96k55ff4mybxy21vjxk6j0asgyjz23")
+         ,(mozilla-patch "icecat-bug-1287176.patch"       "0569d5dce9db" 
"1d41sqbq6jc3af73dz9w19win7v7c12kw1mp7j7b1gkadq46c4y7")
+         ,(mozilla-patch "icecat-bug-1263665.patch"       "a79cafee93f4" 
"0bn7hpm8mh8qmkpz5wiridr792irrs5sjxyvryazy2i0p4pjh62p")
+         ,(mozilla-patch "icecat-bug-1304962.patch"       "f61049d5f373" 
"04d1na31qqq7yq4jjvhq6vzqq3f23rwac8c6fw4h5fx1pdb3l997")
+         ,(mozilla-patch "icecat-bug-1314574.patch"       "46b2558ca469" 
"00q8676xg4wb7p371wgi04nl05j7idkb2kna9a0l08k6lks9wdhh")))
       (modules '((guix build utils)))
       (snippet
        '(begin
diff --git a/gnu/packages/patches/icecat-CVE-2016-9064.patch 
b/gnu/packages/patches/icecat-CVE-2016-9064.patch
new file mode 100644
index 0000000..a539381
--- /dev/null
+++ b/gnu/packages/patches/icecat-CVE-2016-9064.patch
@@ -0,0 +1,996 @@
+Copied from
+<https://hg.mozilla.org/releases/mozilla-esr45/raw-rev/00c2b7baaa0b>
+but with one hunk omitted: the git binary patch for
+toolkit/mozapps/extensions/test/addons/test_update_multi2/addon.xpi
+which is not present in the IceCat sources.
+
+# HG changeset patch
+# User Andrew Swan <address@hidden>
+# Date 1474063218 25200
+# Node ID 00c2b7baaa0b4bfb7d5f1aac31c094ea6b255e1f
+# Parent  46b07bdbf8b20cf3fdc28104add57ff58a55832b
+Bug 1303418 - Don't allow upgrades that change the addon ID. r=mossop, 
a=lizzard
+
+MozReview-Commit-ID: JHINo8ShmeI
+
+diff --git a/toolkit/mozapps/extensions/AddonManager.jsm 
b/toolkit/mozapps/extensions/AddonManager.jsm
+--- a/toolkit/mozapps/extensions/AddonManager.jsm
++++ b/toolkit/mozapps/extensions/AddonManager.jsm
+@@ -2956,16 +2956,18 @@ this.AddonManager = {
+   // The downloaded file seems to be corrupted in some way.
+   ERROR_CORRUPT_FILE: -3,
+   // An error occured trying to write to the filesystem.
+   ERROR_FILE_ACCESS: -4,
+   // The add-on must be signed and isn't.
+   ERROR_SIGNEDSTATE_REQUIRED: -5,
+   // The downloaded add-on had a different type than expected.
+   ERROR_UNEXPECTED_ADDON_TYPE: -6,
++  // The addon did not have the expected ID
++  ERROR_INCORRECT_ID: -7,
+ 
+   // These must be kept in sync with AddonUpdateChecker.
+   // No error was encountered.
+   UPDATE_STATUS_NO_ERROR: 0,
+   // The update check timed out
+   UPDATE_STATUS_TIMEOUT: -1,
+   // There was an error while downloading the update information.
+   UPDATE_STATUS_DOWNLOAD_ERROR: -2,
+diff --git a/toolkit/mozapps/extensions/internal/XPIProvider.jsm 
b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
+--- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm
++++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
+@@ -5473,16 +5473,37 @@ AddonInstall.prototype = {
+       // loadManifestFromZipReader performs the certificate verification for 
us
+       this.addon = yield loadManifestFromZipReader(zipreader, 
this.installLocation);
+     }
+     catch (e) {
+       zipreader.close();
+       return Promise.reject([AddonManager.ERROR_CORRUPT_FILE, e]);
+     }
+ 
++    if (this.existingAddon) {
++      // Check various conditions related to upgrades
++      if (this.addon.id != this.existingAddon.id) {
++        zipreader.close();
++        return Promise.reject([AddonManager.ERROR_INCORRECT_ID,
++                               `Refusing to upgrade addon 
${this.existingAddon.id} to different ID ${this.addon.id}`]);
++      }
++
++      if (this.addon.type == "multipackage") {
++        zipreader.close();
++        return Promise.reject([AddonManager.ERROR_UNEXPECTED_ADDON_TYPE,
++                               `Refusing to upgrade addon 
${this.existingAddon.id} to a multi-package xpi`]);
++      }
++
++      if (this.existingAddon.type == "webextension" && this.addon.type != 
"webextension") {
++        zipreader.close();
++        return Promise.reject([AddonManager.ERROR_UNEXPECTED_ADDON_TYPE,
++                               "Webextensions may not be updated to other 
extension types"]);
++      }
++    }
++
+     if (mustSign(this.addon.type)) {
+       if (this.addon.signedState <= AddonManager.SIGNEDSTATE_MISSING) {
+         // This add-on isn't properly signed by a signature that chains to the
+         // trusted root.
+         let state = this.addon.signedState;
+         this.addon = null;
+         zipreader.close();
+ 
+@@ -5510,23 +5531,16 @@ AddonInstall.prototype = {
+         } else {
+           zipreader.close();
+           return Promise.reject([AddonManager.ERROR_CORRUPT_FILE,
+                                  "XPI is incorrectly signed"]);
+         }
+       }
+     }
+ 
+-    if (this.existingAddon && this.existingAddon.type == "webextension" &&
+-        this.addon.type != "webextension") {
+-      zipreader.close();
+-      return Promise.reject([AddonManager.ERROR_UNEXPECTED_ADDON_TYPE,
+-                             "WebExtensions may not be upated to other 
extension types"]);
+-    }
+-
+     if (this.addon.type == "multipackage")
+       return this._loadMultipackageManifests(zipreader);
+ 
+     zipreader.close();
+ 
+     this.updateAddonURIs();
+ 
+     this.addon._install = this;
+@@ -5791,16 +5805,17 @@ AddonInstall.prototype = {
+           else {
+             // TODO Should we send some event here (bug 557716)?
+             this.state = AddonManager.STATE_CHECKING;
+             new UpdateChecker(this.addon, {
+               onUpdateFinished: aAddon => this.downloadCompleted(),
+             }, AddonManager.UPDATE_WHEN_ADDON_INSTALLED);
+           }
+         }, ([error, message]) => {
++          this.removeTemporaryFile();
+           this.downloadFailed(error, message);
+         });
+       }
+       else {
+         if (aRequest instanceof Ci.nsIHttpChannel)
+           this.downloadFailed(AddonManager.ERROR_NETWORK_FAILURE,
+                               aRequest.responseStatus + " " +
+                               aRequest.responseStatusText);
+diff --git 
a/toolkit/mozapps/extensions/test/addons/test_update_multi1/bootstrap.js 
b/toolkit/mozapps/extensions/test/addons/test_update_multi1/bootstrap.js
+new file mode 100644
+--- /dev/null
++++ b/toolkit/mozapps/extensions/test/addons/test_update_multi1/bootstrap.js
+@@ -0,0 +1,5 @@
++
++function install(data, reason) {}
++function startup(data, reason) {}
++function shutdown(data, reason) {}
++function uninstall(data, reason) {}
+diff --git 
a/toolkit/mozapps/extensions/test/addons/test_update_multi1/install.rdf 
b/toolkit/mozapps/extensions/test/addons/test_update_multi1/install.rdf
+new file mode 100644
+--- /dev/null
++++ b/toolkit/mozapps/extensions/test/addons/test_update_multi1/install.rdf
+@@ -0,0 +1,16 @@
++<?xml version="1.0"?>
++<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
++     xmlns:em="http://www.mozilla.org/2004/em-rdf#";>
++<Description about="urn:mozilla:install-manifest">
++  <em:id>address@hidden</em:id>
++  <em:version>1.0</em:version>
++  
<em:updateURL>http://localhost:4444/data/test_update_multi.rdf</em:updateURL>
++  <em:bootstrap>true</em:bootstrap>
++  <em:name>Test Addon 1</em:name>
++<em:targetApplication><Description>
++  <em:id>address@hidden</em:id>
++  <em:minVersion>1</em:minVersion>
++  <em:maxVersion>1</em:maxVersion>
++</Description></em:targetApplication>
++</Description>
++</RDF>
+diff --git 
a/toolkit/mozapps/extensions/test/addons/test_update_multi2/install.rdf 
b/toolkit/mozapps/extensions/test/addons/test_update_multi2/install.rdf
+new file mode 100644
+--- /dev/null
++++ b/toolkit/mozapps/extensions/test/addons/test_update_multi2/install.rdf
+@@ -0,0 +1,9 @@
++<?xml version="1.0"?>
++<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
++     xmlns:em="http://www.mozilla.org/2004/em-rdf#";>
++<Description about="urn:mozilla:install-manifest">
++  <em:id>address@hidden</em:id>
++  <em:type>32</em:type>
++  <em:version>2.0</em:version>
++</Description>
++</RDF>
+diff --git 
a/toolkit/mozapps/extensions/test/addons/test_updateid1/bootstrap.js 
b/toolkit/mozapps/extensions/test/addons/test_updateid1/bootstrap.js
+new file mode 100644
+--- /dev/null
++++ b/toolkit/mozapps/extensions/test/addons/test_updateid1/bootstrap.js
+@@ -0,0 +1,5 @@
++
++function install(data, reason) {}
++function startup(data, reason) {}
++function shutdown(data, reason) {}
++function uninstall(data, reason) {}
+diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid1/install.rdf 
b/toolkit/mozapps/extensions/test/addons/test_updateid1/install.rdf
+new file mode 100644
+--- /dev/null
++++ b/toolkit/mozapps/extensions/test/addons/test_updateid1/install.rdf
+@@ -0,0 +1,16 @@
++<?xml version="1.0"?>
++<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
++     xmlns:em="http://www.mozilla.org/2004/em-rdf#";>
++<Description about="urn:mozilla:install-manifest">
++  <em:id>address@hidden</em:id>
++  <em:version>1.0</em:version>
++  <em:updateURL>http://localhost:4444/data/test_updateid.rdf</em:updateURL>
++  <em:bootstrap>true</em:bootstrap>
++  <em:name>Test Addon 1</em:name>
++<em:targetApplication><Description>
++  <em:id>address@hidden</em:id>
++  <em:minVersion>1</em:minVersion>
++  <em:maxVersion>1</em:maxVersion>
++</Description></em:targetApplication>
++</Description>
++</RDF>
+diff --git 
a/toolkit/mozapps/extensions/test/addons/test_updateid2/bootstrap.js 
b/toolkit/mozapps/extensions/test/addons/test_updateid2/bootstrap.js
+new file mode 100644
+--- /dev/null
++++ b/toolkit/mozapps/extensions/test/addons/test_updateid2/bootstrap.js
+@@ -0,0 +1,5 @@
++
++function install(data, reason) {}
++function startup(data, reason) {}
++function shutdown(data, reason) {}
++function uninstall(data, reason) {}
+diff --git a/toolkit/mozapps/extensions/test/addons/test_updateid2/install.rdf 
b/toolkit/mozapps/extensions/test/addons/test_updateid2/install.rdf
+new file mode 100644
+--- /dev/null
++++ b/toolkit/mozapps/extensions/test/addons/test_updateid2/install.rdf
+@@ -0,0 +1,16 @@
++<?xml version="1.0"?>
++<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
++     xmlns:em="http://www.mozilla.org/2004/em-rdf#";>
++<Description about="urn:mozilla:install-manifest">
++  <em:id>address@hidden</em:id>
++  <em:version>2.0</em:version>
++  <em:updateURL>http://localhost:4444/data/test_updateid.rdf</em:updateURL>
++  <em:bootstrap>true</em:bootstrap>
++  <em:name>Test Addon 1</em:name>
++<em:targetApplication><Description>
++  <em:id>address@hidden</em:id>
++  <em:minVersion>1</em:minVersion>
++  <em:maxVersion>1</em:maxVersion>
++</Description></em:targetApplication>
++</Description>
++</RDF>
+diff --git 
a/toolkit/mozapps/extensions/test/addons/test_updateid2_2/install.rdf 
b/toolkit/mozapps/extensions/test/addons/test_updateid2_2/install.rdf
+deleted file mode 100644
+--- a/toolkit/mozapps/extensions/test/addons/test_updateid2_2/install.rdf
++++ /dev/null
+@@ -1,24 +0,0 @@
+-<?xml version="1.0"?>
+-
+-<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+-     xmlns:em="http://www.mozilla.org/2004/em-rdf#";>
+-
+-  <Description about="urn:mozilla:install-manifest">
+-    <em:id>address@hidden</em:id>
+-    <em:version>2.0</em:version>
+-    <em:updateURL>http://localhost:4444/data/test_updateid.rdf</em:updateURL>
+-
+-    <!-- Front End MetaData -->
+-    <em:name>Test 2</em:name>
+-    <em:description>Test Description</em:description>
+-
+-    <em:targetApplication>
+-      <Description>
+-        <em:id>address@hidden</em:id>
+-        <em:minVersion>1</em:minVersion>
+-        <em:maxVersion>1</em:maxVersion>
+-      </Description>
+-    </em:targetApplication>
+-
+-  </Description>
+-</RDF>
+diff --git 
a/toolkit/mozapps/extensions/test/addons/test_updateid2_5/install.rdf 
b/toolkit/mozapps/extensions/test/addons/test_updateid2_5/install.rdf
+deleted file mode 100644
+--- a/toolkit/mozapps/extensions/test/addons/test_updateid2_5/install.rdf
++++ /dev/null
+@@ -1,24 +0,0 @@
+-<?xml version="1.0"?>
+-
+-<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+-     xmlns:em="http://www.mozilla.org/2004/em-rdf#";>
+-
+-  <Description about="urn:mozilla:install-manifest">
+-    <em:id>address@hidden</em:id>
+-    <em:version>5.0</em:version>
+-    <em:updateURL>http://localhost:4444/data/test_updateid.rdf</em:updateURL>
+-
+-    <!-- Front End MetaData -->
+-    <em:name>Test 2</em:name>
+-    <em:description>Test Description</em:description>
+-
+-    <em:targetApplication>
+-      <Description>
+-        <em:id>address@hidden</em:id>
+-        <em:minVersion>1</em:minVersion>
+-        <em:maxVersion>1</em:maxVersion>
+-      </Description>
+-    </em:targetApplication>
+-
+-  </Description>
+-</RDF>
+diff --git 
a/toolkit/mozapps/extensions/test/addons/test_updateid3_3/bootstrap.js 
b/toolkit/mozapps/extensions/test/addons/test_updateid3_3/bootstrap.js
+deleted file mode 100644
+--- a/toolkit/mozapps/extensions/test/addons/test_updateid3_3/bootstrap.js
++++ /dev/null
+@@ -1,21 +0,0 @@
+-Components.utils.import("resource://gre/modules/Services.jsm");
+-
+-function install(data, reason) {
+-  Services.prefs.setIntPref("bootstraptest.installed_version", 3);
+-  Services.prefs.setIntPref("bootstraptest.install_reason", reason);
+-}
+-
+-function startup(data, reason) {
+-  Services.prefs.setIntPref("bootstraptest.active_version", 3);
+-  Services.prefs.setIntPref("bootstraptest.startup_reason", reason);
+-}
+-
+-function shutdown(data, reason) {
+-  Services.prefs.setIntPref("bootstraptest.active_version", 0);
+-  Services.prefs.setIntPref("bootstraptest.shutdown_reason", reason);
+-}
+-
+-function uninstall(data, reason) {
+-  Services.prefs.setIntPref("bootstraptest.installed_version", 0);
+-  Services.prefs.setIntPref("bootstraptest.uninstall_reason", reason);
+-}
+diff --git 
a/toolkit/mozapps/extensions/test/addons/test_updateid3_3/install.rdf 
b/toolkit/mozapps/extensions/test/addons/test_updateid3_3/install.rdf
+deleted file mode 100644
+--- a/toolkit/mozapps/extensions/test/addons/test_updateid3_3/install.rdf
++++ /dev/null
+@@ -1,25 +0,0 @@
+-<?xml version="1.0"?>
+-
+-<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+-     xmlns:em="http://www.mozilla.org/2004/em-rdf#";>
+-
+-  <Description about="urn:mozilla:install-manifest">
+-    <em:id>address@hidden</em:id>
+-    <em:version>3.0</em:version>
+-    <em:updateURL>http://localhost:4444/data/test_updateid.rdf</em:updateURL>
+-    <em:bootstrap>true</em:bootstrap>
+-
+-    <!-- Front End MetaData -->
+-    <em:name>Test 3</em:name>
+-    <em:description>Test Description</em:description>
+-
+-    <em:targetApplication>
+-      <Description>
+-        <em:id>address@hidden</em:id>
+-        <em:minVersion>1</em:minVersion>
+-        <em:maxVersion>1</em:maxVersion>
+-      </Description>
+-    </em:targetApplication>
+-
+-  </Description>
+-</RDF>
+diff --git 
a/toolkit/mozapps/extensions/test/addons/test_updateid4_4/bootstrap.js 
b/toolkit/mozapps/extensions/test/addons/test_updateid4_4/bootstrap.js
+deleted file mode 100644
+--- a/toolkit/mozapps/extensions/test/addons/test_updateid4_4/bootstrap.js
++++ /dev/null
+@@ -1,21 +0,0 @@
+-Components.utils.import("resource://gre/modules/Services.jsm");
+-
+-function install(data, reason) {
+-  Services.prefs.setIntPref("bootstraptest.installed_version", 4);
+-  Services.prefs.setIntPref("bootstraptest.install_reason", reason);
+-}
+-
+-function startup(data, reason) {
+-  Services.prefs.setIntPref("bootstraptest.active_version", 4);
+-  Services.prefs.setIntPref("bootstraptest.startup_reason", reason);
+-}
+-
+-function shutdown(data, reason) {
+-  Services.prefs.setIntPref("bootstraptest.active_version", 0);
+-  Services.prefs.setIntPref("bootstraptest.shutdown_reason", reason);
+-}
+-
+-function uninstall(data, reason) {
+-  Services.prefs.setIntPref("bootstraptest.installed_version", 0);
+-  Services.prefs.setIntPref("bootstraptest.uninstall_reason", reason);
+-}
+diff --git 
a/toolkit/mozapps/extensions/test/addons/test_updateid4_4/install.rdf 
b/toolkit/mozapps/extensions/test/addons/test_updateid4_4/install.rdf
+deleted file mode 100644
+--- a/toolkit/mozapps/extensions/test/addons/test_updateid4_4/install.rdf
++++ /dev/null
+@@ -1,25 +0,0 @@
+-<?xml version="1.0"?>
+-
+-<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+-     xmlns:em="http://www.mozilla.org/2004/em-rdf#";>
+-
+-  <Description about="urn:mozilla:install-manifest">
+-    <em:id>address@hidden</em:id>
+-    <em:version>4.0</em:version>
+-    <em:updateURL>http://localhost:4444/data/test_updateid.rdf</em:updateURL>
+-    <em:bootstrap>true</em:bootstrap>
+-
+-    <!-- Front End MetaData -->
+-    <em:name>Test 4</em:name>
+-    <em:description>Test Description</em:description>
+-
+-    <em:targetApplication>
+-      <Description>
+-        <em:id>address@hidden</em:id>
+-        <em:minVersion>1</em:minVersion>
+-        <em:maxVersion>1</em:maxVersion>
+-      </Description>
+-    </em:targetApplication>
+-
+-  </Description>
+-</RDF>
+diff --git 
a/toolkit/mozapps/extensions/test/xpcshell/data/test_update_multi.rdf 
b/toolkit/mozapps/extensions/test/xpcshell/data/test_update_multi.rdf
+new file mode 100644
+--- /dev/null
++++ b/toolkit/mozapps/extensions/test/xpcshell/data/test_update_multi.rdf
+@@ -0,0 +1,26 @@
++<?xml version="1.0" encoding="UTF-8"?>
++
++<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
++     xmlns:em="http://www.mozilla.org/2004/em-rdf#";>
++
++  <Description about="urn:mozilla:extension:address@hidden">
++    <em:updates>
++      <Seq>
++        <li>
++          <Description>
++            <em:version>2.0</em:version>
++            <em:targetApplication>
++              <Description>
++                <em:id>address@hidden</em:id>
++                <em:minVersion>1</em:minVersion>
++                <em:maxVersion>1</em:maxVersion>
++                
<em:updateLink>http://localhost:4444/addons/test_update_multi2.xpi</em:updateLink>
++              </Description>
++            </em:targetApplication>
++          </Description>
++        </li>
++      </Seq>
++    </em:updates>
++  </Description>
++
++</RDF>
+diff --git a/toolkit/mozapps/extensions/test/xpcshell/data/test_updateid.rdf 
b/toolkit/mozapps/extensions/test/xpcshell/data/test_updateid.rdf
+--- a/toolkit/mozapps/extensions/test/xpcshell/data/test_updateid.rdf
++++ b/toolkit/mozapps/extensions/test/xpcshell/data/test_updateid.rdf
+@@ -9,77 +9,17 @@
+         <li>
+           <Description>
+             <em:version>2.0</em:version>
+             <em:targetApplication>
+               <Description>
+                 <em:id>address@hidden</em:id>
+                 <em:minVersion>1</em:minVersion>
+                 <em:maxVersion>1</em:maxVersion>
+-                
<em:updateLink>http://localhost:4444/addons/test_updateid2_2.xpi</em:updateLink>
+-              </Description>
+-            </em:targetApplication>
+-          </Description>
+-        </li>
+-      </Seq>
+-    </em:updates>
+-  </Description>
+-
+-  <Description about="urn:mozilla:extension:address@hidden">
+-    <em:updates>
+-      <Seq>
+-        <li>
+-          <Description>
+-            <em:version>3.0</em:version>
+-            <em:targetApplication>
+-              <Description>
+-                <em:id>address@hidden</em:id>
+-                <em:minVersion>1</em:minVersion>
+-                <em:maxVersion>1</em:maxVersion>
+-                
<em:updateLink>http://localhost:4444/addons/test_updateid3_3.xpi</em:updateLink>
+-              </Description>
+-            </em:targetApplication>
+-          </Description>
+-        </li>
+-      </Seq>
+-    </em:updates>
+-  </Description>
+-
+-  <Description about="urn:mozilla:extension:address@hidden">
+-    <em:updates>
+-      <Seq>
+-        <li>
+-          <Description>
+-            <em:version>4.0</em:version>
+-            <em:targetApplication>
+-              <Description>
+-                <em:id>address@hidden</em:id>
+-                <em:minVersion>1</em:minVersion>
+-                <em:maxVersion>1</em:maxVersion>
+-                
<em:updateLink>http://localhost:4444/addons/test_updateid4_4.xpi</em:updateLink>
+-              </Description>
+-            </em:targetApplication>
+-          </Description>
+-        </li>
+-      </Seq>
+-    </em:updates>
+-  </Description>
+-
+-  <Description about="urn:mozilla:extension:address@hidden">
+-    <em:updates>
+-      <Seq>
+-        <li>
+-          <Description>
+-            <em:version>5.0</em:version>
+-            <em:targetApplication>
+-              <Description>
+-                <em:id>address@hidden</em:id>
+-                <em:minVersion>1</em:minVersion>
+-                <em:maxVersion>1</em:maxVersion>
+-                
<em:updateLink>http://localhost:4444/addons/test_updateid2_5.xpi</em:updateLink>
++                
<em:updateLink>http://localhost:4444/addons/test_updateid2.xpi</em:updateLink>
+               </Description>
+             </em:targetApplication>
+           </Description>
+         </li>
+       </Seq>
+     </em:updates>
+   </Description>
+ 
+diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_updateid.js 
b/toolkit/mozapps/extensions/test/xpcshell/test_updateid.js
+--- a/toolkit/mozapps/extensions/test/xpcshell/test_updateid.js
++++ b/toolkit/mozapps/extensions/test/xpcshell/test_updateid.js
+@@ -2,421 +2,85 @@
+  * http://creativecommons.org/publicdomain/zero/1.0/
+  */
+ 
+ // This verifies that updating an add-on to a new ID works
+ 
+ // The test extension uses an insecure update url.
+ Services.prefs.setBoolPref("extensions.checkUpdateSecurity", false);
+ 
+-Components.utils.import("resource://testing-common/httpd.js");
+-var testserver;
+ const profileDir = gProfD.clone();
+ profileDir.append("extensions");
+ 
+-function resetPrefs() {
+-  Services.prefs.setIntPref("bootstraptest.active_version", -1);
+-  Services.prefs.setIntPref("bootstraptest.installed_version", -1);
+-  Services.prefs.setIntPref("bootstraptest.startup_reason", -1);
+-  Services.prefs.setIntPref("bootstraptest.shutdown_reason", -1);
+-  Services.prefs.setIntPref("bootstraptest.install_reason", -1);
+-  Services.prefs.setIntPref("bootstraptest.uninstall_reason", -1);
+-}
+-
+-function getActiveVersion() {
+-  return Services.prefs.getIntPref("bootstraptest.active_version");
+-}
+-
+-function getInstalledVersion() {
+-  return Services.prefs.getIntPref("bootstraptest.installed_version");
+-}
+-
+-function run_test() {
+-  createAppInfo("address@hidden", "XPCShell", "1", "1.9.2");
+-
+-  // Create and configure the HTTP server.
+-  testserver = new HttpServer();
+-  testserver.registerDirectory("/data/", do_get_file("data"));
+-  testserver.registerDirectory("/addons/", do_get_file("addons"));
+-  testserver.start(4444);
+-
+-  do_test_pending();
+-  run_test_1();
+-}
+-
+-function end_test() {
+-  testserver.stop(do_test_finished);
+-}
+-
+-function installUpdate(aInstall, aCallback) {
+-  aInstall.addListener({
+-    onInstallEnded: function(aInstall) {
+-      // give the startup time to run
+-      do_execute_soon(function() {
+-        aCallback(aInstall);
+-      });
+-    }
+-  });
+-
+-  aInstall.install();
+-}
+-
+-// Verify that an update to an add-on with a new ID uninstalls the old add-on
+-function run_test_1() {
+-  writeInstallRDFForExtension({
+-    id: "address@hidden",
+-    version: "1.0",
+-    updateURL: "http://localhost:4444/data/test_updateid.rdf";,
+-    targetApplications: [{
+-      id: "address@hidden",
+-      minVersion: "1",
+-      maxVersion: "1"
+-    }],
+-    name: "Test Addon 1",
+-  }, profileDir);
+-
+-  startupManager();
+-
+-  AddonManager.getAddonByID("address@hidden", function(a1) {
+-    do_check_neq(a1, null);
+-    do_check_eq(a1.version, "1.0");
++function promiseInstallUpdate(install) {
++  return new Promise((resolve, reject) => {
++    install.addListener({
++      onDownloadFailed: () => {
++        let err = new Error("download error");
++        err.code = install.error;
++        reject(err);
++      },
++      onInstallFailed: () => {
++        let err = new Error("install error");
++        err.code = install.error;
++        reject(err);
++      },
++      onInstallEnded: resolve,
++    });
+ 
+-    a1.findUpdates({
+-      onUpdateAvailable: function(addon, install) {
+-        do_check_eq(install.name, addon.name);
+-        do_check_eq(install.version, "2.0");
+-        do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
+-        do_check_eq(install.existingAddon, a1);
+-
+-        installUpdate(install, check_test_1);
+-      }
+-    }, AddonManager.UPDATE_WHEN_USER_REQUESTED);
+-  });
+-}
+-
+-function check_test_1(install) {
+-  AddonManager.getAddonByID("address@hidden", callback_soon(function(a1) {
+-    // Existing add-on should have a pending upgrade
+-    do_check_neq(a1.pendingUpgrade, null);
+-    do_check_eq(a1.pendingUpgrade.id, "address@hidden");
+-    do_check_eq(a1.pendingUpgrade.install.existingAddon, a1);
+-    do_check_neq(a1.syncGUID);
+-
+-    let a1SyncGUID = a1.syncGUID;
+-
+-    restartManager();
+-
+-    AddonManager.getAddonsByIDs(["address@hidden",
+-                                 "address@hidden"], function([a1, a2]) {
+-      // Should have uninstalled the old and installed the new
+-      do_check_eq(a1, null);
+-      do_check_neq(a2, null);
+-      do_check_neq(a2.syncGUID, null);
+-
+-      // The Sync GUID should change when the ID changes
+-      do_check_neq(a1SyncGUID, a2.syncGUID);
+-
+-      a2.uninstall();
+-
+-      do_execute_soon(run_test_2);
+-    });
+-  }));
+-}
+-
+-// Test that when the new add-on already exists we just upgrade that
+-function run_test_2() {
+-  restartManager();
+-  shutdownManager();
+-
+-  writeInstallRDFForExtension({
+-    id: "address@hidden",
+-    version: "1.0",
+-    updateURL: "http://localhost:4444/data/test_updateid.rdf";,
+-    targetApplications: [{
+-      id: "address@hidden",
+-      minVersion: "1",
+-      maxVersion: "1"
+-    }],
+-    name: "Test Addon 1",
+-  }, profileDir);
+-  writeInstallRDFForExtension({
+-    id: "address@hidden",
+-    version: "1.0",
+-    targetApplications: [{
+-      id: "address@hidden",
+-      minVersion: "1",
+-      maxVersion: "1"
+-    }],
+-    name: "Test Addon 2",
+-  }, profileDir);
+-
+-  startupManager();
+-
+-  AddonManager.getAddonByID("address@hidden", function(a1) {
+-    do_check_neq(a1, null);
+-    do_check_eq(a1.version, "1.0");
+-
+-    a1.findUpdates({
+-      onUpdateAvailable: function(addon, install) {
+-        installUpdate(install, check_test_2);
+-      }
+-    }, AddonManager.UPDATE_WHEN_USER_REQUESTED);
++    install.install();
+   });
+ }
+ 
+-function check_test_2(install) {
+-  AddonManager.getAddonsByIDs(["address@hidden",
+-                               "address@hidden"],
+-                               callback_soon(function([a1, a2]) {
+-    do_check_eq(a1.pendingUpgrade, null);
+-    // Existing add-on should have a pending upgrade
+-    do_check_neq(a2.pendingUpgrade, null);
+-    do_check_eq(a2.pendingUpgrade.id, "address@hidden");
+-    do_check_eq(a2.pendingUpgrade.install.existingAddon, a2);
+-
+-    restartManager();
+-
+-    AddonManager.getAddonsByIDs(["address@hidden",
+-                                 "address@hidden"], function([a1, a2]) {
+-      // Should have uninstalled the old and installed the new
+-      do_check_neq(a1, null);
+-      do_check_neq(a2, null);
+-
+-      a1.uninstall();
+-      a2.uninstall();
+-
+-      do_execute_soon(run_test_3);
+-    });
+-  }));
+-}
+-
+-// Test that we rollback correctly when removing the old add-on fails
+-function run_test_3() {
+-  restartManager();
+-  shutdownManager();
+-
+-  // This test only works on Windows
+-  if (!("nsIWindowsRegKey" in AM_Ci)) {
+-    run_test_4();
+-    return;
+-  }
+-
+-  writeInstallRDFForExtension({
+-    id: "address@hidden",
+-    version: "1.0",
+-    updateURL: "http://localhost:4444/data/test_updateid.rdf";,
+-    targetApplications: [{
+-      id: "address@hidden",
+-      minVersion: "1",
+-      maxVersion: "1"
+-    }],
+-    name: "Test Addon 1",
+-  }, profileDir);
+-
+-  startupManager();
++// Create and configure the HTTP server.
++let testserver = createHttpServer(4444);
++testserver.registerDirectory("/data/", do_get_file("data"));
++testserver.registerDirectory("/addons/", do_get_file("addons"));
+ 
+-  AddonManager.getAddonByID("address@hidden", function(a1) {
+-    do_check_neq(a1, null);
+-    do_check_eq(a1.version, "1.0");
+-
+-    a1.findUpdates({
+-      onUpdateAvailable: function(addon, install) {
+-        installUpdate(install, check_test_3);
+-      }
+-    }, AddonManager.UPDATE_WHEN_USER_REQUESTED);
+-  });
+-}
+-
+-function check_test_3(install) {
+-  AddonManager.getAddonByID("address@hidden", callback_soon(function(a1) {
+-    // Existing add-on should have a pending upgrade
+-    do_check_neq(a1.pendingUpgrade, null);
+-    do_check_eq(a1.pendingUpgrade.id, "address@hidden");
+-    do_check_eq(a1.pendingUpgrade.install.existingAddon, a1);
+-
+-    // Lock the old add-on open so it can't be uninstalled
+-    var file = profileDir.clone();
+-    file.append("address@hidden");
+-    if (!file.exists())
+-      file.leafName += ".xpi";
+-    else
+-      file.append("install.rdf");
+-
+-    var fstream = AM_Cc["@mozilla.org/network/file-output-stream;1"].
+-                  createInstance(AM_Ci.nsIFileOutputStream);
+-    fstream.init(file, FileUtils.MODE_APPEND | FileUtils.MODE_WRONLY, 
FileUtils.PERMS_FILE, 0);
+-
+-    restartManager();
+-
+-    fstream.close();
+-
+-    AddonManager.getAddonsByIDs(["address@hidden",
+-                                 "address@hidden"],
+-                                 callback_soon(function([a1, a2]) {
+-      // Should not have installed the new add-on but it should still be
+-      // pending install
+-      do_check_neq(a1, null);
+-      do_check_eq(a2, null);
+-
+-      restartManager();
+-
+-      AddonManager.getAddonsByIDs(["address@hidden",
+-                                   "address@hidden"], function([a1, a2]) {
+-        // Should have installed the new add-on
+-        do_check_eq(a1, null);
+-        do_check_neq(a2, null);
+-
+-        a2.uninstall();
+-
+-        do_execute_soon(run_test_4);
+-      });
+-    }));
+-  }));
++function run_test() {
++  createAppInfo("address@hidden", "XPCShell", "1", "1.9.2");
++  startupManager();
++  run_next_test();
+ }
+ 
+-// Tests that upgrading to a bootstrapped add-on works but requires a restart
+-function run_test_4() {
+-  restartManager();
+-  shutdownManager();
+-
+-  writeInstallRDFForExtension({
+-    id: "address@hidden",
+-    version: "2.0",
+-    updateURL: "http://localhost:4444/data/test_updateid.rdf";,
+-    targetApplications: [{
+-      id: "address@hidden",
+-      minVersion: "1",
+-      maxVersion: "1"
+-    }],
+-    name: "Test Addon 2",
+-  }, profileDir);
+-
+-  startupManager();
+-
+-  resetPrefs();
+-
+-  AddonManager.getAddonByID("address@hidden", function(a2) {
+-    do_check_neq(a2, null);
+-    do_check_neq(a2.syncGUID, null);
+-    do_check_eq(a2.version, "2.0");
+-
+-    a2.findUpdates({
+-      onUpdateAvailable: function(addon, install) {
+-        installUpdate(install, check_test_4);
+-      }
+-    }, AddonManager.UPDATE_WHEN_USER_REQUESTED);
+-  });
+-}
+-
+-function check_test_4() {
+-  AddonManager.getAddonsByIDs(["address@hidden",
+-                               "address@hidden"],
+-                               callback_soon(function([a2, a3]) {
+-    // Should still be pending install even though the new add-on is 
restartless
+-    do_check_neq(a2, null);
+-    do_check_eq(a3, null);
+-
+-    do_check_neq(a2.pendingUpgrade, null);
+-    do_check_eq(a2.pendingUpgrade.id, "address@hidden");
+-
+-    do_check_eq(getInstalledVersion(), -1);
+-    do_check_eq(getActiveVersion(), -1);
+-
+-    restartManager();
+-
+-    AddonManager.getAddonsByIDs(["address@hidden",
+-                                 "address@hidden"], function([a2, a3]) {
+-      // Should have updated
+-      do_check_eq(a2, null);
+-      do_check_neq(a3, null);
+-
+-      do_check_eq(getInstalledVersion(), 3);
+-      do_check_eq(getActiveVersion(), 3);
+-
+-      do_execute_soon(run_test_5);
+-    });
+-  }));
+-}
+-
+-// Tests that upgrading to another bootstrapped add-on works without a restart
+-function run_test_5() {
+-  AddonManager.getAddonByID("address@hidden", function(a3) {
+-    do_check_neq(a3, null);
+-    do_check_eq(a3.version, "3.0");
++// Verify that an update to an add-on with a new ID fails
++add_task(function* test_update_new_id() {
++  yield promiseInstallAllFiles([do_get_addon("test_updateid1")]);
+ 
+-    a3.findUpdates({
+-      onUpdateAvailable: function(addon, install) {
+-        installUpdate(install, check_test_5);
+-      }
+-    }, AddonManager.UPDATE_WHEN_USER_REQUESTED);
+-  });
+-}
+-
+-function check_test_5() {
+-  AddonManager.getAddonsByIDs(["address@hidden",
+-                               "address@hidden"],
+-                               callback_soon(function([a3, a4]) {
+-    // Should have updated
+-    do_check_eq(a3, null);
+-    do_check_neq(a4, null);
+-
+-    do_check_eq(getInstalledVersion(), 4);
+-    do_check_eq(getActiveVersion(), 4);
+-
+-    restartManager();
+-
+-    AddonManager.getAddonsByIDs(["address@hidden",
+-                                 "address@hidden"], function([a3, a4]) {
+-      // Should still be gone
+-      do_check_eq(a3, null);
+-      do_check_neq(a4, null);
+-
+-      do_check_eq(getInstalledVersion(), 4);
+-      do_check_eq(getActiveVersion(), 4);
+-
+-      run_test_6();
+-    });
+-  }));
+-}
++  let addon = yield promiseAddonByID("address@hidden");
++  do_check_neq(addon, null);
++  do_check_eq(addon.version, "1.0");
+ 
+-// Tests that upgrading to a non-bootstrapped add-on works but requires a 
restart
+-function run_test_6() {
+-  AddonManager.getAddonByID("address@hidden", function(a4) {
+-    do_check_neq(a4, null);
+-    do_check_eq(a4.version, "4.0");
+-
+-    a4.findUpdates({
+-      onUpdateAvailable: function(addon, install) {
+-        installUpdate(install, check_test_6);
+-      }
+-    }, AddonManager.UPDATE_WHEN_USER_REQUESTED);
+-  });
+-}
++  let update = yield promiseFindAddonUpdates(addon, 
AddonManager.UPDATE_WHEN_USER_REQUESTED);
++  let install = update.updateAvailable;
++  do_check_eq(install.name, addon.name);
++  do_check_eq(install.version, "2.0");
++  do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
++  do_check_eq(install.existingAddon, addon);
+ 
+-function check_test_6() {
+-  AddonManager.getAddonsByIDs(["address@hidden",
+-                               "address@hidden"],
+-                               callback_soon(function([a4, a2]) {
+-    // Should still be pending install even though the old add-on is 
restartless
+-    do_check_neq(a4, null);
+-    do_check_eq(a2, null);
+-
+-    do_check_neq(a4.pendingUpgrade, null);
+-    do_check_eq(a4.pendingUpgrade.id, "address@hidden");
+-
+-    do_check_eq(getInstalledVersion(), 4);
+-    do_check_eq(getActiveVersion(), 4);
++  yield Assert.rejects(promiseInstallUpdate(install),
++                       function(err) { return err.code == 
AddonManager.ERROR_INCORRECT_ID },
++                       "Upgrade to a different ID fails");
+ 
+-    restartManager();
++  addon.uninstall();
++});
+ 
+-    AddonManager.getAddonsByIDs(["address@hidden",
+-                                 "address@hidden"], function([a4, a2]) {
+-      // Should have updated
+-      do_check_eq(a4, null);
+-      do_check_neq(a2, null);
++// Verify that an update to a multi-package xpi fails
++add_task(function* test_update_new_id() {
++  yield promiseInstallAllFiles([do_get_addon("test_update_multi1")]);
+ 
+-      do_check_eq(getInstalledVersion(), 0);
+-      do_check_eq(getActiveVersion(), 0);
++  let addon = yield promiseAddonByID("address@hidden");
++  do_check_neq(addon, null);
++  do_check_eq(addon.version, "1.0");
+ 
+-      end_test();
+-    });
+-  }));
+-}
++  let update = yield promiseFindAddonUpdates(addon, 
AddonManager.UPDATE_WHEN_USER_REQUESTED);
++  let install = update.updateAvailable;
++  do_check_eq(install.name, addon.name);
++  do_check_eq(install.version, "2.0");
++  do_check_eq(install.state, AddonManager.STATE_AVAILABLE);
++  do_check_eq(install.existingAddon, addon);
++
++  yield Assert.rejects(promiseInstallUpdate(install),
++                       function(err) { return err.code == 
AddonManager.ERROR_UNEXPECTED_ADDON_TYPE },
++                       "Upgrade to a multipackage xpi fails");
++
++  addon.uninstall();
++});
+



reply via email to

[Prev in Thread] Current Thread [Next in Thread]