summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--application/palemoon/components/downloads/DownloadsCommon.jsm36
-rw-r--r--application/palemoon/components/downloads/content/downloads.js32
2 files changed, 29 insertions, 39 deletions
diff --git a/application/palemoon/components/downloads/DownloadsCommon.jsm b/application/palemoon/components/downloads/DownloadsCommon.jsm
index 2bfd7b528..aac43d197 100644
--- a/application/palemoon/components/downloads/DownloadsCommon.jsm
+++ b/application/palemoon/components/downloads/DownloadsCommon.jsm
@@ -647,12 +647,8 @@ XPCOMUtils.defineLazyGetter(DownloadsCommon, "useJSTransfer", function () {
function DownloadsDataCtor(aPrivate) {
this._isPrivate = aPrivate;
- // This Object contains all the available DownloadsDataItem objects, indexed by
- // their globally unique identifier. The identifiers of downloads that have
- // been removed from the Download Manager data are still present, however the
- // associated objects are replaced with the value "null". This is required to
- // prevent race conditions when populating the list asynchronously.
- this.dataItems = {};
+ // Contains all the available DownloadsDataItem objects.
+ this.dataItems = new Set();
// Array of view objects that should be notified when the available download
// data changes.
@@ -690,8 +686,8 @@ DownloadsDataCtor.prototype = {
*/
get canRemoveFinished()
{
- for (let [, dataItem] of Iterator(this.dataItems)) {
- if (dataItem && !dataItem.inProgress) {
+ for (let dataItem of this.dataItems) {
+ if (!dataItem.inProgress) {
return true;
}
}
@@ -716,7 +712,7 @@ DownloadsDataCtor.prototype = {
{
let dataItem = new DownloadsDataItem(aDownload);
this._downloadToDataItemMap.set(aDownload, dataItem);
- this.dataItems[dataItem.downloadGuid] = dataItem;
+ this.dataItems.add(dataItem);
for (let view of this._views) {
view.onDataItemAdded(dataItem, true);
@@ -745,7 +741,7 @@ DownloadsDataCtor.prototype = {
}
this._downloadToDataItemMap.delete(aDownload);
- this.dataItems[dataItem.downloadGuid] = null;
+ this.dataItems.delete(dataItem);
for (let view of this._views) {
view.onDataItemRemoved(dataItem);
}
@@ -861,14 +857,7 @@ DownloadsDataCtor.prototype = {
//let loadedItemsArray = [dataItem
// for each (dataItem in this.dataItems)
// if (dataItem)];
-
- let loadedItemsArray = [];
-
- for each (let dataItem in this.dataItems) {
- if (dataItem) {
- loadedItemsArray.push(dataItem);
- }
- }
+ let loadedItemsArray = [...this.dataItems];
loadedItemsArray.sort(function(a, b) b.download.startTime - a.download.startTime);
loadedItemsArray.forEach(
@@ -1345,13 +1334,6 @@ function DownloadsDataItem(aSource)
DownloadsDataItem.prototype = {
/**
- * The JavaScript API does not need identifiers for Download objects, so they
- * are generated sequentially for the corresponding DownloadDataItem.
- */
- get _autoIncrementId() ++DownloadsDataItem.prototype.__lastId,
- __lastId: 0,
-
- /**
* Initializes this object from the JavaScript API for downloads.
*
* The endTime property is initialized to the current date and time.
@@ -1362,8 +1344,6 @@ DownloadsDataItem.prototype = {
_initFromJSDownload: function (aDownload)
{
this.download = aDownload;
-
- this.downloadGuid = "id:" + this._autoIncrementId;
this.endTime = Date.now();
this.updateFromJSDownload();
@@ -2029,7 +2009,7 @@ DownloadsIndicatorDataCtor.prototype = {
{
let dataItems = this._isPrivate ? PrivateDownloadsData.dataItems
: DownloadsData.dataItems;
- for each (let dataItem in dataItems) {
+ for (let dataItem of dataItems) {
if (dataItem && dataItem.inProgress) {
yield dataItem;
}
diff --git a/application/palemoon/components/downloads/content/downloads.js b/application/palemoon/components/downloads/content/downloads.js
index af0c85535..a6c716b8c 100644
--- a/application/palemoon/components/downloads/content/downloads.js
+++ b/application/palemoon/components/downloads/content/downloads.js
@@ -896,6 +896,16 @@ const DownloadsView = {
},
/**
+ * Associates each richlistitem for a download with its corresponding
+ * DownloadsViewItemController object.
+ */
+ _controllersForElements: new Map(),
+
+ controllerForElement(element) {
+ return this._controllersForElements.get(element);
+ },
+
+ /**
* Creates a new view item associated with the specified data item, and adds
* it to the top or the bottom of the list.
*/
@@ -907,6 +917,8 @@ const DownloadsView = {
let element = document.createElement("richlistitem");
let viewItem = new DownloadsViewItem(aDataItem, element);
this._visibleViewItems.set(aDataItem, viewItem);
+ let viewItemController = new DownloadsViewItemController(aDataItem);
+ this._controllersForElements.set(element, viewItemController);
if (aNewest) {
this.richListBox.insertBefore(element, this.richListBox.firstChild);
} else {
@@ -928,6 +940,7 @@ const DownloadsView = {
this.richListBox.itemCount - 1);
}
this._visibleViewItems.delete(aDataItem);
+ this._controllersForElements.delete(element);
},
//////////////////////////////////////////////////////////////////////////////
@@ -949,7 +962,7 @@ const DownloadsView = {
while (target.nodeName != "richlistitem") {
target = target.parentNode;
}
- new DownloadsViewItemController(target).doCommand(aCommand);
+ DownloadsView.controllerForElement(target).doCommand(aCommand);
},
onDownloadClick: function DV_onDownloadClick(aEvent)
@@ -1028,8 +1041,8 @@ const DownloadsView = {
return;
}
- let controller = new DownloadsViewItemController(element);
- let localFile = controller.dataItem.localFile;
+ let localFile = DownloadsView.controllerForElement(element)
+ .dataItem.localFile;
if (!localFile.exists()) {
return;
}
@@ -1082,8 +1095,6 @@ function DownloadsViewItem(aDataItem, aElement)
let attributes = {
"type": "download",
"class": "download-state",
- "id": "downloadsItem_" + this.dataItem.downloadGuid,
- "downloadGuid": this.dataItem.downloadGuid,
"state": this.dataItem.state,
"progress": this.dataItem.inProgress ? this.dataItem.percentComplete : 100,
"displayName": target,
@@ -1360,8 +1371,8 @@ const DownloadsViewController = {
// Other commands are selection-specific.
let element = DownloadsView.richListBox.selectedItem;
- return element &&
- new DownloadsViewItemController(element).isCommandEnabled(aCommand);
+ return element && DownloadsView.controllerForElement(element)
+ .isCommandEnabled(aCommand);
},
doCommand: function DVC_doCommand(aCommand)
@@ -1376,7 +1387,7 @@ const DownloadsViewController = {
let element = DownloadsView.richListBox.selectedItem;
if (element) {
// The doCommand function also checks if the command is enabled.
- new DownloadsViewItemController(element).doCommand(aCommand);
+ DownloadsView.controllerForElement(element).doCommand(aCommand);
}
},
@@ -1416,9 +1427,8 @@ XPCOMUtils.defineConstant(this, "DownloadsViewController", DownloadsViewControll
* Handles all the user interaction events, in particular the "commands",
* related to a single item in the downloads list widgets.
*/
-function DownloadsViewItemController(aElement) {
- let downloadGuid = aElement.getAttribute("downloadGuid");
- this.dataItem = DownloadsCommon.getData(window).dataItems[downloadGuid];
+function DownloadsViewItemController(aDataItem) {
+ this.dataItem = aDataItem;
}
DownloadsViewItemController.prototype = {