OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // TODO(jhawkins): Use hidden instead of showInline* and display:none. | 5 // TODO(jhawkins): Use hidden instead of showInline* and display:none. |
6 | 6 |
7 /** | 7 /** |
8 * The type of the download object. The definition is based on | 8 * The type of the download object. The definition is based on |
9 * chrome/browser/ui/webui/downloads_dom_handler.cc:CreateDownloadItemValue() | 9 * chrome/browser/ui/webui/downloads_dom_handler.cc:CreateDownloadItemValue() |
10 * @typedef {{by_ext_id: (string|undefined), | 10 * @typedef {{by_ext_id: (string|undefined), |
(...skipping 11 matching lines...) Expand all Loading... |
22 * progress_status_text: (string|undefined), | 22 * progress_status_text: (string|undefined), |
23 * received: (number|undefined), | 23 * received: (number|undefined), |
24 * resume: boolean, | 24 * resume: boolean, |
25 * retry: boolean, | 25 * retry: boolean, |
26 * since_string: string, | 26 * since_string: string, |
27 * started: number, | 27 * started: number, |
28 * state: string, | 28 * state: string, |
29 * total: number, | 29 * total: number, |
30 * url: string}} | 30 * url: string}} |
31 */ | 31 */ |
32 var BackendDownloadObject; | 32 var DownloadItem; |
33 | 33 |
34 /** | 34 /** |
35 * Sets the display style of a node. | 35 * Sets the display style of a node. |
36 * @param {!Element} node The target element to show or hide. | 36 * @param {!Element} node The target element to show or hide. |
37 * @param {boolean} isShow Should the target element be visible. | 37 * @param {boolean} isShow Should the target element be visible. |
38 */ | 38 */ |
39 function showInline(node, isShow) { | 39 function showInline(node, isShow) { |
40 node.style.display = isShow ? 'inline' : 'none'; | 40 node.style.display = isShow ? 'inline' : 'none'; |
41 } | 41 } |
42 | 42 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 this.iconLoadQueue_ = []; | 101 this.iconLoadQueue_ = []; |
102 this.isIconLoading_ = false; | 102 this.isIconLoading_ = false; |
103 | 103 |
104 this.progressForeground1_ = new Image(); | 104 this.progressForeground1_ = new Image(); |
105 this.progressForeground1_.src = | 105 this.progressForeground1_.src = |
106 'chrome://theme/IDR_DOWNLOAD_PROGRESS_FOREGROUND_32@1x'; | 106 'chrome://theme/IDR_DOWNLOAD_PROGRESS_FOREGROUND_32@1x'; |
107 this.progressForeground2_ = new Image(); | 107 this.progressForeground2_ = new Image(); |
108 this.progressForeground2_.src = | 108 this.progressForeground2_.src = |
109 'chrome://theme/IDR_DOWNLOAD_PROGRESS_FOREGROUND_32@2x'; | 109 'chrome://theme/IDR_DOWNLOAD_PROGRESS_FOREGROUND_32@2x'; |
110 | 110 |
111 window.addEventListener('keydown', this.onKeyDown_.bind(this)); | 111 cr.ui.decorate('command', cr.ui.Command); |
| 112 document.addEventListener('canExecute', this.onCanExecute_.bind(this)); |
| 113 document.addEventListener('command', this.onCommand_.bind(this)); |
112 | 114 |
113 this.updateResults(); | 115 this.updateResults(); |
114 } | 116 } |
115 | 117 |
116 /** | 118 /** |
117 * Called when a download has been updated or added. | 119 * Called when a download has been updated or added. |
118 * @param {BackendDownloadObject} download A backend download object | 120 * @param {DownloadItem} download Information about a download. |
119 */ | 121 */ |
120 Downloads.prototype.updated = function(download) { | 122 Downloads.prototype.updated = function(download) { |
121 var id = download.id; | 123 var id = download.id; |
122 if (!!this.downloads_[id]) { | 124 if (this.downloads_[id]) { |
123 this.downloads_[id].update(download); | 125 this.downloads_[id].update(download); |
124 } else { | 126 } else { |
125 this.downloads_[id] = new Download(download); | 127 this.downloads_[id] = new Download(download); |
126 // We get downloads in display order, so we don't have to worry about | 128 // We get downloads in display order, so we don't have to worry about |
127 // maintaining correct order - we can assume that any downloads not in | 129 // maintaining correct order - we can assume that any downloads not in |
128 // display order are new ones and so we can add them to the top of the | 130 // display order are new ones and so we can add them to the top of the |
129 // list. | 131 // list. |
130 if (download.started > this.newestTime_) { | 132 if (download.started > this.newestTime_) { |
131 this.node_.insertBefore(this.downloads_[id].node, this.node_.firstChild); | 133 this.node_.insertBefore(this.downloads_[id].node, this.node_.firstChild); |
132 this.newestTime_ = download.started; | 134 this.newestTime_ = download.started; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 * Called whenever the downloads lists items have changed (either by being | 189 * Called whenever the downloads lists items have changed (either by being |
188 * updated, added, or removed). | 190 * updated, added, or removed). |
189 * @private | 191 * @private |
190 */ | 192 */ |
191 Downloads.prototype.onDownloadListChanged_ = function() { | 193 Downloads.prototype.onDownloadListChanged_ = function() { |
192 // Update the date visibility in our nodes so that no date is repeated. | 194 // Update the date visibility in our nodes so that no date is repeated. |
193 var dateContainers = document.getElementsByClassName('date-container'); | 195 var dateContainers = document.getElementsByClassName('date-container'); |
194 var displayed = {}; | 196 var displayed = {}; |
195 for (var i = 0, container; container = dateContainers[i]; i++) { | 197 for (var i = 0, container; container = dateContainers[i]; i++) { |
196 var dateString = container.getElementsByClassName('date')[0].innerHTML; | 198 var dateString = container.getElementsByClassName('date')[0].innerHTML; |
197 if (!!displayed[dateString]) { | 199 if (displayed[dateString]) { |
198 container.style.display = 'none'; | 200 container.style.display = 'none'; |
199 } else { | 201 } else { |
200 displayed[dateString] = true; | 202 displayed[dateString] = true; |
201 container.style.display = 'block'; | 203 container.style.display = 'block'; |
202 } | 204 } |
203 } | 205 } |
204 | 206 |
205 this.updateResults(); | 207 this.updateResults(); |
206 }; | 208 }; |
207 | 209 |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 // downloads having been inserted. So check only for new downloads in | 276 // downloads having been inserted. So check only for new downloads in |
275 // deciding whether to update. | 277 // deciding whether to update. |
276 for (var i = 0; i < downloads.length; i++) { | 278 for (var i = 0; i < downloads.length; i++) { |
277 if (!this.downloads_[downloads[i].id]) | 279 if (!this.downloads_[downloads[i].id]) |
278 return true; | 280 return true; |
279 } | 281 } |
280 return false; | 282 return false; |
281 }; | 283 }; |
282 | 284 |
283 /** | 285 /** |
284 * Handles shortcut keys. | 286 * @param {Event} e |
285 * @param {Event} evt The keyboard event. | |
286 * @private | 287 * @private |
287 */ | 288 */ |
288 Downloads.prototype.onKeyDown_ = function(evt) { | 289 Downloads.prototype.onCanExecute_ = function(e) { |
289 var keyEvt = /** @type {KeyboardEvent} */(evt); | 290 e = /** @type {cr.ui.CanExecuteEvent} */(e); |
290 if (keyEvt.keyCode == 67 && keyEvt.altKey) { // alt + c. | 291 e.canExecute = document.activeElement != $('term'); |
| 292 }; |
| 293 |
| 294 /** |
| 295 * @param {Event} e |
| 296 * @private |
| 297 */ |
| 298 Downloads.prototype.onCommand_ = function(e) { |
| 299 if (e.command.id == 'undo-command') |
| 300 chrome.send('undo'); |
| 301 else if (e.command.id == 'clear-all-command') |
291 clearAll(); | 302 clearAll(); |
292 keyEvt.preventDefault(); | |
293 } | |
294 }; | 303 }; |
295 | 304 |
296 /////////////////////////////////////////////////////////////////////////////// | 305 /////////////////////////////////////////////////////////////////////////////// |
297 // Download | 306 // Download |
298 /** | 307 /** |
299 * A download and the DOM representation for that download. | 308 * A download and the DOM representation for that download. |
300 * @param {BackendDownloadObject} download A backend download object | 309 * @param {DownloadItem} download Info about the download. |
301 * @constructor | 310 * @constructor |
302 */ | 311 */ |
303 function Download(download) { | 312 function Download(download) { |
304 // Create DOM | 313 // Create DOM |
305 this.node = createElementWithClassName( | 314 this.node = createElementWithClassName( |
306 'div', 'download' + (download.otr ? ' otr' : '')); | 315 'div', 'download' + (download.otr ? ' otr' : '')); |
307 | 316 |
308 // Dates | 317 // Dates |
309 this.dateContainer_ = createElementWithClassName('div', 'date-container'); | 318 this.dateContainer_ = createElementWithClassName('div', 'date-container'); |
310 this.node.appendChild(this.dateContainer_); | 319 this.node.appendChild(this.dateContainer_); |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
516 | 525 |
517 // Listens for when device-pixel-ratio changes between any zoom level. | 526 // Listens for when device-pixel-ratio changes between any zoom level. |
518 [0.3, 0.4, 0.6, 0.7, 0.8, 0.95, 1.05, 1.2, 1.4, 1.6, 1.9, 2.2, 2.7, 3.5, 4.5 | 527 [0.3, 0.4, 0.6, 0.7, 0.8, 0.95, 1.05, 1.2, 1.4, 1.6, 1.9, 2.2, 2.7, 3.5, 4.5 |
519 ].forEach(function(scale) { | 528 ].forEach(function(scale) { |
520 var media = '(-webkit-min-device-pixel-ratio:' + scale + ')'; | 529 var media = '(-webkit-min-device-pixel-ratio:' + scale + ')'; |
521 window.matchMedia(media).addListener(computeDownloadProgress); | 530 window.matchMedia(media).addListener(computeDownloadProgress); |
522 }); | 531 }); |
523 | 532 |
524 /** | 533 /** |
525 * Updates the download to reflect new data. | 534 * Updates the download to reflect new data. |
526 * @param {BackendDownloadObject} download A backend download object | 535 * @param {DownloadItem} download Updated info about this download. |
527 */ | 536 */ |
528 Download.prototype.update = function(download) { | 537 Download.prototype.update = function(download) { |
529 this.id_ = download.id; | 538 this.id_ = download.id; |
530 this.filePath_ = download.file_path; | 539 this.filePath_ = download.file_path; |
531 this.fileUrl_ = download.file_url; | 540 this.fileUrl_ = download.file_url; |
532 this.fileName_ = download.file_name; | 541 this.fileName_ = download.file_name; |
533 this.url_ = download.url; | 542 this.url_ = download.url; |
534 this.state_ = download.state; | 543 this.state_ = download.state; |
535 this.fileExternallyRemoved_ = download.file_externally_removed; | 544 this.fileExternallyRemoved_ = download.file_externally_removed; |
536 this.dangerType_ = download.danger_type; | 545 this.dangerType_ = download.danger_type; |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
776 }; | 785 }; |
777 | 786 |
778 /** | 787 /** |
779 * Tells the backend to initiate a drag, allowing users to drag | 788 * Tells the backend to initiate a drag, allowing users to drag |
780 * files from the download page and have them appear as native file | 789 * files from the download page and have them appear as native file |
781 * drags. | 790 * drags. |
782 * @return {boolean} Returns false to prevent the default action. | 791 * @return {boolean} Returns false to prevent the default action. |
783 * @private | 792 * @private |
784 */ | 793 */ |
785 Download.prototype.drag_ = function() { | 794 Download.prototype.drag_ = function() { |
786 chrome.send('drag', [this.id_.toString()]); | 795 chrome.send('drag', [this.id_]); |
787 return false; | 796 return false; |
788 }; | 797 }; |
789 | 798 |
790 /** | 799 /** |
791 * Tells the backend to open this file. | 800 * Tells the backend to open this file. |
792 * @return {boolean} Returns false to prevent the default action. | 801 * @return {boolean} Returns false to prevent the default action. |
793 * @private | 802 * @private |
794 */ | 803 */ |
795 Download.prototype.openFile_ = function() { | 804 Download.prototype.openFile_ = function() { |
796 chrome.send('openFile', [this.id_.toString()]); | 805 chrome.send('openFile', [this.id_]); |
797 return false; | 806 return false; |
798 }; | 807 }; |
799 | 808 |
800 /** | 809 /** |
801 * Tells the backend that the user chose to save a dangerous file. | 810 * Tells the backend that the user chose to save a dangerous file. |
802 * @return {boolean} Returns false to prevent the default action. | 811 * @return {boolean} Returns false to prevent the default action. |
803 * @private | 812 * @private |
804 */ | 813 */ |
805 Download.prototype.saveDangerous_ = function() { | 814 Download.prototype.saveDangerous_ = function() { |
806 chrome.send('saveDangerous', [this.id_.toString()]); | 815 chrome.send('saveDangerous', [this.id_]); |
807 return false; | 816 return false; |
808 }; | 817 }; |
809 | 818 |
810 /** | 819 /** |
811 * Tells the backend that the user chose to discard a dangerous file. | 820 * Tells the backend that the user chose to discard a dangerous file. |
812 * @return {boolean} Returns false to prevent the default action. | 821 * @return {boolean} Returns false to prevent the default action. |
813 * @private | 822 * @private |
814 */ | 823 */ |
815 Download.prototype.discardDangerous_ = function() { | 824 Download.prototype.discardDangerous_ = function() { |
816 chrome.send('discardDangerous', [this.id_.toString()]); | 825 chrome.send('discardDangerous', [this.id_]); |
817 downloads.remove(this.id_); | 826 downloads.remove(this.id_); |
818 return false; | 827 return false; |
819 }; | 828 }; |
820 | 829 |
821 /** | 830 /** |
822 * Tells the backend to show the file in explorer. | 831 * Tells the backend to show the file in explorer. |
823 * @return {boolean} Returns false to prevent the default action. | 832 * @return {boolean} Returns false to prevent the default action. |
824 * @private | 833 * @private |
825 */ | 834 */ |
826 Download.prototype.show_ = function() { | 835 Download.prototype.show_ = function() { |
827 chrome.send('show', [this.id_.toString()]); | 836 chrome.send('show', [this.id_]); |
828 return false; | 837 return false; |
829 }; | 838 }; |
830 | 839 |
831 /** | 840 /** |
832 * Tells the backend to pause this download. | 841 * Tells the backend to pause this download. |
833 * @return {boolean} Returns false to prevent the default action. | 842 * @return {boolean} Returns false to prevent the default action. |
834 * @private | 843 * @private |
835 */ | 844 */ |
836 Download.prototype.pause_ = function() { | 845 Download.prototype.pause_ = function() { |
837 chrome.send('pause', [this.id_.toString()]); | 846 chrome.send('pause', [this.id_]); |
838 return false; | 847 return false; |
839 }; | 848 }; |
840 | 849 |
841 /** | 850 /** |
842 * Tells the backend to resume this download. | 851 * Tells the backend to resume this download. |
843 * @return {boolean} Returns false to prevent the default action. | 852 * @return {boolean} Returns false to prevent the default action. |
844 * @private | 853 * @private |
845 */ | 854 */ |
846 Download.prototype.resume_ = function() { | 855 Download.prototype.resume_ = function() { |
847 chrome.send('resume', [this.id_.toString()]); | 856 chrome.send('resume', [this.id_]); |
848 return false; | 857 return false; |
849 }; | 858 }; |
850 | 859 |
851 /** | 860 /** |
852 * Tells the backend to remove this download from history and download shelf. | 861 * Tells the backend to remove this download from history and download shelf. |
853 * @return {boolean} Returns false to prevent the default action. | 862 * @return {boolean} Returns false to prevent the default action. |
854 * @private | 863 * @private |
855 */ | 864 */ |
856 Download.prototype.remove_ = function() { | 865 Download.prototype.remove_ = function() { |
857 if (loadTimeData.getBoolean('allow_deleting_history')) { | 866 if (loadTimeData.getBoolean('allow_deleting_history')) |
858 chrome.send('remove', [this.id_.toString()]); | 867 chrome.send('remove', [this.id_]); |
859 } | |
860 return false; | 868 return false; |
861 }; | 869 }; |
862 | 870 |
863 /** | 871 /** |
864 * Tells the backend to cancel this download. | 872 * Tells the backend to cancel this download. |
865 * @return {boolean} Returns false to prevent the default action. | 873 * @return {boolean} Returns false to prevent the default action. |
866 * @private | 874 * @private |
867 */ | 875 */ |
868 Download.prototype.cancel_ = function() { | 876 Download.prototype.cancel_ = function() { |
869 chrome.send('cancel', [this.id_.toString()]); | 877 chrome.send('cancel', [this.id_]); |
870 return false; | 878 return false; |
871 }; | 879 }; |
872 | 880 |
873 /////////////////////////////////////////////////////////////////////////////// | 881 /////////////////////////////////////////////////////////////////////////////// |
874 // Page: | 882 // Page: |
875 var downloads, resultsTimeout; | 883 var downloads, resultsTimeout; |
876 | 884 |
877 // TODO(benjhayden): Rename Downloads to DownloadManager, downloads to | 885 // TODO(benjhayden): Rename Downloads to DownloadManager, downloads to |
878 // downloadManager or theDownloadManager or DownloadManager.get() to prevent | 886 // downloadManager or theDownloadManager or DownloadManager.get() to prevent |
879 // confusing Downloads with Download. | 887 // confusing Downloads with Download. |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
991 if (Date.now() - start > 50) { | 999 if (Date.now() - start > 50) { |
992 clearTimeout(resultsTimeout); | 1000 clearTimeout(resultsTimeout); |
993 resultsTimeout = setTimeout(tryDownloadUpdatedPeriodically, 5); | 1001 resultsTimeout = setTimeout(tryDownloadUpdatedPeriodically, 5); |
994 break; | 1002 break; |
995 } | 1003 } |
996 } | 1004 } |
997 } | 1005 } |
998 | 1006 |
999 // Add handlers to HTML elements. | 1007 // Add handlers to HTML elements. |
1000 window.addEventListener('DOMContentLoaded', load); | 1008 window.addEventListener('DOMContentLoaded', load); |
OLD | NEW |