зеркало из https://github.com/mozilla/gecko-dev.git
Bug 485624 - Downloads in progress for previous releases should be canceled on startup instead of resumed. r=dtownsend
This commit is contained in:
Родитель
495b8f33be
Коммит
665be959a7
|
@ -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);
|
||||
}
|
Загрузка…
Ссылка в новой задаче