Index: storage/browser/fileapi/recursive_operation_delegate.cc |
diff --git a/storage/browser/fileapi/recursive_operation_delegate.cc b/storage/browser/fileapi/recursive_operation_delegate.cc |
index 609df31f8f03610c82137b26cc54e95ab73ccf79..a3cb1a8644913a753f77a456de03fee16efad2be 100644 |
--- a/storage/browser/fileapi/recursive_operation_delegate.cc |
+++ b/storage/browser/fileapi/recursive_operation_delegate.cc |
@@ -21,7 +21,9 @@ RecursiveOperationDelegate::RecursiveOperationDelegate( |
FileSystemContext* file_system_context) |
: file_system_context_(file_system_context), |
inflight_operations_(0), |
- canceled_(false) { |
+ canceled_(false), |
+ ignore_error_(false), |
+ failed_some_operations_(false) { |
} |
RecursiveOperationDelegate::~RecursiveOperationDelegate() { |
@@ -40,11 +42,29 @@ void RecursiveOperationDelegate::StartRecursiveOperation( |
DCHECK_EQ(0, inflight_operations_); |
callback_ = callback; |
+ |
+ TryProcessFile(root); |
+} |
+ |
+void RecursiveOperationDelegate::StartRecursiveOperationWithIgnoringError( |
+ const FileSystemURL& root, |
+ const ErrorCallback& error_callback, |
+ const StatusCallback& status_callback) { |
+ DCHECK(pending_directory_stack_.empty()); |
+ DCHECK(pending_files_.empty()); |
+ DCHECK_EQ(0, inflight_operations_); |
+ |
+ error_callback_ = error_callback; |
+ callback_ = status_callback; |
+ ignore_error_ = true; |
+ |
+ TryProcessFile(root); |
+} |
+ |
+void RecursiveOperationDelegate::TryProcessFile(const FileSystemURL& root) { |
++inflight_operations_; |
- ProcessFile( |
- root, |
- base::Bind(&RecursiveOperationDelegate::DidTryProcessFile, |
- AsWeakPtr(), root)); |
+ ProcessFile(root, base::Bind(&RecursiveOperationDelegate::DidTryProcessFile, |
+ AsWeakPtr(), root)); |
} |
FileSystemOperationRunner* RecursiveOperationDelegate::operation_runner() { |
@@ -159,23 +179,31 @@ void RecursiveOperationDelegate::ProcessPendingFiles() { |
++inflight_operations_; |
current_task_runner->PostTask( |
FROM_HERE, |
- base::Bind(&RecursiveOperationDelegate::ProcessFile, |
- AsWeakPtr(), pending_files_.front(), |
+ base::Bind(&RecursiveOperationDelegate::ProcessFile, AsWeakPtr(), |
+ pending_files_.front(), |
base::Bind(&RecursiveOperationDelegate::DidProcessFile, |
- AsWeakPtr()))); |
+ AsWeakPtr(), pending_files_.front()))); |
pending_files_.pop(); |
} |
} |
-void RecursiveOperationDelegate::DidProcessFile( |
- base::File::Error error) { |
+void RecursiveOperationDelegate::DidProcessFile(const FileSystemURL& url, |
+ base::File::Error error) { |
--inflight_operations_; |
+ |
if (error != base::File::FILE_OK) { |
- // If an error occurs, invoke Done immediately (even if there remain |
- // running operations). It is because in the callback, this instance is |
- // deleted. |
- Done(error); |
- return; |
+ if (!ignore_error_) { |
+ // If an error occurs, invoke Done immediately (even if there remain |
+ // running operations). It is because in the callback, this instance is |
+ // deleted. |
+ Done(error); |
+ return; |
+ } else { |
+ failed_some_operations_ = true; |
+ |
+ if (!error_callback_.is_null()) |
+ error_callback_.Run(url, error); |
+ } |
} |
ProcessPendingFiles(); |
@@ -234,7 +262,10 @@ void RecursiveOperationDelegate::Done(base::File::Error error) { |
if (canceled_ && error == base::File::FILE_OK) { |
callback_.Run(base::File::FILE_ERROR_ABORT); |
} else { |
- callback_.Run(error); |
+ if (ignore_error_ && failed_some_operations_) |
+ callback_.Run(base::File::FILE_ERROR_FAILED); |
+ else |
+ callback_.Run(error); |
} |
} |