Index: webkit/fileapi/file_system_url_request_job.cc |
diff --git a/webkit/fileapi/file_system_url_request_job.cc b/webkit/fileapi/file_system_url_request_job.cc |
index ad4664cbcf5394c2e98482f4ebee098570f7320a..a617d6a90e2574645d331a94c528847bcf8b6b1b 100644 |
--- a/webkit/fileapi/file_system_url_request_job.cc |
+++ b/webkit/fileapi/file_system_url_request_job.cc |
@@ -55,9 +55,12 @@ static net::HttpResponseHeaders* CreateHttpResponseHeaders() { |
class FileSystemURLRequestJob::CallbackDispatcher |
: public FileSystemCallbackDispatcher { |
public: |
- explicit CallbackDispatcher(FileSystemURLRequestJob* job) |
- : job_(job) { |
- DCHECK(job_); |
+ // An instance of this class must be created by Create() |
+ // (so that we do not leak ownerships). |
+ static scoped_ptr<FileSystemCallbackDispatcher> Create( |
+ FileSystemURLRequestJob* job) { |
+ return scoped_ptr<FileSystemCallbackDispatcher>( |
+ new CallbackDispatcher(job)); |
} |
// fileapi::FileSystemCallbackDispatcher overrides. |
@@ -93,6 +96,10 @@ class FileSystemURLRequestJob::CallbackDispatcher |
} |
private: |
+ explicit CallbackDispatcher(FileSystemURLRequestJob* job) : job_(job) { |
+ DCHECK(job_); |
+ } |
+ |
// TODO(adamk): Get rid of the need for refcounting here by |
// allowing FileSystemOperations to be cancelled. |
scoped_refptr<FileSystemURLRequestJob> job_; |
@@ -213,7 +220,7 @@ int FileSystemURLRequestJob::GetResponseCode() const { |
void FileSystemURLRequestJob::StartAsync() { |
if (request_) { |
- (new FileSystemOperation(new CallbackDispatcher(this), |
+ (new FileSystemOperation(CallbackDispatcher::Create(this), |
file_thread_proxy_, |
file_system_context_) |
)->GetMetadata(request_->url()); |