diff options
-rw-r--r-- | application/palemoon/components/downloads/DownloadsCommon.jsm | 36 | ||||
-rw-r--r-- | application/palemoon/components/downloads/content/downloads.js | 32 |
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 = { |