Bug 1306492 - release staging directory when add-on install is postponed r?kmag draft
authorRobert Helmer <rhelmer@mozilla.com>
Thu, 29 Sep 2016 19:38:08 -0700
changeset 419847 af4b87851c3a6e005a1fd4651a9ed99619907146
parent 419377 3fc3826c761ee16c2c8c7bde129927f8e1466615
child 532663 2b3d16b6ad67ae93ebee6b5127f9ceaa935b9f8a
push id31027
push userrhelmer@mozilla.com
push dateSat, 01 Oct 2016 05:00:04 +0000
reviewerskmag
bugs1306492
milestone52.0a1
Bug 1306492 - release staging directory when add-on install is postponed r?kmag MozReview-Commit-ID: 3mMFS2l8bKq
toolkit/mozapps/extensions/internal/XPIProvider.jsm
toolkit/mozapps/extensions/test/xpcshell/test_delay_update_webextension.js
--- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm
+++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
@@ -6268,16 +6268,17 @@ AddonInstall.prototype = {
                 switch (this.state) {
                   case AddonManager.STATE_INSTALLED:
                     // this addon has already been installed, nothing to do
                     logger.warn(`${this.addon.id} tried to resume postponed upgrade, but it's already installed`);
                     break;
                   case AddonManager.STATE_POSTPONED:
                     logger.info(`${this.addon.id} has resumed a previously postponed upgrade`);
                     this.state = AddonManager.STATE_DOWNLOADED;
+                    this.installLocation.releaseStagingDir();
                     this.install();
                     break;
                   default:
                     logger.warn(`${this.addon.id} cannot resume postponed upgrade from state (${this.state})`);
                     break;
                 }
               },
             });
--- a/toolkit/mozapps/extensions/test/xpcshell/test_delay_update_webextension.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_delay_update_webextension.js
@@ -7,16 +7,18 @@
 // The test extension uses an insecure update url.
 Services.prefs.setBoolPref(PREF_EM_CHECK_UPDATE_SECURITY, false);
 
 /*globals browser*/
 
 const profileDir = gProfD.clone();
 profileDir.append("extensions");
 const tempdir = gTmpD.clone();
+const stageDir = profileDir.clone();
+stageDir.append("staged");
 
 const IGNORE_ID = "test_delay_update_ignore_webext@tests.mozilla.org";
 const COMPLETE_ID = "test_delay_update_complete_webext@tests.mozilla.org";
 const DEFER_ID = "test_delay_update_defer_webext@tests.mozilla.org";
 const NOUPDATE_ID = "test_no_update_webext@tests.mozilla.org";
 
 // Create and configure the HTTP server.
 let testserver = createHttpServer();
@@ -172,16 +174,20 @@ add_task(function* delay_updates_complet
   do_check_neq(addon_allowed, null);
   do_check_eq(addon_allowed.version, "2.0");
   do_check_eq(addon_allowed.name, "Delay Upgrade");
   do_check_true(addon_allowed.isCompatible);
   do_check_false(addon_allowed.appDisabled);
   do_check_true(addon_allowed.isActive);
   do_check_eq(addon_allowed.type, "extension");
 
+  if (stageDir.exists()) {
+    do_throw("Staging directory should not exist for formerly-postponed extension");
+  }
+
   yield extension.markUnloaded();
   yield addon_allowed.uninstall();
   yield promiseShutdownManager();
 });
 
 // add-on registers upgrade listener, initially defers update then allows upgrade
 add_task(function* delay_updates_defer() {
   startupManager();