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

Side by Side Diff: chrome/browser/resources/file_manager/js/file_copy_manager.js

Issue 22150006: Re-implement cancellation of copyFileEntry_(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 4 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | chrome/browser/resources/file_manager/js/util.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 'use strict'; 5 'use strict';
6 6
7 /** 7 /**
8 * @constructor 8 * @constructor
9 */ 9 */
10 function FileCopyManager() { 10 function FileCopyManager() {
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 this.cancelObservers_ = []; 477 this.cancelObservers_ = [];
478 this.maybeScheduleCloseBackgroundPage_(); 478 this.maybeScheduleCloseBackgroundPage_();
479 }; 479 };
480 480
481 /** 481 /**
482 * Request that the current copy queue be abandoned. 482 * Request that the current copy queue be abandoned.
483 * 483 *
484 * @param {function()=} opt_callback On cancel. 484 * @param {function()=} opt_callback On cancel.
485 */ 485 */
486 FileCopyManager.prototype.requestCancel = function(opt_callback) { 486 FileCopyManager.prototype.requestCancel = function(opt_callback) {
487 this.cancelRequested_ = true; 487 this.cancelRequested_ = true;
mtomasz 2013/08/06 01:39:19 Can we remove this member and just clean the callb
hidehiko 2013/08/06 02:14:55 Added code to clean callback at L489. We cannot re
mtomasz 2013/08/06 02:21:38 sgtm
488 if (this.cancelCallback_) 488 if (this.cancelCallback_)
489 this.cancelCallback_(); 489 this.cancelCallback_();
490 if (opt_callback) 490 if (opt_callback)
491 this.cancelObservers_.push(opt_callback); 491 this.cancelObservers_.push(opt_callback);
492 492
493 // If there is any active task it will eventually call maybeCancel_. 493 // If there is any active task it will eventually call maybeCancel_.
494 // Otherwise call it right now. 494 // Otherwise call it right now.
495 if (this.copyTasks_.length == 0) 495 if (this.copyTasks_.length == 0)
496 this.doCancel_(); 496 this.doCancel_();
497 }; 497 };
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after
882 var isTargetOnDrive = PathUtil.isDriveBasedPath(targetDirEntry.fullPath); 882 var isTargetOnDrive = PathUtil.isDriveBasedPath(targetDirEntry.fullPath);
883 883
884 if (!isSourceOnDrive && !isTargetOnDrive) { 884 if (!isSourceOnDrive && !isTargetOnDrive) {
885 // Sending a file from local to local. 885 // Sending a file from local to local.
886 // To copy local file, we use File blob and FileWriter to take the 886 // To copy local file, we use File blob and FileWriter to take the
887 // progress. 887 // progress.
888 targetDirEntry.getFile( 888 targetDirEntry.getFile(
889 targetRelativePath, 889 targetRelativePath,
890 {create: true, exclusive: true}, 890 {create: true, exclusive: true},
891 function(targetEntry) { 891 function(targetEntry) {
892 self.copyFileEntry_( 892 self.cancelCallback_ = self.copyFileEntry_(
893 sourceEntry, targetEntry, 893 sourceEntry, targetEntry,
894 onCopyProgress, onCopyComplete, onFilesystemError); 894 onCopyProgress,
895 function(entry, size) {
896 self.cancelCallback_ = null;
897 onCopyComplete(entry, size);
898 },
899 function(error) {
900 self.cancelCallback_ = null;
901 onFilesystemError(error);
902 });
895 }, 903 },
896 util.flog('Error getting file: ' + targetRelativePath, 904 util.flog('Error getting file: ' + targetRelativePath,
897 onFilesystemError)); 905 onFilesystemError));
898 return; 906 return;
899 } 907 }
900 908
901 // Sending a file from a) Drive to Drive, b) Drive to local or c) local to 909 // Sending a file from a) Drive to Drive, b) Drive to local or c) local to
902 // Drive. 910 // Drive.
903 var sourceFileUrl = sourceEntry.toURL(); 911 var sourceFileUrl = sourceEntry.toURL();
904 var sourceFilePath = util.extractFilePath(sourceFileUrl); 912 var sourceFilePath = util.extractFilePath(sourceFileUrl);
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
984 * copied. 992 * copied.
985 * @param {function(FileEntry, number)} progressCallback Function that will be 993 * @param {function(FileEntry, number)} progressCallback Function that will be
986 * called when a part of the source entry is copied. It takes |targetEntry| 994 * called when a part of the source entry is copied. It takes |targetEntry|
987 * and size of the last copied chunk as parameters. 995 * and size of the last copied chunk as parameters.
988 * @param {function(FileEntry, number)} successCallback Function that will be 996 * @param {function(FileEntry, number)} successCallback Function that will be
989 * called the copy operation finishes. It takes |targetEntry| and size of 997 * called the copy operation finishes. It takes |targetEntry| and size of
990 * the last (not previously reported) copied chunk as parameters. 998 * the last (not previously reported) copied chunk as parameters.
991 * @param {function(FileError)} errorCallback Function that will be called 999 * @param {function(FileError)} errorCallback Function that will be called
992 * if an error is encountered. Takes error type and additional error data 1000 * if an error is encountered. Takes error type and additional error data
993 * as parameters. 1001 * as parameters.
1002 * @return {function()} Callback to cancel the current file copy operation.
1003 * When the cancel is done, errorCallback will be called. The returned
1004 * callback must not be called more than once.
994 * @private 1005 * @private
995 */ 1006 */
996 FileCopyManager.prototype.copyFileEntry_ = function(sourceEntry, 1007 FileCopyManager.prototype.copyFileEntry_ = function(sourceEntry,
997 targetEntry, 1008 targetEntry,
998 progressCallback, 1009 progressCallback,
999 successCallback, 1010 successCallback,
1000 errorCallback) { 1011 errorCallback) {
1001 if (this.maybeCancel_()) 1012 // Set to true when cancel is requested.
1002 return; 1013 var cancelRequested = false;
1003 1014
1004 var self = this; 1015 sourceEntry.file(function(file) {
1016 if (cancelRequested) {
1017 errorCallback(util.createFileError(FileError.ABORT_ERR));
1018 return;
1019 }
1005 1020
1006 var onSourceFileFound = function(file) { 1021 targetEntry.createWriter(function(writer) {
1007 var onWriterCreated = function(writer) { 1022 if (cancelRequested) {
1023 errorCallback(util.createFileError(FileError.ABORT_ERR));
mtomasz 2013/08/06 01:39:19 Can we remove the target file on cancel? It may be
hidehiko 2013/08/06 02:14:55 I want to keep this as is, because, IIRC, many OS
mtomasz 2013/08/06 02:21:38 As far as I remember on Windows the file gets remo
mtomasz 2013/08/06 02:22:29 I meant when downloading a file in Chrome.
1024 return;
1025 }
1026
1008 var reportedProgress = 0; 1027 var reportedProgress = 0;
1009 writer.onerror = function(progress) { 1028 writer.onerror = writer.onabort = function(progress) {
1010 errorCallback(writer.error); 1029 errorCallback(cancelRequested ?
1030 util.createFileError(FileError.ABORT_ERR) :
1031 writer.error);
1011 }; 1032 };
1012 1033
1013 writer.onprogress = function(progress) { 1034 writer.onprogress = function(progress) {
1014 if (self.maybeCancel_()) { 1035 if (cancelRequested) {
1015 // If the copy was cancelled, we should abort the operation. 1036 // If the copy was cancelled, we should abort the operation.
1037 // The errorCallback will be called by writer.onabort after the
1038 // termination.
1016 writer.abort(); 1039 writer.abort();
1017 return; 1040 return;
1018 } 1041 }
1042
1019 // |progress.loaded| will contain total amount of data copied by now. 1043 // |progress.loaded| will contain total amount of data copied by now.
1020 // |progressCallback| expects data amount delta from the last progress 1044 // |progressCallback| expects data amount delta from the last progress
1021 // update. 1045 // update.
1022 progressCallback(targetEntry, progress.loaded - reportedProgress); 1046 progressCallback(targetEntry, progress.loaded - reportedProgress);
1023 reportedProgress = progress.loaded; 1047 reportedProgress = progress.loaded;
1024 }; 1048 };
1025 1049
1026 writer.onwrite = function() { 1050 writer.onwrite = function() {
1051 if (cancelRequested) {
1052 errorCallback(util.createFileError(FileError.ABORT_ERR));
1053 return;
1054 }
1055
1027 sourceEntry.getMetadata(function(metadata) { 1056 sourceEntry.getMetadata(function(metadata) {
1028 chrome.fileBrowserPrivate.setLastModified(targetEntry.toURL(), 1057 if (cancelRequested) {
1058 errorCallback(util.createFileError(FileError.ABORT_ERR));
1059 return;
1060 }
1061
1062 chrome.fileBrowserPrivate.setLastModified(
1063 targetEntry.toURL(),
1029 '' + Math.round(metadata.modificationTime.getTime() / 1000)); 1064 '' + Math.round(metadata.modificationTime.getTime() / 1000));
1030 successCallback(targetEntry, file.size - reportedProgress); 1065 successCallback(targetEntry, file.size - reportedProgress);
1031 }); 1066 });
1032 }; 1067 };
1033 1068
1034 writer.write(file); 1069 writer.write(file);
1035 }; 1070 }, errorCallback);
1071 }, errorCallback);
1036 1072
1037 targetEntry.createWriter(onWriterCreated, errorCallback); 1073 return function() {
1074 cancelRequested = true;
1038 }; 1075 };
1039
1040 sourceEntry.file(onSourceFileFound, errorCallback);
1041 }; 1076 };
1042 1077
1043 /** 1078 /**
1044 * Moves all entries in the task. 1079 * Moves all entries in the task.
1045 * 1080 *
1046 * @param {FileCopyManager.Task} task A move task to be run. 1081 * @param {FileCopyManager.Task} task A move task to be run.
1047 * @param {function(util.EntryChangedType, Entry)} entryChangedCallback Callback 1082 * @param {function(util.EntryChangedType, Entry)} entryChangedCallback Callback
1048 * invoked when an entry is changed. 1083 * invoked when an entry is changed.
1049 * @param {function()} progressCallback Callback invoked periodically during 1084 * @param {function()} progressCallback Callback invoked periodically during
1050 * the moving. 1085 * the moving.
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
1189 if (success) { 1224 if (success) {
1190 task.targetDirEntry.getFile( 1225 task.targetDirEntry.getFile(
1191 destPath, {create: false}, 1226 destPath, {create: false},
1192 function(entry) { 1227 function(entry) {
1193 entryChangedCallback(util.EntryChangedType.CREATE, entry); 1228 entryChangedCallback(util.EntryChangedType.CREATE, entry);
1194 successCallback(); 1229 successCallback();
1195 }, 1230 },
1196 onFilesystemError); 1231 onFilesystemError);
1197 } else { 1232 } else {
1198 onFilesystemError( 1233 onFilesystemError(
1199 Object.create(FileError.prototype, { 1234 util.createFileError(FileError.INVALID_MODIFICATION_ERR));
1200 code: {
1201 get: function() { return FileError.INVALID_MODIFICATION_ERR; }
1202 }
1203 }));
1204 } 1235 }
1205 }; 1236 };
1206 1237
1207 progressCallback(); 1238 progressCallback();
1208 chrome.fileBrowserPrivate.zipSelection(dirURL, selectionURLs, destPath, 1239 chrome.fileBrowserPrivate.zipSelection(dirURL, selectionURLs, destPath,
1209 onZipSelectionComplete); 1240 onZipSelectionComplete);
1210 }; 1241 };
1211 1242
1212 FileCopyManager.Task.deduplicatePath( 1243 FileCopyManager.Task.deduplicatePath(
1213 task.targetDirEntry, destName + '.zip', onDeduplicated, errorCallback); 1244 task.targetDirEntry, destName + '.zip', onDeduplicated, errorCallback);
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
1352 // Assume self.cancelRequested_ == false. 1383 // Assume self.cancelRequested_ == false.
1353 // This moved us from 0 to 1 active tasks, let the servicing begin! 1384 // This moved us from 0 to 1 active tasks, let the servicing begin!
1354 self.serviceAllTasks_(); 1385 self.serviceAllTasks_();
1355 } else { 1386 } else {
1356 // Force to update the progress of butter bar when there are new tasks 1387 // Force to update the progress of butter bar when there are new tasks
1357 // coming while servicing current task. 1388 // coming while servicing current task.
1358 self.eventRouter_.sendProgressEvent('PROGRESS', self.getStatus()); 1389 self.eventRouter_.sendProgressEvent('PROGRESS', self.getStatus());
1359 } 1390 }
1360 }); 1391 });
1361 }; 1392 };
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/resources/file_manager/js/util.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698