Chromium Code Reviews| Index: chrome/browser/resources/downloads/downloads.js |
| diff --git a/chrome/browser/resources/downloads/downloads.js b/chrome/browser/resources/downloads/downloads.js |
| index 0a074b7bf28f290c4615c3195488864ef9ee92f1..c8697755222bf7da57c62c2d3c43e3c293799157 100644 |
| --- a/chrome/browser/resources/downloads/downloads.js |
| +++ b/chrome/browser/resources/downloads/downloads.js |
| @@ -172,10 +172,6 @@ function Downloads() { |
| this.searchText_ = ''; |
| this.focusGrid_ = new cr.ui.FocusGrid(); |
| - // Keep track of the dates of the newest and oldest downloads so that we |
| - // know where to insert them. |
| - this.newestTime_ = -1; |
| - |
| // Icon load request queue. |
| this.iconLoadQueue_ = []; |
| this.isIconLoading_ = false; |
| @@ -202,17 +198,21 @@ Downloads.prototype.updated = function(download) { |
| this.downloads_[id].update(download); |
| } else { |
| this.downloads_[id] = new Download(download); |
| - // We get downloads in display order, so we don't have to worry about |
| - // maintaining correct order - we can assume that any downloads not in |
| - // display order are new ones and so we can add them to the top of the |
| - // list. |
| - if (download.started > this.newestTime_) { |
| - this.node_.insertBefore(this.downloads_[id].node, this.node_.firstChild); |
| - this.newestTime_ = download.started; |
| - } else { |
| - this.node_.appendChild(this.downloads_[id].node); |
| + |
| + // Sort downloads by start time and insert the new one in the right place. |
| + var startSorted = []; |
| + for (var sortedId in this.downloads_) { |
| + startSorted.push(this.downloads_[sortedId]); |
| } |
| + startSorted.sort(function(d1, d2) { return d2.started_ - d1.started_; }); |
| + |
| + var indexOfNewDownload = startSorted.indexOf(this.downloads_[id]); |
| + var before = startSorted[indexOfNewDownload + 1]; |
| + |
| + // If !before, insertBefore() acts like appendChild() and adds at the end. |
| + this.node_.insertBefore(this.downloads_[id].node, before && before.node); |
|
Dan Beam
2015/03/03 19:31:05
i could possibly do this:
if (startSorted.lengt
asanka
2015/03/03 20:45:56
Yeah. For undo operations that affect multiple dow
Dan Beam
2015/03/04 00:46:20
the problem with rebuilding DOM is that it messes
|
| } |
| + |
| // Download.prototype.update may change its nodeSince_ and nodeDate_, so |
| // update all the date displays. |
| // TODO(benjhayden) Only do this if its nodeSince_ or nodeDate_ actually did |
| @@ -373,10 +373,7 @@ Downloads.prototype.scheduleIconLoad = function(elem, iconURL) { |
| * @return {boolean} Returns true if the displayed list is to be updated. |
| */ |
| Downloads.prototype.isUpdateNeeded = function(downloads) { |
| - var size = 0; |
| - for (var i in this.downloads_) |
| - size++; |
| - if (size != downloads.length) |
| + if (this.size() != downloads.length) |
| return true; |
| // Since there are the same number of items in the incoming list as |
| // |this.downloads_|, there won't be any removed downloads without some |
| @@ -633,6 +630,7 @@ Download.prototype.update = function(download) { |
| this.fileUrl_ = download.file_url; |
| this.fileName_ = download.file_name; |
| this.url_ = download.url; |
| + this.started_ = download.started; |
| this.state_ = download.state; |
| this.fileExternallyRemoved_ = download.file_externally_removed; |
| this.dangerType_ = download.danger_type; |