Index: chrome/browser/resources/md_downloads/manager.js |
diff --git a/chrome/browser/resources/md_downloads/manager.js b/chrome/browser/resources/md_downloads/manager.js |
index ebd003f47fc0e37e53ba7f5370eda0efaa46291a..74aed83d4e5d299c67b5cab2b83832768bff8b78 100644 |
--- a/chrome/browser/resources/md_downloads/manager.js |
+++ b/chrome/browser/resources/md_downloads/manager.js |
@@ -6,40 +6,84 @@ cr.define('downloads', function() { |
/** |
* Class to own and manage download items. |
* @constructor |
+ * @implements {downloads.ActionService} |
*/ |
function Manager() {} |
cr.addSingletonGetter(Manager); |
+ /** |
+ * @param {string} chromeSendName |
+ * @return {function(string):void} A chrome.send() callback with curried name. |
+ */ |
+ function chromeSendWithId(chromeSendName) { |
+ return function(id) { chrome.send(chromeSendName, [id]); }; |
+ } |
+ |
Manager.prototype = { |
- /** @private {string} */ |
- searchText_: '', |
+ /** @override */ |
+ cancel: chromeSendWithId('cancel'), |
- /** |
- * Sets the search text, updates related UIs, and tells the browser. |
- * @param {string} searchText Text we're searching for. |
- * @private |
- */ |
- setSearchText_: function(searchText) { |
- this.searchText_ = searchText; |
+ /** @override */ |
+ clearAll: function() { |
+ if (loadTimeData.getBoolean('allowDeletingHistory')) { |
+ chrome.send('clearAll'); |
+ this.search(''); |
+ } |
+ }, |
+ |
+ /** @override */ |
+ discardDangerous: chromeSendWithId('discardDangerous'), |
+ |
+ /** @override */ |
+ drag: chromeSendWithId('drag'), |
+ |
+ /** @override */ |
+ openDownloadsFolder: function() { |
+ chrome.send('openDownloadsFolder'); |
+ }, |
+ |
+ /** @override */ |
+ openFile: chromeSendWithId('openFile'), |
+ |
+ /** @override */ |
+ pause: chromeSendWithId('pause'), |
- $('downloads-summary-text').textContent = this.searchText_ ? |
- loadTimeData.getStringF('searchResultsFor', this.searchText_) : ''; |
+ /** @override */ |
+ remove: chromeSendWithId('remove'), |
+ /** @override */ |
+ resume: chromeSendWithId('resume'), |
+ |
+ /** @override */ |
+ saveDangerous: chromeSendWithId('saveDangerous'), |
+ |
+ /** @override */ |
+ search: function(searchText) { |
// Split quoted terms (e.g., 'The "lazy" dog' => ['The', 'lazy', 'dog']). |
function trim(s) { return s.trim(); } |
chrome.send('getDownloads', searchText.split(/"([^"]*)"/).map(trim)); |
}, |
+ /** @override */ |
+ show: chromeSendWithId('show'), |
+ |
+ /** |
+ * @return {boolean} Whether all can be cleared. |
+ * @private |
+ */ |
+ canClearAll_: function() { |
+ return loadTimeData.getBoolean('allowDeletingHistory') && |
+ this.size_() > 0; |
+ }, |
+ |
/** |
* @return {number} A guess at how many items could be visible at once. |
* @private |
*/ |
guesstimateNumberOfVisibleItems_: function() { |
- var toolbarHeight = $('downloads-toolbar').offsetHeight; |
- var summaryHeight = $('downloads-summary').offsetHeight; |
- var nonItemSpace = toolbarHeight + summaryHeight; |
- return Math.floor((window.innerHeight - nonItemSpace) / 46) + 1; |
+ var toolbarHeight = this.toolbar_.offsetHeight; |
+ return Math.floor((window.innerHeight - toolbarHeight) / 46) + 1; |
}, |
/** |
@@ -67,7 +111,8 @@ cr.define('downloads', function() { |
var id = data.id; |
// Re-use old items when possible (saves work, preserves focus). |
- var item = oldIdMap[id] || new downloads.ItemView(this.iconLoader_); |
+ var item = |
+ oldIdMap[id] || new downloads.ItemView(this.iconLoader_, this); |
this.idMap_[id] = item; // Associated by ID for fast lookup. |
this.items_.push(item); // Add to sorted list for order. |
@@ -102,19 +147,15 @@ cr.define('downloads', function() { |
before = this.items_[j]; |
} |
// If |before| is null, |item| will just get added at the end. |
- this.node_.insertBefore(item, before); |
+ this.list_.insertBefore(item, before); |
} |
- var noDownloadsOrResults = $('no-downloads-or-results'); |
- noDownloadsOrResults.textContent = loadTimeData.getString( |
- this.searchText_ ? 'noSearchResults' : 'noDownloads'); |
- |
var hasDownloads = this.size_() > 0; |
- this.node_.hidden = !hasDownloads; |
- noDownloadsOrResults.hidden = hasDownloads; |
+ this.list_.hidden = !hasDownloads; |
+ $('no-downloads').hidden = hasDownloads; |
if (loadTimeData.getBoolean('allowDeletingHistory')) |
- $('clear-all').hidden = !hasDownloads || this.searchText_.length > 0; |
+ this.toolbar_.canClearAll = hasDownloads; |
}, |
/** |
@@ -133,53 +174,6 @@ cr.define('downloads', function() { |
return this.items_.length; |
}, |
- /** @private */ |
- clearAll_: function() { |
- if (loadTimeData.getBoolean('allowDeletingHistory')) { |
- chrome.send('clearAll'); |
- this.setSearchText_(''); |
- } |
- }, |
- |
- /** @private */ |
- onLoad_: function() { |
- this.node_ = $('downloads-display'); |
- |
- $('clear-all').onclick = function() { |
- this.clearAll_(); |
- }.bind(this); |
- |
- $('open-downloads-folder').onclick = function() { |
- chrome.send('openDownloadsFolder'); |
- }; |
- |
- $('search-button').onclick = function() { |
- if (!$('search-term').hidden) |
- return; |
- $('clear-search').hidden = false; |
- $('search-term').hidden = false; |
- }; |
- |
- $('clear-search').onclick = function() { |
- $('clear-search').hidden = true; |
- $('search-term').hidden = true; |
- $('search-term').value = ''; |
- this.setSearchText_(''); |
- }.bind(this); |
- |
- // TODO(dbeam): this previously used onsearch, which batches keystrokes |
- // together. This should probably be re-instated eventually. |
- $('search-term').oninput = function(e) { |
- this.setSearchText_($('search-term').value); |
- }.bind(this); |
- |
- cr.ui.decorate('command', cr.ui.Command); |
- document.addEventListener('canExecute', this.onCanExecute_.bind(this)); |
- document.addEventListener('command', this.onCommand_.bind(this)); |
- |
- this.setSearchText_(''); |
- }, |
- |
/** |
* @param {Event} e |
* @private |
@@ -188,7 +182,9 @@ cr.define('downloads', function() { |
e = /** @type {cr.ui.CanExecuteEvent} */(e); |
switch (e.command.id) { |
case 'undo-command': |
- e.canExecute = !$('search-term').contains(document.activeElement); |
+ var activeElement = document.activeElement; |
+ var searchTerm = this.toolbar_ && this.toolbar_.searchTerm; |
+ e.canExecute = searchTerm && !searchTerm.contains(activeElement); |
Jeremy Klein
2015/07/16 18:54:53
This is a cool trick for determining focus. I've n
Dan Beam
2015/07/18 01:02:20
Acknowledged.
|
break; |
case 'clear-all-command': |
e.canExecute = true; |
@@ -204,20 +200,25 @@ cr.define('downloads', function() { |
if (e.command.id == 'undo-command') |
chrome.send('undo'); |
else if (e.command.id == 'clear-all-command') |
- this.clearAll_(); |
+ this.clearAll(); |
}, |
- }; |
- Manager.updateAll = function(list) { |
- Manager.getInstance().updateAll_(list); |
- }; |
+ /** @private */ |
+ onLoad_: function() { |
+ this.list_ = $('downloads-list'); |
- Manager.updateItem = function(item) { |
- Manager.getInstance().updateItem_(item); |
- }; |
+ var toolbar = document.querySelector('downloads-toolbar'); |
+ /** @private {!downloads.Toolbar} */ |
+ this.toolbar_ = assertInstanceof(toolbar, downloads.Toolbar); |
+ this.toolbar_.setActionService(this); |
Jeremy Klein
2015/07/16 18:54:53
This creates a circular dependency that makes thes
Dan Beam
2015/07/18 01:02:20
Done.
|
+ |
+ cr.ui.decorate('command', cr.ui.Command); |
+ document.addEventListener('canExecute', this.onCanExecute_.bind(this)); |
+ document.addEventListener('command', this.onCommand_.bind(this)); |
- Manager.setSearchText = function(searchText) { |
- Manager.getInstance().setSearchText_(searchText); |
+ // Shows all downloads. |
+ this.search(''); |
+ }, |
}; |
Manager.onLoad = function() { |
@@ -228,6 +229,14 @@ cr.define('downloads', function() { |
return Manager.getInstance().size_(); |
}; |
+ Manager.updateAll = function(list) { |
+ Manager.getInstance().updateAll_(list); |
+ }; |
+ |
+ Manager.updateItem = function(item) { |
+ Manager.getInstance().updateItem_(item); |
+ }; |
+ |
return {Manager: Manager}; |
}); |