| Index: chrome/browser/resources/file_manager/js/file_selection.js
|
| diff --git a/chrome/browser/resources/file_manager/js/file_selection.js b/chrome/browser/resources/file_manager/js/file_selection.js
|
| index 0e439f2a070a8e162d0a968ad7d3919a5f8f618a..ddd399e42c6cb62379d061073c5f683802bdba6e 100644
|
| --- a/chrome/browser/resources/file_manager/js/file_selection.js
|
| +++ b/chrome/browser/resources/file_manager/js/file_selection.js
|
| @@ -13,6 +13,7 @@
|
| */
|
| function FileSelection(fileManager, indexes) {
|
| this.fileManager_ = fileManager;
|
| + this.computeBytesSequence_ = 0;
|
| this.indexes = indexes;
|
| this.entries = [];
|
| this.urls = [];
|
| @@ -23,7 +24,6 @@ function FileSelection(fileManager, indexes) {
|
| this.showBytes = false;
|
| this.allDriveFilesPresent = false,
|
| this.iconType = null;
|
| - this.cancelled_ = false;
|
| this.bytesKnown = false;
|
|
|
| // Synchronously compute what we can.
|
| @@ -83,7 +83,8 @@ FileSelection.prototype.createTasks = function(callback) {
|
| /**
|
| * Computes the total size of selected files.
|
| *
|
| - * @param {function} callback The callback.
|
| + * @param {function} callback Completion callback. Not called when cancelled,
|
| + * or a new call has been invoked in the meantime.
|
| */
|
| FileSelection.prototype.computeBytes = function(callback) {
|
| if (this.entries.length == 0) {
|
| @@ -92,26 +93,30 @@ FileSelection.prototype.computeBytes = function(callback) {
|
| return;
|
| }
|
|
|
| - var countdown = this.entries.length;
|
| + var computeBytesSequence = ++this.computeBytesSequence_;
|
| var pendingMetadataCount = 0;
|
|
|
| var maybeDone = function() {
|
| - if (countdown == 0 && pendingMetadataCount == 0 && !this.cancelled_) {
|
| + if (pendingMetadataCount == 0) {
|
| this.bytesKnown = true;
|
| callback();
|
| }
|
| }.bind(this);
|
|
|
| - var onProps = function(filesystem) {
|
| - this.bytes += filesystem.size;
|
| + var onProps = function(properties) {
|
| + // Ignore if the call got cancelled, or there is another new one fired.
|
| + if (computeBytesSequence != this.computeBytesSequence_)
|
| + return;
|
| +
|
| + // It may happen that the metadata is not available because a file has been
|
| + // deleted in the meantime.
|
| + if (properties)
|
| + this.bytes += properties.size;
|
| pendingMetadataCount--;
|
| maybeDone();
|
| }.bind(this);
|
|
|
| for (var index = 0; index < this.entries.length; index++) {
|
| - if (this.cancelled_)
|
| - break;
|
| -
|
| var entry = this.entries[index];
|
| if (entry.isFile) {
|
| this.showBytes |= !FileType.isHosted(entry);
|
| @@ -121,21 +126,20 @@ FileSelection.prototype.computeBytes = function(callback) {
|
| // Don't compute the directory size as it's expensive.
|
| // crbug.com/179073.
|
| this.showBytes = false;
|
| - countdown = 0;
|
| break;
|
| }
|
| - countdown--;
|
| }
|
| maybeDone();
|
| };
|
|
|
| /**
|
| - * Cancels any async computation.
|
| + * Cancels any async computation by increasing the sequence number. Results
|
| + * of any previous call to computeBytes() will be discarded.
|
| *
|
| * @private
|
| */
|
| FileSelection.prototype.cancelComputing_ = function() {
|
| - this.cancelled_ = true;
|
| + this.computeBytesSequence_++;
|
| };
|
|
|
| /**
|
|
|