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

Side by Side 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: Manage file_ref in calling code, remove from API. 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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 #include "webkit/browser/fileapi/copy_or_move_operation_delegate.h" 5 #include "webkit/browser/fileapi/copy_or_move_operation_delegate.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/files/file_path.h" 8 #include "base/files/file_path.h"
9 #include "webkit/browser/fileapi/copy_or_move_file_validator.h" 9 #include "webkit/browser/fileapi/copy_or_move_file_validator.h"
10 #include "webkit/browser/fileapi/file_system_context.h" 10 #include "webkit/browser/fileapi/file_system_context.h"
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 error != base::PLATFORM_FILE_ERROR_NOT_FOUND) { 103 error != base::PLATFORM_FILE_ERROR_NOT_FOUND) {
104 callback_.Run(error); 104 callback_.Run(error);
105 return; 105 return;
106 } 106 }
107 107
108 // Start to process the source directory recursively. 108 // Start to process the source directory recursively.
109 // TODO(kinuko): This could be too expensive for same_file_system_==true 109 // TODO(kinuko): This could be too expensive for same_file_system_==true
110 // and operation==MOVE case, probably we can just rename the root directory. 110 // and operation==MOVE case, probably we can just rename the root directory.
111 // http://crbug.com/172187 111 // http://crbug.com/172187
112 StartRecursiveOperation( 112 StartRecursiveOperation(
113 src_root_, base::Bind(&CopyOrMoveOperationDelegate::DidFinishCopy, 113 src_root_, base::Bind(&CopyOrMoveOperationDelegate::DidFinishCopy,
kinuko 2013/07/12 05:00:19 I overlooked this in my previous review, but when
Greg Billock 2013/07/12 18:02:19 OK. I'll add a directory-specific handler for this
vandebo (ex-Chrome) 2013/07/12 18:51:48 Probably want a complementary test that fails veri
Greg Billock 2013/07/12 20:36:46 validation is per-file at present, so you'd expect
vandebo (ex-Chrome) 2013/07/12 21:06:58 We only get one result code, so do you say it work
Greg Billock 2013/07/12 22:06:32 Yeah, the test shows this: it deletes the entire d
114 AsWeakPtr(), src_root_, callback_)); 114 AsWeakPtr(), URLPair(src_root_, dest_root_),
115 callback_));
115 } 116 }
116 117
117 void CopyOrMoveOperationDelegate::CopyOrMoveFile(const URLPair& url_pair, 118 void CopyOrMoveOperationDelegate::CopyOrMoveFile(const URLPair& url_pair,
118 const StatusCallback& callback) { 119 const StatusCallback& callback) {
119 // Same filesystem case. 120 // Same filesystem case.
120 if (same_file_system_) { 121 if (same_file_system_) {
121 if (operation_type_ == OPERATION_MOVE) { 122 if (operation_type_ == OPERATION_MOVE) {
122 operation_runner()->MoveFileLocal(url_pair.src, url_pair.dest, callback); 123 operation_runner()->MoveFileLocal(url_pair.src, url_pair.dest, callback);
123 } else { 124 } else {
124 operation_runner()->CopyFileLocal(url_pair.src, url_pair.dest, callback); 125 operation_runner()->CopyFileLocal(url_pair.src, url_pair.dest, callback);
125 } 126 }
126 return; 127 return;
127 } 128 }
128 129
129 // Cross filesystem case. 130 // Cross filesystem case.
130 // Perform CreateSnapshotFile, CopyInForeignFile and then calls 131 // Perform CreateSnapshotFile, CopyInForeignFile and then calls
131 // copy_callback which removes the source file if operation_type == MOVE. 132 // copy_callback which removes the source file if operation_type == MOVE.
132 StatusCallback copy_callback = 133 StatusCallback copy_callback =
133 base::Bind(&CopyOrMoveOperationDelegate::DidFinishCopy, AsWeakPtr(), 134 base::Bind(&CopyOrMoveOperationDelegate::DidFinishCopy, AsWeakPtr(),
134 url_pair.src, callback); 135 url_pair, callback);
135 operation_runner()->CreateSnapshotFile( 136 operation_runner()->CreateSnapshotFile(
136 url_pair.src, 137 url_pair.src,
137 base::Bind(&CopyOrMoveOperationDelegate::DidCreateSnapshot, AsWeakPtr(), 138 base::Bind(&CopyOrMoveOperationDelegate::DidCreateSnapshot, AsWeakPtr(),
138 url_pair, copy_callback)); 139 url_pair, copy_callback));
139 } 140 }
140 141
141 void CopyOrMoveOperationDelegate::DidCreateSnapshot( 142 void CopyOrMoveOperationDelegate::DidCreateSnapshot(
142 const URLPair& url_pair, 143 const URLPair& url_pair,
143 const StatusCallback& callback, 144 const StatusCallback& callback,
144 base::PlatformFileError error, 145 base::PlatformFileError error,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 base::PlatformFileError error) { 183 base::PlatformFileError error) {
183 if (error != base::PLATFORM_FILE_OK) { 184 if (error != base::PLATFORM_FILE_OK) {
184 callback.Run(error); 185 callback.Run(error);
185 return; 186 return;
186 } 187 }
187 188
188 operation_runner()->CopyInForeignFile(platform_path, dest, callback); 189 operation_runner()->CopyInForeignFile(platform_path, dest, callback);
189 } 190 }
190 191
191 void CopyOrMoveOperationDelegate::DidFinishCopy( 192 void CopyOrMoveOperationDelegate::DidFinishCopy(
192 const FileSystemURL& src, 193 const URLPair& url_pair,
193 const StatusCallback& callback, 194 const StatusCallback& callback,
194 base::PlatformFileError error) { 195 base::PlatformFileError error) {
195 if (error != base::PLATFORM_FILE_OK || 196 if (error != base::PLATFORM_FILE_OK) {
196 operation_type_ == OPERATION_COPY) {
197 callback.Run(error); 197 callback.Run(error);
198 return; 198 return;
199 } 199 }
200
201 // |validator_| must not exist in the same-filesystem case.
202 if (!validator_.get()) {
203 scoped_refptr<webkit_blob::ShareableFileReference> file_ref;
204 DidPostWriteValidation(url_pair, callback, file_ref,
205 base::PLATFORM_FILE_OK);
206 return;
207 }
208
209 DCHECK(!same_file_system_);
210 operation_runner()->CreateSnapshotFile(
211 url_pair.dest,
212 base::Bind(&CopyOrMoveOperationDelegate::DoPostWriteValidation,
213 AsWeakPtr(), url_pair, callback));
214 }
215
216 void CopyOrMoveOperationDelegate::DoPostWriteValidation(
217 const URLPair& url_pair,
218 const StatusCallback& callback,
219 base::PlatformFileError error,
220 const base::PlatformFileInfo& file_info,
221 const base::FilePath& platform_path,
222 const scoped_refptr<webkit_blob::ShareableFileReference>& file_ref) {
223 if (error != base::PLATFORM_FILE_OK) {
224 operation_runner()->Remove(
225 url_pair.dest, true,
226 base::Bind(&CopyOrMoveOperationDelegate::DidRemoveDestForError,
227 AsWeakPtr(), error, callback));
228 return;
229 }
230
231 DCHECK(validator_.get());
232 validator_->StartPostWriteValidation(
vandebo (ex-Chrome) 2013/07/12 15:08:15 Probably should add a comment about keeping file_r
Greg Billock 2013/07/12 18:02:19 Done.
233 platform_path,
234 base::Bind(&CopyOrMoveOperationDelegate::DidPostWriteValidation,
235 AsWeakPtr(), url_pair, callback, file_ref));
236 }
237
238 void CopyOrMoveOperationDelegate::DidPostWriteValidation(
239 const URLPair& url_pair,
240 const StatusCallback& callback,
241 const scoped_refptr<webkit_blob::ShareableFileReference>& file_ref,
vandebo (ex-Chrome) 2013/07/12 15:08:15 nit: file_ref isn't used in this context, so /*fil
Greg Billock 2013/07/12 18:02:19 Done.
242 base::PlatformFileError error) {
243 if (error != base::PLATFORM_FILE_OK) {
244 operation_runner()->Remove(
245 url_pair.dest, true,
246 base::Bind(&CopyOrMoveOperationDelegate::DidRemoveDestForError,
247 AsWeakPtr(), error, callback));
248 return;
249 }
250
251 if (operation_type_ == OPERATION_COPY) {
252 callback.Run(error);
253 return;
254 }
200 255
201 DCHECK_EQ(OPERATION_MOVE, operation_type_); 256 DCHECK_EQ(OPERATION_MOVE, operation_type_);
202 257
203 // Remove the source for finalizing move operation. 258 // Remove the source for finalizing move operation.
204 operation_runner()->Remove( 259 operation_runner()->Remove(
205 src, true /* recursive */, 260 url_pair.src, true /* recursive */,
206 base::Bind(&CopyOrMoveOperationDelegate::DidRemoveSourceForMove, 261 base::Bind(&CopyOrMoveOperationDelegate::DidRemoveSourceForMove,
207 AsWeakPtr(), callback)); 262 AsWeakPtr(), callback));
208 } 263 }
209 264
210 void CopyOrMoveOperationDelegate::DidRemoveSourceForMove( 265 void CopyOrMoveOperationDelegate::DidRemoveSourceForMove(
211 const StatusCallback& callback, 266 const StatusCallback& callback,
212 base::PlatformFileError error) { 267 base::PlatformFileError error) {
213 if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND) 268 if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND)
214 error = base::PLATFORM_FILE_OK; 269 error = base::PLATFORM_FILE_OK;
215 callback.Run(error); 270 callback.Run(error);
216 } 271 }
217 272
218 FileSystemURL CopyOrMoveOperationDelegate::CreateDestURL( 273 FileSystemURL CopyOrMoveOperationDelegate::CreateDestURL(
219 const FileSystemURL& src_url) const { 274 const FileSystemURL& src_url) const {
220 DCHECK_EQ(src_root_.type(), src_url.type()); 275 DCHECK_EQ(src_root_.type(), src_url.type());
221 DCHECK_EQ(src_root_.origin(), src_url.origin()); 276 DCHECK_EQ(src_root_.origin(), src_url.origin());
222 277
223 base::FilePath relative = dest_root_.virtual_path(); 278 base::FilePath relative = dest_root_.virtual_path();
224 src_root_.virtual_path().AppendRelativePath(src_url.virtual_path(), 279 src_root_.virtual_path().AppendRelativePath(src_url.virtual_path(),
225 &relative); 280 &relative);
226 return file_system_context()->CreateCrackedFileSystemURL( 281 return file_system_context()->CreateCrackedFileSystemURL(
227 dest_root_.origin(), 282 dest_root_.origin(),
228 dest_root_.mount_type(), 283 dest_root_.mount_type(),
229 relative); 284 relative);
230 } 285 }
231 286
287 void CopyOrMoveOperationDelegate::DidRemoveDestForError(
288 base::PlatformFileError prior_error,
289 const StatusCallback& callback,
290 base::PlatformFileError error) {
291 callback.Run(prior_error);
vandebo (ex-Chrome) 2013/07/12 15:08:15 nit: VLOG if error != OK ?
Greg Billock 2013/07/12 18:02:19 Done.
292 }
293
232 } // namespace fileapi 294 } // namespace fileapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698