diff options
author | mtomasz@chromium.org <mtomasz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-19 15:09:11 +0000 |
---|---|---|
committer | mtomasz@chromium.org <mtomasz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-19 15:09:11 +0000 |
commit | 3d51f8cd483d788a7c290164d68673a1330ec099 (patch) | |
tree | 2a2f6af9f81f95c170edef3b8f84aabe07f0744f | |
parent | aa8328fb543ae6ce61522735586cfdd3349a49b4 (diff) | |
download | chromium_src-3d51f8cd483d788a7c290164d68673a1330ec099.zip chromium_src-3d51f8cd483d788a7c290164d68673a1330ec099.tar.gz chromium_src-3d51f8cd483d788a7c290164d68673a1330ec099.tar.bz2 |
Fix Javascript errors occuring when a file is deleted during calculating it's size.
These errors occur when deleting very quickly, just after selecting a file. Such situation happens especially in tests. Along the way fixed the cancellation code.
TEST=Run browser_tests --test_filter="*FileManagerBrowser*Delete*"
BUG=233460
Review URL: https://codereview.chromium.org/14367009
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@195203 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/resources/file_manager/js/file_selection.js | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/chrome/browser/resources/file_manager/js/file_selection.js b/chrome/browser/resources/file_manager/js/file_selection.js index 0e439f2..ddd399e 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_++; }; /** |