зеркало из https://github.com/mozilla/pjs.git
170006 - more downloading updates - clean up properly if the app quits
This commit is contained in:
Родитель
baa7b99581
Коммит
877aea0960
|
@ -164,7 +164,8 @@ function Shutdown()
|
||||||
|
|
||||||
var os = Components.classes["@mozilla.org/observer-service;1"]
|
var os = Components.classes["@mozilla.org/observer-service;1"]
|
||||||
.getService(Components.interfaces.nsIObserverService);
|
.getService(Components.interfaces.nsIObserverService);
|
||||||
os.removeObserver(gDownloadManager, "xpinstall-download-started");
|
if (gDownloadManager)
|
||||||
|
os.removeObserver(gDownloadManager, "xpinstall-download-started");
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -196,11 +197,13 @@ XPInstallDownloadManager.prototype = {
|
||||||
|
|
||||||
observe: function (aSubject, aTopic, aData)
|
observe: function (aSubject, aTopic, aData)
|
||||||
{
|
{
|
||||||
if (aTopic == "xpinstall-download-started") {
|
switch (aTopic) {
|
||||||
|
case "xpinstall-download-started":
|
||||||
var params = aSubject.QueryInterface(Components.interfaces.nsISupportsArray);
|
var params = aSubject.QueryInterface(Components.interfaces.nsISupportsArray);
|
||||||
var paramBlock = params.GetElementAt(0).QueryInterface(Components.interfaces.nsISupportsInterfacePointer);
|
var paramBlock = params.GetElementAt(0).QueryInterface(Components.interfaces.nsISupportsInterfacePointer);
|
||||||
paramBlock = paramBlock.data.QueryInterface(Components.interfaces.nsIDialogParamBlock);
|
paramBlock = paramBlock.data.QueryInterface(Components.interfaces.nsIDialogParamBlock);
|
||||||
this.addDownloads(paramBlock);
|
this.addDownloads(paramBlock);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -244,6 +247,8 @@ XPInstallDownloadManager.prototype = {
|
||||||
{
|
{
|
||||||
const nsIXPIProgressDialog = Components.interfaces.nsIXPIProgressDialog;
|
const nsIXPIProgressDialog = Components.interfaces.nsIXPIProgressDialog;
|
||||||
var element = document.getElementById(aURL);
|
var element = document.getElementById(aURL);
|
||||||
|
dump("*** aURL = " + aURL + "\n");
|
||||||
|
if (!element) return;
|
||||||
switch (aState) {
|
switch (aState) {
|
||||||
case nsIXPIProgressDialog.DOWNLOAD_START:
|
case nsIXPIProgressDialog.DOWNLOAD_START:
|
||||||
element.setAttribute("state", "waiting");
|
element.setAttribute("state", "waiting");
|
||||||
|
@ -268,12 +273,10 @@ XPInstallDownloadManager.prototype = {
|
||||||
}
|
}
|
||||||
element.setAttribute("error", msg);
|
element.setAttribute("error", msg);
|
||||||
}
|
}
|
||||||
else {
|
// Remove the dummy, since we installed successfully
|
||||||
// Remove the dummy, since we installed successfully
|
var type = gWindowState == "extensions" ? nsIUpdateItem.TYPE_EXTENSION
|
||||||
var type = gWindowState == "extensions" ? nsIUpdateItem.TYPE_EXTENSION
|
: nsIUpdateItem.TYPE_THEME;
|
||||||
: nsIUpdateItem.TYPE_THEME;
|
gExtensionManager.removeDownload(aURL, type);
|
||||||
gExtensionManager.removeDownload(aURL, type);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case nsIXPIProgressDialog.DIALOG_CLOSE:
|
case nsIXPIProgressDialog.DIALOG_CLOSE:
|
||||||
break;
|
break;
|
||||||
|
@ -284,6 +287,7 @@ XPInstallDownloadManager.prototype = {
|
||||||
onProgress: function (aURL, aValue, aMaxValue)
|
onProgress: function (aURL, aValue, aMaxValue)
|
||||||
{
|
{
|
||||||
var element = document.getElementById(aURL);
|
var element = document.getElementById(aURL);
|
||||||
|
if (!element) return;
|
||||||
var percent = Math.round((aValue / aMaxValue) * 100);
|
var percent = Math.round((aValue / aMaxValue) * 100);
|
||||||
if (percent > 1 && !(aURL in this._urls)) {
|
if (percent > 1 && !(aURL in this._urls)) {
|
||||||
this._urls[aURL] = true;
|
this._urls[aURL] = true;
|
||||||
|
|
|
@ -1054,8 +1054,87 @@ nsExtensionManager.prototype = {
|
||||||
|
|
||||||
win.close();
|
win.close();
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case "quit-application-requested":
|
||||||
|
if (this._downloadCount > 0) {
|
||||||
|
var result;
|
||||||
|
#ifndef XP_MACOSX
|
||||||
|
result = this._confirmCancelDownloads(this._downloadCount,
|
||||||
|
"quitCancelDownloadsAlertTitle",
|
||||||
|
"quitCancelDownloadsAlertMsgMultiple",
|
||||||
|
"quitCancelDownloadsAlertMsg",
|
||||||
|
"dontQuitButtonWin");
|
||||||
|
#else
|
||||||
|
result = this._confirmCancelDownloads(this._downloadCount,
|
||||||
|
"quitCancelDownloadsAlertTitle",
|
||||||
|
"quitCancelDownloadsAlertMsgMacMultiple",
|
||||||
|
"quitCancelDownloadsAlertMsgMac",
|
||||||
|
"dontQuitButtonMac");
|
||||||
|
#endif
|
||||||
|
if (!result)
|
||||||
|
this._cancelDownloads();
|
||||||
|
var PRBool = aSubject.QueryInterface(Components.interfaces.nsISupportsPRBool);
|
||||||
|
PRBool.data = result;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "offline-requested":
|
||||||
|
if (this._downloadCount > 0) {
|
||||||
|
result = this._confirmCancelDownloads(this._downloadCount,
|
||||||
|
"offlineCancelDownloadsAlertTitle",
|
||||||
|
"offlineCancelDownloadsAlertMsgMultiple",
|
||||||
|
"offlineCancelDownloadsAlertMsg",
|
||||||
|
"dontGoOfflineButton");
|
||||||
|
if (!result)
|
||||||
|
this._cancelDownloads();
|
||||||
|
var PRBool = aSubject.QueryInterface(Components.interfaces.nsISupportsPRBool);
|
||||||
|
PRBool.data = result;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_cancelDownloads: function ()
|
||||||
|
{
|
||||||
|
var os = Components.classes["@mozilla.org/observer-service;1"]
|
||||||
|
.getService(Components.interfaces.nsIObserverService);
|
||||||
|
for (var i = 0; i < this._transactions.length; ++i)
|
||||||
|
os.notifyObservers(this._transactions[i], "xpinstall-progress", "cancel");
|
||||||
|
os.removeObserver(this, "offline-requested");
|
||||||
|
os.removeObserver(this, "quit-application-requested");
|
||||||
|
|
||||||
|
this._removeAllDownloads();
|
||||||
|
},
|
||||||
|
|
||||||
|
_confirmCancelDownloads: function (aCount, aTitle, aCancelMessageMultiple,
|
||||||
|
aCancelMessageSingle, aDontCancelButton)
|
||||||
|
{
|
||||||
|
var sbs = Components.classes["@mozilla.org/intl/stringbundle;1"]
|
||||||
|
.getService(Components.interfaces.nsIStringBundleService);
|
||||||
|
var bundle = sbs.createBundle("chrome://mozapps/locale/downloads/downloads.properties");
|
||||||
|
var title = bundle.GetStringFromName(aTitle);
|
||||||
|
var message, quitButton;
|
||||||
|
if (aCount > 1) {
|
||||||
|
message = bundle.formatStringFromName(aCancelMessageMultiple, [aCount], 1);
|
||||||
|
quitButton = bundle.formatStringFromName("cancelDownloadsOKTextMultiple", [aCount], 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
message = bundle.GetStringFromName(aCancelMessageSingle);
|
||||||
|
quitButton = bundle.GetStringFromName("cancelDownloadsOKText");
|
||||||
|
}
|
||||||
|
var dontQuitButton = bundle.GetStringFromName(aDontCancelButton);
|
||||||
|
|
||||||
|
var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
|
||||||
|
.getService(Components.interfaces.nsIWindowMediator);
|
||||||
|
var win = wm.getMostRecentWindow("Extension:Manager");
|
||||||
|
const nsIPromptService = Components.interfaces.nsIPromptService;
|
||||||
|
var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
|
||||||
|
.getService(nsIPromptService);
|
||||||
|
var flags = (nsIPromptService.BUTTON_TITLE_IS_STRING * nsIPromptService.BUTTON_POS_0) +
|
||||||
|
(nsIPromptService.BUTTON_TITLE_IS_STRING * nsIPromptService.BUTTON_POS_1);
|
||||||
|
var rv = { };
|
||||||
|
ps.confirmEx(win, title, message, flags, quitButton, dontQuitButton, null, null, { }, rv);
|
||||||
|
return rv.value == 0;
|
||||||
|
},
|
||||||
|
|
||||||
// This function checks for and disables any "old-style" extensions
|
// This function checks for and disables any "old-style" extensions
|
||||||
// from Firefox 0.8 and earlier created using the "chrome:extension=true" flag.
|
// from Firefox 0.8 and earlier created using the "chrome:extension=true" flag.
|
||||||
|
@ -1610,8 +1689,11 @@ nsExtensionManager.prototype = {
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
// Downloads
|
// Downloads
|
||||||
_transactions: [],
|
_transactions: [],
|
||||||
|
_downloadCount: 0,
|
||||||
addDownloads: function (aItems, aItemCount)
|
addDownloads: function (aItems, aItemCount)
|
||||||
{
|
{
|
||||||
|
this._downloadCount += aItemCount;
|
||||||
|
|
||||||
var txn = new nsItemDownloadTransaction(this);
|
var txn = new nsItemDownloadTransaction(this);
|
||||||
for (var i = 0; i < aItemCount; ++i) {
|
for (var i = 0; i < aItemCount; ++i) {
|
||||||
var currItem = aItems[i];
|
var currItem = aItems[i];
|
||||||
|
@ -1623,6 +1705,8 @@ nsExtensionManager.prototype = {
|
||||||
// Kick off the download process for this transaction
|
// Kick off the download process for this transaction
|
||||||
var os = Components.classes["@mozilla.org/observer-service;1"]
|
var os = Components.classes["@mozilla.org/observer-service;1"]
|
||||||
.getService(Components.interfaces.nsIObserverService);
|
.getService(Components.interfaces.nsIObserverService);
|
||||||
|
os.addObserver(this, "offline-requested", false);
|
||||||
|
os.addObserver(this, "quit-application-requested", false);
|
||||||
os.notifyObservers(txn, "xpinstall-progress", "open");
|
os.notifyObservers(txn, "xpinstall-progress", "open");
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -1636,6 +1720,12 @@ nsExtensionManager.prototype = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_removeAllDownloads: function ()
|
||||||
|
{
|
||||||
|
for (var i = 0; i < this._transactions.length; ++i)
|
||||||
|
this._transactions[i].removeAllDownloads();
|
||||||
|
},
|
||||||
|
|
||||||
// The nsIXPIProgressDialog implementation in the download transaction object
|
// The nsIXPIProgressDialog implementation in the download transaction object
|
||||||
// forwards notifications through these methods which we then pass on to any
|
// forwards notifications through these methods which we then pass on to any
|
||||||
// front end objects implementing nsIExtensionDownloadProgressListener that
|
// front end objects implementing nsIExtensionDownloadProgressListener that
|
||||||
|
@ -1649,11 +1739,16 @@ nsExtensionManager.prototype = {
|
||||||
this._progressData[aURL] = { };
|
this._progressData[aURL] = { };
|
||||||
this._progressData[aURL].state = aState;
|
this._progressData[aURL].state = aState;
|
||||||
|
|
||||||
|
dump("*** sending state changes for " + aURL + "\n");
|
||||||
for (var i = 0; i < this._downloadObservers.length; ++i)
|
for (var i = 0; i < this._downloadObservers.length; ++i)
|
||||||
this._downloadObservers[i].onStateChange(aURL, aState, aValue);
|
this._downloadObservers[i].onStateChange(aURL, aState, aValue);
|
||||||
|
|
||||||
const nsIXPIProgressDialog = Components.interfaces.nsIXPIProgressDialog;
|
const nsIXPIProgressDialog = Components.interfaces.nsIXPIProgressDialog;
|
||||||
if (aState == nsIXPIProgressDialog.DIALOG_CLOSE) {
|
switch (aState) {
|
||||||
|
case nsIXPIProgressDialog.INSTALL_DONE:
|
||||||
|
--this._downloadCount;
|
||||||
|
break;
|
||||||
|
case nsIXPIProgressDialog.DIALOG_CLOSE:
|
||||||
for (var i = 0; i < this._transactions.length; ++i) {
|
for (var i = 0; i < this._transactions.length; ++i) {
|
||||||
if (this._transactions[i].id == aTransaction.id) {
|
if (this._transactions[i].id == aTransaction.id) {
|
||||||
this._transactions.splice(i, 1);
|
this._transactions.splice(i, 1);
|
||||||
|
@ -1661,6 +1756,7 @@ nsExtensionManager.prototype = {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -1804,6 +1900,12 @@ nsItemDownloadTransaction.prototype = {
|
||||||
this._manager._ds.removeDownload(aURL, aItemType);
|
this._manager._ds.removeDownload(aURL, aItemType);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
removeAllDownloads: function ()
|
||||||
|
{
|
||||||
|
for (var i = 0; i < this._downloads.length; ++i)
|
||||||
|
this.removeDownload(this._downloads[i].url, this._downloads[i].type);
|
||||||
|
},
|
||||||
|
|
||||||
containsURL: function (aURL)
|
containsURL: function (aURL)
|
||||||
{
|
{
|
||||||
for (var i = 0; i < this._downloads.length; ++i) {
|
for (var i = 0; i < this._downloads.length; ++i) {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче