Chromium Code Reviews| Index: chrome/browser/sessions/session_data_deleter.cc |
| diff --git a/chrome/browser/sessions/session_data_deleter.cc b/chrome/browser/sessions/session_data_deleter.cc |
| index acbec24b534fb66803cbf143a55365a72a121a7e..96b31839a110915fe9cafa99f5fdaa0c054e94e2 100644 |
| --- a/chrome/browser/sessions/session_data_deleter.cc |
| +++ b/chrome/browser/sessions/session_data_deleter.cc |
| @@ -11,7 +11,7 @@ |
| #include "build/build_config.h" |
| #include "chrome/browser/browser_shutdown.h" |
| #include "chrome/browser/prefs/session_startup_pref.h" |
| -#include "chrome/browser/profiles/profile_io_data.h" |
| +#include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/ui/startup/startup_browser_creator.h" |
| #include "content/public/browser/browser_context.h" |
| #include "content/public/browser/browser_thread.h" |
| @@ -21,6 +21,7 @@ |
| #include "net/cookies/cookie_store.h" |
| #include "net/cookies/cookie_util.h" |
| #include "net/url_request/url_request_context.h" |
| +#include "net/url_request/url_request_context_getter.h" |
| #include "storage/browser/quota/special_storage_policy.h" |
| namespace { |
| @@ -35,8 +36,9 @@ class SessionDataDeleter |
| SessionDataDeleter(storage::SpecialStoragePolicy* storage_policy, |
| bool delete_only_by_session_only_policy); |
| - void Run(content::StoragePartition* storage_partition, |
| - ProfileIOData* profile_io_data); |
| + void Run( |
| + content::StoragePartition* storage_partition, |
| + scoped_refptr<net::URLRequestContextGetter> url_request_context_getter); |
| private: |
| friend class base::RefCountedThreadSafe<SessionDataDeleter>; |
| @@ -52,16 +54,18 @@ class SessionDataDeleter |
| // |delete_only_by_session_only_policy_| is false. Once completed or skipped, |
| // this arranges for DeleteSessionOnlyOriginCookies to be called with a list |
| // of all remaining cookies. |
| - void DeleteSessionCookiesOnIOThread(ProfileIOData* profile_io_data); |
| + void DeleteSessionCookiesOnIOThread( |
| + scoped_refptr<net::URLRequestContextGetter> url_request_context_getter); |
| // Called when all session-only cookies have been deleted. |
| - void DeleteSessionCookiesDone(int num_deleted); |
| + void DeleteSessionCookiesDone(net::CookieStore* cookie_store, |
| + int num_deleted); |
| // Deletes the cookies in |cookies| that are for origins which are |
| // session-only. |
| - void DeleteSessionOnlyOriginCookies(const net::CookieList& cookies); |
| + void DeleteSessionOnlyOriginCookies(net::CookieStore* cookie_store, |
| + const net::CookieList& cookies); |
| - scoped_refptr<net::CookieStore> cookie_store_; |
| scoped_refptr<storage::SpecialStoragePolicy> storage_policy_; |
| const bool delete_only_by_session_only_policy_; |
| @@ -75,8 +79,9 @@ SessionDataDeleter::SessionDataDeleter( |
| delete_only_by_session_only_policy_(delete_only_by_session_only_policy) { |
| } |
| -void SessionDataDeleter::Run(content::StoragePartition* storage_partition, |
| - ProfileIOData* profile_io_data) { |
| +void SessionDataDeleter::Run( |
| + content::StoragePartition* storage_partition, |
| + scoped_refptr<net::URLRequestContextGetter> url_request_context_getter) { |
| if (storage_policy_.get() && storage_policy_->HasSessionOnlyOrigins()) { |
| storage_partition->GetDOMStorageContext()->GetLocalStorageUsage( |
| base::Bind(&SessionDataDeleter::ClearSessionOnlyLocalStorage, |
| @@ -84,11 +89,9 @@ void SessionDataDeleter::Run(content::StoragePartition* storage_partition, |
| storage_partition)); |
| } |
| content::BrowserThread::PostTask( |
| - content::BrowserThread::IO, |
| - FROM_HERE, |
| - base::Bind(&SessionDataDeleter::DeleteSessionCookiesOnIOThread, |
| - this, |
| - profile_io_data)); |
| + content::BrowserThread::IO, FROM_HERE, |
| + base::Bind(&SessionDataDeleter::DeleteSessionCookiesOnIOThread, this, |
| + url_request_context_getter)); |
| } |
| SessionDataDeleter::~SessionDataDeleter() {} |
| @@ -107,38 +110,50 @@ void SessionDataDeleter::ClearSessionOnlyLocalStorage( |
| } |
| void SessionDataDeleter::DeleteSessionCookiesOnIOThread( |
| - ProfileIOData* profile_io_data) { |
| + scoped_refptr<net::URLRequestContextGetter> url_request_context_getter) { |
| DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| net::URLRequestContext* request_context = |
| - profile_io_data->GetMainRequestContext(); |
| - cookie_store_ = request_context->cookie_store(); |
| + url_request_context_getter->GetURLRequestContext(); |
| + // Shouldn't happen, but best not to depend on the URLRequestContext's |
| + // lifetime |
| + if (!request_context) |
| + return; |
| + net::CookieStore* cookie_store = request_context->cookie_store(); |
| + // If these callbacks are invoked, |cookie_store| is gauranteed to still |
| + // exist, since deleting the CookieStore will cancel pending callbacks. |
| if (delete_only_by_session_only_policy_) { |
| - cookie_store_->GetAllCookiesAsync( |
| - base::Bind(&SessionDataDeleter::DeleteSessionOnlyOriginCookies, this)); |
| + cookie_store->GetAllCookiesAsync( |
| + base::Bind(&SessionDataDeleter::DeleteSessionOnlyOriginCookies, this, |
| + base::Unretained(cookie_store))); |
| } else { |
| - cookie_store_->DeleteSessionCookiesAsync( |
| - base::Bind(&SessionDataDeleter::DeleteSessionCookiesDone, this)); |
| + cookie_store->DeleteSessionCookiesAsync( |
| + base::Bind(&SessionDataDeleter::DeleteSessionCookiesDone, this, |
| + base::Unretained(cookie_store))); |
| } |
| } |
| -void SessionDataDeleter::DeleteSessionCookiesDone(int num_deleted) { |
| - cookie_store_->GetAllCookiesAsync( |
| - base::Bind(&SessionDataDeleter::DeleteSessionOnlyOriginCookies, this)); |
| +void SessionDataDeleter::DeleteSessionCookiesDone( |
| + net::CookieStore* cookie_store, |
| + int num_deleted) { |
| + // If these callbacks are invoked, |cookie_store| is gauranteed to still |
|
Randy Smith (Not in Mondays)
2016/02/29 22:37:45
nit: "guaranteed".
mmenke
2016/02/29 23:00:29
Done.
|
| + // exist, since deleting the CookieStore will cancel pending callbacks. |
| + cookie_store->GetAllCookiesAsync( |
| + base::Bind(&SessionDataDeleter::DeleteSessionOnlyOriginCookies, this, |
| + base::Unretained(cookie_store))); |
| } |
| void SessionDataDeleter::DeleteSessionOnlyOriginCookies( |
| + net::CookieStore* cookie_store, |
| const net::CookieList& cookies) { |
| if (!storage_policy_.get() || !storage_policy_->HasSessionOnlyOrigins()) |
| return; |
| - for (net::CookieList::const_iterator it = cookies.begin(); |
| - it != cookies.end(); |
| - ++it) { |
| + for (const auto& cookie : cookies) { |
| GURL url = |
| - net::cookie_util::CookieOriginToURL(it->Domain(), it->IsSecure()); |
| + net::cookie_util::CookieOriginToURL(cookie.Domain(), cookie.IsSecure()); |
| if (!storage_policy_->IsStorageSessionOnly(url)) |
| continue; |
| - cookie_store_->DeleteCanonicalCookieAsync(*it, base::Bind(CookieDeleted)); |
| + cookie_store->DeleteCanonicalCookieAsync(cookie, base::Bind(CookieDeleted)); |
| } |
| } |
| @@ -163,7 +178,6 @@ void DeleteSessionOnlyData(Profile* profile) { |
| scoped_refptr<SessionDataDeleter> deleter( |
| new SessionDataDeleter(profile->GetSpecialStoragePolicy(), |
| startup_pref_type == SessionStartupPref::LAST)); |
| - deleter->Run( |
| - Profile::GetDefaultStoragePartition(profile), |
| - ProfileIOData::FromResourceContext(profile->GetResourceContext())); |
| + deleter->Run(Profile::GetDefaultStoragePartition(profile), |
| + profile->GetRequestContext()); |
| } |