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

Unified Diff: webkit/browser/fileapi/copy_or_move_operation_delegate.cc

Issue 18565002: [FileSystem] Add another copy-or-move validation hook for post-write. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix flakey test Created 7 years, 5 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
Index: webkit/browser/fileapi/copy_or_move_operation_delegate.cc
diff --git a/webkit/browser/fileapi/copy_or_move_operation_delegate.cc b/webkit/browser/fileapi/copy_or_move_operation_delegate.cc
index 8b706902b5c84396c675b884a01422d75f638b4b..87467253c801946ee93aae9070631be436e87beb 100644
--- a/webkit/browser/fileapi/copy_or_move_operation_delegate.cc
+++ b/webkit/browser/fileapi/copy_or_move_operation_delegate.cc
@@ -110,12 +110,14 @@ void CopyOrMoveOperationDelegate::DidTryRemoveDestRoot(
// and operation==MOVE case, probably we can just rename the root directory.
// http://crbug.com/172187
StartRecursiveOperation(
- src_root_, base::Bind(&CopyOrMoveOperationDelegate::DidFinishCopy,
- AsWeakPtr(), src_root_, callback_));
+ src_root_, base::Bind(&CopyOrMoveOperationDelegate::DidFinishCopyDir,
+ AsWeakPtr(), src_root_,
+ callback_));
}
-void CopyOrMoveOperationDelegate::CopyOrMoveFile(const URLPair& url_pair,
- const StatusCallback& callback) {
+void CopyOrMoveOperationDelegate::CopyOrMoveFile(
+ const URLPair& url_pair,
+ const StatusCallback& callback) {
// Same filesystem case.
if (same_file_system_) {
if (operation_type_ == OPERATION_MOVE) {
@@ -131,7 +133,7 @@ void CopyOrMoveOperationDelegate::CopyOrMoveFile(const URLPair& url_pair,
// copy_callback which removes the source file if operation_type == MOVE.
StatusCallback copy_callback =
base::Bind(&CopyOrMoveOperationDelegate::DidFinishCopy, AsWeakPtr(),
- url_pair.src, callback);
+ url_pair, callback);
operation_runner()->CreateSnapshotFile(
url_pair.src,
base::Bind(&CopyOrMoveOperationDelegate::DidCreateSnapshot, AsWeakPtr(),
@@ -169,7 +171,7 @@ void CopyOrMoveOperationDelegate::DidCreateSnapshot(
validator_.reset(
factory->CreateCopyOrMoveFileValidator(url_pair.src, platform_path));
- validator_->StartValidation(
+ validator_->StartPreWriteValidation(
base::Bind(&CopyOrMoveOperationDelegate::DidValidateFile, AsWeakPtr(),
url_pair.dest, callback, file_info, platform_path));
}
@@ -188,7 +190,7 @@ void CopyOrMoveOperationDelegate::DidValidateFile(
operation_runner()->CopyInForeignFile(platform_path, dest, callback);
}
-void CopyOrMoveOperationDelegate::DidFinishCopy(
+void CopyOrMoveOperationDelegate::DidFinishCopyDir(
const FileSystemURL& src,
const StatusCallback& callback,
base::PlatformFileError error) {
@@ -198,7 +200,7 @@ void CopyOrMoveOperationDelegate::DidFinishCopy(
return;
}
- DCHECK_EQ(OPERATION_MOVE, operation_type_);
+ DCHECK_EQ(operation_type_, OPERATION_MOVE);
// Remove the source for finalizing move operation.
operation_runner()->Remove(
@@ -207,6 +209,84 @@ void CopyOrMoveOperationDelegate::DidFinishCopy(
AsWeakPtr(), callback));
}
+void CopyOrMoveOperationDelegate::DidFinishCopy(
+ const URLPair& url_pair,
+ const StatusCallback& callback,
+ base::PlatformFileError error) {
+ if (error != base::PLATFORM_FILE_OK) {
+ callback.Run(error);
+ return;
+ }
+
+ // |validator_| is NULL in the same-filesystem case or when the destination
+ // filesystem does not do validation.
+ if (!validator_.get()) {
+ scoped_refptr<webkit_blob::ShareableFileReference> file_ref;
+ DidPostWriteValidation(url_pair, callback, file_ref,
+ base::PLATFORM_FILE_OK);
+ return;
+ }
+
+ DCHECK(!same_file_system_);
+ operation_runner()->CreateSnapshotFile(
+ url_pair.dest,
+ base::Bind(&CopyOrMoveOperationDelegate::DoPostWriteValidation,
+ AsWeakPtr(), url_pair, callback));
+}
+
+void CopyOrMoveOperationDelegate::DoPostWriteValidation(
+ const URLPair& url_pair,
+ const StatusCallback& callback,
+ base::PlatformFileError error,
+ const base::PlatformFileInfo& file_info,
+ const base::FilePath& platform_path,
+ const scoped_refptr<webkit_blob::ShareableFileReference>& file_ref) {
+ if (error != base::PLATFORM_FILE_OK) {
+ operation_runner()->Remove(
+ url_pair.dest, true,
+ base::Bind(&CopyOrMoveOperationDelegate::DidRemoveDestForError,
+ AsWeakPtr(), error, callback));
+ return;
+ }
+
+ DCHECK(validator_.get());
+ // Note: file_ref passed here to keep the file alive until after
+ // the StartPostWriteValidation operation finishes.
+ validator_->StartPostWriteValidation(
+ platform_path,
+ base::Bind(&CopyOrMoveOperationDelegate::DidPostWriteValidation,
+ AsWeakPtr(), url_pair, callback, file_ref));
+}
+
+// |file_ref| is unused; it is passed here to make sure the reference is
+// alive until after post-write validation is complete.
+void CopyOrMoveOperationDelegate::DidPostWriteValidation(
+ const URLPair& url_pair,
+ const StatusCallback& callback,
+ const scoped_refptr<webkit_blob::ShareableFileReference>& /*file_ref*/,
+ base::PlatformFileError error) {
+ if (error != base::PLATFORM_FILE_OK) {
+ operation_runner()->Remove(
+ url_pair.dest, true,
+ base::Bind(&CopyOrMoveOperationDelegate::DidRemoveDestForError,
+ AsWeakPtr(), error, callback));
+ return;
+ }
+
+ if (operation_type_ == OPERATION_COPY) {
+ callback.Run(error);
+ return;
+ }
+
+ DCHECK_EQ(OPERATION_MOVE, operation_type_);
+
+ // Remove the source for finalizing move operation.
+ operation_runner()->Remove(
+ url_pair.src, true /* recursive */,
+ base::Bind(&CopyOrMoveOperationDelegate::DidRemoveSourceForMove,
+ AsWeakPtr(), callback));
+}
+
void CopyOrMoveOperationDelegate::DidRemoveSourceForMove(
const StatusCallback& callback,
base::PlatformFileError error) {
@@ -229,4 +309,15 @@ FileSystemURL CopyOrMoveOperationDelegate::CreateDestURL(
relative);
}
+void CopyOrMoveOperationDelegate::DidRemoveDestForError(
+ base::PlatformFileError prior_error,
+ const StatusCallback& callback,
+ base::PlatformFileError error) {
+ if (error != base::PLATFORM_FILE_OK) {
+ VLOG(1) << "Error removing destination file after validation error: "
+ << error;
+ }
+ callback.Run(prior_error);
+}
+
} // namespace fileapi

Powered by Google App Engine
This is Rietveld 408576698