Bug 1250611: Fix xpinstall mochitests to work when add-ons must be signed by AMO. r=rhelmer
authorDave Townsend <dtownsend@oxymoronical.com>
Wed, 24 Feb 2016 13:34:08 -0800
changeset 285608 ba871a36752cdf91f4fc5a6f328e2af6ebb29587
parent 285607 1bcb9055be8c62b9f61cab5b9d79f5bfa2b92222
child 285609 e2414186e18ad96183afc486a4ecd3d0397ed04d
push id17836
push userdtownsend@mozilla.com
push dateFri, 26 Feb 2016 00:45:52 +0000
treeherderfx-team@ba871a36752c [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersrhelmer
bugs1250611
milestone47.0a1
Bug 1250611: Fix xpinstall mochitests to work when add-ons must be signed by AMO. r=rhelmer These tests verify that the InstallTrigger API works as expected and that the old style of signing add-ons is verified correctly. Other applications still care about this so we don't want to regress it. This switches most tests that previously expected an unsigned add-on to use an AMO signed add-on. In apps that care that will allow it to install, in apps that don't it will be effectively the same as unsigned (untrusted root). Other tests that actually verify that the old style of signatures are either seen or not seen are marked as skipped when AMO-signing is required. In some cases that meant doubling up a few tests to make sure we have coverage. MozReview-Commit-ID: 6V4U1U1HTqx
toolkit/mozapps/extensions/test/xpinstall/amosigned.xpi
toolkit/mozapps/extensions/test/xpinstall/amosigned2.xpi
toolkit/mozapps/extensions/test/xpinstall/browser.ini
toolkit/mozapps/extensions/test/xpinstall/browser_amosigned_trigger.js
toolkit/mozapps/extensions/test/xpinstall/browser_amosigned_trigger_iframe.js
toolkit/mozapps/extensions/test/xpinstall/browser_amosigned_url.js
toolkit/mozapps/extensions/test/xpinstall/browser_auth.js
toolkit/mozapps/extensions/test/xpinstall/browser_auth2.js
toolkit/mozapps/extensions/test/xpinstall/browser_auth3.js
toolkit/mozapps/extensions/test/xpinstall/browser_auth4.js
toolkit/mozapps/extensions/test/xpinstall/browser_badargs.js
toolkit/mozapps/extensions/test/xpinstall/browser_badhash.js
toolkit/mozapps/extensions/test/xpinstall/browser_badhashtype.js
toolkit/mozapps/extensions/test/xpinstall/browser_bug672485.js
toolkit/mozapps/extensions/test/xpinstall/browser_cancel.js
toolkit/mozapps/extensions/test/xpinstall/browser_cookies.js
toolkit/mozapps/extensions/test/xpinstall/browser_cookies2.js
toolkit/mozapps/extensions/test/xpinstall/browser_cookies3.js
toolkit/mozapps/extensions/test/xpinstall/browser_cookies4.js
toolkit/mozapps/extensions/test/xpinstall/browser_datauri.js
toolkit/mozapps/extensions/test/xpinstall/browser_enabled3.js
toolkit/mozapps/extensions/test/xpinstall/browser_hash.js
toolkit/mozapps/extensions/test/xpinstall/browser_hash2.js
toolkit/mozapps/extensions/test/xpinstall/browser_httphash.js
toolkit/mozapps/extensions/test/xpinstall/browser_httphash2.js
toolkit/mozapps/extensions/test/xpinstall/browser_httphash3.js
toolkit/mozapps/extensions/test/xpinstall/browser_httphash4.js
toolkit/mozapps/extensions/test/xpinstall/browser_httphash5.js
toolkit/mozapps/extensions/test/xpinstall/browser_httphash6.js
toolkit/mozapps/extensions/test/xpinstall/browser_installchrome.js
toolkit/mozapps/extensions/test/xpinstall/browser_localfile.js
toolkit/mozapps/extensions/test/xpinstall/browser_localfile2.js
toolkit/mozapps/extensions/test/xpinstall/browser_localfile3.js
toolkit/mozapps/extensions/test/xpinstall/browser_localfile4.js
toolkit/mozapps/extensions/test/xpinstall/browser_multipackage.js
toolkit/mozapps/extensions/test/xpinstall/browser_navigateaway.js
toolkit/mozapps/extensions/test/xpinstall/browser_navigateaway2.js
toolkit/mozapps/extensions/test/xpinstall/browser_navigateaway3.js
toolkit/mozapps/extensions/test/xpinstall/browser_navigateaway4.js
toolkit/mozapps/extensions/test/xpinstall/browser_offline.js
toolkit/mozapps/extensions/test/xpinstall/browser_relative.js
toolkit/mozapps/extensions/test/xpinstall/browser_signed_multipackage.js
toolkit/mozapps/extensions/test/xpinstall/browser_softwareupdate.js
toolkit/mozapps/extensions/test/xpinstall/browser_switchtab.js
toolkit/mozapps/extensions/test/xpinstall/browser_trigger_redirect.js
toolkit/mozapps/extensions/test/xpinstall/browser_unsigned_trigger_xorigin.js
toolkit/mozapps/extensions/test/xpinstall/browser_whitelist.js
toolkit/mozapps/extensions/test/xpinstall/browser_whitelist2.js
toolkit/mozapps/extensions/test/xpinstall/browser_whitelist3.js
toolkit/mozapps/extensions/test/xpinstall/browser_whitelist4.js
toolkit/mozapps/extensions/test/xpinstall/browser_whitelist5.js
toolkit/mozapps/extensions/test/xpinstall/browser_whitelist6.js
toolkit/mozapps/extensions/test/xpinstall/browser_whitelist7.js
toolkit/mozapps/extensions/test/xpinstall/bug540558.html
toolkit/mozapps/extensions/test/xpinstall/bug645699.html
toolkit/mozapps/extensions/test/xpinstall/concurrent_installs.html
toolkit/mozapps/extensions/test/xpinstall/multipackage.xpi
toolkit/mozapps/extensions/test/xpinstall/signed-multipackage.xpi
toolkit/mozapps/extensions/test/xpinstall/triggerredirect.html
new file mode 100644
index 0000000000000000000000000000000000000000..4edf91e34a903af625951e97bffc5db5c0793cbe
GIT binary patch
literal 4420
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
new file mode 100644
index 0000000000000000000000000000000000000000..74e877f26fe36641a92e66d3c5960e7f52e39e4c
GIT binary patch
literal 4421
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
--- a/toolkit/mozapps/extensions/test/xpinstall/browser.ini
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser.ini
@@ -1,10 +1,12 @@
 [DEFAULT]
 support-files =
+  amosigned.xpi
+  amosigned2.xpi
   authRedirect.sjs
   bug540558.html
   bug638292.html
   bug645699.html
   concurrent_installs.html
   cookieRedirect.sjs
   corrupt.xpi
   empty.xpi
@@ -14,28 +16,33 @@ support-files =
   incompatible.xpi
   installchrome.html
   installtrigger.html
   installtrigger_frame.html
   multipackage.xpi
   navigate.html
   redirect.sjs
   restartless.xpi
+  signed-multipackage.xpi
   signed-no-cn.xpi
   signed-no-o.xpi
   signed-tampered.xpi
   signed-untrusted.xpi
   signed.xpi
   signed2.xpi
   slowinstall.sjs
   startsoftwareupdate.html
   theme.xpi
   triggerredirect.html
   unsigned.xpi
 
+[browser_amosigned_trigger.js]
+[browser_amosigned_trigger_iframe.js]
+skip-if = buildapp == "mulet"
+[browser_amosigned_url.js]
 [browser_auth.js]
 [browser_auth2.js]
 [browser_auth3.js]
 [browser_auth4.js]
 [browser_badargs.js]
 [browser_badargs2.js]
 [browser_badhash.js]
 [browser_badhashtype.js]
@@ -72,30 +79,40 @@ skip-if = true # Bug 1084646
 [browser_localfile4.js]
 [browser_multipackage.js]
 [browser_navigateaway.js]
 [browser_navigateaway2.js]
 [browser_navigateaway3.js]
 [browser_navigateaway4.js]
 [browser_offline.js]
 [browser_relative.js]
+[browser_signed_multipackage.js]
+skip-if = require_signing
 [browser_signed_multiple.js]
+skip-if = require_signing
 [browser_signed_naming.js]
+skip-if = require_signing
 [browser_signed_tampered.js]
+skip-if = require_signing
 [browser_signed_trigger.js]
+skip-if = require_signing
 [browser_signed_untrusted.js]
+skip-if = require_signing
 [browser_signed_url.js]
+skip-if = require_signing
 [browser_softwareupdate.js]
 [browser_switchtab.js]
 [browser_trigger_redirect.js]
 [browser_unsigned_trigger.js]
+skip-if = require_signing
 [browser_unsigned_trigger_iframe.js]
-skip-if = buildapp == "mulet"
+skip-if = buildapp == "mulet" || require_signing
 [browser_unsigned_trigger_xorigin.js]
 skip-if = buildapp == "mulet"
 [browser_unsigned_url.js]
+skip-if = require_signing
 [browser_whitelist.js]
 [browser_whitelist2.js]
 [browser_whitelist3.js]
 [browser_whitelist4.js]
 [browser_whitelist5.js]
 [browser_whitelist6.js]
 [browser_whitelist7.js]
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_amosigned_trigger.js
@@ -0,0 +1,50 @@
+// ----------------------------------------------------------------------------
+// Tests installing an unsigned add-on through an InstallTrigger call in web
+// content.
+function test() {
+  Harness.installConfirmCallback = confirm_install;
+  Harness.installEndedCallback = install_ended;
+  Harness.installsCompletedCallback = finish_test;
+  Harness.finalContentEvent = "InstallComplete";
+  Harness.setup();
+
+  var pm = Services.perms;
+  pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
+
+  var triggers = encodeURIComponent(JSON.stringify({
+    "Unsigned XPI": {
+      URL: TESTROOT + "amosigned.xpi",
+      IconURL: TESTROOT + "icon.png",
+      toString: function() { return this.URL; }
+    }
+  }));
+  gBrowser.selectedTab = gBrowser.addTab();
+  gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
+}
+
+function confirm_install(window) {
+  var items = window.document.getElementById("itemList").childNodes;
+  is(items.length, 1, "Should only be 1 item listed in the confirmation dialog");
+  is(items[0].name, "XPI Test", "Should have seen the name");
+  is(items[0].url, TESTROOT + "amosigned.xpi", "Should have listed the correct url for the item");
+  is(items[0].icon, TESTROOT + "icon.png", "Should have listed the correct icon for the item");
+  is(items[0].signed, "false", "Should have listed the item as unsigned");
+  return true;
+}
+
+function install_ended(install, addon) {
+  install.cancel();
+}
+
+function finish_test(count) {
+  is(count, 1, "1 Add-on should have been successfully installed");
+
+  Services.perms.remove(makeURI("http://example.com"), "install");
+
+  var doc = gBrowser.contentDocument;
+  is(doc.getElementById("return").textContent, "true", "installTrigger should have claimed success");
+  is(doc.getElementById("status").textContent, "0", "Callback should have seen a success");
+
+  gBrowser.removeCurrentTab();
+  Harness.finish();
+}
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_amosigned_trigger_iframe.js
@@ -0,0 +1,51 @@
+// ----------------------------------------------------------------------------
+// Test for bug 589598 - Ensure that installing through InstallTrigger
+// works in an iframe in web content.
+
+function test() {
+  Harness.installConfirmCallback = confirm_install;
+  Harness.installEndedCallback = install_ended;
+  Harness.installsCompletedCallback = finish_test;
+  Harness.finalContentEvent = "InstallComplete";
+  Harness.setup();
+
+  var pm = Services.perms;
+  pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
+
+  var inner_url = encodeURIComponent(TESTROOT + "installtrigger.html?" + encodeURIComponent(JSON.stringify({
+    "Unsigned XPI": {
+      URL: TESTROOT + "amosigned.xpi",
+      IconURL: TESTROOT + "icon.png",
+      toString: function() { return this.URL; }
+    }
+  })));
+  gBrowser.selectedTab = gBrowser.addTab();
+  gBrowser.loadURI(TESTROOT + "installtrigger_frame.html?" + inner_url);
+}
+
+function confirm_install(window) {
+  var items = window.document.getElementById("itemList").childNodes;
+  is(items.length, 1, "Should only be 1 item listed in the confirmation dialog");
+  is(items[0].name, "XPI Test", "Should have seen the name");
+  is(items[0].url, TESTROOT + "amosigned.xpi", "Should have listed the correct url for the item");
+  is(items[0].icon, TESTROOT + "icon.png", "Should have listed the correct icon for the item");
+  is(items[0].signed, "false", "Should have listed the item as unsigned");
+  return true;
+}
+
+function install_ended(install, addon) {
+  install.cancel();
+}
+
+function finish_test(count) {
+  is(count, 1, "1 Add-on should have been successfully installed");
+
+  Services.perms.remove(makeURI("http://example.com"), "install");
+
+  var doc = gBrowser.contentWindow.frames[0].document; // Document of iframe
+  is(doc.getElementById("return").textContent, "true", "installTrigger in iframe should have claimed success");
+  is(doc.getElementById("status").textContent, "0", "Callback in iframe should have seen a success");
+
+  gBrowser.removeCurrentTab();
+  Harness.finish();
+}
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_amosigned_url.js
@@ -0,0 +1,35 @@
+// ----------------------------------------------------------------------------
+// Tests installing an unsigned add-on by navigating directly to the url
+function test() {
+  Harness.installConfirmCallback = confirm_install;
+  Harness.installEndedCallback = install_ended;
+  Harness.installsCompletedCallback = finish_test;
+  Harness.setup();
+
+  gBrowser.selectedTab = gBrowser.addTab("about:blank");
+  BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser).then(() => {
+    gBrowser.loadURI(TESTROOT + "amosigned.xpi");
+  });
+}
+
+function confirm_install(window) {
+  let items = window.document.getElementById("itemList").childNodes;
+  is(items.length, 1, "Should only be 1 item listed in the confirmation dialog");
+  is(items[0].name, "XPI Test", "Should have had the filename for the item name");
+  is(items[0].url, TESTROOT + "amosigned.xpi", "Should have listed the correct url for the item");
+  is(items[0].icon, "", "Should have listed no icon for the item");
+  is(items[0].signed, "false", "Should have listed the item as unsigned");
+  return true;
+}
+
+function install_ended(install, addon) {
+  install.cancel();
+}
+
+function finish_test(count) {
+  is(count, 1, "1 Add-on should have been successfully installed");
+
+  gBrowser.removeCurrentTab();
+  Harness.finish();
+}
+// ----------------------------------------------------------------------------
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_auth.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_auth.js
@@ -11,17 +11,17 @@ function test() {
   var prefs = Cc["@mozilla.org/preferences-service;1"].
                         getService(Ci.nsIPrefBranch);
   prefs.setIntPref("network.auth.subresource-http-auth-allow", 2);
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
-    "Unsigned XPI": TESTROOT + "authRedirect.sjs?" + TESTROOT + "unsigned.xpi"
+    "Unsigned XPI": TESTROOT + "authRedirect.sjs?" + TESTROOT + "amosigned.xpi"
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function get_auth_info() {
   return [ "testuser", "testpass" ];
 }
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_auth2.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_auth2.js
@@ -9,17 +9,17 @@ function test() {
   Harness.installEndedCallback = install_ended;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
-    "Unsigned XPI": TESTROOT + "authRedirect.sjs?" + TESTROOT + "unsigned.xpi"
+    "Unsigned XPI": TESTROOT + "authRedirect.sjs?" + TESTROOT + "amosigned.xpi"
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function get_auth_info() {
   return [ "baduser", "badpass" ];
 }
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_auth3.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_auth3.js
@@ -17,17 +17,17 @@ function test() {
   Harness.installEndedCallback = install_ended;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
-    "Unsigned XPI": TESTROOT + "authRedirect.sjs?" + TESTROOT + "unsigned.xpi"
+    "Unsigned XPI": TESTROOT + "authRedirect.sjs?" + TESTROOT + "amosigned.xpi"
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function get_auth_info() {
   return null;
 }
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_auth4.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_auth4.js
@@ -16,17 +16,17 @@ function test() {
   Harness.installEndedCallback = install_ended;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
-    "Unsigned XPI": TESTROOT + "authRedirect.sjs?" + TESTROOT + "unsigned.xpi"
+    "Unsigned XPI": TESTROOT + "authRedirect.sjs?" + TESTROOT + "amosigned.xpi"
   }));
   gNewTab = gBrowser.addTab();
   gBrowser.getBrowserForTab(gNewTab).loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function get_auth_info() {
   is(gBrowser.selectedTab, gNewTab, "Should have focused the tab loading the XPI");
   return [ "testuser", "testpass" ];
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_badargs.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_badargs.js
@@ -1,15 +1,15 @@
 // ----------------------------------------------------------------------------
 // Test whether passing a simple string to InstallTrigger.install throws an
 // exception
 function test() {
   waitForExplicitFinish();
 
-  var triggers = encodeURIComponent(JSON.stringify(TESTROOT + "unsigned.xpi"));
+  var triggers = encodeURIComponent(JSON.stringify(TESTROOT + "amosigned.xpi"));
   gBrowser.selectedTab = gBrowser.addTab();
 
   function loadListener() {
     gBrowser.selectedBrowser.removeEventListener("load", loadListener, true);
     gBrowser.contentWindow.addEventListener("InstallTriggered", page_loaded, false);
   }
 
   gBrowser.selectedBrowser.addEventListener("load", loadListener, true);
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_badhash.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_badhash.js
@@ -6,17 +6,17 @@ function test() {
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
     "Unsigned XPI": {
-      URL: TESTROOT + "unsigned.xpi",
+      URL: TESTROOT + "amosigned.xpi",
       Hash: "sha1:643b08418599ddbd1ea8a511c90696578fb844b9",
       toString: function() { return this.URL; }
     }
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_badhashtype.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_badhashtype.js
@@ -6,17 +6,17 @@ function test() {
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
     "Unsigned XPI": {
-      URL: TESTROOT + "unsigned.xpi",
+      URL: TESTROOT + "amosigned.xpi",
       Hash: "foo:3d0dc22e1f394e159b08aaf5f0f97de4d5c65f4f",
       toString: function() { return this.URL; }
     }
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_bug672485.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_bug672485.js
@@ -14,17 +14,17 @@ function test() {
   gWindowWatcher = Services.ww;
   delete Services.ww;
   is(Services.ww, undefined, "Services.ww should now be undefined");
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
-    "Unsigned XPI": TESTROOT + "unsigned.xpi"
+    "Unsigned XPI": TESTROOT + "amosigned.xpi"
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function confirm_install(window) {
   ok(false, "Should not see the install dialog");
   return false;
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_cancel.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_cancel.js
@@ -9,18 +9,18 @@ function test() {
   Harness.installEndedCallback = install_ended;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
-    "Signed XPI": TESTROOT + "signed.xpi",
-    "Signed XPI 2": TESTROOT + "signed2.xpi",
+    "Unsigned XPI": TESTROOT + "amosigned.xpi",
+    "Unsigned XPI 2": TESTROOT + "amosigned2.xpi",
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function get_item(items, url) {
   for (let item of items) {
     if (item.url == url)
@@ -28,27 +28,25 @@ function get_item(items, url) {
   }
   ok(false, "Item for " + url + " was not listed");
   return null;
 }
 
 function confirm_install(window) {
   let items = window.document.getElementById("itemList").childNodes;
   is(items.length, 2, "Should be 2 items listed in the confirmation dialog");
-  let item = get_item(items, TESTROOT + "signed.xpi");
+  let item = get_item(items, TESTROOT + "amosigned.xpi");
+  if (item) {
+    is(item.name, "XPI Test", "Should have seen the name from the trigger list");
+    is(item.signed, "false", "Should have listed the item as signed");
+  }
+  item = get_item(items, TESTROOT + "amosigned2.xpi");
   if (item) {
     is(item.name, "Signed XPI Test", "Should have seen the name from the trigger list");
-    is(item.cert, "(Object Signer)", "Should have seen the signer");
-    is(item.signed, "true", "Should have listed the item as signed");
-  }
-  item = get_item(items, TESTROOT + "signed2.xpi");
-  if (item) {
-    is(item.name, "Signed XPI Test", "Should have seen the name from the trigger list");
-    is(item.cert, "(Object Signer)", "Should have seen the signer");
-    is(item.signed, "true", "Should have listed the item as signed");
+    is(item.signed, "false", "Should have listed the item as signed");
   }
   return false;
 }
 
 function install_ended(install, addon) {
   ok(false, "Should not have seen installs complete");
 }
 
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_cookies.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_cookies.js
@@ -6,17 +6,17 @@ function test() {
   Harness.downloadFailedCallback = download_failed;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
-    "Cookie check": TESTROOT + "cookieRedirect.sjs?" + TESTROOT + "unsigned.xpi"
+    "Cookie check": TESTROOT + "cookieRedirect.sjs?" + TESTROOT + "amosigned.xpi"
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function download_failed(install) {
   is(install.error, AddonManager.ERROR_NETWORK_FAILURE, "Install should fail");
 }
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_cookies2.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_cookies2.js
@@ -11,17 +11,17 @@ function test() {
                      .getService(Components.interfaces.nsICookieManager2);
   cm.add("example.com", "/browser/" + RELATIVE_DIR, "xpinstall", "true", false,
          false, true, (Date.now() / 1000) + 60);
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
-    "Cookie check": TESTROOT + "cookieRedirect.sjs?" + TESTROOT + "unsigned.xpi"
+    "Cookie check": TESTROOT + "cookieRedirect.sjs?" + TESTROOT + "amosigned.xpi"
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function install_ended(install, addon) {
   install.cancel();
 }
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_cookies3.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_cookies3.js
@@ -13,17 +13,17 @@ function test() {
          false, true, (Date.now() / 1000) + 60);
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   Services.prefs.setIntPref("network.cookie.cookieBehavior", 1);
 
   var triggers = encodeURIComponent(JSON.stringify({
-    "Cookie check": TESTROOT + "cookieRedirect.sjs?" + TESTROOT + "unsigned.xpi"
+    "Cookie check": TESTROOT + "cookieRedirect.sjs?" + TESTROOT + "amosigned.xpi"
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function install_ended(install, addon) {
   install.cancel();
 }
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_cookies4.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_cookies4.js
@@ -14,17 +14,17 @@ function test() {
          false, true, (Date.now() / 1000) + 60);
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   Services.prefs.setIntPref("network.cookie.cookieBehavior", 1);
 
   var triggers = encodeURIComponent(JSON.stringify({
-    "Cookie check": TESTROOT2 + "cookieRedirect.sjs?" + TESTROOT + "unsigned.xpi"
+    "Cookie check": TESTROOT2 + "cookieRedirect.sjs?" + TESTROOT + "amosigned.xpi"
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function download_failed(install) {
   is(install.error, AddonManager.ERROR_NETWORK_FAILURE, "Install should fail");
 }
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_datauri.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_datauri.js
@@ -13,17 +13,17 @@ function setup_redirect(aSettings) {
 }
 
 function test() {
   Harness.installOriginBlockedCallback = install_blocked;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   setup_redirect({
-    "Location": "data:text/html,<script>window.location.href='" + TESTROOT + "unsigned.xpi'</script>"
+    "Location": "data:text/html,<script>window.location.href='" + TESTROOT + "amosigned.xpi'</script>"
   });
 
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "redirect.sjs?mode=redirect");
 }
 
 function install_blocked(installInfo) {
 }
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_enabled3.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_enabled3.js
@@ -4,17 +4,17 @@ function test() {
   Harness.installDisabledCallback = install_disabled;
   Harness.installBlockedCallback = allow_blocked;
   Harness.installConfirmCallback = confirm_install;
   Harness.setup();
 
   Services.prefs.setBoolPref("xpinstall.enabled", false);
 
   var triggers = encodeURIComponent(JSON.stringify({
-    "Unsigned XPI": TESTROOT + "unsigned.xpi"
+    "Unsigned XPI": TESTROOT + "amosigned.xpi"
   }));
   gBrowser.selectedTab = gBrowser.addTab();
 
   ContentTask.spawn(gBrowser.selectedBrowser, TESTROOT + "installtrigger.html?" + triggers, url => {
     return new Promise(resolve => {
       function page_loaded() {
         content.removeEventListener("PageLoaded", page_loaded, false);
         resolve(content.document.getElementById("return").textContent);
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_hash.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_hash.js
@@ -6,18 +6,18 @@ function test() {
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
     "Unsigned XPI": {
-      URL: TESTROOT + "unsigned.xpi",
-      Hash: "sha1:3d0dc22e1f394e159b08aaf5f0f97de4d5c65f4f",
+      URL: TESTROOT + "amosigned.xpi",
+      Hash: "sha1:36ffb0acfd9c6e9682473aaebaab394d38b473c9",
       toString: function() { return this.URL; }
     }
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function install_ended(install, addon) {
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_hash2.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_hash2.js
@@ -6,18 +6,18 @@ function test() {
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
     "Unsigned XPI": {
-      URL: TESTROOT + "unsigned.xpi",
-      Hash: "sha1:3D0DC22E1F394E159B08AAF5F0F97DE4D5C65F4F",
+      URL: TESTROOT + "amosigned.xpi",
+      Hash: "sha1:36FFB0ACFD9C6E9682473AAEBAAB394D38B473C9",
       toString: function() { return this.URL; }
     }
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function install_ended(install, addon) {
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_httphash.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_httphash.js
@@ -7,17 +7,17 @@ function test() {
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
   Services.prefs.setBoolPref(PREF_INSTALL_REQUIREBUILTINCERTS, false);
 
   var url = "https://example.com/browser/" + RELATIVE_DIR + "hashRedirect.sjs";
-  url += "?sha1:3d0dc22e1f394e159b08aaf5f0f97de4d5c65f4f|" + TESTROOT + "unsigned.xpi";
+  url += "?sha1:36ffb0acfd9c6e9682473aaebaab394d38b473c9|" + TESTROOT + "amosigned.xpi";
 
   var triggers = encodeURIComponent(JSON.stringify({
     "Unsigned XPI": {
       URL: url,
       toString: function() { return this.URL; }
     }
   }));
   gBrowser.selectedTab = gBrowser.addTab();
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_httphash2.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_httphash2.js
@@ -7,17 +7,17 @@ function test() {
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
   Services.prefs.setBoolPref(PREF_INSTALL_REQUIREBUILTINCERTS, false);
 
   var url = "https://example.com/browser/" + RELATIVE_DIR + "hashRedirect.sjs";
-  url += "?sha1:foobar|" + TESTROOT + "unsigned.xpi";
+  url += "?sha1:foobar|" + TESTROOT + "amosigned.xpi";
 
   var triggers = encodeURIComponent(JSON.stringify({
     "Unsigned XPI": {
       URL: url,
       toString: function() { return this.URL; }
     }
   }));
   gBrowser.selectedTab = gBrowser.addTab();
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_httphash3.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_httphash3.js
@@ -6,22 +6,22 @@ function test() {
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
   Services.prefs.setBoolPref(PREF_INSTALL_REQUIREBUILTINCERTS, false);
 
   var url = "https://example.com/browser/" + RELATIVE_DIR + "hashRedirect.sjs";
-  url += "?sha1:foobar|" + TESTROOT + "unsigned.xpi";
+  url += "?sha1:foobar|" + TESTROOT + "amosigned.xpi";
 
   var triggers = encodeURIComponent(JSON.stringify({
     "Unsigned XPI": {
       URL: url,
-      Hash: "sha1:3d0dc22e1f394e159b08aaf5f0f97de4d5c65f4f",
+      Hash: "sha1:36ffb0acfd9c6e9682473aaebaab394d38b473c9",
       toString: function() { return this.URL; }
     }
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function install_ended(install, addon) {
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_httphash4.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_httphash4.js
@@ -5,17 +5,17 @@ function test() {
   Harness.installEndedCallback = install_ended;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var url = "http://example.com/browser/" + RELATIVE_DIR + "hashRedirect.sjs";
-  url += "?sha1:foobar|" + TESTROOT + "unsigned.xpi";
+  url += "?sha1:foobar|" + TESTROOT + "amosigned.xpi";
 
   var triggers = encodeURIComponent(JSON.stringify({
     "Unsigned XPI": {
       URL: url,
       toString: function() { return this.URL; }
     }
   }));
   gBrowser.selectedTab = gBrowser.addTab();
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_httphash5.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_httphash5.js
@@ -6,19 +6,19 @@ function test() {
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
   Services.prefs.setBoolPref(PREF_INSTALL_REQUIREBUILTINCERTS, false);
 
   var url = "https://example.com/browser/" + RELATIVE_DIR + "hashRedirect.sjs";
-  url += "?sha1:3d0dc22e1f394e159b08aaf5f0f97de4d5c65f4f|";
+  url += "?sha1:36ffb0acfd9c6e9682473aaebaab394d38b473c9|";
   url += "https://example.com/browser/" + RELATIVE_DIR + "hashRedirect.sjs";
-  url += "?sha1:foobar|" + TESTROOT + "unsigned.xpi";
+  url += "?sha1:foobar|" + TESTROOT + "amosigned.xpi";
 
   var triggers = encodeURIComponent(JSON.stringify({
     "Unsigned XPI": {
       URL: url,
       toString: function() { return this.URL; }
     }
   }));
   gBrowser.selectedTab = gBrowser.addTab();
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_httphash6.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_httphash6.js
@@ -21,17 +21,17 @@ function test() {
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
   Services.prefs.setBoolPref(PREF_INSTALL_REQUIREBUILTINCERTS, false);
 
   // Set up the redirect to give a bad hash
   setup_redirect({
     "X-Target-Digest": "sha1:foo",
-    "Location": "http://example.com/browser/" + RELATIVE_DIR + "unsigned.xpi"
+    "Location": "http://example.com/browser/" + RELATIVE_DIR + "amosigned.xpi"
   });
 
   var url = "https://example.com/browser/" + RELATIVE_DIR + "redirect.sjs?mode=redirect";
 
   var triggers = encodeURIComponent(JSON.stringify({
     "Unsigned XPI": {
       URL: url,
       toString: function() { return this.URL; }
@@ -50,18 +50,18 @@ function download_failed(install) {
 function finish_failed_download() {
   // Setup to track the successful re-download
   Harness.installEndedCallback = install_ended;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   // Give it the right hash this time
   setup_redirect({
-    "X-Target-Digest": "sha1:3d0dc22e1f394e159b08aaf5f0f97de4d5c65f4f",
-    "Location": "http://example.com/browser/" + RELATIVE_DIR + "unsigned.xpi"
+    "X-Target-Digest": "sha1:36ffb0acfd9c6e9682473aaebaab394d38b473c9",
+    "Location": "http://example.com/browser/" + RELATIVE_DIR + "amosigned.xpi"
   });
 
   // The harness expects onNewInstall events for all installs that are about to start
   Harness.onNewInstall(gInstall);
 
   // Restart the install as a regular webpage install so the harness tracks it
   AddonManager.installAddonsFromWebpage("application/x-xpinstall",
                                         gBrowser.selectedBrowser,
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_installchrome.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_installchrome.js
@@ -4,17 +4,17 @@ function test() {
   Harness.installEndedCallback = install_ended;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   gBrowser.selectedTab = gBrowser.addTab();
-  gBrowser.loadURI(TESTROOT + "installchrome.html? " + encodeURIComponent(TESTROOT + "unsigned.xpi"));
+  gBrowser.loadURI(TESTROOT + "installchrome.html? " + encodeURIComponent(TESTROOT + "amosigned.xpi"));
 }
 
 function install_ended(install, addon) {
   install.cancel();
 }
 
 function finish_test(count) {
   is(count, 1, "1 Add-on should have been successfully installed");
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_localfile.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_localfile.js
@@ -6,17 +6,17 @@ function test() {
   Harness.setup();
 
   var cr = Components.classes["@mozilla.org/chrome/chrome-registry;1"]
                      .getService(Components.interfaces.nsIChromeRegistry);
 
   var chromeroot = extractChromeRoot(gTestPath);
   var xpipath = chromeroot + "unsigned.xpi";
   try {
-    xpipath = cr.convertChromeURL(makeURI(chromeroot + "unsigned.xpi")).spec;
+    xpipath = cr.convertChromeURL(makeURI(chromeroot + "amosigned.xpi")).spec;
   } catch (ex) {
     //scenario where we are running from a .jar and already extracted
   }
 
   gBrowser.selectedTab = gBrowser.addTab("about:blank");
   BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser).then(() => {
     gBrowser.loadURI(xpipath);
   });
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_localfile2.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_localfile2.js
@@ -3,19 +3,19 @@
 // web content
 function test() {
   waitForExplicitFinish();
 
   var cr = Components.classes["@mozilla.org/chrome/chrome-registry;1"]
                      .getService(Components.interfaces.nsIChromeRegistry);
 
   var chromeroot = getChromeRoot(gTestPath);
-  var xpipath = chromeroot + "unsigned.xpi";
+  var xpipath = chromeroot + "amosigned.xpi";
   try {
-    xpipath = cr.convertChromeURL(makeURI(chromeroot + "unsigned.xpi")).spec;
+    xpipath = cr.convertChromeURL(makeURI(xpipath)).spec;
   } catch (ex) {
     //scenario where we are running from a .jar and already extracted
   }
 
   var triggers = encodeURIComponent(JSON.stringify({
     "Unsigned XPI": xpipath
   }));
   gBrowser.selectedTab = gBrowser.addTab();
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_localfile3.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_localfile3.js
@@ -8,19 +8,19 @@ function test() {
 
   // Disable direct request whitelisting, installing from file should be blocked.
   Services.prefs.setBoolPref("xpinstall.whitelist.directRequest", false);
 
   var cr = Components.classes["@mozilla.org/chrome/chrome-registry;1"]
                      .getService(Components.interfaces.nsIChromeRegistry);
 
   var chromeroot = extractChromeRoot(gTestPath);
-  var xpipath = chromeroot + "unsigned.xpi";
+  var xpipath = chromeroot + "amosigned.xpi";
   try {
-    xpipath = cr.convertChromeURL(makeURI(chromeroot + "unsigned.xpi")).spec;
+    xpipath = cr.convertChromeURL(makeURI(xpipath)).spec;
   } catch (ex) {
     //scenario where we are running from a .jar and already extracted
   }
 
   gBrowser.selectedTab = gBrowser.addTab("about:blank");
   BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser).then(() => {
     gBrowser.loadURI(xpipath);
   });
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_localfile4.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_localfile4.js
@@ -15,17 +15,17 @@ function test() {
   var chromeroot = extractChromeRoot(gTestPath);
   var xpipath = chromeroot;
   try {
     xpipath = cr.convertChromeURL(makeURI(chromeroot)).spec;
   } catch (ex) {
     //scenario where we are running from a .jar and already extracted
   }
   var triggers = encodeURIComponent(JSON.stringify({
-    "Unsigned XPI": TESTROOT + "unsigned.xpi"
+    "Unsigned XPI": TESTROOT + "amosigned.xpi"
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(xpipath + "installtrigger.html?" + triggers);
 }
 
 function allow_blocked(installInfo) {
   ok(true, "Seen blocked");
   return false;
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_multipackage.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_multipackage.js
@@ -28,18 +28,17 @@ function confirm_install(window) {
   let item = get_item(items, "XPI Test");
   if (item) {
     is(item.signed, "false", "Should not have listed the item as signed");
     is(item.icon, "", "Should have listed no icon for the item");
   }
 
   item = get_item(items, "Signed XPI Test");
   if (item) {
-    is(item.cert, "(Object Signer)", "Should have seen the signer");
-    is(item.signed, "true", "Should have listed the item as signed");
+    is(item.signed, "false", "Should have listed the item as signed");
     is(item.icon, "", "Should have listed no icon for the item");
   }
 
   return true;
 }
 
 function install_ended(install, addon) {
   install.cancel();
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_navigateaway.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_navigateaway.js
@@ -7,17 +7,17 @@ function test() {
   Harness.installEndedCallback = install_ended;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
-    "Unsigned XPI": TESTROOT + "unsigned.xpi"
+    "Unsigned XPI": TESTROOT + "amosigned.xpi"
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function download_progress(addon, value, maxValue) {
   gBrowser.loadURI(TESTROOT + "enabled.html");
 }
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_navigateaway2.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_navigateaway2.js
@@ -6,17 +6,17 @@ function test() {
   Harness.installEndedCallback = install_ended;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
-    "Unsigned XPI": TESTROOT + "unsigned.xpi"
+    "Unsigned XPI": TESTROOT + "amosigned.xpi"
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function download_progress(addon, value, maxValue) {
   gBrowser.removeCurrentTab();
 }
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_navigateaway3.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_navigateaway3.js
@@ -9,17 +9,17 @@ function test() {
   Harness.installEndedCallback = install_ended;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
-    "Unsigned XPI": TESTROOT + "unsigned.xpi"
+    "Unsigned XPI": TESTROOT + "amosigned.xpi"
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function download_progress(addon, value, maxValue) {
   gBrowser.loadURI(TESTROOT2 + "enabled.html");
 }
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_navigateaway4.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_navigateaway4.js
@@ -8,17 +8,17 @@ function test() {
   Harness.installEndedCallback = install_ended;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
-    "Unsigned XPI": TESTROOT + "unsigned.xpi"
+    "Unsigned XPI": TESTROOT + "amosigned.xpi"
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function confirm_install(window) {
   sawUnload = BrowserTestUtils.waitForEvent(window, "unload");
 
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_offline.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_offline.js
@@ -6,17 +6,17 @@ function test() {
   Harness.downloadProgressCallback = download_progress;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
-    "Unsigned XPI": TESTROOT + "unsigned.xpi"
+    "Unsigned XPI": TESTROOT + "amosigned.xpi"
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function download_progress(addon, value, maxValue) {
   try {
     // Tests always connect to localhost, and per bug 87717, localhost is now
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_relative.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_relative.js
@@ -7,30 +7,30 @@ function test() {
   Harness.finalContentEvent = "InstallComplete";
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
     "Unsigned XPI": {
-      URL: "unsigned.xpi",
+      URL: "amosigned.xpi",
       IconURL: "icon.png",
       toString: function() { return this.URL; }
     }
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function confirm_install(window) {
   var items = window.document.getElementById("itemList").childNodes;
   is(items.length, 1, "Should only be 1 item listed in the confirmation dialog");
   is(items[0].name, "XPI Test", "Should have seen the name");
-  is(items[0].url, TESTROOT + "unsigned.xpi", "Should have listed the correct url for the item");
+  is(items[0].url, TESTROOT + "amosigned.xpi", "Should have listed the correct url for the item");
   is(items[0].icon, TESTROOT + "icon.png", "Should have listed the correct icon for the item");
   is(items[0].signed, "false", "Should have listed the item as unsigned");
   return true;
 }
 
 function install_ended(install, addon) {
   install.cancel();
 }
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_signed_multipackage.js
@@ -0,0 +1,53 @@
+// ----------------------------------------------------------------------------
+// Tests installing an signed add-on by navigating directly to the url
+function test() {
+  Harness.installConfirmCallback = confirm_install;
+  Harness.installEndedCallback = install_ended;
+  Harness.installsCompletedCallback = finish_test;
+  Harness.setup();
+
+  gBrowser.selectedTab = gBrowser.addTab("about:blank");
+  BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser).then(() => {
+    gBrowser.loadURI(TESTROOT + "signed-multipackage.xpi");
+  });
+}
+
+function get_item(items, name) {
+  for (let item of items) {
+    if (item.name == name)
+      return item;
+  }
+  ok(false, "Item for " + name + " was not listed");
+  return null;
+}
+
+function confirm_install(window) {
+  let items = window.document.getElementById("itemList").childNodes;
+  is(items.length, 2, "Should be 2 items listed in the confirmation dialog");
+
+  let item = get_item(items, "XPI Test");
+  if (item) {
+    is(item.signed, "false", "Should not have listed the item as signed");
+    is(item.icon, "", "Should have listed no icon for the item");
+  }
+
+  item = get_item(items, "Signed XPI Test");
+  if (item) {
+    is(item.cert, "(Object Signer)", "Should have seen the signer");
+    is(item.signed, "true", "Should have listed the item as signed");
+    is(item.icon, "", "Should have listed no icon for the item");
+  }
+
+  return true;
+}
+
+function install_ended(install, addon) {
+  install.cancel();
+}
+
+function finish_test(count) {
+  is(count, 2, "2 Add-ons should have been successfully installed");
+  gBrowser.removeCurrentTab();
+  Harness.finish();
+}
+// ----------------------------------------------------------------------------
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_softwareupdate.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_softwareupdate.js
@@ -4,17 +4,17 @@ function test() {
   Harness.installEndedCallback = install_ended;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   gBrowser.selectedTab = gBrowser.addTab();
-  gBrowser.loadURI(TESTROOT + "startsoftwareupdate.html? " + encodeURIComponent(TESTROOT + "unsigned.xpi"));
+  gBrowser.loadURI(TESTROOT + "startsoftwareupdate.html? " + encodeURIComponent(TESTROOT + "amosigned.xpi"));
 }
 
 function install_ended(install, addon) {
   install.cancel();
 }
 
 function finish_test(count) {
   is(count, 1, "1 Add-on should have been successfully installed");
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_switchtab.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_switchtab.js
@@ -9,30 +9,30 @@ function test() {
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
     "Unsigned XPI": {
-      URL: TESTROOT + "unsigned.xpi",
+      URL: TESTROOT + "amosigned.xpi",
       IconURL: TESTROOT + "icon.png",
       toString: function() { return this.URL; }
     }
   }));
   expectedTab = gBrowser.addTab();
   expectedTab.linkedBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function confirm_install(window) {
   var items = window.document.getElementById("itemList").childNodes;
   is(items.length, 1, "Should only be 1 item listed in the confirmation dialog");
   is(items[0].name, "XPI Test", "Should have seen the name");
-  is(items[0].url, TESTROOT + "unsigned.xpi", "Should have listed the correct url for the item");
+  is(items[0].url, TESTROOT + "amosigned.xpi", "Should have listed the correct url for the item");
   is(items[0].icon, TESTROOT + "icon.png", "Should have listed the correct icon for the item");
   is(items[0].signed, "false", "Should have listed the item as unsigned");
 
   is(gBrowser.selectedTab, expectedTab, "Should have switched to the installing tab.");
   return true;
 }
 
 function install_ended(install, addon) {
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_trigger_redirect.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_trigger_redirect.js
@@ -13,17 +13,17 @@ function test() {
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "triggerredirect.html");
 }
 
 function confirm_install(window) {
   var items = window.document.getElementById("itemList").childNodes;
   is(items.length, 1, "Should only be 1 item listed in the confirmation dialog");
   is(items[0].name, "XPI Test", "Should have seen the name");
-  is(items[0].url, TESTROOT + "unsigned.xpi", "Should have listed the correct url for the item");
+  is(items[0].url, TESTROOT + "amosigned.xpi", "Should have listed the correct url for the item");
   is(items[0].icon, TESTROOT + "icon.png", "Should have listed the correct icon for the item");
   is(items[0].signed, "false", "Should have listed the item as unsigned");
   return true;
 }
 
 function install_ended(install, addon) {
   install.cancel();
 }
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_unsigned_trigger_xorigin.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_unsigned_trigger_xorigin.js
@@ -9,17 +9,17 @@ function test() {
   Harness.finalContentEvent = "InstallComplete";
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
   var inner_url = encodeURIComponent(TESTROOT + "installtrigger.html?" + encodeURIComponent(JSON.stringify({
     "Unsigned XPI": {
-      URL: TESTROOT + "unsigned.xpi",
+      URL: TESTROOT + "amosigned.xpi",
       IconURL: TESTROOT + "icon.png",
       toString: function() { return this.URL; }
     }
   })));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT2 + "installtrigger_frame.html?" + inner_url);
 }
 
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_whitelist.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_whitelist.js
@@ -5,33 +5,33 @@
 function test() {
   Harness.installConfirmCallback = confirm_install;
   Harness.installBlockedCallback = allow_blocked;
   Harness.installEndedCallback = install_ended;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var triggers = encodeURIComponent(JSON.stringify({
-    "Unsigned XPI": TESTROOT + "unsigned.xpi"
+    "Unsigned XPI": TESTROOT + "amosigned.xpi"
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function allow_blocked(installInfo) {
   is(installInfo.browser, gBrowser.selectedBrowser, "Install should have been triggered by the right browser");
   is(installInfo.originatingURI.spec, gBrowser.currentURI.spec, "Install should have been triggered by the right uri");
   return true;
 }
 
 function confirm_install(window) {
   var items = window.document.getElementById("itemList").childNodes;
   is(items.length, 1, "Should only be 1 item listed in the confirmation dialog");
   is(items[0].name, "XPI Test", "Should have seen the name from the trigger list");
-  is(items[0].url, TESTROOT + "unsigned.xpi", "Should have listed the correct url for the item");
+  is(items[0].url, TESTROOT + "amosigned.xpi", "Should have listed the correct url for the item");
   is(items[0].signed, "false", "Should have listed the item as unsigned");
   return true;
 }
 
 function install_ended(install, addon) {
   install.cancel();
 }
 
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_whitelist2.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_whitelist2.js
@@ -6,17 +6,17 @@ function test() {
   Harness.installBlockedCallback = allow_blocked;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.org/"), "install", pm.ALLOW_ACTION);
 
   var triggers = encodeURIComponent(JSON.stringify({
-    "Unsigned XPI": TESTROOT2 + "unsigned.xpi"
+    "Unsigned XPI": TESTROOT2 + "amosigned.xpi"
   }));
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 }
 
 function allow_blocked(installInfo) {
   is(installInfo.browser, gBrowser.selectedBrowser, "Install should have been triggered by the right browser");
   is(installInfo.originatingURI.spec, gBrowser.currentURI.spec, "Install should have been triggered by the right uri");
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_whitelist3.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_whitelist3.js
@@ -1,12 +1,12 @@
 // ----------------------------------------------------------------------------
 // Tests installing an unsigned add-on through a navigation. Should not be
 // blocked since the referer is whitelisted.
-var url = TESTROOT2 + "navigate.html?" + encodeURIComponent(TESTROOT + "unsigned.xpi");
+var url = TESTROOT2 + "navigate.html?" + encodeURIComponent(TESTROOT + "amosigned.xpi");
 
 function test() {
   Harness.installConfirmCallback = confirm_install;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.org/"), "install", pm.ALLOW_ACTION);
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_whitelist4.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_whitelist4.js
@@ -1,12 +1,12 @@
 // ----------------------------------------------------------------------------
 // Tests installing an unsigned add-on through a navigation. Should be
 // blocked since the referer is not whitelisted even though the target is.
-var url = TESTROOT2 + "navigate.html?" + encodeURIComponent(TESTROOT + "unsigned.xpi");
+var url = TESTROOT2 + "navigate.html?" + encodeURIComponent(TESTROOT + "amosigned.xpi");
 
 function test() {
   Harness.installBlockedCallback = allow_blocked;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   var pm = Services.perms;
   pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_whitelist5.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_whitelist5.js
@@ -3,17 +3,17 @@
 // content. This should be blocked by the whitelist check.
 // This verifies bug 252830
 function test() {
   Harness.installBlockedCallback = allow_blocked;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   gBrowser.selectedTab = gBrowser.addTab();
-  gBrowser.loadURI(TESTROOT + "startsoftwareupdate.html? " + encodeURIComponent(TESTROOT + "unsigned.xpi"));
+  gBrowser.loadURI(TESTROOT + "startsoftwareupdate.html? " + encodeURIComponent(TESTROOT + "amosigned.xpi"));
 }
 
 function allow_blocked(installInfo) {
   is(installInfo.browser, gBrowser.selectedBrowser, "Install should have been triggered by the right browser");
   is(installInfo.originatingURI.spec, gBrowser.currentURI.spec, "Install should have been triggered by the right uri");
   return false;
 }
 
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_whitelist6.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_whitelist6.js
@@ -3,17 +3,17 @@
 // content. This should be blocked by the whitelist check.
 // This verifies bug 252830
 function test() {
   Harness.installBlockedCallback = allow_blocked;
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   gBrowser.selectedTab = gBrowser.addTab();
-  gBrowser.loadURI(TESTROOT + "installchrome.html? " + encodeURIComponent(TESTROOT + "unsigned.xpi"));
+  gBrowser.loadURI(TESTROOT + "installchrome.html? " + encodeURIComponent(TESTROOT + "amosigned.xpi"));
 }
 
 function allow_blocked(installInfo) {
   is(installInfo.browser, gBrowser.selectedBrowser, "Install should have been triggered by the right browser");
   is(installInfo.originatingURI.spec, gBrowser.currentURI.spec, "Install should have been triggered by the right uri");
   return false;
 }
 
--- a/toolkit/mozapps/extensions/test/xpinstall/browser_whitelist7.js
+++ b/toolkit/mozapps/extensions/test/xpinstall/browser_whitelist7.js
@@ -7,17 +7,17 @@ function test() {
   Harness.installsCompletedCallback = finish_test;
   Harness.setup();
 
   // Disable direct request whitelisting, installing should be blocked.
   Services.prefs.setBoolPref("xpinstall.whitelist.directRequest", false);
 
   gBrowser.selectedTab = gBrowser.addTab("about:blank");
   BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser).then(() => {
-    gBrowser.loadURI(TESTROOT + "unsigned.xpi");
+    gBrowser.loadURI(TESTROOT + "amosigned.xpi");
   });
 }
 
 function allow_blocked(installInfo) {
   ok(true, "Seen blocked");
   return false;
 }
 
--- a/toolkit/mozapps/extensions/test/xpinstall/bug540558.html
+++ b/toolkit/mozapps/extensions/test/xpinstall/bug540558.html
@@ -5,17 +5,17 @@
 
 <!-- This page tests that window.InstallTrigger.install works -->
 
 <head>
 <title>InstallTrigger tests</title>
 <script type="text/javascript">
 function startInstall() {
   window.InstallTrigger.install({
-    "Unsigned XPI": "unsigned.xpi"
+    "Unsigned XPI": "amosigned.xpi"
   });
 }
 </script>
 </head>
 <body onload="startInstall()">
 <p>InstallTrigger tests</p>
 <p id="return"></p>
 <p id="status"></p>
--- a/toolkit/mozapps/extensions/test/xpinstall/bug645699.html
+++ b/toolkit/mozapps/extensions/test/xpinstall/bug645699.html
@@ -15,17 +15,17 @@ function startInstall() {
     throw new Error("Object.defineProperty(window, 'location', ...) should have thrown");
   } catch (exc) {
     if (!(exc instanceof TypeError))
       throw exc;
   }
   Object.defineProperty(document, "documentURIObject", { spec : { href : whiteUrl }	});
 
   InstallTrigger.install({
-    "Unsigned XPI": "http://example.com/browser/toolkit/mozapps/extensions/test/xpinstall/unsigned.xpi"
+    "Unsigned XPI": "http://example.com/browser/toolkit/mozapps/extensions/test/xpinstall/amosigned.xpi"
   });
 }
 </script>
 </head>
 <body onload="startInstall()">
 <p>InstallTrigger tests</p>
 </body>
 </html>
--- a/toolkit/mozapps/extensions/test/xpinstall/concurrent_installs.html
+++ b/toolkit/mozapps/extensions/test/xpinstall/concurrent_installs.html
@@ -14,17 +14,17 @@ function installCallback(url, status) {
   dump("Sending InstallComplete\n");
   var event = new CustomEvent("InstallComplete", {detail: {loc: location.href, xpi: url}});
   window.dispatchEvent(event);
 }
 
 function startInstall() {
   var root = location.href.replace("concurrent_installs.html", "");
   var triggers = {
-    "Unsigned XPI": root + "unsigned.xpi"
+    "Unsigned XPI": root + "amosigned.xpi"
   };
   try {
     document.getElementById("return").textContent = InstallTrigger.install(triggers, installCallback);
   }
   catch (e) {
     document.getElementById("return").textContent = "exception";
     throw e;
   }
index 11fbe1861a3775fbe2383cbdb8d3a04b6ffed9b1..d52f28c2872c9b3ff612cdcc436e65618a3b5c68
GIT binary patch
literal 9589
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
new file mode 100644
index 0000000000000000000000000000000000000000..11fbe1861a3775fbe2383cbdb8d3a04b6ffed9b1
GIT binary patch
literal 2976
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
--- a/toolkit/mozapps/extensions/test/xpinstall/triggerredirect.html
+++ b/toolkit/mozapps/extensions/test/xpinstall/triggerredirect.html
@@ -15,17 +15,17 @@ function installCallback(url, status) {
   dump("Sending InstallComplete\n");
   var event = new CustomEvent("InstallComplete");
   window.dispatchEvent(event);
 }
 
 function startInstall() {
   InstallTrigger.install({
     "Unsigned XPI": {
-      URL: "unsigned.xpi",
+      URL: "amosigned.xpi",
       IconURL: "icon.png",
       toString: function() { return this.URL; }
     }
   }, installCallback);
 }
 </script>
 </head>
 <body onload="startInstall()">