blob: 7e472aca40927107209ccebb66c733336de33581 [file] [log] [blame]
// Copyright (c) 2013 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.
/**
* Monitor the downloading progress of a XMLHttpRequest |xhr_| and shows the
* progress on |progressBar_|.
* @constructor
*/
function ProgressManager() {
this.xhr_ = null;
this.progressBar_ = document.querySelector('.progress-bar');
this.selectedGridItem_ = null;
}
/**
* Sets the XMLHttpRequest |xhr| to monitor, and the wallpaper thumbnail grid
* item |selectedGridItem| to show a progress bar for. Cancels previous xhr and
* hides/removes previous progress bar if any.
* Note: this must be called before xhr.send() function. Otherwise, we wont get
* loadstart event.
* @param {XMLHttpRequest} xhr The XMLHttpRequest.
* @param {WallpaperThumbnailsGridItem} selectedGridItem The wallpaper thumbnail
* grid item. It extends from cr.ui.ListItem.
*/
ProgressManager.prototype.reset = function(xhr, selectedGridItem) {
if (this.xhr_)
this.removeEventListeners_();
this.hideProgressBar(this.selectedGridItem_);
this.xhr_ = xhr;
this.selectedGridItem_ = selectedGridItem;
this.xhrListeners_ = {
'loadstart': this.onDownloadStart_.bind(this),
'progress': this.onDownloadProgress_.bind(this),
'abort': this.onDownloadErrorOrAbort_.bind(this),
'error': this.onDownloadErrorOrAbort_.bind(this),
'load': this.onDownloadComplete_.bind(this)
};
for (var eventType in this.xhrListeners_)
this.xhr_.addEventListener(eventType, this.xhrListeners_[eventType]);
};
/**
* Removes all event listeners progress manager currently registered.
* @private
*/
ProgressManager.prototype.removeEventListeners_ = function() {
for (var eventType in this.xhrListeners_)
this.xhr_.removeEventListener(eventType, this.xhrListeners_[eventType]);
};
/**
* Removes the progress bar in |selectedGridItem| if any. May be called
* asynchronously.
* @param {WallpaperThumbnailsGridItem} selectedGridItem The wallpaper thumbnail
grid item. It extends from cr.ui.ListItem.
*/
ProgressManager.prototype.hideProgressBar = function(selectedGridItem) {
if (selectedGridItem && selectedGridItem.querySelector('.progress-bar')) {
this.progressBar_.hidden = true;
selectedGridItem.removeChild(this.progressBar_);
}
};
/**
* Calculates and updates the width of progress track.
* @private
* @param {float} percentComplete The percent of loaded content.
*/
ProgressManager.prototype.setProgress_ = function(percentComplete) {
this.progressBar_.querySelector('.progress-track').style.width =
(percentComplete * 100) + '%';
};
/**
* Shows a 0% progress bar to indicate downloading starts.
* @private
* @param {Event} e A loadstart ProgressEvent from XMLHttpRequest.
*/
ProgressManager.prototype.onDownloadStart_ = function(e) {
this.setProgress_(0);
this.selectedGridItem_.appendChild(this.progressBar_);
this.progressBar_.hidden = false;
};
/**
* Hides progress bar when progression is terminated.
* @private
* @param {Event} e An error/abort ProgressEvent from XMLHttpRequest.
*/
ProgressManager.prototype.onDownloadErrorOrAbort_ = function(e) {
this.removeEventListeners_();
this.xhr_ = null;
this.hideProgressBar(this.selectedGridItem_);
};
/**
* Download completed successfully. Shows a 100% progress bar and clears |xhr_|.
* @private
* @param {Event} e A load ProgressEvent from XMLHttpRequest.
*/
ProgressManager.prototype.onDownloadComplete_ = function(e) {
this.setProgress_(1);
this.removeEventListeners_();
this.xhr_ = null;
};
/**
* Calculates downloading percentage and shows downloading progress.
* @private
* @param {Event} e A progress ProgressEvent from XMLHttpRequest.
*/
ProgressManager.prototype.onDownloadProgress_ = function(e) {
if (e.lengthComputable)
this.setProgress_(e.loaded / e.total);
};