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

Side by Side Diff: webkit/fileapi/local_file_system_operation.cc

Issue 12018017: FileAPI: Split recursive remove into multiple async tasks (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase + addressed comment #2 Created 7 years, 11 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) 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 #include "webkit/fileapi/local_file_system_operation.h" 5 #include "webkit/fileapi/local_file_system_operation.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/single_thread_task_runner.h" 8 #include "base/single_thread_task_runner.h"
9 #include "base/time.h" 9 #include "base/time.h"
10 #include "base/utf_string_conversions.h" 10 #include "base/utf_string_conversions.h"
11 #include "net/base/escape.h" 11 #include "net/base/escape.h"
12 #include "net/url_request/url_request_context.h" 12 #include "net/url_request/url_request_context.h"
13 #include "webkit/blob/shareable_file_reference.h" 13 #include "webkit/blob/shareable_file_reference.h"
14 #include "webkit/fileapi/file_observers.h" 14 #include "webkit/fileapi/file_observers.h"
15 #include "webkit/fileapi/file_system_context.h" 15 #include "webkit/fileapi/file_system_context.h"
16 #include "webkit/fileapi/file_system_file_util_proxy.h" 16 #include "webkit/fileapi/file_system_file_util_proxy.h"
17 #include "webkit/fileapi/file_system_mount_point_provider.h" 17 #include "webkit/fileapi/file_system_mount_point_provider.h"
18 #include "webkit/fileapi/file_system_task_runners.h" 18 #include "webkit/fileapi/file_system_task_runners.h"
19 #include "webkit/fileapi/file_system_types.h" 19 #include "webkit/fileapi/file_system_types.h"
20 #include "webkit/fileapi/file_system_url.h" 20 #include "webkit/fileapi/file_system_url.h"
21 #include "webkit/fileapi/file_system_util.h" 21 #include "webkit/fileapi/file_system_util.h"
22 #include "webkit/fileapi/file_writer_delegate.h" 22 #include "webkit/fileapi/file_writer_delegate.h"
23 #include "webkit/fileapi/remove_operation_delegate.h"
23 #include "webkit/fileapi/sandbox_file_stream_writer.h" 24 #include "webkit/fileapi/sandbox_file_stream_writer.h"
24 #include "webkit/quota/quota_manager.h" 25 #include "webkit/quota/quota_manager.h"
25 #include "webkit/quota/quota_types.h" 26 #include "webkit/quota/quota_types.h"
26 27
27 using webkit_blob::ShareableFileReference; 28 using webkit_blob::ShareableFileReference;
28 29
29 namespace fileapi { 30 namespace fileapi {
30 31
31 namespace { 32 namespace {
32 33
33 bool IsMediaFileSystemType(FileSystemType type) { 34 bool IsMediaFileSystemType(FileSystemType type) {
34 return type == kFileSystemTypeNativeMedia || 35 return type == kFileSystemTypeNativeMedia ||
35 type == kFileSystemTypeDeviceMedia; 36 type == kFileSystemTypeDeviceMedia;
36 } 37 }
37 38
38 bool IsCrossOperationAllowed(FileSystemType src_type, 39 bool IsCrossOperationAllowed(FileSystemType src_type,
39 FileSystemType dest_type) { 40 FileSystemType dest_type) {
40 // If two types are supposed to run on different task runners we should not 41 // If two types are supposed to run on different task runners we should not
41 // allow cross FileUtil operations at this layer. 42 // allow cross FileUtil operations at this layer.
42 return IsMediaFileSystemType(src_type) == IsMediaFileSystemType(dest_type); 43 return IsMediaFileSystemType(src_type) == IsMediaFileSystemType(dest_type);
43 } 44 }
44 45
45 } // namespace 46 } // namespace
46 47
48 // LocalFileSystemOperation::ScopedUpdateNotifier -----------------------------
49
47 class LocalFileSystemOperation::ScopedUpdateNotifier { 50 class LocalFileSystemOperation::ScopedUpdateNotifier {
48 public: 51 public:
49 ScopedUpdateNotifier(FileSystemOperationContext* operation_context, 52 ScopedUpdateNotifier(FileSystemOperationContext* operation_context,
50 const FileSystemURL& url); 53 const FileSystemURL& url);
51 ~ScopedUpdateNotifier(); 54 ~ScopedUpdateNotifier();
52 55
53 private: 56 private:
54 // Not owned; owned by the owner of this instance 57 // Not owned; owned by the owner of this instance
55 // (i.e. LocalFileSystemOperation). 58 // (i.e. LocalFileSystemOperation).
56 FileSystemOperationContext* operation_context_; 59 FileSystemOperationContext* operation_context_;
57 FileSystemURL url_; 60 FileSystemURL url_;
58 DISALLOW_COPY_AND_ASSIGN(ScopedUpdateNotifier); 61 DISALLOW_COPY_AND_ASSIGN(ScopedUpdateNotifier);
59 }; 62 };
60 63
61 LocalFileSystemOperation::ScopedUpdateNotifier::ScopedUpdateNotifier( 64 LocalFileSystemOperation::ScopedUpdateNotifier::ScopedUpdateNotifier(
62 FileSystemOperationContext* operation_context, 65 FileSystemOperationContext* operation_context,
63 const FileSystemURL& url) 66 const FileSystemURL& url)
64 : operation_context_(operation_context), url_(url) { 67 : operation_context_(operation_context), url_(url) {
65 operation_context_->update_observers()->Notify( 68 operation_context_->update_observers()->Notify(
66 &FileUpdateObserver::OnStartUpdate, MakeTuple(url_)); 69 &FileUpdateObserver::OnStartUpdate, MakeTuple(url_));
67 } 70 }
68 71
69 LocalFileSystemOperation::ScopedUpdateNotifier::~ScopedUpdateNotifier() { 72 LocalFileSystemOperation::ScopedUpdateNotifier::~ScopedUpdateNotifier() {
70 operation_context_->update_observers()->Notify( 73 operation_context_->update_observers()->Notify(
71 &FileUpdateObserver::OnEndUpdate, MakeTuple(url_)); 74 &FileUpdateObserver::OnEndUpdate, MakeTuple(url_));
72 } 75 }
73 76
77 // LocalFileSystemOperation ---------------------------------------------------
78
74 LocalFileSystemOperation::~LocalFileSystemOperation() { 79 LocalFileSystemOperation::~LocalFileSystemOperation() {
75 } 80 }
76 81
77 void LocalFileSystemOperation::CreateFile(const FileSystemURL& url, 82 void LocalFileSystemOperation::CreateFile(const FileSystemURL& url,
78 bool exclusive, 83 bool exclusive,
79 const StatusCallback& callback) { 84 const StatusCallback& callback) {
80 DCHECK(SetPendingOperationType(kOperationCreateFile)); 85 DCHECK(SetPendingOperationType(kOperationCreateFile));
81 86
82 base::PlatformFileError result = SetUp(url, &src_util_, SETUP_FOR_CREATE); 87 base::PlatformFileError result = SetUp(url, &src_util_, SETUP_FOR_CREATE);
83 if (result != base::PLATFORM_FILE_OK) { 88 if (result != base::PLATFORM_FILE_OK) {
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 DCHECK(SetPendingOperationType(kOperationDirectoryExists)); 185 DCHECK(SetPendingOperationType(kOperationDirectoryExists));
181 186
182 base::PlatformFileError result = SetUp(url, &src_util_, SETUP_FOR_READ); 187 base::PlatformFileError result = SetUp(url, &src_util_, SETUP_FOR_READ);
183 if (result != base::PLATFORM_FILE_OK) { 188 if (result != base::PLATFORM_FILE_OK) {
184 callback.Run(result); 189 callback.Run(result);
185 delete this; 190 delete this;
186 return; 191 return;
187 } 192 }
188 193
189 FileSystemFileUtilProxy::GetFileInfo( 194 FileSystemFileUtilProxy::GetFileInfo(
190 operation_context_.get(), src_util_, url, 195 operation_context(), src_util_, url,
191 base::Bind(&LocalFileSystemOperation::DidDirectoryExists, 196 base::Bind(&LocalFileSystemOperation::DidDirectoryExists,
192 base::Owned(this), callback)); 197 base::Owned(this), callback));
193 } 198 }
194 199
195 void LocalFileSystemOperation::FileExists(const FileSystemURL& url, 200 void LocalFileSystemOperation::FileExists(const FileSystemURL& url,
196 const StatusCallback& callback) { 201 const StatusCallback& callback) {
197 DCHECK(SetPendingOperationType(kOperationFileExists)); 202 DCHECK(SetPendingOperationType(kOperationFileExists));
198 203
199 base::PlatformFileError result = SetUp(url, &src_util_, SETUP_FOR_READ); 204 base::PlatformFileError result = SetUp(url, &src_util_, SETUP_FOR_READ);
200 if (result != base::PLATFORM_FILE_OK) { 205 if (result != base::PLATFORM_FILE_OK) {
201 callback.Run(result); 206 callback.Run(result);
202 delete this; 207 delete this;
203 return; 208 return;
204 } 209 }
205 210
206 FileSystemFileUtilProxy::GetFileInfo( 211 FileSystemFileUtilProxy::GetFileInfo(
207 operation_context_.get(), src_util_, url, 212 operation_context(), src_util_, url,
208 base::Bind(&LocalFileSystemOperation::DidFileExists, 213 base::Bind(&LocalFileSystemOperation::DidFileExists,
209 base::Owned(this), callback)); 214 base::Owned(this), callback));
210 } 215 }
211 216
212 void LocalFileSystemOperation::GetMetadata( 217 void LocalFileSystemOperation::GetMetadata(
213 const FileSystemURL& url, const GetMetadataCallback& callback) { 218 const FileSystemURL& url, const GetMetadataCallback& callback) {
214 DCHECK(SetPendingOperationType(kOperationGetMetadata)); 219 DCHECK(SetPendingOperationType(kOperationGetMetadata));
215 220
216 base::PlatformFileError result = SetUp(url, &src_util_, SETUP_FOR_READ); 221 base::PlatformFileError result = SetUp(url, &src_util_, SETUP_FOR_READ);
217 if (result != base::PLATFORM_FILE_OK) { 222 if (result != base::PLATFORM_FILE_OK) {
218 callback.Run(result, base::PlatformFileInfo(), FilePath()); 223 callback.Run(result, base::PlatformFileInfo(), FilePath());
219 delete this; 224 delete this;
220 return; 225 return;
221 } 226 }
222 227
223 FileSystemFileUtilProxy::GetFileInfo( 228 FileSystemFileUtilProxy::GetFileInfo(
224 operation_context_.get(), src_util_, url, 229 operation_context(), src_util_, url,
225 base::Bind(&LocalFileSystemOperation::DidGetMetadata, 230 base::Bind(&LocalFileSystemOperation::DidGetMetadata,
226 base::Owned(this), callback)); 231 base::Owned(this), callback));
227 } 232 }
228 233
229 void LocalFileSystemOperation::ReadDirectory( 234 void LocalFileSystemOperation::ReadDirectory(
230 const FileSystemURL& url, const ReadDirectoryCallback& callback) { 235 const FileSystemURL& url, const ReadDirectoryCallback& callback) {
231 DCHECK(SetPendingOperationType(kOperationReadDirectory)); 236 DCHECK(SetPendingOperationType(kOperationReadDirectory));
232 237
233 base::PlatformFileError result = SetUp(url, &src_util_, SETUP_FOR_READ); 238 base::PlatformFileError result = SetUp(url, &src_util_, SETUP_FOR_READ);
234 if (result != base::PLATFORM_FILE_OK) { 239 if (result != base::PLATFORM_FILE_OK) {
235 callback.Run(result, std::vector<base::FileUtilProxy::Entry>(), false); 240 callback.Run(result, std::vector<base::FileUtilProxy::Entry>(), false);
236 delete this; 241 delete this;
237 return; 242 return;
238 } 243 }
239 244
240 FileSystemFileUtilProxy::ReadDirectory( 245 FileSystemFileUtilProxy::ReadDirectory(
241 operation_context_.get(), src_util_, url, 246 operation_context(), src_util_, url,
242 base::Bind(&LocalFileSystemOperation::DidReadDirectory, 247 base::Bind(&LocalFileSystemOperation::DidReadDirectory,
243 base::Owned(this), callback)); 248 base::Owned(this), callback));
244 } 249 }
245 250
246 void LocalFileSystemOperation::Remove(const FileSystemURL& url, 251 void LocalFileSystemOperation::Remove(const FileSystemURL& url,
247 bool recursive, 252 bool recursive,
248 const StatusCallback& callback) { 253 const StatusCallback& callback) {
249 DCHECK(SetPendingOperationType(kOperationRemove)); 254 DCHECK(SetPendingOperationType(kOperationRemove));
250 255 DCHECK(!remove_operation_delegate_);
251 base::PlatformFileError result = SetUp(url, &src_util_, SETUP_FOR_WRITE); 256 remove_operation_delegate_.reset(new RemoveOperationDelegate(this, callback));
252 if (result != base::PLATFORM_FILE_OK) { 257 if (recursive)
253 callback.Run(result); 258 remove_operation_delegate_->RunRecursively(url);
254 delete this; 259 else
255 return; 260 remove_operation_delegate_->Run(url);
256 }
257
258 FileSystemFileUtilProxy::Delete(
259 operation_context_.get(), src_util_, url, recursive,
260 base::Bind(&LocalFileSystemOperation::DidFinishFileOperation,
261 base::Owned(this), callback));
262 } 261 }
263 262
264 void LocalFileSystemOperation::Write( 263 void LocalFileSystemOperation::Write(
265 const net::URLRequestContext* url_request_context, 264 const net::URLRequestContext* url_request_context,
266 const FileSystemURL& url, 265 const FileSystemURL& url,
267 const GURL& blob_url, 266 const GURL& blob_url,
268 int64 offset, 267 int64 offset,
269 const WriteCallback& callback) { 268 const WriteCallback& callback) {
270 GetWriteClosure(url_request_context, url, blob_url, offset, callback).Run(); 269 GetWriteClosure(url_request_context, url, blob_url, offset, callback).Run();
271 } 270 }
(...skipping 22 matching lines...) Expand all
294 DCHECK(SetPendingOperationType(kOperationTouchFile)); 293 DCHECK(SetPendingOperationType(kOperationTouchFile));
295 294
296 base::PlatformFileError result = SetUp(url, &src_util_, SETUP_FOR_WRITE); 295 base::PlatformFileError result = SetUp(url, &src_util_, SETUP_FOR_WRITE);
297 if (result != base::PLATFORM_FILE_OK) { 296 if (result != base::PLATFORM_FILE_OK) {
298 callback.Run(result); 297 callback.Run(result);
299 delete this; 298 delete this;
300 return; 299 return;
301 } 300 }
302 301
303 FileSystemFileUtilProxy::Touch( 302 FileSystemFileUtilProxy::Touch(
304 operation_context_.get(), src_util_, url, 303 operation_context(), src_util_, url,
305 last_access_time, last_modified_time, 304 last_access_time, last_modified_time,
306 base::Bind(&LocalFileSystemOperation::DidTouchFile, 305 base::Bind(&LocalFileSystemOperation::DidTouchFile,
307 base::Owned(this), callback)); 306 base::Owned(this), callback));
308 } 307 }
309 308
310 void LocalFileSystemOperation::OpenFile(const FileSystemURL& url, 309 void LocalFileSystemOperation::OpenFile(const FileSystemURL& url,
311 int file_flags, 310 int file_flags,
312 base::ProcessHandle peer_handle, 311 base::ProcessHandle peer_handle,
313 const OpenFileCallback& callback) { 312 const OpenFileCallback& callback) {
314 DCHECK(SetPendingOperationType(kOperationOpenFile)); 313 DCHECK(SetPendingOperationType(kOperationOpenFile));
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 void LocalFileSystemOperation::SyncGetPlatformPath(const FileSystemURL& url, 397 void LocalFileSystemOperation::SyncGetPlatformPath(const FileSystemURL& url,
399 FilePath* platform_path) { 398 FilePath* platform_path) {
400 DCHECK(SetPendingOperationType(kOperationGetLocalPath)); 399 DCHECK(SetPendingOperationType(kOperationGetLocalPath));
401 400
402 base::PlatformFileError result = SetUp(url, &src_util_, SETUP_FOR_READ); 401 base::PlatformFileError result = SetUp(url, &src_util_, SETUP_FOR_READ);
403 if (result != base::PLATFORM_FILE_OK) { 402 if (result != base::PLATFORM_FILE_OK) {
404 delete this; 403 delete this;
405 return; 404 return;
406 } 405 }
407 406
408 src_util_->GetLocalFilePath(operation_context_.get(), url, platform_path); 407 src_util_->GetLocalFilePath(operation_context(), url, platform_path);
409 408
410 delete this; 409 delete this;
411 } 410 }
412 411
413 void LocalFileSystemOperation::CreateSnapshotFile( 412 void LocalFileSystemOperation::CreateSnapshotFile(
414 const FileSystemURL& url, 413 const FileSystemURL& url,
415 const SnapshotFileCallback& callback) { 414 const SnapshotFileCallback& callback) {
416 DCHECK(SetPendingOperationType(kOperationCreateSnapshotFile)); 415 DCHECK(SetPendingOperationType(kOperationCreateSnapshotFile));
417 416
418 base::PlatformFileError result = SetUp(url, &src_util_, SETUP_FOR_READ); 417 base::PlatformFileError result = SetUp(url, &src_util_, SETUP_FOR_READ);
419 if (result != base::PLATFORM_FILE_OK) { 418 if (result != base::PLATFORM_FILE_OK) {
420 callback.Run(result, base::PlatformFileInfo(), FilePath(), NULL); 419 callback.Run(result, base::PlatformFileInfo(), FilePath(), NULL);
421 delete this; 420 delete this;
422 return; 421 return;
423 } 422 }
424 423
425 FileSystemFileUtilProxy::CreateSnapshotFile( 424 FileSystemFileUtilProxy::CreateSnapshotFile(
426 operation_context_.get(), src_util_, url, 425 operation_context(), src_util_, url,
427 base::Bind(&LocalFileSystemOperation::DidCreateSnapshotFile, 426 base::Bind(&LocalFileSystemOperation::DidCreateSnapshotFile,
428 base::Owned(this), callback)); 427 base::Owned(this), callback));
429 } 428 }
430 429
431 void LocalFileSystemOperation::CopyInForeignFile( 430 void LocalFileSystemOperation::CopyInForeignFile(
432 const FilePath& src_local_disk_file_path, 431 const FilePath& src_local_disk_file_path,
433 const FileSystemURL& dest_url, 432 const FileSystemURL& dest_url,
434 const StatusCallback& callback) { 433 const StatusCallback& callback) {
435 DCHECK(SetPendingOperationType(kOperationCopyInForeignFile)); 434 DCHECK(SetPendingOperationType(kOperationCopyInForeignFile));
436 435
437 base::PlatformFileError result = SetUp( 436 base::PlatformFileError result = SetUp(
438 dest_url, &dest_util_, SETUP_FOR_CREATE); 437 dest_url, &dest_util_, SETUP_FOR_CREATE);
439 if (result != base::PLATFORM_FILE_OK) { 438 if (result != base::PLATFORM_FILE_OK) {
440 callback.Run(result); 439 callback.Run(result);
441 delete this; 440 delete this;
442 return; 441 return;
443 } 442 }
444 443
445 GetUsageAndQuotaThenRunTask( 444 GetUsageAndQuotaThenRunTask(
446 dest_url, 445 dest_url,
447 base::Bind(&LocalFileSystemOperation::DoCopyInForeignFile, 446 base::Bind(&LocalFileSystemOperation::DoCopyInForeignFile,
448 base::Unretained(this), src_local_disk_file_path, dest_url, 447 base::Unretained(this), src_local_disk_file_path, dest_url,
449 callback), 448 callback),
450 base::Bind(callback, base::PLATFORM_FILE_ERROR_FAILED)); 449 base::Bind(callback, base::PLATFORM_FILE_ERROR_FAILED));
451 } 450 }
452 451
452 void LocalFileSystemOperation::RemoveFile(
453 const FileSystemURL& url,
454 const StatusCallback& callback) {
455 DCHECK(SetPendingOperationType(kOperationRemove));
456 base::PlatformFileError result = SetUp(url, &src_util_, SETUP_FOR_WRITE);
457 if (result != base::PLATFORM_FILE_OK) {
458 callback.Run(result);
459 delete this;
460 return;
461 }
462
463 FileSystemFileUtilProxy::DeleteFile(
464 operation_context(), src_util_, url,
465 base::Bind(&LocalFileSystemOperation::DidFinishFileOperation,
466 base::Owned(this), callback));
467 }
468
469 void LocalFileSystemOperation::RemoveDirectory(
470 const FileSystemURL& url,
471 const StatusCallback& callback) {
472 DCHECK(SetPendingOperationType(kOperationRemove));
473 base::PlatformFileError result = SetUp(url, &src_util_, SETUP_FOR_WRITE);
474 if (result != base::PLATFORM_FILE_OK) {
475 callback.Run(result);
476 delete this;
477 return;
478 }
479
480 FileSystemFileUtilProxy::DeleteDirectory(
481 operation_context(), src_util_, url,
482 base::Bind(&LocalFileSystemOperation::DidFinishFileOperation,
483 base::Owned(this), callback));
484 }
485
453 LocalFileSystemOperation::LocalFileSystemOperation( 486 LocalFileSystemOperation::LocalFileSystemOperation(
454 FileSystemContext* file_system_context, 487 FileSystemContext* file_system_context,
455 scoped_ptr<FileSystemOperationContext> operation_context) 488 scoped_ptr<FileSystemOperationContext> operation_context)
456 : file_system_context_(file_system_context), 489 : file_system_context_(file_system_context),
457 operation_context_(operation_context.Pass()), 490 operation_context_(operation_context.Pass()),
458 src_util_(NULL), 491 src_util_(NULL),
459 dest_util_(NULL), 492 dest_util_(NULL),
493 overriding_operation_context_(NULL),
460 is_cross_operation_(false), 494 is_cross_operation_(false),
461 peer_handle_(base::kNullProcessHandle), 495 peer_handle_(base::kNullProcessHandle),
462 pending_operation_(kOperationNone), 496 pending_operation_(kOperationNone),
463 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { 497 weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
464 DCHECK(operation_context_.get()); 498 DCHECK(operation_context_.get());
465 } 499 }
466 500
467 void LocalFileSystemOperation::GetUsageAndQuotaThenRunTask( 501 void LocalFileSystemOperation::GetUsageAndQuotaThenRunTask(
468 const FileSystemURL& url, 502 const FileSystemURL& url,
469 const base::Closure& task, 503 const base::Closure& task,
470 const base::Closure& error_callback) { 504 const base::Closure& error_callback) {
471 quota::QuotaManagerProxy* quota_manager_proxy = 505 quota::QuotaManagerProxy* quota_manager_proxy =
472 file_system_context()->quota_manager_proxy(); 506 file_system_context()->quota_manager_proxy();
473 if (!quota_manager_proxy || 507 if (!quota_manager_proxy ||
474 !file_system_context()->GetQuotaUtil(url.type())) { 508 !file_system_context()->GetQuotaUtil(url.type())) {
475 // If we don't have the quota manager or the requested filesystem type 509 // If we don't have the quota manager or the requested filesystem type
476 // does not support quota, we should be able to let it go. 510 // does not support quota, we should be able to let it go.
477 operation_context_->set_allowed_bytes_growth(kint64max); 511 operation_context()->set_allowed_bytes_growth(kint64max);
478 task.Run(); 512 task.Run();
479 return; 513 return;
480 } 514 }
481 515
482 DCHECK(quota_manager_proxy); 516 DCHECK(quota_manager_proxy);
483 DCHECK(quota_manager_proxy->quota_manager()); 517 DCHECK(quota_manager_proxy->quota_manager());
484 quota_manager_proxy->quota_manager()->GetUsageAndQuota( 518 quota_manager_proxy->quota_manager()->GetUsageAndQuota(
485 url.origin(), 519 url.origin(),
486 FileSystemTypeToQuotaStorageType(url.type()), 520 FileSystemTypeToQuotaStorageType(url.type()),
487 base::Bind(&LocalFileSystemOperation::DidGetUsageAndQuotaAndRunTask, 521 base::Bind(&LocalFileSystemOperation::DidGetUsageAndQuotaAndRunTask,
488 weak_factory_.GetWeakPtr(), task, error_callback)); 522 weak_factory_.GetWeakPtr(), task, error_callback));
489 } 523 }
490 524
491 void LocalFileSystemOperation::DidGetUsageAndQuotaAndRunTask( 525 void LocalFileSystemOperation::DidGetUsageAndQuotaAndRunTask(
492 const base::Closure& task, 526 const base::Closure& task,
493 const base::Closure& error_callback, 527 const base::Closure& error_callback,
494 quota::QuotaStatusCode status, 528 quota::QuotaStatusCode status,
495 int64 usage, int64 quota) { 529 int64 usage, int64 quota) {
496 if (status != quota::kQuotaStatusOk) { 530 if (status != quota::kQuotaStatusOk) {
497 LOG(WARNING) << "Got unexpected quota error : " << status; 531 LOG(WARNING) << "Got unexpected quota error : " << status;
498 error_callback.Run(); 532 error_callback.Run();
499 return; 533 return;
500 } 534 }
501 535
502 operation_context_->set_allowed_bytes_growth(quota - usage); 536 operation_context()->set_allowed_bytes_growth(quota - usage);
503 task.Run(); 537 task.Run();
504 } 538 }
505 539
506 base::Closure LocalFileSystemOperation::GetWriteClosure( 540 base::Closure LocalFileSystemOperation::GetWriteClosure(
507 const net::URLRequestContext* url_request_context, 541 const net::URLRequestContext* url_request_context,
508 const FileSystemURL& url, 542 const FileSystemURL& url,
509 const GURL& blob_url, 543 const GURL& blob_url,
510 int64 offset, 544 int64 offset,
511 const WriteCallback& callback) { 545 const WriteCallback& callback) {
512 DCHECK(SetPendingOperationType(kOperationWrite)); 546 DCHECK(SetPendingOperationType(kOperationWrite));
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
549 const WriteCallback& callback, 583 const WriteCallback& callback,
550 base::PlatformFileError result) { 584 base::PlatformFileError result) {
551 callback.Run(result, 0, false); 585 callback.Run(result, 0, false);
552 } 586 }
553 587
554 void LocalFileSystemOperation::DoCreateFile( 588 void LocalFileSystemOperation::DoCreateFile(
555 const FileSystemURL& url, 589 const FileSystemURL& url,
556 const StatusCallback& callback, 590 const StatusCallback& callback,
557 bool exclusive) { 591 bool exclusive) {
558 FileSystemFileUtilProxy::EnsureFileExists( 592 FileSystemFileUtilProxy::EnsureFileExists(
559 operation_context_.get(), 593 operation_context(),
560 src_util_, url, 594 src_util_, url,
561 base::Bind( 595 base::Bind(
562 exclusive ? 596 exclusive ?
563 &LocalFileSystemOperation::DidEnsureFileExistsExclusive : 597 &LocalFileSystemOperation::DidEnsureFileExistsExclusive :
564 &LocalFileSystemOperation::DidEnsureFileExistsNonExclusive, 598 &LocalFileSystemOperation::DidEnsureFileExistsNonExclusive,
565 base::Owned(this), callback)); 599 base::Owned(this), callback));
566 } 600 }
567 601
568 void LocalFileSystemOperation::DoCreateDirectory( 602 void LocalFileSystemOperation::DoCreateDirectory(
569 const FileSystemURL& url, 603 const FileSystemURL& url,
570 const StatusCallback& callback, 604 const StatusCallback& callback,
571 bool exclusive, bool recursive) { 605 bool exclusive, bool recursive) {
572 FileSystemFileUtilProxy::CreateDirectory( 606 FileSystemFileUtilProxy::CreateDirectory(
573 operation_context_.get(), 607 operation_context(),
574 src_util_, url, exclusive, recursive, 608 src_util_, url, exclusive, recursive,
575 base::Bind(&LocalFileSystemOperation::DidFinishFileOperation, 609 base::Bind(&LocalFileSystemOperation::DidFinishFileOperation,
576 base::Owned(this), callback)); 610 base::Owned(this), callback));
577 } 611 }
578 612
579 void LocalFileSystemOperation::DoCopy(const FileSystemURL& src_url, 613 void LocalFileSystemOperation::DoCopy(const FileSystemURL& src_url,
580 const FileSystemURL& dest_url, 614 const FileSystemURL& dest_url,
581 const StatusCallback& callback) { 615 const StatusCallback& callback) {
582 FileSystemFileUtilProxy::Copy( 616 FileSystemFileUtilProxy::Copy(
583 operation_context_.get(), 617 operation_context(),
584 src_util_, dest_util_, 618 src_util_, dest_util_,
585 src_url, dest_url, 619 src_url, dest_url,
586 base::Bind(&LocalFileSystemOperation::DidFinishFileOperation, 620 base::Bind(&LocalFileSystemOperation::DidFinishFileOperation,
587 base::Owned(this), callback)); 621 base::Owned(this), callback));
588 } 622 }
589 623
590 void LocalFileSystemOperation::DoCopyInForeignFile( 624 void LocalFileSystemOperation::DoCopyInForeignFile(
591 const FilePath& src_local_disk_file_path, 625 const FilePath& src_local_disk_file_path,
592 const FileSystemURL& dest_url, 626 const FileSystemURL& dest_url,
593 const StatusCallback& callback) { 627 const StatusCallback& callback) {
594 FileSystemFileUtilProxy::CopyInForeignFile( 628 FileSystemFileUtilProxy::CopyInForeignFile(
595 operation_context_.get(), 629 operation_context(),
596 dest_util_, 630 dest_util_,
597 src_local_disk_file_path, dest_url, 631 src_local_disk_file_path, dest_url,
598 base::Bind(&LocalFileSystemOperation::DidFinishFileOperation, 632 base::Bind(&LocalFileSystemOperation::DidFinishFileOperation,
599 base::Owned(this), callback)); 633 base::Owned(this), callback));
600 } 634 }
601 635
602 void LocalFileSystemOperation::DoMove(const FileSystemURL& src_url, 636 void LocalFileSystemOperation::DoMove(const FileSystemURL& src_url,
603 const FileSystemURL& dest_url, 637 const FileSystemURL& dest_url,
604 const StatusCallback& callback) { 638 const StatusCallback& callback) {
605 FileSystemFileUtilProxy::Move( 639 FileSystemFileUtilProxy::Move(
606 operation_context_.get(), 640 operation_context(),
607 src_util_, dest_util_, 641 src_util_, dest_util_,
608 src_url, dest_url, 642 src_url, dest_url,
609 base::Bind(&LocalFileSystemOperation::DidFinishFileOperation, 643 base::Bind(&LocalFileSystemOperation::DidFinishFileOperation,
610 base::Owned(this), callback)); 644 base::Owned(this), callback));
611 } 645 }
612 646
613 void LocalFileSystemOperation::DoTruncate(const FileSystemURL& url, 647 void LocalFileSystemOperation::DoTruncate(const FileSystemURL& url,
614 const StatusCallback& callback, 648 const StatusCallback& callback,
615 int64 length) { 649 int64 length) {
616 FileSystemFileUtilProxy::Truncate( 650 FileSystemFileUtilProxy::Truncate(
617 operation_context_.get(), src_util_, url, length, 651 operation_context(), src_util_, url, length,
618 base::Bind(&LocalFileSystemOperation::DidFinishFileOperation, 652 base::Bind(&LocalFileSystemOperation::DidFinishFileOperation,
619 base::Owned(this), callback)); 653 base::Owned(this), callback));
620 } 654 }
621 655
622 void LocalFileSystemOperation::DoOpenFile(const FileSystemURL& url, 656 void LocalFileSystemOperation::DoOpenFile(const FileSystemURL& url,
623 const OpenFileCallback& callback, 657 const OpenFileCallback& callback,
624 int file_flags) { 658 int file_flags) {
625 FileSystemFileUtilProxy::CreateOrOpen( 659 FileSystemFileUtilProxy::CreateOrOpen(
626 operation_context_.get(), src_util_, url, file_flags, 660 operation_context(), src_util_, url, file_flags,
627 base::Bind(&LocalFileSystemOperation::DidOpenFile, 661 base::Bind(&LocalFileSystemOperation::DidOpenFile,
628 base::Owned(this), callback)); 662 base::Owned(this), callback));
629 } 663 }
630 664
631 void LocalFileSystemOperation::DidEnsureFileExistsExclusive( 665 void LocalFileSystemOperation::DidEnsureFileExistsExclusive(
632 const StatusCallback& callback, 666 const StatusCallback& callback,
633 base::PlatformFileError rv, bool created) { 667 base::PlatformFileError rv, bool created) {
634 if (rv == base::PLATFORM_FILE_OK && !created) { 668 if (rv == base::PLATFORM_FILE_OK && !created) {
635 callback.Run(base::PLATFORM_FILE_ERROR_EXISTS); 669 callback.Run(base::PLATFORM_FILE_ERROR_EXISTS);
636 } else { 670 } else {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 if (write_callback_.is_null()) { 736 if (write_callback_.is_null()) {
703 // If cancelled, callback is already invoked and set to null in Cancel(). 737 // If cancelled, callback is already invoked and set to null in Cancel().
704 // We must not call it twice. Just shut down this operation object. 738 // We must not call it twice. Just shut down this operation object.
705 delete this; 739 delete this;
706 return; 740 return;
707 } 741 }
708 742
709 const bool complete = ( 743 const bool complete = (
710 write_status != FileWriterDelegate::SUCCESS_IO_PENDING); 744 write_status != FileWriterDelegate::SUCCESS_IO_PENDING);
711 if (complete && write_status != FileWriterDelegate::ERROR_WRITE_NOT_STARTED) { 745 if (complete && write_status != FileWriterDelegate::ERROR_WRITE_NOT_STARTED) {
712 operation_context_->change_observers()->Notify( 746 operation_context()->change_observers()->Notify(
713 &FileChangeObserver::OnModifyFile, MakeTuple(url)); 747 &FileChangeObserver::OnModifyFile, MakeTuple(url));
714 } 748 }
715 749
716 write_callback_.Run(rv, bytes, complete); 750 write_callback_.Run(rv, bytes, complete);
717 if (complete || rv != base::PLATFORM_FILE_OK) 751 if (complete || rv != base::PLATFORM_FILE_OK)
718 delete this; 752 delete this;
719 } 753 }
720 754
721 void LocalFileSystemOperation::DidTouchFile(const StatusCallback& callback, 755 void LocalFileSystemOperation::DidTouchFile(const StatusCallback& callback,
722 base::PlatformFileError rv) { 756 base::PlatformFileError rv) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 FileSystemFileUtil** file_util, 788 FileSystemFileUtil** file_util,
755 SetUpMode mode) { 789 SetUpMode mode) {
756 if (!url.is_valid()) 790 if (!url.is_valid())
757 return base::PLATFORM_FILE_ERROR_INVALID_URL; 791 return base::PLATFORM_FILE_ERROR_INVALID_URL;
758 792
759 // Restricted file system is read-only. 793 // Restricted file system is read-only.
760 if (url.type() == fileapi::kFileSystemTypeRestrictedNativeLocal && 794 if (url.type() == fileapi::kFileSystemTypeRestrictedNativeLocal &&
761 mode != SETUP_FOR_READ) 795 mode != SETUP_FOR_READ)
762 return base::PLATFORM_FILE_ERROR_SECURITY; 796 return base::PLATFORM_FILE_ERROR_SECURITY;
763 797
764 if (!file_system_context()->GetMountPointProvider(
765 url.type())->IsAccessAllowed(url))
766 return base::PLATFORM_FILE_ERROR_SECURITY;
767
768 DCHECK(file_util); 798 DCHECK(file_util);
769 if (!*file_util) 799 if (!*file_util)
770 *file_util = file_system_context()->GetFileUtil(url.type()); 800 *file_util = file_system_context()->GetFileUtil(url.type());
771 if (!*file_util) 801 if (!*file_util)
772 return base::PLATFORM_FILE_ERROR_SECURITY; 802 return base::PLATFORM_FILE_ERROR_SECURITY;
773 803
804 // If this operation is created for recursive sub-operations (i.e.
805 // operation context is overridden from another operation) we skip
806 // some duplicated security checks.
807 if (overriding_operation_context_)
808 return base::PLATFORM_FILE_OK;
809
810 if (!file_system_context()->GetMountPointProvider(
811 url.type())->IsAccessAllowed(url))
812 return base::PLATFORM_FILE_ERROR_SECURITY;
813
774 if (mode == SETUP_FOR_READ) { 814 if (mode == SETUP_FOR_READ) {
775 // TODO(kinuko): This doesn't work well for cross-filesystem operation 815 // TODO(kinuko): This doesn't work well for cross-filesystem operation
776 // in the current architecture since the operation context (thus the 816 // in the current architecture since the operation context (thus the
777 // observers) is configured for the destination URL while this method 817 // observers) is configured for the destination URL while this method
778 // could be called for both src and dest URL. 818 // could be called for both src and dest URL.
779 if (!is_cross_operation_) { 819 if (!is_cross_operation_) {
780 operation_context_->access_observers()->Notify( 820 operation_context()->access_observers()->Notify(
781 &FileAccessObserver::OnAccess, MakeTuple(url)); 821 &FileAccessObserver::OnAccess, MakeTuple(url));
782 } 822 }
783 return base::PLATFORM_FILE_OK; 823 return base::PLATFORM_FILE_OK;
784 } 824 }
785 825
786 DCHECK(mode == SETUP_FOR_WRITE || mode == SETUP_FOR_CREATE); 826 DCHECK(mode == SETUP_FOR_WRITE || mode == SETUP_FOR_CREATE);
787 827
788 scoped_update_notifiers_.push_back(new ScopedUpdateNotifier( 828 scoped_update_notifiers_.push_back(new ScopedUpdateNotifier(
789 operation_context_.get(), url)); 829 operation_context(), url));
790 830
791 // Any write access is disallowed on the root path. 831 // Any write access is disallowed on the root path.
792 if (url.path().value().length() == 0 || 832 if (url.path().value().length() == 0 ||
793 url.path().DirName().value() == url.path().value()) 833 url.path().DirName().value() == url.path().value())
794 return base::PLATFORM_FILE_ERROR_SECURITY; 834 return base::PLATFORM_FILE_ERROR_SECURITY;
795 835
796 if (mode == SETUP_FOR_CREATE) { 836 if (mode == SETUP_FOR_CREATE) {
797 FileSystemMountPointProvider* provider = file_system_context()-> 837 FileSystemMountPointProvider* provider = file_system_context()->
798 GetMountPointProvider(url.type()); 838 GetMountPointProvider(url.type());
799 839
800 // Check if the cracked file name looks good to create. 840 // Check if the cracked file name looks good to create.
801 if (provider->IsRestrictedFileName(VirtualPath::BaseName(url.path()))) 841 if (provider->IsRestrictedFileName(VirtualPath::BaseName(url.path())))
802 return base::PLATFORM_FILE_ERROR_SECURITY; 842 return base::PLATFORM_FILE_ERROR_SECURITY;
803 } 843 }
804 844
805 return base::PLATFORM_FILE_OK; 845 return base::PLATFORM_FILE_OK;
806 } 846 }
807 847
808 bool LocalFileSystemOperation::SetPendingOperationType(OperationType type) { 848 bool LocalFileSystemOperation::SetPendingOperationType(OperationType type) {
809 if (pending_operation_ != kOperationNone) 849 if (pending_operation_ != kOperationNone)
810 return false; 850 return false;
811 pending_operation_ = type; 851 pending_operation_ = type;
812 return true; 852 return true;
813 } 853 }
814 854
815 } // namespace fileapi 855 } // namespace fileapi
OLDNEW
« no previous file with comments | « webkit/fileapi/local_file_system_operation.h ('k') | webkit/fileapi/local_file_system_operation_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698