Index: ios/net/cookies/cookie_store_ios.mm |
diff --git a/ios/net/cookies/cookie_store_ios.mm b/ios/net/cookies/cookie_store_ios.mm |
index 8be649ae81d9ef0b9cd7166fb3e564fdbc7faa05..2d3ebdac9f6dfc07d9b737640829253c5bcf79a3 100644 |
--- a/ios/net/cookies/cookie_store_ios.mm |
+++ b/ios/net/cookies/cookie_store_ios.mm |
@@ -292,20 +292,27 @@ CookieStoreIOS::CookieStoreIOS( |
CookieStoreIOS::CookieStoreIOS( |
net::CookieMonster::PersistentCookieStore* persistent_store, |
NSHTTPCookieStorage* system_store) |
- : system_store_(system_store), |
+ : cookie_monster_(new net::CookieMonster(persistent_store, nullptr)), |
+ system_store_(system_store), |
creation_time_manager_(new CookieCreationTimeManager), |
metrics_enabled_(false), |
flush_delay_(base::TimeDelta::FromSeconds(10)), |
synchronization_state_(NOT_SYNCHRONIZED), |
- cookie_cache_(new CookieCache()) { |
+ cookie_cache_(new CookieCache()), |
+ weak_factory_(this) { |
DCHECK(system_store); |
NotificationTrampoline::GetInstance()->AddObserver(this); |
- cookie_monster_ = new net::CookieMonster(persistent_store, nullptr); |
+ |
cookie_monster_->SetPersistSessionCookies(true); |
cookie_monster_->SetForceKeepSessionState(); |
} |
+CookieStoreIOS::~CookieStoreIOS() { |
+ NotificationTrampoline::GetInstance()->RemoveObserver(this); |
+ STLDeleteContainerPairSecondPointers(hook_map_.begin(), hook_map_.end()); |
+} |
+ |
// static |
void CookieStoreIOS::SetCookiePolicy(CookiePolicy setting) { |
NSHTTPCookieAcceptPolicy policy = (setting == ALLOW) |
@@ -320,7 +327,7 @@ void CookieStoreIOS::SetCookiePolicy(CookiePolicy setting) { |
} |
// static |
-CookieStoreIOS* CookieStoreIOS::CreateCookieStore( |
+scoped_ptr<CookieStoreIOS> CookieStoreIOS::CreateCookieStore( |
NSHTTPCookieStorage* cookie_storage) { |
DCHECK(cookie_storage); |
// TODO(huey): Update this when CrNet supports multiple cookie jars. |
@@ -328,7 +335,8 @@ CookieStoreIOS* CookieStoreIOS::CreateCookieStore( |
// Create a cookie store with no persistent store backing. Then, populate |
// it from the system's cookie jar. |
- CookieStoreIOS* cookie_store = new CookieStoreIOS(nullptr, cookie_storage); |
+ scoped_ptr<CookieStoreIOS> cookie_store( |
+ new CookieStoreIOS(nullptr, cookie_storage)); |
cookie_store->synchronization_state_ = SYNCHRONIZED; |
cookie_store->FlushStore(base::Closure()); |
return cookie_store; |
@@ -378,8 +386,9 @@ void CookieStoreIOS::SetCookieWithOptionsAsync( |
break; |
case SYNCHRONIZING: |
tasks_pending_synchronization_.push_back( |
- base::Bind(&CookieStoreIOS::SetCookieWithOptionsAsync, this, url, |
- cookie_line, options, WrapSetCallback(callback))); |
+ base::Bind(&CookieStoreIOS::SetCookieWithOptionsAsync, |
+ weak_factory_.GetWeakPtr(), url, cookie_line, options, |
+ WrapSetCallback(callback))); |
break; |
case SYNCHRONIZED: |
// The exclude_httponly() option would only be used by a javascript |
@@ -454,11 +463,12 @@ void CookieStoreIOS::SetCookieWithDetailsAsync( |
priority, WrapSetCallback(callback)); |
break; |
case SYNCHRONIZING: |
- tasks_pending_synchronization_.push_back(base::Bind( |
- &CookieStoreIOS::SetCookieWithDetailsAsync, this, url, name, value, |
- domain, path, creation_time, expiration_time, last_access_time, |
- secure, http_only, same_site, enforce_strict_secure, priority, |
- WrapSetCallback(callback))); |
+ tasks_pending_synchronization_.push_back( |
+ base::Bind(&CookieStoreIOS::SetCookieWithDetailsAsync, |
+ weak_factory_.GetWeakPtr(), url, name, value, domain, path, |
+ creation_time, expiration_time, last_access_time, secure, |
+ http_only, same_site, enforce_strict_secure, priority, |
+ WrapSetCallback(callback))); |
break; |
case SYNCHRONIZED: |
// If cookies are not allowed, they are stashed in the CookieMonster, and |
@@ -509,8 +519,8 @@ void CookieStoreIOS::GetCookiesWithOptionsAsync( |
break; |
case SYNCHRONIZING: |
tasks_pending_synchronization_.push_back( |
- base::Bind(&CookieStoreIOS::GetCookiesWithOptionsAsync, this, url, |
- options, callback)); |
+ base::Bind(&CookieStoreIOS::GetCookiesWithOptionsAsync, |
+ weak_factory_.GetWeakPtr(), url, options, callback)); |
break; |
case SYNCHRONIZED: |
// If cookies are not allowed, they are stashed in the CookieMonster, and |
@@ -542,8 +552,8 @@ void CookieStoreIOS::GetCookieListWithOptionsAsync( |
break; |
case SYNCHRONIZING: |
tasks_pending_synchronization_.push_back( |
- base::Bind(&CookieStoreIOS::GetCookieListWithOptionsAsync, this, url, |
- options, callback)); |
+ base::Bind(&CookieStoreIOS::GetCookieListWithOptionsAsync, |
+ weak_factory_.GetWeakPtr(), url, options, callback)); |
break; |
case SYNCHRONIZED: |
if (!SystemCookiesAllowed()) { |
@@ -573,8 +583,9 @@ void CookieStoreIOS::GetAllCookiesAsync(const GetCookieListCallback& callback) { |
cookie_monster_->GetAllCookiesAsync(callback); |
break; |
case SYNCHRONIZING: |
- tasks_pending_synchronization_.push_back(base::Bind( |
- &CookieStoreIOS::GetAllCookiesAsync, this, callback)); |
+ tasks_pending_synchronization_.push_back( |
+ base::Bind(&CookieStoreIOS::GetAllCookiesAsync, |
+ weak_factory_.GetWeakPtr(), callback)); |
break; |
case SYNCHRONIZED: |
if (!SystemCookiesAllowed()) { |
@@ -606,9 +617,9 @@ void CookieStoreIOS::DeleteCookieAsync(const GURL& url, |
WrapClosure(callback)); |
break; |
case SYNCHRONIZING: |
- tasks_pending_synchronization_.push_back( |
- base::Bind(&CookieStoreIOS::DeleteCookieAsync, this, url, cookie_name, |
- WrapClosure(callback))); |
+ tasks_pending_synchronization_.push_back(base::Bind( |
+ &CookieStoreIOS::DeleteCookieAsync, weak_factory_.GetWeakPtr(), url, |
+ cookie_name, WrapClosure(callback))); |
break; |
case SYNCHRONIZED: |
NSArray* cookies = GetCookiesForURL(system_store_, |
@@ -637,9 +648,9 @@ void CookieStoreIOS::DeleteCanonicalCookieAsync( |
WrapDeleteCallback(callback)); |
break; |
case SYNCHRONIZING: |
- tasks_pending_synchronization_.push_back( |
- base::Bind(&CookieStoreIOS::DeleteCanonicalCookieAsync, this, cookie, |
- WrapDeleteCallback(callback))); |
+ tasks_pending_synchronization_.push_back(base::Bind( |
+ &CookieStoreIOS::DeleteCanonicalCookieAsync, |
+ weak_factory_.GetWeakPtr(), cookie, WrapDeleteCallback(callback))); |
break; |
case SYNCHRONIZED: |
// This relies on the fact cookies are given unique creation dates. |
@@ -665,8 +676,9 @@ void CookieStoreIOS::DeleteAllCreatedBetweenAsync( |
break; |
case SYNCHRONIZING: |
tasks_pending_synchronization_.push_back( |
- base::Bind(&CookieStoreIOS::DeleteAllCreatedBetweenAsync, this, |
- delete_begin, delete_end, WrapDeleteCallback(callback))); |
+ base::Bind(&CookieStoreIOS::DeleteAllCreatedBetweenAsync, |
+ weak_factory_.GetWeakPtr(), delete_begin, delete_end, |
+ WrapDeleteCallback(callback))); |
break; |
case SYNCHRONIZED: |
CookieFilterFunction filter = |
@@ -692,9 +704,10 @@ void CookieStoreIOS::DeleteAllCreatedBetweenForHostAsync( |
delete_begin, delete_end, url, WrapDeleteCallback(callback)); |
break; |
case SYNCHRONIZING: |
- tasks_pending_synchronization_.push_back(base::Bind( |
- &CookieStoreIOS::DeleteAllCreatedBetweenForHostAsync, this, |
- delete_begin, delete_end, url, WrapDeleteCallback(callback))); |
+ tasks_pending_synchronization_.push_back( |
+ base::Bind(&CookieStoreIOS::DeleteAllCreatedBetweenForHostAsync, |
+ weak_factory_.GetWeakPtr(), delete_begin, delete_end, url, |
+ WrapDeleteCallback(callback))); |
break; |
case SYNCHRONIZED: |
NSString* host = base::SysUTF8ToNSString(url.host()); |
@@ -717,8 +730,8 @@ void CookieStoreIOS::DeleteSessionCookiesAsync(const DeleteCallback& callback) { |
break; |
case SYNCHRONIZING: |
tasks_pending_synchronization_.push_back( |
- base::Bind(&CookieStoreIOS::DeleteSessionCookiesAsync, this, |
- WrapDeleteCallback(callback))); |
+ base::Bind(&CookieStoreIOS::DeleteSessionCookiesAsync, |
+ weak_factory_.GetWeakPtr(), WrapDeleteCallback(callback))); |
break; |
case SYNCHRONIZED: |
CookieFilterFunction filter = base::Bind(&IsCookieSessionCookie); |
@@ -740,14 +753,6 @@ void CookieStoreIOS::FlushStore(const base::Closure& closure) { |
} |
#pragma mark - |
-#pragma mark Protected methods |
- |
-CookieStoreIOS::~CookieStoreIOS() { |
- NotificationTrampoline::GetInstance()->RemoveObserver(this); |
- STLDeleteContainerPairSecondPointers(hook_map_.begin(), hook_map_.end()); |
-} |
- |
-#pragma mark - |
#pragma mark Private methods |
void CookieStoreIOS::ClearSystemStore() { |
@@ -777,8 +782,8 @@ void CookieStoreIOS::OnSystemCookiePolicyChanged() { |
DCHECK(![[system_store_ cookies] count]); |
DCHECK(synchronization_state_ != SYNCHRONIZING); |
synchronization_state_ = SYNCHRONIZING; |
- cookie_monster_->GetAllCookiesAsync( |
- base::Bind(&CookieStoreIOS::AddCookiesToSystemStore, this)); |
+ cookie_monster_->GetAllCookiesAsync(base::Bind( |
+ &CookieStoreIOS::AddCookiesToSystemStore, weak_factory_.GetWeakPtr())); |
} else { |
DCHECK_EQ(NSHTTPCookieAcceptPolicyNever, policy); |
// FlushStore() does not write the cookies to disk when they are disabled. |
@@ -832,7 +837,8 @@ void CookieStoreIOS::SetSynchronizedWithSystemStore(bool synchronized) { |
synchronization_state_ = SYNCHRONIZING; |
ClearSystemStore(); |
cookie_monster_->GetAllCookiesAsync( |
- base::Bind(&CookieStoreIOS::AddCookiesToSystemStore, this)); |
+ base::Bind(&CookieStoreIOS::AddCookiesToSystemStore, |
+ weak_factory_.GetWeakPtr())); |
return; |
} else { |
// Copy the cookies from the global store to |cookie_monster_|. |
@@ -970,7 +976,7 @@ void CookieStoreIOS::OnSystemCookiesChanged() { |
return; |
flush_closure_.Reset(base::Bind(&CookieStoreIOS::FlushStore, |
- base::Unretained(this), base::Closure())); |
+ weak_factory_.GetWeakPtr(), base::Closure())); |
base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
FROM_HERE, flush_closure_.callback(), flush_delay_); |
} |
@@ -1065,8 +1071,9 @@ void CookieStoreIOS::DidClearNSHTTPCookieStorageCookies( |
DCHECK(client); |
auto sequenced_task_runner = client->GetTaskRunner(); |
DCHECK(sequenced_task_runner); |
- auto callback = base::Bind(&CookieStoreIOS::DidClearBinaryCookiesFileCookies, |
- this, delete_callback, num_deleted); |
+ auto callback = |
+ base::Bind(&CookieStoreIOS::DidClearBinaryCookiesFileCookies, |
+ weak_factory_.GetWeakPtr(), delete_callback, num_deleted); |
sequenced_task_runner.get()->PostTaskAndReply( |
FROM_HERE, base::Bind(&ClearAllCookiesFromBinaryCookiesFile), callback); |
} |
@@ -1087,8 +1094,8 @@ void CookieStoreIOS::UpdateCachesFromCookieMonster() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
for (const auto& hook_map_entry : hook_map_) { |
std::pair<GURL, std::string> key = hook_map_entry.first; |
- GetCookieListCallback callback = |
- base::Bind(&CookieStoreIOS::GotCookieListFor, this, key); |
+ GetCookieListCallback callback = base::Bind( |
+ &CookieStoreIOS::GotCookieListFor, weak_factory_.GetWeakPtr(), key); |
cookie_monster_->GetAllCookiesForURLAsync(key.first, callback); |
} |
} |
@@ -1131,18 +1138,21 @@ CookieStoreIOS::CanonicalCookieListFromSystemCookies(NSArray* cookies) { |
CookieStoreIOS::SetCookiesCallback CookieStoreIOS::WrapSetCallback( |
const SetCookiesCallback& callback) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- return base::Bind(&CookieStoreIOS::UpdateCachesAfterSet, this, callback); |
+ return base::Bind(&CookieStoreIOS::UpdateCachesAfterSet, |
+ weak_factory_.GetWeakPtr(), callback); |
} |
CookieStoreIOS::DeleteCallback CookieStoreIOS::WrapDeleteCallback( |
const DeleteCallback& callback) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- return base::Bind(&CookieStoreIOS::UpdateCachesAfterDelete, this, callback); |
+ return base::Bind(&CookieStoreIOS::UpdateCachesAfterDelete, |
+ weak_factory_.GetWeakPtr(), callback); |
} |
base::Closure CookieStoreIOS::WrapClosure(const base::Closure& callback) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- return base::Bind(&CookieStoreIOS::UpdateCachesAfterClosure, this, callback); |
+ return base::Bind(&CookieStoreIOS::UpdateCachesAfterClosure, |
+ weak_factory_.GetWeakPtr(), callback); |
} |
} // namespace net |