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

Unified Diff: webkit/fileapi/file_writer_delegate.cc

Issue 10008047: FileWriterDelegate should not call URLRequest::Start() after Cancel(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: reverted the test Created 8 years, 7 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
« no previous file with comments | « webkit/fileapi/file_writer_delegate.h ('k') | webkit/fileapi/file_writer_delegate_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/fileapi/file_writer_delegate.cc
diff --git a/webkit/fileapi/file_writer_delegate.cc b/webkit/fileapi/file_writer_delegate.cc
index 1f8a08643fb973ba933f64e36c608dc5d6976425..31214ae13fbbefb45089cf9875114f03fd32af61 100644
--- a/webkit/fileapi/file_writer_delegate.cc
+++ b/webkit/fileapi/file_writer_delegate.cc
@@ -32,14 +32,10 @@ class InitializeTask : public base::RefCountedThreadSafe<InitializeTask> {
public:
InitializeTask(
base::PlatformFile file,
- const FileSystemPath& path,
- FileSystemOperationContext* context,
const InitializeTaskCallback& callback)
: original_loop_(base::MessageLoopProxy::current()),
error_code_(base::PLATFORM_FILE_OK),
file_(file),
- path_(path),
- context_(*context),
callback_(callback) {
DCHECK_EQ(false, callback.is_null());
}
@@ -60,13 +56,6 @@ class InitializeTask : public base::RefCountedThreadSafe<InitializeTask> {
}
void ProcessOnTargetThread() {
- DCHECK(context_.file_system_context());
- FileSystemQuotaUtil* quota_util = context_.file_system_context()->
- GetQuotaUtil(path_.type());
- if (quota_util) {
- DCHECK(quota_util->proxy());
- quota_util->proxy()->StartUpdateOrigin(path_.origin(), path_.type());
- }
if (!base::GetPlatformFileInfo(file_, &file_info_))
error_code_ = base::PLATFORM_FILE_ERROR_FAILED;
original_loop_->PostTask(
@@ -78,8 +67,6 @@ class InitializeTask : public base::RefCountedThreadSafe<InitializeTask> {
base::PlatformFileError error_code_;
base::PlatformFile file_;
- FileSystemPath path_;
- FileSystemOperationContext context_;
InitializeTaskCallback callback_;
base::PlatformFileInfo file_info_;
@@ -95,6 +82,7 @@ FileWriterDelegate::FileWriterDelegate(
file_(base::kInvalidPlatformFileValue),
path_(path),
offset_(offset),
+ has_pending_write_(false),
bytes_written_backlog_(0),
bytes_written_(0),
bytes_read_(0),
@@ -107,10 +95,11 @@ FileWriterDelegate::FileWriterDelegate(
FileWriterDelegate::~FileWriterDelegate() {
}
-void FileWriterDelegate::OnGetFileInfoAndCallStartUpdate(
+void FileWriterDelegate::OnGetFileInfoAndStartRequest(
+ scoped_ptr<net::URLRequest> request,
base::PlatformFileError error,
const base::PlatformFileInfo& file_info) {
- if (error) {
+ if (error != base::PLATFORM_FILE_OK) {
OnError(error);
return;
}
@@ -128,22 +117,34 @@ void FileWriterDelegate::OnGetFileInfoAndCallStartUpdate(
base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_WRITE |
base::PLATFORM_FILE_ASYNC,
NULL));
+ DCHECK(!request_.get());
+ request_ = request.Pass();
request_->Start();
}
void FileWriterDelegate::Start(base::PlatformFile file,
- net::URLRequest* request) {
+ scoped_ptr<net::URLRequest> request) {
file_ = file;
- request_ = request;
scoped_refptr<InitializeTask> relay = new InitializeTask(
- file_, path_,
- file_system_operation_context(),
- base::Bind(&FileWriterDelegate::OnGetFileInfoAndCallStartUpdate,
- weak_factory_.GetWeakPtr()));
+ file_,
+ base::Bind(&FileWriterDelegate::OnGetFileInfoAndStartRequest,
+ weak_factory_.GetWeakPtr(), base::Passed(&request)));
relay->Start(file_system_operation_context()->file_task_runner(), FROM_HERE);
}
+bool FileWriterDelegate::Cancel() {
+ if (request_.get()) {
+ // This halts any callbacks on this delegate.
+ request_->set_delegate(NULL);
+ request_->Cancel();
+ }
+
+ // Return true to finish immediately if we're not writing.
+ // Otherwise we'll do the final cleanup in the write callback.
+ return !has_pending_write_;
+}
+
void FileWriterDelegate::OnReceivedRedirect(net::URLRequest* request,
const GURL& new_url,
bool* defer_redirect) {
@@ -172,7 +173,7 @@ void FileWriterDelegate::OnSSLCertificateError(net::URLRequest* request,
}
void FileWriterDelegate::OnResponseStarted(net::URLRequest* request) {
- DCHECK_EQ(request_, request);
+ DCHECK_EQ(request_.get(), request);
// file_stream_->Seek() blocks the IO thread.
// See http://crbug.com/75548.
base::ThreadRestrictions::ScopedAllowIO allow_io;
@@ -190,7 +191,7 @@ void FileWriterDelegate::OnResponseStarted(net::URLRequest* request) {
void FileWriterDelegate::OnReadCompleted(net::URLRequest* request,
int bytes_read) {
- DCHECK_EQ(request_, request);
+ DCHECK_EQ(request_.get(), request);
if (!request->status().is_success()) {
OnError(base::PLATFORM_FILE_ERROR_FAILED);
return;
@@ -241,6 +242,7 @@ void FileWriterDelegate::Write() {
if (bytes_to_write > allowed_bytes_to_write_ - total_bytes_written_)
bytes_to_write = allowed_bytes_to_write_ - total_bytes_written_;
+ has_pending_write_ = true;
int write_response =
file_stream_->Write(cursor_,
static_cast<int>(bytes_to_write),
@@ -256,7 +258,12 @@ void FileWriterDelegate::Write() {
}
void FileWriterDelegate::OnDataWritten(int write_response) {
+ has_pending_write_ = false;
if (write_response > 0) {
+ if (request_->status().status() == net::URLRequestStatus::CANCELED) {
+ OnProgress(write_response, true);
+ return;
+ }
OnProgress(write_response, false);
cursor_->DidConsume(write_response);
bytes_written_ += write_response;
@@ -271,11 +278,10 @@ void FileWriterDelegate::OnDataWritten(int write_response) {
}
void FileWriterDelegate::OnError(base::PlatformFileError error) {
- request_->set_delegate(NULL);
- request_->Cancel();
-
- if (quota_util())
- quota_util()->proxy()->EndUpdateOrigin(path_.origin(), path_.type());
+ if (request_.get()) {
+ request_->set_delegate(NULL);
+ request_->Cancel();
+ }
file_system_operation_->DidWrite(error, 0, true);
}
« no previous file with comments | « webkit/fileapi/file_writer_delegate.h ('k') | webkit/fileapi/file_writer_delegate_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698