blob: 00a3716f6a3ac235f0b2dc92244be8615b10c772 [file] [log] [blame]
// 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() {
var Item = Polymer({
is: 'downloads-item',
properties: {
data: {
type: Object,
},
completelyOnDisk_: {
computed: 'computeCompletelyOnDisk_(' +
'data.state, data.file_externally_removed)',
type: Boolean,
value: true,
},
controlledBy_: {
computed: 'computeControlledBy_(data.by_ext_id, data.by_ext_name)',
type: String,
value: '',
},
isActive_: {
computed: 'computeIsActive_(' +
'data.state, data.file_externally_removed)',
type: Boolean,
value: true,
},
isDangerous_: {
computed: 'computeIsDangerous_(data.state)',
type: Boolean,
value: false,
},
isMalware_: {
computed: 'computeIsMalware_(isDangerous_, data.danger_type)',
type: Boolean,
value: false,
},
isInProgress_: {
computed: 'computeIsInProgress_(data.state)',
type: Boolean,
value: false,
},
pauseOrResumeText_: {
computed: 'computePauseOrResumeText_(isInProgress_, data.resume)',
type: String,
},
showCancel_: {
computed: 'computeShowCancel_(data.state)',
type: Boolean,
value: false,
},
showProgress_: {
computed: 'computeShowProgress_(showCancel_, data.percent)',
type: Boolean,
value: false,
},
},
observers: [
// TODO(dbeam): this gets called way more when I observe data.by_ext_id
// and data.by_ext_name directly. Why?
'observeControlledBy_(controlledBy_)',
'observeIsDangerous_(isDangerous_, data)',
],
ready: function() {
this.content = this.$.content;
},
/**
* @param {string} url
* @return {string} A reasonably long URL.
* @private
*/
chopUrl_: function(url) {
return url.slice(0, 300);
},
/** @private */
computeClass_: function() {
var classes = [];
if (this.isActive_)
classes.push('is-active');
if (this.isDangerous_)
classes.push('dangerous');
if (this.showProgress_)
classes.push('show-progress');
return classes.join(' ');
},
/** @private */
computeCompletelyOnDisk_: function() {
return this.data.state == downloads.States.COMPLETE &&
!this.data.file_externally_removed;
},
/** @private */
computeControlledBy_: function() {
if (!this.data.by_ext_id || !this.data.by_ext_name)
return '';
var url = 'chrome://extensions#' + this.data.by_ext_id;
var name = this.data.by_ext_name;
return loadTimeData.getStringF('controlledByUrl', url, HTMLEscape(name));
},
/** @private */
computeDangerIcon_: function() {
return this.isDangerous_ ? 'cr:warning' : '';
},
/** @private */
computeDate_: function() {
assert(typeof this.data.hideDate == 'boolean');
if (this.data.hideDate)
return '';
return assert(this.data.since_string || this.data.date_string);
},
/** @private */
computeDescription_: function() {
var data = this.data;
switch (data.state) {
case downloads.States.DANGEROUS:
var fileName = data.file_name;
switch (data.danger_type) {
case downloads.DangerType.DANGEROUS_FILE:
return loadTimeData.getString('dangerFileDesc');
case downloads.DangerType.DANGEROUS_URL:
case downloads.DangerType.DANGEROUS_CONTENT:
case downloads.DangerType.DANGEROUS_HOST:
return loadTimeData.getString('dangerDownloadDesc');
case downloads.DangerType.UNCOMMON_CONTENT:
return loadTimeData.getString('dangerUncommonDesc');
case downloads.DangerType.POTENTIALLY_UNWANTED:
return loadTimeData.getString('dangerSettingsDesc');
}
break;
case downloads.States.IN_PROGRESS:
case downloads.States.PAUSED: // Fallthrough.
return data.progress_status_text;
}
return '';
},
/** @private */
computeIsActive_: function() {
return this.data.state != downloads.States.CANCELLED &&
this.data.state != downloads.States.INTERRUPTED &&
!this.data.file_externally_removed;
},
/** @private */
computeIsDangerous_: function() {
return this.data.state == downloads.States.DANGEROUS;
},
/** @private */
computeIsInProgress_: function() {
return this.data.state == downloads.States.IN_PROGRESS;
},
/** @private */
computeIsMalware_: function() {
return this.isDangerous_ &&
(this.data.danger_type == downloads.DangerType.DANGEROUS_CONTENT ||
this.data.danger_type == downloads.DangerType.DANGEROUS_HOST ||
this.data.danger_type == downloads.DangerType.DANGEROUS_URL ||
this.data.danger_type == downloads.DangerType.POTENTIALLY_UNWANTED);
},
/** @private */
computePauseOrResumeText_: function() {
if (this.isInProgress_)
return loadTimeData.getString('controlPause');
if (this.data.resume)
return loadTimeData.getString('controlResume');
return '';
},
/** @private */
computeRemoveStyle_: function() {
var canDelete = loadTimeData.getBoolean('allowDeletingHistory');
var hideRemove = this.isDangerous_ || this.showCancel_ || !canDelete;
return hideRemove ? 'visibility: hidden' : '';
},
/** @private */
computeShowCancel_: function() {
return this.data.state == downloads.States.IN_PROGRESS ||
this.data.state == downloads.States.PAUSED;
},
/** @private */
computeShowProgress_: function() {
return this.showCancel_ && this.data.percent >= -1;
},
/** @private */
computeTag_: function() {
switch (this.data.state) {
case downloads.States.CANCELLED:
return loadTimeData.getString('statusCancelled');
case downloads.States.INTERRUPTED:
return this.data.last_reason_text;
case downloads.States.COMPLETE:
return this.data.file_externally_removed ?
loadTimeData.getString('statusRemoved') : '';
}
return '';
},
/** @private */
isIndeterminate_: function() {
return this.data.percent == -1;
},
/** @private */
observeControlledBy_: function() {
this.$['controlled-by'].innerHTML = this.controlledBy_;
},
/** @private */
observeIsDangerous_: function() {
if (!this.data)
return;
if (this.isDangerous_) {
this.$.url.removeAttribute('href');
} else {
this.$.url.href = assert(this.data.url);
var filePath = encodeURIComponent(this.data.file_path);
var scaleFactor = '?scale=' + window.devicePixelRatio + 'x';
this.$['file-icon'].src = 'chrome://fileicon/' + filePath + scaleFactor;
}
},
/** @private */
onCancelTap_: function() {
downloads.ActionService.getInstance().cancel(this.data.id);
},
/** @private */
onDiscardDangerousTap_: function() {
downloads.ActionService.getInstance().discardDangerous(this.data.id);
},
/**
* @private
* @param {Event} e
*/
onDragStart_: function(e) {
e.preventDefault();
downloads.ActionService.getInstance().drag(this.data.id);
},
/**
* @param {Event} e
* @private
*/
onFileLinkTap_: function(e) {
e.preventDefault();
downloads.ActionService.getInstance().openFile(this.data.id);
},
/** @private */
onPauseOrResumeTap_: function() {
if (this.isInProgress_)
downloads.ActionService.getInstance().pause(this.data.id);
else
downloads.ActionService.getInstance().resume(this.data.id);
},
/** @private */
onRemoveTap_: function() {
downloads.ActionService.getInstance().remove(this.data.id);
},
/** @private */
onRetryTap_: function() {
downloads.ActionService.getInstance().download(this.data.url);
},
/** @private */
onSaveDangerousTap_: function() {
downloads.ActionService.getInstance().saveDangerous(this.data.id);
},
/** @private */
onShowTap_: function() {
downloads.ActionService.getInstance().show(this.data.id);
},
});
return {Item: Item};
});