OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2013 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 /** |
| 6 * Monitor the downloading progress of a XMLHttpRequest |xhr_| and shows the |
| 7 * progress on |progressBar_|. |
| 8 * @constructor |
| 9 */ |
| 10 function ProgressManager() { |
| 11 this.xhr_ = null; |
| 12 this.progressBar_ = document.querySelector('.progress-bar'); |
| 13 this.selectedGridItem_ = null; |
| 14 } |
| 15 |
| 16 /** |
| 17 * Sets the XMLHttpRequest |xhr| to monitor, and the wallpaper thumbnail grid |
| 18 * item |selectedGridItem| to show a progress bar for. Cancels previous xhr and |
| 19 * hides/removes previous progress bar if any. |
| 20 * Note: this must be called before xhr.send() function. Otherwise, we wont get |
| 21 * loadstart event. |
| 22 * @param {XMLHttpRequest} xhr The XMLHttpRequest. |
| 23 * @param {WallpaperThumbnailsGridItem} selectedGridItem The wallpaper thumbnail |
| 24 * grid item. It extends from cr.ui.ListItem. |
| 25 */ |
| 26 ProgressManager.prototype.reset = function(xhr, selectedGridItem) { |
| 27 if (this.xhr_) |
| 28 this.removeEventListeners_(); |
| 29 this.hideProgressBar(this.selectedGridItem_); |
| 30 this.xhr_ = xhr; |
| 31 this.selectedGridItem_ = selectedGridItem; |
| 32 this.xhrListeners_ = { |
| 33 'loadstart': this.onDownloadStart_.bind(this), |
| 34 'progress': this.onDownloadProgress_.bind(this), |
| 35 'abort': this.onDownloadAbort_.bind(this), |
| 36 'error': this.onDownloadError_.bind(this), |
| 37 'load': this.onDownloadComplete_.bind(this) |
| 38 }; |
| 39 for (var eventType in this.xhrListeners_) |
| 40 this.xhr_.addEventListener(eventType, this.xhrListeners_[eventType]); |
| 41 }; |
| 42 |
| 43 /** |
| 44 * Removes all event listeners progress manager currently registered. |
| 45 * @private |
| 46 */ |
| 47 ProgressManager.prototype.removeEventListeners_ = function() { |
| 48 for (var eventType in this.xhrListeners_) |
| 49 this.xhr_.removeEventListener(eventType, this.xhrListeners_[eventType]); |
| 50 }; |
| 51 |
| 52 /** |
| 53 * Removes the progress bar in |selectedGridItem| if any. May be called |
| 54 * asynchronously. |
| 55 * @param {WallpaperThumbnailsGridItem} selectedGridItem The wallpaper thumbnail |
| 56 grid item. It extends from cr.ui.ListItem. |
| 57 */ |
| 58 ProgressManager.prototype.hideProgressBar = function(selectedGridItem) { |
| 59 if (selectedGridItem && selectedGridItem.querySelector('.progress-bar')) { |
| 60 this.progressBar_.hidden = true; |
| 61 selectedGridItem.removeChild(this.progressBar_); |
| 62 } |
| 63 }; |
| 64 |
| 65 /** |
| 66 * Calculates and updates the width of progress track. |
| 67 * @private |
| 68 * @param {float} percentComplete The percent of loaded content. |
| 69 */ |
| 70 ProgressManager.prototype.setProgress_ = function(percentComplete) { |
| 71 this.progressBar_.querySelector('.progress-track').style.width = |
| 72 (percentComplete * 100) + '%'; |
| 73 }; |
| 74 |
| 75 /** |
| 76 * Shows a 0% progress bar to indicate downloading starts. |
| 77 * @private |
| 78 * @param {Event} e A loadstart ProgressEvent from XMLHttpRequest. |
| 79 */ |
| 80 ProgressManager.prototype.onDownloadStart_ = function(e) { |
| 81 this.setProgress_(0); |
| 82 this.selectedGridItem_.appendChild(this.progressBar_); |
| 83 this.progressBar_.hidden = false; |
| 84 }; |
| 85 |
| 86 /** |
| 87 * Hides progress bar when progression is terminated. |
| 88 * @private |
| 89 * @param {Event} e An abort ProgressEvent from XMLHttpRequest. |
| 90 */ |
| 91 ProgressManager.prototype.onDownloadAbort_ = function(e) { |
| 92 this.removeEventListeners_(); |
| 93 this.xhr_ = null; |
| 94 this.hideProgressBar(this.selectedGridItem_); |
| 95 }; |
| 96 |
| 97 /** |
| 98 * Download completed successfully. Shows a 100% progress bar and clears |xhr_|. |
| 99 * @private |
| 100 * @param {Event} e A load ProgressEvent from XMLHttpRequest. |
| 101 */ |
| 102 ProgressManager.prototype.onDownloadComplete_ = function(e) { |
| 103 this.setProgress_(1); |
| 104 this.removeEventListeners_(); |
| 105 this.xhr_ = null; |
| 106 }; |
| 107 |
| 108 /** |
| 109 * Shows error message when progression failed. |
| 110 * @private |
| 111 * @param {Event} e An error ProgressEvent from XMLHttpRequest. |
| 112 */ |
| 113 ProgressManager.prototype.onDownloadError_ = function(e) { |
| 114 this.removeEventListeners_(); |
| 115 // TODO(bshe): Add error message back once we decide how to show error |
| 116 // message in the new UI. http://crbug.com/162563 |
| 117 this.xhr_ = null; |
| 118 this.hideProgressBar(this.selectedGridItem_); |
| 119 }; |
| 120 |
| 121 /** |
| 122 * Calculates downloading percentage and shows downloading progress. |
| 123 * @private |
| 124 * @param {Event} e A progress ProgressEvent from XMLHttpRequest. |
| 125 */ |
| 126 ProgressManager.prototype.onDownloadProgress_ = function(e) { |
| 127 if (e.lengthComputable) |
| 128 this.setProgress_(e.loaded / e.total); |
| 129 }; |
OLD | NEW |