summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormtomasz@chromium.org <mtomasz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-19 15:09:11 +0000
committermtomasz@chromium.org <mtomasz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-19 15:09:11 +0000
commit3d51f8cd483d788a7c290164d68673a1330ec099 (patch)
tree2a2f6af9f81f95c170edef3b8f84aabe07f0744f
parentaa8328fb543ae6ce61522735586cfdd3349a49b4 (diff)
downloadchromium_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.js30
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_++;
};
/**