Chromium Code Reviews| Index: content/browser/appcache/appcache_disk_cache.cc |
| diff --git a/content/browser/appcache/appcache_disk_cache.cc b/content/browser/appcache/appcache_disk_cache.cc |
| index 382ed45fed2197ae8be5b861e1f310d18a118694..79efd83887941a68d4eb5d00ce1b621e1f5874bb 100644 |
| --- a/content/browser/appcache/appcache_disk_cache.cc |
| +++ b/content/browser/appcache/appcache_disk_cache.cc |
| @@ -119,14 +119,15 @@ class AppCacheDiskCache::ActiveCall { |
| explicit ActiveCall(AppCacheDiskCache* owner) |
| : entry_(NULL), |
| owner_(owner), |
| - entry_ptr_(NULL) { |
| + entry_ptr_(NULL), |
| + weak_factory_(this) { |
| } |
| int CreateEntry(int64 key, Entry** entry, |
| const net::CompletionCallback& callback) { |
| int rv = owner_->disk_cache()->CreateEntry( |
| base::Int64ToString(key), &entry_ptr_, |
| - base::Bind(&ActiveCall::OnAsyncCompletion, base::Unretained(this))); |
| + base::Bind(&ActiveCall::OnAsyncCompletion, weak_factory_.GetWeakPtr())); |
|
michaeln
2015/05/14 02:25:01
I remember there being a difference in behavior be
nhiroki
2015/05/14 04:27:05
I haven't had an absolute proof yet, but it seems
|
| return HandleImmediateReturnValue(rv, entry, callback); |
| } |
| @@ -134,17 +135,22 @@ class AppCacheDiskCache::ActiveCall { |
| const net::CompletionCallback& callback) { |
| int rv = owner_->disk_cache()->OpenEntry( |
| base::Int64ToString(key), &entry_ptr_, |
| - base::Bind(&ActiveCall::OnAsyncCompletion, base::Unretained(this))); |
| + base::Bind(&ActiveCall::OnAsyncCompletion, weak_factory_.GetWeakPtr())); |
| return HandleImmediateReturnValue(rv, entry, callback); |
| } |
| int DoomEntry(int64 key, const net::CompletionCallback& callback) { |
| int rv = owner_->disk_cache()->DoomEntry( |
| base::Int64ToString(key), |
| - base::Bind(&ActiveCall::OnAsyncCompletion, base::Unretained(this))); |
| + base::Bind(&ActiveCall::OnAsyncCompletion, weak_factory_.GetWeakPtr())); |
| return HandleImmediateReturnValue(rv, NULL, callback); |
| } |
| + void Abort() { |
| + callback_.Run(net::ERR_ABORTED); |
| + delete this; |
| + } |
| + |
| private: |
| int HandleImmediateReturnValue(int rv, Entry** entry, |
| const net::CompletionCallback& callback) { |
| @@ -166,7 +172,6 @@ class AppCacheDiskCache::ActiveCall { |
| if (rv == net::OK && entry_) |
| *entry_ = new EntryImpl(entry_ptr_, owner_); |
| callback_.Run(rv); |
| - callback_.Reset(); |
| delete this; |
| } |
| @@ -174,6 +179,8 @@ class AppCacheDiskCache::ActiveCall { |
| net::CompletionCallback callback_; |
| AppCacheDiskCache* owner_; |
| disk_cache::Entry* entry_ptr_; |
| + |
| + base::WeakPtrFactory<AppCacheDiskCache::ActiveCall> weak_factory_; |
| }; |
| AppCacheDiskCache::AppCacheDiskCache() |
| @@ -225,7 +232,10 @@ void AppCacheDiskCache::Disable() { |
| } |
| open_entries_.clear(); |
| disk_cache_.reset(); |
| - STLDeleteElements(&active_calls_); |
| + |
| + for (AppCacheDiskCache::ActiveCall* active_call : active_calls_) |
| + active_call->Abort(); |
| + active_calls_.clear(); |
| } |
| int AppCacheDiskCache::CreateEntry(int64 key, Entry** entry, |