14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file.
44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)'use strict';
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Event of the ProgressCenter class.
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @enum {string}
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @const
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)var ProgressCenterEvent = Object.freeze({
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /**
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * Background page notifies item update to application windows.
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   */
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ITEM_UPDATED: 'itemUpdated',
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /**
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * Background page notifies all the items are cleared.
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   */
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RESET: 'reset'
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)});
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * State of progress items.
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @enum {string}
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @const
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)var ProgressItemState = Object.freeze({
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PROGRESSING: 'progressing',
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  COMPLETED: 'completed',
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ERROR: 'error',
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CANCELED: 'canceled'
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)});
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) * Type of progress items.
380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) * @enum {string}
390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) * @const
400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) */
410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)var ProgressItemType = Object.freeze({
420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // The item is file copy operation.
430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  COPY: 'copy',
440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // The item is file move operation.
450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  MOVE: 'move',
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The item is file delete operation.
470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DELETE: 'delete',
480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // The item is file zip operation.
490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ZIP: 'zip',
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The item is drive sync operation.
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SYNC: 'sync',
520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // The item is general file transfer operation.
530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // This is used for the mixed operation of summarized item.
540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  TRANSFER: 'transfer'
550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)});
560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)/**
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Item of the progress center.
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @constructor
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)var ProgressCenterItem = function() {
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /**
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * Item ID.
648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)   * @type {string}
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * @private
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   */
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.id_ = null;
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /**
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * State of the progress item.
714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * @type {ProgressItemState}
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   */
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.state = ProgressItemState.PROGRESSING;
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /**
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * Message of the progress item.
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * @type {string}
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   */
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.message = '';
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /**
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * Max value of the progress.
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * @type {number}
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   */
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.progressMax = 0;
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /**
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * Current value of the progress.
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * @type {number}
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   */
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.progressValue = 0;
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /**
940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)   * Type of progress item.
950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)   * @type {ProgressItemType}
960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)   */
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  this.type = null;
980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  /**
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Whether the item represents a single item or not.
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * @type {boolean}
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   */
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.single = true;
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * If the property is true, only the message of item shown in the progress
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * center and the notification of the item is created as priority = -1.
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @type {boolean}
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  this.quiet = false;
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /**
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * Callback function to cancel the item.
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * @type {function()}
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   */
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  this.cancelCallback = null;
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // This object is instantiated many time. Object.seal use more memory
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // than Object.preventExtensions (crbug.com/412307)
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Object.preventExtensions(this);
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)ProgressCenterItem.prototype = {
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /**
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * Setter of Item ID.
1268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)   * @param {string} value New value of ID.
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   */
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  set id(value) {
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!this.id_)
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      this.id_ = value;
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    else
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      console.error('The ID is already set. (current ID: ' + this.id_ + ')');
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  },
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /**
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * Getter of Item ID.
1378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)   * @return {string} Item ID.
1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   */
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  get id() {
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return this.id_;
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  },
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /**
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   * Gets progress rate in percent.
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   *
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * If the current state is canceled or completed, it always returns 0 or 100
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * respectively.
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   *
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   * @return {number} Progress rate in percent.
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   */
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  get progressRateInPercent() {
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    switch (this.state) {
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ProgressItemState.CANCELED: return 0;
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ProgressItemState.COMPLETED: return 100;
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      default: return ~~(100 * this.progressValue / this.progressMax);
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  },
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /**
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * Whether the item can be canceled or not.
1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   * @return {boolean} True if the item can be canceled.
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   */
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  get cancelable() {
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return !!(this.state == ProgressItemState.PROGRESSING &&
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              this.cancelCallback &&
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              this.single);
1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/**
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Clones the item.
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @return {ProgressCenterItem} New item having the same properties with this.
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ProgressCenterItem.prototype.clone = function() {
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  var newItem = new ProgressCenterItem();
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  newItem.id = this.id;
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  newItem.state = this.state;
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  newItem.message = this.message;
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  newItem.progressMax = this.progressMax;
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  newItem.progressValue = this.progressValue;
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  newItem.type = this.type;
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  newItem.single = this.single;
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  newItem.quiet = this.quiet;
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  newItem.cancelCallback = this.cancelCallback;
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return newItem;
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
187