Bug 485624 - Downloads in progress for previous releases should be canceled on startup instead of resumed. r=dtownsend

This commit is contained in:
Robert Strong 2009-04-16 18:40:46 -07:00
Родитель 495b8f33be
Коммит 665be959a7
6 изменённых файлов: 295 добавлений и 27 удалений

Просмотреть файл

@ -60,7 +60,12 @@ var gUpdateHistory = {
var update = um.getUpdateAt(i);
if (!update || !update.name)
continue;
// Don't display updates that are downloading since they don't have
// valid statusText for the UI (bug 485493).
if (update.statusText == "" || update.statusText == "undefined")
continue;
var element = document.createElementNS(NS_XUL, "update");
this._view.appendChild(element);
element.name = bundle.getFormattedString("updateFullName",

Просмотреть файл

@ -187,9 +187,8 @@
<content>
<xul:hbox>
<xul:label class="update-name" xbl:inherits="value=name" flex="1" crop="right"/>
<xul:link xbl:inherits="href=detailsURL" class="update-details-link">
<xul:label>&update.details.label;</xul:label>
</xul:link>
<xul:label xbl:inherits="href=detailsURL" class="text-link"
value="&update.details.label;"/>
</xul:hbox>
<xul:label class="update-type" xbl:inherits="value=type"/>
<xul:grid>

Просмотреть файл

@ -769,9 +769,9 @@ UpdatePatch.prototype = {
* See nsIUpdateService.idl
*/
get state() {
if (!this.statusFileExists)
return STATE_NONE;
return this._properties.state;
if (this._properties.state)
return this._properties.state;
return STATE_NONE;
},
set state(val) {
this._properties.state = val;
@ -1188,7 +1188,8 @@ UpdateService.prototype = {
#endif
if (status == STATE_DOWNLOADING) {
LOG("UpdateService", "_postUpdateProcessing - downloading patch");
LOG("UpdateService", "_postUpdateProcessing - patch found in " +
"downloading state");
}
else if (status != null) {
// null status means the update.status file is not present, because either:
@ -1212,16 +1213,8 @@ UpdateService.prototype = {
if (status == STATE_SUCCEEDED) {
update.statusText = bundle.GetStringFromName("installSuccess");
// Dig through the update history to find the patch that was just
// installed and update its metadata.
for (var i = 0; i < um.updateCount; ++i) {
var umUpdate = um.getUpdateAt(i);
if (umUpdate && umUpdate.version == update.version &&
umUpdate.buildID == update.buildID) {
umUpdate.statusText = update.statusText;
break;
}
}
// Update the patch's metadata.
um.activeUpdate = update;
prompter.showUpdateInstalled();
@ -1674,7 +1667,7 @@ UpdateService.prototype = {
// fall through to checking if write access to the
// installation directory is available.
LOG("UpdateService", "canUpdate - on Vista, appDir is not under " +
"the Program Files");
"Program Files");
}
}
@ -1770,6 +1763,20 @@ UpdateService.prototype = {
downloadUpdate: function AUS_downloadUpdate(update, background) {
if (!update)
throw Cr.NS_ERROR_NULL_POINTER;
let ai = Cc["@mozilla.org/xre/app-info;1"].
getService(Ci.nsIXULAppInfo);
let vc = Cc["@mozilla.org/xpcom/version-comparator;1"].
getService(Ci.nsIVersionComparator);
// Don't download the update if the update's version is less than the
// current application's version.
if (update.version && vc.compare(update.version, ai.version) < 0) {
LOG("UpdateService", "downloadUpdate - removing update for previous " +
"application version " + update.version);
cleanupActiveUpdate();
return STATE_NONE;
}
if (this.isDownloading) {
if (update.isCompleteUpdate == this._downloader.isCompleteUpdate &&
background == this._downloader.background) {
@ -1879,7 +1886,7 @@ UpdateManager.prototype = {
LOG("UpdateManager", "_loadXMLFileIntoArray - invalid update");
continue;
}
result.push(new Update(updateElement));
result.push(update);
}
}
catch (e) {
@ -1898,10 +1905,10 @@ UpdateManager.prototype = {
this._updates = this._loadXMLFileIntoArray(getUpdateFile(
[FILE_UPDATES_DB]));
// Make sure that any active update is part of our updates list
var active = this.activeUpdate;
if (active)
this._addUpdate(active);
var activeUpdates = this._loadXMLFileIntoArray(getUpdateFile(
[FILE_UPDATE_ACTIVE]));
if (activeUpdates.length > 0)
this._activeUpdate = activeUpdates[0];
}
},
@ -1973,8 +1980,7 @@ UpdateManager.prototype = {
}
}
// Otherwise add it to the front of the list.
if (update)
this._updates = [update].concat(this._updates);
this._updates.unshift(update);
},
/**
@ -2019,8 +2025,21 @@ UpdateManager.prototype = {
saveUpdates: function UM_saveUpdates() {
this._writeUpdatesToXMLFile([this._activeUpdate],
getUpdateFile([FILE_UPDATE_ACTIVE]));
if (this._activeUpdate)
this._addUpdate(this._activeUpdate);
// Don't write updates that have a temporary state to the updates.xml file.
if (this._updates) {
this._writeUpdatesToXMLFile(this._updates.slice(0, 10),
let updates = this._updates.slice();
for (let i = updates.length - 1; i >= 0; --i) {
let state = updates[i].state;
if (state == STATE_NONE || state == STATE_DOWNLOADING ||
state == STATE_PENDING) {
updates.splice(i, 1);
}
}
this._writeUpdatesToXMLFile(updates.slice(0, 10),
getUpdateFile([FILE_UPDATES_DB]));
}
},
@ -2706,6 +2725,9 @@ Downloader.prototype = {
this._update.installDate = (new Date()).getTime();
um.activeUpdate = null;
}
else {
um.activeUpdate.state = state;
}
um.saveUpdates();
var listenerCount = this._listeners.length;

Просмотреть файл

@ -0,0 +1,117 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the Application Update Service.
*
* The Initial Developer of the Original Code is
* Robert Strong <robert.bugzilla@gmail.com>.
*
* Portions created by the Initial Developer are Copyright (C) 2009
* the Mozilla Foundation <http://www.mozilla.org/>. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK *****
*/
/* General Update Manager Tests */
function run_test() {
dump("Testing: addition of a successful update to " + FILE_UPDATES_DB +
" and verification of update properties\n");
removeUpdateDirsAndFiles();
var defaults = gPrefs.QueryInterface(AUS_Ci.nsIPrefService)
.getDefaultBranch(null);
defaults.setCharPref("app.update.channel", "bogus_channel");
var patches = getLocalPatchString(null, null, null, null, null, null,
STATE_FAILED);
var updates = getLocalUpdateString(patches, "Existing", null, "3.0", "3.0",
"3.0", null, null, null, null, null,
getString("patchApplyFailure"));
writeUpdatesToXMLFile(getLocalUpdatesXMLString(updates), false);
patches = getLocalPatchString(null, null, null, null, null, null,
STATE_PENDING);
updates = getLocalUpdateString(patches, "New");
writeUpdatesToXMLFile(getLocalUpdatesXMLString(updates), true);
writeStatusFile(STATE_SUCCEEDED);
startAUS();
startUpdateManager();
do_check_eq(gUpdateManager.activeUpdate, null);
do_check_eq(gUpdateManager.updateCount, 2);
var update = gUpdateManager.getUpdateAt(0);
do_check_eq(update.state, STATE_SUCCEEDED);
do_check_eq(update.name, "New");
do_check_eq(update.type, "major");
do_check_eq(update.version, "4.0");
do_check_eq(update.platformVersion, "4.0");
do_check_eq(update.extensionVersion, "4.0");
do_check_eq(update.detailsURL, "http://dummydetails/");
do_check_eq(update.licenseURL, "http://dummylicense/");
do_check_eq(update.serviceURL, "http://dummyservice/");
do_check_eq(update.installDate, "1238441400314");
do_check_eq(update.statusText, getString("installSuccess"));
do_check_eq(update.buildID, "20080811053724");
do_check_true(update.isCompleteUpdate);
do_check_eq(update.channel, "bogus_channel");
var patch = update.selectedPatch;
do_check_eq(patch.type, "complete");
do_check_eq(patch.URL, "http://localhost:4444/data/empty.mar");
do_check_eq(patch.hashFunction, "MD5");
do_check_eq(patch.hashValue, "6232cd43a1c77e30191c53a329a3f99d");
do_check_eq(patch.size, "775");
do_check_true(patch.selected);
do_check_eq(patch.state, STATE_SUCCEEDED);
update = gUpdateManager.getUpdateAt(1);
do_check_eq(update.state, STATE_FAILED);
do_check_eq(update.name, "Existing");
do_check_eq(update.type, "major");
do_check_eq(update.version, "3.0");
do_check_eq(update.platformVersion, "3.0");
do_check_eq(update.extensionVersion, "3.0");
do_check_eq(update.detailsURL, "http://dummydetails/");
do_check_eq(update.licenseURL, "http://dummylicense/");
do_check_eq(update.serviceURL, "http://dummyservice/");
do_check_eq(update.installDate, "1238441400314");
do_check_eq(update.statusText, getString("patchApplyFailure"));
do_check_eq(update.buildID, "20080811053724");
do_check_true(update.isCompleteUpdate);
do_check_eq(update.channel, "bogus_channel");
patch = update.selectedPatch;
do_check_eq(patch.type, "complete");
do_check_eq(patch.URL, "http://localhost:4444/data/empty.mar");
do_check_eq(patch.hashFunction, "MD5");
do_check_eq(patch.hashValue, "6232cd43a1c77e30191c53a329a3f99d");
do_check_eq(patch.size, "775");
do_check_true(patch.selected);
do_check_eq(patch.state, STATE_FAILED);
}

Просмотреть файл

@ -0,0 +1,62 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the Application Update Service.
*
* The Initial Developer of the Original Code is
* Robert Strong <robert.bugzilla@gmail.com>.
*
* Portions created by the Initial Developer are Copyright (C) 2009
* the Mozilla Foundation <http://www.mozilla.org/>. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK *****
*/
/* General Update Manager Tests */
function run_test() {
dump("Testing: removal of an update download in progress for an older " +
"version of the application on startup - bug 485624\n");
removeUpdateDirsAndFiles();
var defaults = gPrefs.QueryInterface(AUS_Ci.nsIPrefService)
.getDefaultBranch(null);
defaults.setCharPref("app.update.channel", "bogus_channel");
writeUpdatesToXMLFile(getLocalUpdatesXMLString(""), false);
patches = getLocalPatchString(null, null, null, null, null, null,
STATE_DOWNLOADING);
updates = getLocalUpdateString(patches, null, null, "0.9", null, "0.9");
writeUpdatesToXMLFile(getLocalUpdatesXMLString(updates), true);
writeStatusFile(STATE_DOWNLOADING);
startAUS();
startUpdateManager();
do_check_eq(gUpdateManager.activeUpdate, null);
do_check_eq(gUpdateManager.updateCount, 0);
}

Просмотреть файл

@ -0,0 +1,63 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the Application Update Service.
*
* The Initial Developer of the Original Code is
* Robert Strong <robert.bugzilla@gmail.com>.
*
* Portions created by the Initial Developer are Copyright (C) 2009
* the Mozilla Foundation <http://www.mozilla.org/>. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK *****
*/
/* General Update Manager Tests */
function run_test() {
dump("Testing: resuming an update download in progress for the same " +
"version of the application on startup - bug 485624\n");
removeUpdateDirsAndFiles();
var defaults = gPrefs.QueryInterface(AUS_Ci.nsIPrefService)
.getDefaultBranch(null);
defaults.setCharPref("app.update.channel", "bogus_channel");
writeUpdatesToXMLFile(getLocalUpdatesXMLString(""), false);
patches = getLocalPatchString(null, null, null, null, null, null,
STATE_DOWNLOADING);
updates = getLocalUpdateString(patches, null, null, "1.0", null, "1.0", null,
null, null, URL_HOST + DIR_DATA + "/empty.mar");
writeUpdatesToXMLFile(getLocalUpdatesXMLString(updates), true);
writeStatusFile(STATE_DOWNLOADING);
startAUS();
startUpdateManager();
do_check_eq(gUpdateManager.updateCount, 1);
do_check_eq(gUpdateManager.activeUpdate.state, STATE_DOWNLOADING);
}