Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 cr.define('downloads', function() { | |
| 6 var ItemView = Polymer({ | |
| 7 is: 'item-view', | |
| 8 | |
| 9 properties: { | |
| 10 dateContainer: { | |
| 11 type: Object, | |
| 12 value: function() { | |
| 13 return this.$['date-container']; | |
|
michaelpg
2015/07/08 19:39:52
I'm not sure this is safe -- is the local DOM guar
Dan Beam
2015/07/09 18:13:45
Done. (in an alternate way)
| |
| 14 }, | |
| 15 }, | |
| 16 }, | |
| 17 | |
| 18 ready: function() { | |
| 19 this.$.safe.ondragstart = this.onSafeDragstart_.bind(this); | |
| 20 this.$['file-link'].onclick = this.onFileLinkClick_.bind(this); | |
| 21 this.$.show.onclick = this.onShowClick_.bind(this); | |
| 22 this.$.pause.onclick = this.onPauseClick_.bind(this); | |
| 23 this.$.resume.onclick = this.onResumeClick_.bind(this); | |
| 24 this.$['safe-remove'].onclick = this.onSafeRemoveClick_.bind(this); | |
| 25 this.$.cancel.onclick = this.onCancelClick_.bind(this); | |
| 26 this.$.restore.onclick = this.onRestoreClick_.bind(this); | |
| 27 this.$.save.onclick = this.onSaveClick_.bind(this); | |
| 28 this.$['dangerous-remove'].onclick = this.onDangerRemoveClick_.bind(this); | |
| 29 this.$.discard.onclick = this.onDiscardClick_.bind(this); | |
| 30 }, | |
| 31 | |
| 32 /** @param {!downloads.Data} data */ | |
| 33 update: function(data) { | |
| 34 assert(!this.id_ || data.id == this.id_); | |
| 35 this.id_ = data.id; // This is the only thing saved from |data|. | |
| 36 | |
| 37 this.classList.toggle('otr', data.otr); | |
| 38 | |
| 39 this.ensureTextIs_(this.$.since, data.since_string); | |
| 40 this.ensureTextIs_(this.$.date, data.date_string); | |
| 41 | |
| 42 var dangerText = this.getDangerText_(data); | |
| 43 this.$.dangerous.hidden = !dangerText; | |
| 44 this.$.safe.hidden = !!dangerText; | |
| 45 | |
| 46 if (dangerText) { | |
| 47 this.ensureTextIs_(this.$.description, dangerText); | |
| 48 | |
| 49 var dangerType = data.danger_type; | |
| 50 var dangerousFile = dangerType == downloads.DangerType.DANGEROUS_FILE; | |
| 51 this.$.description.classList.toggle('malware', !dangerousFile); | |
| 52 | |
| 53 var idr = dangerousFile ? 'IDR_WARNING' : 'IDR_SAFEBROWSING_WARNING'; | |
| 54 downloads.IconLoader.loadScaledIcon(this.$['dangerous-icon'], | |
| 55 'chrome://theme/' + idr); | |
| 56 | |
| 57 /** @const */ var showMalwareControls = | |
| 58 dangerType == downloads.DangerType.DANGEROUS_CONTENT || | |
| 59 dangerType == downloads.DangerType.DANGEROUS_HOST || | |
| 60 dangerType == downloads.DangerType.DANGEROUS_URL || | |
| 61 dangerType == downloads.DangerType.POTENTIALLY_UNWANTED; | |
| 62 | |
| 63 this.$['malware-controls'].hidden = !showMalwareControls; | |
| 64 this.$.discard.hidden = showMalwareControls; | |
| 65 this.$.save.hidden = showMalwareControls; | |
| 66 } else { | |
| 67 var icon = 'chrome://fileicon/' + encodeURIComponent(data.file_path); | |
| 68 downloads.IconLoader.loadScaledIcon(this.$['safe-icon'], icon); | |
| 69 | |
| 70 /** @const */ var isInProgress = | |
| 71 data.state == downloads.States.IN_PROGRESS; | |
| 72 this.classList.toggle('in-progress', isInProgress); | |
| 73 | |
| 74 /** @const */ var completelyOnDisk = | |
| 75 data.state == downloads.States.COMPLETE && | |
| 76 !data.file_externally_removed; | |
| 77 | |
| 78 this.$['file-link'].href = data.url; | |
| 79 this.ensureTextIs_(this.$['file-link'], data.file_name); | |
| 80 this.$['file-link'].hidden = !completelyOnDisk; | |
| 81 | |
| 82 /** @const */ var isInterrupted = | |
| 83 data.state == downloads.States.INTERRUPTED; | |
| 84 this.$.name.classList.toggle('interrupted', isInterrupted); | |
| 85 this.ensureTextIs_(this.$.name, data.file_name); | |
| 86 this.$.name.hidden = completelyOnDisk; | |
| 87 | |
| 88 this.$.show.hidden = !completelyOnDisk; | |
| 89 | |
| 90 this.$.retry.href = data.url; | |
| 91 this.$.retry.hidden = !data.retry; | |
| 92 | |
| 93 this.$.pause.hidden = !isInProgress; | |
| 94 | |
| 95 this.$.resume.hidden = !data.resume; | |
| 96 | |
| 97 /** @const */ var isPaused = data.state == downloads.States.PAUSED; | |
| 98 /** @const */ var showCancel = isPaused || isInProgress; | |
| 99 this.$.cancel.hidden = !showCancel; | |
| 100 | |
| 101 this.$['safe-remove'].hidden = showCancel || | |
| 102 !loadTimeData.getBoolean('allow_deleting_history'); | |
| 103 | |
| 104 /** @const */ var controlledByExtension = data.by_ext_id && | |
| 105 data.by_ext_name; | |
| 106 this.$['controlled-by'].hidden = !controlledByExtension; | |
| 107 if (controlledByExtension) { | |
| 108 var link = this.$['controlled-by'].querySelector('a'); | |
| 109 link.href = 'chrome://extensions#' + data.by_ext_id; | |
| 110 link.setAttribute('column-type', 'controlled-by'); | |
| 111 link.textContent = data.by_ext_name; | |
| 112 } | |
| 113 | |
| 114 this.ensureTextIs_(this.$['src-url'], data.url); | |
| 115 this.$['src-url'].href = data.url; | |
| 116 this.ensureTextIs_(this.$.status, this.getStatusText_(data)); | |
| 117 | |
| 118 this.$.progress.hidden = !isInProgress; | |
| 119 | |
| 120 // TODO(dbeam): implement progress. | |
| 121 } | |
| 122 }, | |
| 123 | |
| 124 /** | |
| 125 * Overwrite |el|'s textContent if it differs from |text|. | |
| 126 * @param {!Element} el | |
| 127 * @param {string} text | |
| 128 * @private | |
| 129 */ | |
| 130 ensureTextIs_: function(el, text) { | |
| 131 if (el.textContent != text) | |
| 132 el.textContent = text; | |
| 133 }, | |
| 134 | |
| 135 /** | |
| 136 * @param {!downloads.Data} data | |
| 137 * @return {string} Text describing the danger of a download. Empty if not | |
| 138 * dangerous. | |
| 139 */ | |
| 140 getDangerText_: function(data) { | |
| 141 switch (data.danger_type) { | |
| 142 case downloads.DangerType.DANGEROUS_FILE: | |
| 143 return loadTimeData.getStringF('danger_file_desc', data.file_name); | |
| 144 case downloads.DangerType.DANGEROUS_URL: | |
| 145 return loadTimeData.getString('danger_url_desc'); | |
| 146 case downloads.DangerType.DANGEROUS_CONTENT: // Fall through. | |
| 147 case downloads.DangerType.DANGEROUS_HOST: | |
| 148 return loadTimeData.getStringF('danger_content_desc', data.file_name); | |
| 149 case downloads.DangerType.UNCOMMON_CONTENT: | |
| 150 return loadTimeData.getStringF('danger_uncommon_desc', | |
| 151 data.file_name); | |
| 152 case downloads.DangerType.POTENTIALLY_UNWANTED: | |
| 153 return loadTimeData.getStringF('danger_settings_desc', | |
| 154 data.file_name); | |
| 155 default: | |
| 156 return ''; | |
| 157 } | |
| 158 }, | |
| 159 | |
| 160 /** | |
| 161 * @param {!downloads.Data} data | |
| 162 * @return {string} User-visible status update text. | |
| 163 * @private | |
| 164 */ | |
| 165 getStatusText_: function(data) { | |
| 166 switch (data.state) { | |
| 167 case downloads.States.IN_PROGRESS: | |
| 168 case downloads.States.PAUSED: // Fallthrough. | |
| 169 assert(typeof data.progress_status_text == 'string'); | |
| 170 return data.progress_status_text; | |
| 171 case downloads.States.CANCELLED: | |
| 172 return loadTimeData.getString('status_cancelled'); | |
| 173 case downloads.States.DANGEROUS: | |
| 174 break; // Intentionally hit assertNotReached(); at bottom. | |
| 175 case downloads.States.INTERRUPTED: | |
| 176 assert(typeof data.last_reason_text == 'string'); | |
| 177 return data.last_reason_text; | |
| 178 case downloads.States.COMPLETE: | |
| 179 return data.file_externally_removed ? | |
| 180 loadTimeData.getString('status_removed') : ''; | |
| 181 } | |
| 182 assertNotReached(); | |
| 183 return ''; | |
| 184 }, | |
| 185 | |
| 186 /** | |
| 187 * @private | |
| 188 * @param {Event} e | |
| 189 */ | |
| 190 onSafeDragstart_: function(e) { | |
| 191 e.preventDefault(); | |
| 192 chrome.send('drag', [this.id_]); | |
| 193 }, | |
| 194 | |
| 195 /** | |
| 196 * @param {Event} e | |
| 197 * @private | |
| 198 */ | |
| 199 onFileLinkClick_: function(e) { | |
| 200 e.preventDefault(); | |
| 201 chrome.send('openFile', [this.id_]); | |
| 202 }, | |
| 203 | |
| 204 /** @private */ | |
| 205 onShowClick_: function() { | |
| 206 chrome.send('show', [this.id_]); | |
| 207 }, | |
| 208 | |
| 209 /** @private */ | |
| 210 onPauseClick_: function() { | |
| 211 chrome.send('pause', [this.id_]); | |
| 212 }, | |
| 213 | |
| 214 /** @private */ | |
| 215 onResumeClick_: function() { | |
| 216 chrome.send('resume', [this.id_]); | |
| 217 }, | |
| 218 | |
| 219 /** @private */ | |
| 220 onSafeRemoveClick_: function() { | |
| 221 chrome.send('remove', [this.id_]); | |
| 222 }, | |
| 223 | |
| 224 /** @private */ | |
| 225 onCancelClick_: function() { | |
| 226 chrome.send('cancel', [this.id_]); | |
| 227 }, | |
| 228 | |
| 229 /** @private */ | |
| 230 onRestoreClick_: function() { | |
| 231 this.onSaveClick_(); | |
| 232 }, | |
| 233 | |
| 234 /** @private */ | |
| 235 onSaveClick_: function() { | |
| 236 chrome.send('saveDangerous', [this.id_]); | |
| 237 }, | |
| 238 | |
| 239 /** @private */ | |
| 240 onDangerRemoveClick_: function() { | |
| 241 this.onDiscardClick_(); | |
| 242 }, | |
| 243 | |
| 244 /** @private */ | |
| 245 onDiscardClick_: function() { | |
| 246 chrome.send('discardDangerous', [this.id_]); | |
| 247 }, | |
| 248 }); | |
| 249 | |
| 250 return {ItemView: ItemView}; | |
| 251 }); | |
| OLD | NEW |