summaryrefslogtreecommitdiffstats
path: root/application/palemoon/components/downloads/content/downloadsViewCommon.js
diff options
context:
space:
mode:
Diffstat (limited to 'application/palemoon/components/downloads/content/downloadsViewCommon.js')
-rw-r--r--application/palemoon/components/downloads/content/downloadsViewCommon.js110
1 files changed, 50 insertions, 60 deletions
diff --git a/application/palemoon/components/downloads/content/downloadsViewCommon.js b/application/palemoon/components/downloads/content/downloadsViewCommon.js
index 7b763ed07..7d18eadc6 100644
--- a/application/palemoon/components/downloads/content/downloadsViewCommon.js
+++ b/application/palemoon/components/downloads/content/downloadsViewCommon.js
@@ -72,12 +72,19 @@ DownloadElementShell.prototype = {
* URI string for the file type icon displayed in the download element.
*/
get image() {
- if (this.download.target.path) {
- return "moz-icon://" + this.download.target.path + "?size=32";
+ if (!this.download.target.path) {
+ // Old history downloads may not have a target path.
+ return "moz-icon://.unknown?size=32";
}
- // Old history downloads may not have a target path.
- return "moz-icon://.unknown?size=32";
+ // When a download that was previously in progress finishes successfully, it
+ // means that the target file now exists and we can extract its specific
+ // icon, for example from a Windows executable. To ensure that the icon is
+ // reloaded, however, we must change the URI used by the XUL image element,
+ // for example by adding a query parameter. This only works if we add one of
+ // the parameters explicitly supported by the nsIMozIconURI interface.
+ return "moz-icon://" + this.download.target.path + "?size=32" +
+ (this.download.succeeded ? "&state=normal" : "");
},
/**
@@ -127,11 +134,12 @@ DownloadElementShell.prototype = {
* update in order to improve performance.
*/
_updateState() {
- this.element.setAttribute("state", this.dataItem.state);
this.element.setAttribute("displayName", this.displayName);
this.element.setAttribute("extendedDisplayName", this.extendedDisplayName);
this.element.setAttribute("extendedDisplayNameTip", this.extendedDisplayNameTip);
this.element.setAttribute("image", this.image);
+ this.element.setAttribute("state",
+ DownloadsCommon.stateOfDownload(this.download));
// Since state changed, reset the time left estimation.
this.lastEstimatedSecondsLeft = Infinity;
@@ -144,19 +152,12 @@ DownloadElementShell.prototype = {
* namely the progress bar and the status line.
*/
_updateProgress() {
- if (this.dataItem.starting) {
- // Before the download starts, the progress meter has its initial value.
+ // The progress bar is only displayed for in-progress downloads.
+ if (this.download.hasProgress) {
this.element.setAttribute("progressmode", "normal");
- this.element.setAttribute("progress", "0");
- } else if (this.dataItem.state == Ci.nsIDownloadManager.DOWNLOAD_SCANNING ||
- this.dataItem.percentComplete == -1) {
- // We might not know the progress of a running download, and we don't know
- // the remaining time during the malware scanning phase.
- this.element.setAttribute("progressmode", "undetermined");
+ this.element.setAttribute("progress", this.download.progress);
} else {
- // This is a running download of which we know the progress.
- this.element.setAttribute("progressmode", "normal");
- this.element.setAttribute("progress", this.dataItem.percentComplete);
+ this.element.setAttribute("progressmode", "undetermined");
}
// Dispatch the ValueChange event for accessibility, if possible.
@@ -190,71 +191,60 @@ DownloadElementShell.prototype = {
let text = "";
let tip = "";
- if (this.dataItem.paused) {
- let transfer = DownloadUtils.getTransferTotal(this.download.currentBytes,
- this.dataItem.maxBytes);
-
- // We use the same XUL label to display both the state and the amount
- // transferred, for example "Paused - 1.1 MB".
- text = s.statusSeparatorBeforeNumber(s.statePaused, transfer);
- } else if (this.dataItem.state == nsIDM.DOWNLOAD_DOWNLOADING) {
+ if (!this.download.stopped) {
+ let maxBytes = DownloadsCommon.maxBytesOfDownload(this.download);
// By default, extended status information including the individual
// download rate is displayed in the tooltip. The history view overrides
// the getter and displays the detials in the main area instead.
[text] = DownloadUtils.getDownloadStatusNoRate(
this.download.currentBytes,
- this.dataItem.maxBytes,
+ maxBytes,
this.download.speed,
this.lastEstimatedSecondsLeft);
let newEstimatedSecondsLeft;
[tip, newEstimatedSecondsLeft] = DownloadUtils.getDownloadStatus(
this.download.currentBytes,
- this.dataItem.maxBytes,
+ maxBytes,
this.download.speed,
this.lastEstimatedSecondsLeft);
this.lastEstimatedSecondsLeft = newEstimatedSecondsLeft;
- } else if (this.dataItem.starting) {
+ } else if (this.download.canceled && this.download.hasPartialData) {
+ let maxBytes = DownloadsCommon.maxBytesOfDownload(this.download);
+ let transfer = DownloadUtils.getTransferTotal(this.download.currentBytes,
+ maxBytes);
+
+ // We use the same XUL label to display both the state and the amount
+ // transferred, for example "Paused - 1.1 MB".
+ text = s.statusSeparatorBeforeNumber(s.statePaused, transfer);
+ } else if (!this.download.succeeded && !this.download.canceled &&
+ !this.download.error) {
text = s.stateStarting;
- } else if (this.dataItem.state == nsIDM.DOWNLOAD_SCANNING) {
- text = s.stateScanning;
} else {
let stateLabel;
- switch (this.dataItem.state) {
- case nsIDM.DOWNLOAD_FAILED:
- stateLabel = s.stateFailed;
- break;
- case nsIDM.DOWNLOAD_CANCELED:
- stateLabel = s.stateCanceled;
- break;
- case nsIDM.DOWNLOAD_BLOCKED_PARENTAL:
- stateLabel = s.stateBlockedParentalControls;
- break;
- case nsIDM.DOWNLOAD_BLOCKED_POLICY:
- stateLabel = s.stateBlockedPolicy;
- break;
- case nsIDM.DOWNLOAD_DIRTY:
- stateLabel = s.stateDirty;
- break;
- case nsIDM.DOWNLOAD_FINISHED:
- // For completed downloads, show the file size (e.g. "1.5 MB")
- if (this.dataItem.maxBytes !== undefined &&
- this.dataItem.maxBytes >= 0) {
- let [size, unit] =
- DownloadUtils.convertByteUnits(this.dataItem.maxBytes);
- stateLabel = s.sizeWithUnits(size, unit);
- break;
- }
- // Fallback to default unknown state.
- default:
+
+ if (this.download.succeeded) {
+ // For completed downloads, show the file size (e.g. "1.5 MB")
+ let maxBytes = DownloadsCommon.maxBytesOfDownload(this.download);
+ if (maxBytes >= 0) {
+ let [size, unit] = DownloadUtils.convertByteUnits(maxBytes);
+ stateLabel = s.sizeWithUnits(size, unit);
+ } else {
stateLabel = s.sizeUnknown;
- break;
+ }
+ } else if (this.download.canceled) {
+ stateLabel = s.stateCanceled;
+ } else if (this.download.error.becauseBlockedByParentalControls) {
+ stateLabel = s.stateBlockedParentalControls;
+ } else if (this.download.error.becauseBlockedByReputationCheck) {
+ stateLabel = s.stateDirty;
+ } else {
+ stateLabel = s.stateFailed;
}
- let referrer = this.download.source.referrer ||
- this.download.source.url;
+ let referrer = this.download.source.referrer || this.download.source.url;
let [displayHost, fullHost] = DownloadUtils.getURIHost(referrer);
- let date = new Date(this.dataItem.endTime);
+ let date = new Date(this.download.endTime);
let [displayDate, fullDate] = DownloadUtils.getReadableDates(date);
let firstPart = s.statusSeparator(stateLabel, displayHost);