summaryrefslogtreecommitdiffstats
path: root/chrome/browser/resources/downloads/manager.js
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/resources/downloads/manager.js')
-rw-r--r--chrome/browser/resources/downloads/manager.js256
1 files changed, 0 insertions, 256 deletions
diff --git a/chrome/browser/resources/downloads/manager.js b/chrome/browser/resources/downloads/manager.js
deleted file mode 100644
index 7f91b61..0000000
--- a/chrome/browser/resources/downloads/manager.js
+++ /dev/null
@@ -1,256 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-cr.define('downloads', function() {
- /**
- * Class to own and manage download items.
- * @constructor
- */
- function Manager() {}
-
- cr.addSingletonGetter(Manager);
-
- Manager.prototype = {
- /** @private {string} */
- searchText_: '',
-
- /**
- * 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;
-
- $('downloads-summary-text').textContent = this.searchText_ ?
- loadTimeData.getStringF('searchResultsFor', this.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));
- },
-
- /**
- * @return {number} A guess at how many items could be visible at once.
- * @private
- */
- guesstimateNumberOfVisibleItems_: function() {
- var headerHeight = document.querySelector('header').offsetHeight;
- var summaryHeight = $('downloads-summary').offsetHeight;
- var nonItemSpace = headerHeight + summaryHeight;
- return Math.floor((window.innerHeight - nonItemSpace) / 46) + 1;
- },
-
- /**
- * Called when all items need to be updated.
- * @param {!Array<!downloads.Data>} list A list of new download data.
- * @private
- */
- updateAll_: function(list) {
- var oldIdMap = this.idMap_ || {};
-
- /** @private {!Object<!downloads.ItemView>} */
- this.idMap_ = {};
-
- /** @private {!Array<!downloads.ItemView>} */
- this.items_ = [];
-
- if (!this.iconLoader_) {
- var guesstimate = Math.max(this.guesstimateNumberOfVisibleItems_(), 1);
- /** @private {downloads.ThrottledIconLoader} */
- this.iconLoader_ = new downloads.ThrottledIconLoader(guesstimate);
- }
-
- for (var i = 0; i < list.length; ++i) {
- var data = list[i];
- var id = data.id;
-
- // Re-use old items when possible (saves work, preserves focus).
- var item = oldIdMap[id] || new downloads.ItemView(this.iconLoader_);
-
- this.idMap_[id] = item; // Associated by ID for fast lookup.
- this.items_.push(item); // Add to sorted list for order.
-
- // Render |item| but don't actually add to the DOM yet. |this.items_|
- // must be fully created to be able to find the right spot to insert.
- item.update(data);
-
- // Collapse redundant dates.
- var prev = list[i - 1];
- item.dateContainer.hidden =
- prev && prev.date_string == data.date_string;
-
- delete oldIdMap[id];
- }
-
- // Remove stale, previously rendered items from the DOM.
- for (var id in oldIdMap) {
- var oldNode = oldIdMap[id].node;
- if (oldNode.parentNode)
- oldNode.parentNode.removeChild(oldNode);
- delete oldIdMap[id];
- }
-
- for (var i = 0; i < this.items_.length; ++i) {
- var item = this.items_[i];
- if (item.node.parentNode) // Already in the DOM; skip.
- continue;
-
- var before = null;
- // Find the next rendered item after this one, and insert before it.
- for (var j = i + 1; !before && j < this.items_.length; ++j) {
- if (this.items_[j].node.parentNode)
- before = this.items_[j].node;
- }
- // If |before| is null, |item| will just get added at the end.
- this.node_.insertBefore(item.node, 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;
-
- if (loadTimeData.getBoolean('allowDeletingHistory'))
- $('clear-all').hidden = !hasDownloads || this.searchText_.length > 0;
-
- this.rebuildFocusGrid_();
- },
-
- /**
- * @param {!downloads.Data} data Info about the item to update.
- * @private
- */
- updateItem_: function(data) {
- var activeElement = document.activeElement;
-
- var item = this.idMap_[data.id];
- item.update(data);
-
- if (item.node.contains(activeElement) &&
- !cr.ui.FocusRow.isFocusable(activeElement)) {
- var focusRow = this.focusGrid_.getRowForRoot(item.node);
- focusRow.getEquivalentElement(activeElement).focus();
- }
- },
-
- /**
- * Rebuild the focusGrid_ using the elements that each download will have.
- * @private
- */
- rebuildFocusGrid_: function() {
- var activeElement = document.activeElement;
-
- /** @private {!cr.ui.FocusGrid} */
- this.focusGrid_ = this.focusGrid_ || new cr.ui.FocusGrid();
- this.focusGrid_.destroy();
-
- this.items_.forEach(function(item) {
- var focusRow = new downloads.FocusRow(item.node, this.node_);
-
- this.focusGrid_.addRow(focusRow);
-
- if (item.node.contains(activeElement) &&
- !cr.ui.FocusRow.isFocusable(activeElement)) {
- focusRow.getEquivalentElement(activeElement).focus();
- }
- }, this);
-
- this.focusGrid_.ensureRowActive();
- },
-
- /**
- * @return {number} The number of downloads shown on the page.
- * @private
- */
- size_: 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');
- };
-
- $('term').onsearch = function(e) {
- this.setSearchText_($('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
- */
- onCanExecute_: function(e) {
- e = /** @type {cr.ui.CanExecuteEvent} */(e);
- switch (e.command.id) {
- case 'undo-command':
- e.canExecute = document.activeElement != $('term');
- break;
- case 'clear-all-command':
- e.canExecute = true;
- break;
- }
- },
-
- /**
- * @param {Event} e
- * @private
- */
- onCommand_: function(e) {
- if (e.command.id == 'undo-command')
- chrome.send('undo');
- else if (e.command.id == 'clear-all-command')
- this.clearAll_();
- },
- };
-
- Manager.updateAll = function(list) {
- Manager.getInstance().updateAll_(list);
- };
-
- Manager.updateItem = function(item) {
- Manager.getInstance().updateItem_(item);
- };
-
- Manager.setSearchText = function(searchText) {
- Manager.getInstance().setSearchText_(searchText);
- };
-
- Manager.onLoad = function() {
- Manager.getInstance().onLoad_();
- };
-
- Manager.size = function() {
- return Manager.getInstance().size_();
- };
-
- return {Manager: Manager};
-});
-
-window.addEventListener('DOMContentLoaded', downloads.Manager.onLoad);