Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(26)

Unified Diff: chrome/browser/resources/file_manager/js/file_selection.js

Issue 14367009: Fix Javascript errors occuring when a file is deleted during calculating it's size. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed comments. Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/browser/resources/file_manager/js/test_util.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_++;
};
/**
« no previous file with comments | « no previous file | chrome/browser/resources/file_manager/js/test_util.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698