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

Unified Diff: ui/file_manager/file_manager/background/js/file_operation_util.js

Issue 2949513006: Show number of remaining files when copying directories. (Closed)
Patch Set: Check before decrement numRemainingItems. Created 3 years, 6 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 | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/file_manager/file_manager/background/js/file_operation_util.js
diff --git a/ui/file_manager/file_manager/background/js/file_operation_util.js b/ui/file_manager/file_manager/background/js/file_operation_util.js
index 73bb7268651baf18e607a82adb79fbd255e18461..467cf30b4a2df5ae3f14f4da9936198d665fc891 100644
--- a/ui/file_manager/file_manager/background/js/file_operation_util.js
+++ b/ui/file_manager/file_manager/background/js/file_operation_util.js
@@ -549,6 +549,12 @@ fileOperationUtil.Task = function(
*/
this.processedBytes = 0;
+ /**
+ * Total number of remaining items. Updated periodically.
+ * @type {number}
+ */
+ this.numRemainingItems = this.sourceEntries.length;
+
/**
* Index of the progressing entry in sourceEntries.
* @private {number}
@@ -612,14 +618,14 @@ fileOperationUtil.Task.prototype.run = function(
/**
* Get states of the task.
- * TOOD(hirono): Removes this method and sets a task to progress events.
+ * TODO(hirono): Removes this method and sets a task to progress events.
* @return {Object} Status object.
*/
fileOperationUtil.Task.prototype.getStatus = function() {
var processingEntry = this.sourceEntries[this.processingSourceIndex_];
return {
operationType: this.operationType,
- numRemainingItems: this.sourceEntries.length - this.processingSourceIndex_,
+ numRemainingItems: this.numRemainingItems,
totalBytes: this.totalBytes,
processedBytes: this.processedBytes,
processingEntryName: processingEntry ? processingEntry.name : ''
@@ -645,6 +651,36 @@ fileOperationUtil.Task.prototype.calcProcessedBytes_ = function() {
return bytes;
};
+/**
+ * Obtains the number of remaining items.
+ * @return {number} Number of remaining items.
+ * @private
+ */
+fileOperationUtil.Task.prototype.calcNumRemainingItems_ = function() {
+ var numRemainingItems = 0;
+
+ var resolvedEntryMap;
+ if (this.processingEntries && this.processingEntries.length > 0)
+ resolvedEntryMap = this.processingEntries[this.processingSourceIndex_];
+
+ if (resolvedEntryMap) {
+ for (var key in resolvedEntryMap) {
+ if (resolvedEntryMap.hasOwnProperty(key) &&
+ resolvedEntryMap[key].processedBytes === 0) {
+ numRemainingItems++;
+ }
+ }
+ for (var i = this.processingSourceIndex_ + 1;
+ i < this.processingEntries.length; i++) {
+ numRemainingItems += Object.keys(this.processingEntries[i] || {}).length;
+ }
+ } else {
+ numRemainingItems = this.sourceEntries.length - this.processingSourceIndex_;
+ }
+
+ return numRemainingItems;
+};
+
/**
* Task to copy entries.
*
@@ -794,11 +830,24 @@ fileOperationUtil.CopyTask.prototype.run = function(
if (!processedEntry)
return;
+ var alreadyCompleted =
+ processedEntry.processedBytes === processedEntry.size;
+
// Accumulates newly processed bytes.
var size = opt_size !== undefined ? opt_size : processedEntry.size;
this.processedBytes += size - processedEntry.processedBytes;
processedEntry.processedBytes = size;
+ // updateProgress can be called multiple times for a single file copy, and
+ // it might not be called for a small file.
+ // The following prevents multiple call for a single file to decrement
+ // numRemainingItems multiple times.
+ // For small files, it will be decremented by next calcNumRemainingItems_().
+ if (!alreadyCompleted &&
+ processedEntry.processedBytes === processedEntry.size) {
+ this.numRemainingItems--;
+ }
+
// Updates progress bar in limited frequency so that intervals between
// updates have at least 200ms.
this.updateProgressRateLimiter_.run();
@@ -807,6 +856,8 @@ fileOperationUtil.CopyTask.prototype.run = function(
this.updateProgressRateLimiter_ = new AsyncUtil.RateLimiter(progressCallback);
+ this.numRemainingItems = this.calcNumRemainingItems_();
+
// Number of consecutive errors. Increases while failing and resets to zero
// when one of them succeeds.
var errorCount = 0;
@@ -842,6 +893,7 @@ fileOperationUtil.CopyTask.prototype.run = function(
// Update current source index and processing bytes.
this.processingSourceIndex_ = index + 1;
this.processedBytes = this.calcProcessedBytes_();
+ this.numRemainingItems = this.calcNumRemainingItems_();
errorCount = 0;
callback();
}.bind(this),
@@ -851,6 +903,7 @@ fileOperationUtil.CopyTask.prototype.run = function(
// Update current source index and processing bytes.
this.processingSourceIndex_ = index + 1;
this.processedBytes = this.calcProcessedBytes_();
+ this.numRemainingItems = this.calcNumRemainingItems_();
errorCount++;
lastError = error;
if (errorCount <
@@ -1002,6 +1055,7 @@ fileOperationUtil.MoveTask.prototype.run = function(
// Update current source index.
this.processingSourceIndex_ = index + 1;
this.processedBytes = this.calcProcessedBytes_();
+ this.numRemainingItems = this.calcNumRemainingItems_();
callback();
}.bind(this),
errorCallback);
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698