Index: chrome/browser/chromeos/login/profile_auth_data.cc |
diff --git a/chrome/browser/chromeos/login/profile_auth_data.cc b/chrome/browser/chromeos/login/profile_auth_data.cc |
index ab79b03c6fa01ddcc84f69e4c30dbfc2eecb2556..e83d94515e989978f278b8a363622c7e38649306 100644 |
--- a/chrome/browser/chromeos/login/profile_auth_data.cc |
+++ b/chrome/browser/chromeos/login/profile_auth_data.cc |
@@ -22,127 +22,189 @@ namespace chromeos { |
namespace { |
-// Callback for transferring |cookies_to_transfer| into |cookie_monster| if |
-// its jar is completely empty. |
-void OnTransferCookiesIfEmptyJar( |
- net::CookieMonster* cookie_monster, |
- const net::CookieList& cookies_to_transfer, |
- const base::Callback<void()>& cookies_transfered_callback, |
- const net::CookieList& cookies_in_jar) { |
- std::string sid; |
- std::string lsid; |
- // Transfer only if the existing cookie jar is empty. |
- if (!cookies_in_jar.size()) |
- cookie_monster->InitializeFrom(cookies_to_transfer); |
+class ProfileAuthDataTransferer { |
+ public: |
+ ProfileAuthDataTransferer( |
+ Profile* from_profile, |
+ Profile* to_profile, |
+ bool transfer_cookies, |
+ const base::Closure& completion_callback); |
+ |
+ void BeginTransfer(); |
+ |
+ private: |
+ void BeginTransferOnIOThread(); |
+ void MaybeDoCookieAndCertTransfer(); |
+ void Finish(); |
+ |
+ void OnTransferCookiesIfEmptyJar(const net::CookieList& cookies_in_jar); |
+ void OnGetCookiesToTransfer(const net::CookieList& cookies_to_transfer); |
+ void RetrieveDefaultCookies(); |
+ void OnGetServerBoundCertsToTransfer( |
+ const net::ServerBoundCertStore::ServerBoundCertList& certs); |
+ void RetrieveDefaultServerBoundCerts(); |
+ void TransferDefaultAuthCache(); |
+ |
+ scoped_refptr<net::URLRequestContextGetter> from_context_; |
+ scoped_refptr<net::URLRequestContextGetter> to_context_; |
+ bool transfer_cookies_; |
+ base::Closure completion_callback_; |
+ |
+ net::CookieList cookies_to_transfer_; |
+ net::ServerBoundCertStore::ServerBoundCertList certs_to_transfer_; |
+ |
+ bool got_cookies_; |
+ bool got_server_bound_certs_; |
+}; |
+ |
+ProfileAuthDataTransferer::ProfileAuthDataTransferer( |
+ Profile* from_profile, |
+ Profile* to_profile, |
+ bool transfer_cookies, |
+ const base::Closure& completion_callback) |
+ : from_context_(from_profile->GetRequestContext()), |
+ to_context_(to_profile->GetRequestContext()), |
+ transfer_cookies_(transfer_cookies), |
+ completion_callback_(completion_callback), |
+ got_cookies_(false), |
+ got_server_bound_certs_(false) { |
+} |
+void ProfileAuthDataTransferer::BeginTransfer() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ // If we aren't transferring cookies, post the completion callback |
+ // immediately. Otherwise, it will be called when both cookies and channel |
+ // ids are finished transferring. |
+ if (!transfer_cookies_) { |
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, completion_callback_); |
+ // Null the callback so that when Finish is called the callback won't be |
+ // called again. |
+ completion_callback_.Reset(); |
+ } |
BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, cookies_transfered_callback); |
- return; |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind(&ProfileAuthDataTransferer::BeginTransferOnIOThread, |
+ base::Unretained(this))); |
} |
-// Callback for receiving |cookies_to_transfer| from the authentication profile |
-// cookie jar. |
-void OnGetCookiesToTransfer( |
- net::CookieMonster* cookie_monster, |
- const base::Callback<void()>& cookies_transfered_callback, |
- const net::CookieList& cookies_to_transfer) { |
+void ProfileAuthDataTransferer::BeginTransferOnIOThread() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ TransferDefaultAuthCache(); |
+ |
+ if (transfer_cookies_) { |
+ RetrieveDefaultCookies(); |
+ RetrieveDefaultServerBoundCerts(); |
+ } else { |
+ Finish(); |
+ } |
+} |
+ |
+// If both cookies and server bound certs have been retrieved, see if we need to |
+// do the actual transfer. |
+void ProfileAuthDataTransferer::MaybeDoCookieAndCertTransfer() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ if (!(got_cookies_ && got_server_bound_certs_)) |
+ return; |
// Nothing to transfer over? |
- if (!cookies_to_transfer.size()) { |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, cookies_transfered_callback); |
+ if (!cookies_to_transfer_.size()) { |
+ Finish(); |
return; |
} |
+ |
// Now let's see if the target cookie monster's jar is even empty. |
- cookie_monster->GetAllCookiesAsync( |
- base::Bind(&OnTransferCookiesIfEmptyJar, |
- make_scoped_refptr(cookie_monster), |
- cookies_to_transfer, |
- cookies_transfered_callback)); |
+ net::CookieStore* to_store = |
+ to_context_->GetURLRequestContext()->cookie_store(); |
+ net::CookieMonster* to_monster = to_store->GetCookieMonster(); |
+ to_monster->GetAllCookiesAsync( |
+ base::Bind(&ProfileAuthDataTransferer::OnTransferCookiesIfEmptyJar, |
+ base::Unretained(this))); |
} |
-// Transfers initial set of Profile cookies from the |from_context| to cookie |
-// jar of |to_context|. |
-void TransferDefaultCookiesOnIOThread( |
- net::URLRequestContextGetter* from_context, |
- net::URLRequestContextGetter* to_context, |
- const base::Callback<void()>& cookies_transfered_callback) { |
+// Post the |completion_callback_| and delete ourself. |
+void ProfileAuthDataTransferer::Finish() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- net::CookieStore* to_store = |
- to_context->GetURLRequestContext()->cookie_store(); |
- net::CookieMonster* to_monster = to_store->GetCookieMonster(); |
+ if (!completion_callback_.is_null()) |
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, completion_callback_); |
+ delete this; |
+} |
- net::CookieStore* from_store = |
- from_context->GetURLRequestContext()->cookie_store(); |
- net::CookieMonster* from_monster = from_store->GetCookieMonster(); |
- from_monster->SetKeepExpiredCookies(); |
- from_monster->GetAllCookiesAsync(base::Bind(&OnGetCookiesToTransfer, |
- make_scoped_refptr(to_monster), |
- cookies_transfered_callback)); |
+// Callback for transferring |cookies_to_transfer_| into |to_context_|'s |
+// CookieMonster if its jar is completely empty. If authentication was |
+// performed by an extension, then the set of cookies that was acquired through |
+// such that process will be automatically transfered into the profile. |
+void ProfileAuthDataTransferer::OnTransferCookiesIfEmptyJar( |
+ const net::CookieList& cookies_in_jar) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ // Transfer only if the existing cookie jar is empty. |
+ if (!cookies_in_jar.size()) { |
+ net::CookieStore* to_store = |
+ to_context_->GetURLRequestContext()->cookie_store(); |
+ net::CookieMonster* to_monster = to_store->GetCookieMonster(); |
+ to_monster->InitializeFrom(cookies_to_transfer_); |
+ |
+ net::ServerBoundCertService* to_cert_service = |
+ to_context_->GetURLRequestContext()->server_bound_cert_service(); |
+ to_cert_service->GetCertStore()->InitializeFrom(certs_to_transfer_); |
+ } |
+ |
+ Finish(); |
} |
-// Transfers default server bound certs of |from_context| to server bound certs |
-// storage of |to_context|. |
-void TransferDefaultServerBoundCertsIOThread( |
- net::URLRequestContextGetter* from_context, |
- net::URLRequestContextGetter* to_context) { |
+// Callback for receiving |cookies_to_transfer| from the authentication profile |
+// cookie jar. |
+void ProfileAuthDataTransferer::OnGetCookiesToTransfer( |
+ const net::CookieList& cookies_to_transfer) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- net::ServerBoundCertService* default_service = |
- from_context->GetURLRequestContext()->server_bound_cert_service(); |
- net::ServerBoundCertStore::ServerBoundCertList server_bound_certs; |
- default_service->GetCertStore()->GetAllServerBoundCerts(&server_bound_certs); |
+ got_cookies_ = true; |
+ MaybeDoCookieAndCertTransfer(); |
+} |
+ |
+// Retrieves initial set of Profile cookies from the |from_context_|. |
+void ProfileAuthDataTransferer::RetrieveDefaultCookies() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- net::ServerBoundCertService* new_service = |
- to_context->GetURLRequestContext()->server_bound_cert_service(); |
- new_service->GetCertStore()->InitializeFrom(server_bound_certs); |
+ net::CookieStore* from_store = |
+ from_context_->GetURLRequestContext()->cookie_store(); |
+ net::CookieMonster* from_monster = from_store->GetCookieMonster(); |
+ from_monster->SetKeepExpiredCookies(); |
+ from_monster->GetAllCookiesAsync( |
+ base::Bind(&ProfileAuthDataTransferer::OnGetCookiesToTransfer, |
+ base::Unretained(this))); |
} |
-// Transfers default auth cache of |from_context| to auth cache storage of |
-// |to_context|. |
-void TransferDefaultAuthCacheOnIOThread( |
- net::URLRequestContextGetter* from_context, |
- net::URLRequestContextGetter* to_context) { |
+// Callback for receiving |cookies_to_transfer| from the authentication profile |
+// cookie jar. |
+void ProfileAuthDataTransferer::OnGetServerBoundCertsToTransfer( |
+ const net::ServerBoundCertStore::ServerBoundCertList& certs) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- net::HttpAuthCache* new_cache = to_context->GetURLRequestContext()-> |
- http_transaction_factory()->GetSession()->http_auth_cache(); |
- new_cache->UpdateAllFrom(*from_context->GetURLRequestContext()-> |
- http_transaction_factory()->GetSession()->http_auth_cache()); |
+ certs_to_transfer_ = certs; |
+ got_server_bound_certs_ = true; |
+ MaybeDoCookieAndCertTransfer(); |
} |
-// Transfers cookies and server bound certs from the |from_profile| into |
-// the |to_profile|. If authentication was performed by an extension, then |
-// the set of cookies that was acquired through such that process will be |
-// automatically transfered into the profile. |
-void TransferDefaultCookiesAndServerBoundCerts( |
- Profile* from_profile, |
- Profile* to_profile, |
- const base::Callback<void()>& cookies_transfered_callback) { |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&TransferDefaultCookiesOnIOThread, |
- make_scoped_refptr(from_profile->GetRequestContext()), |
- make_scoped_refptr(to_profile->GetRequestContext()), |
- cookies_transfered_callback)); |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&TransferDefaultServerBoundCertsIOThread, |
- make_scoped_refptr(from_profile->GetRequestContext()), |
- make_scoped_refptr(to_profile->GetRequestContext()))); |
+// Retrieves server bound certs of |from_context_|. |
+void ProfileAuthDataTransferer::RetrieveDefaultServerBoundCerts() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ net::ServerBoundCertService* from_service = |
+ from_context_->GetURLRequestContext()->server_bound_cert_service(); |
+ |
+ from_service->GetCertStore()->GetAllServerBoundCerts( |
+ base::Bind(&ProfileAuthDataTransferer::OnGetServerBoundCertsToTransfer, |
+ base::Unretained(this))); |
} |
-// Transfers HTTP authentication cache from the |from_profile| |
-// into the |to_profile|. If user was required to authenticate with a proxy |
+// Transfers HTTP authentication cache from the |from_context_| |
+// into the |to_context_|. If user was required to authenticate with a proxy |
// during the login, this authentication information will be transferred |
// into the new session. |
-void TransferDefaultAuthCache(Profile* from_profile, |
- Profile* to_profile) { |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&TransferDefaultAuthCacheOnIOThread, |
- make_scoped_refptr(from_profile->GetRequestContext()), |
- make_scoped_refptr(to_profile->GetRequestContext()))); |
+void ProfileAuthDataTransferer::TransferDefaultAuthCache() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ net::HttpAuthCache* new_cache = to_context_->GetURLRequestContext()-> |
+ http_transaction_factory()->GetSession()->http_auth_cache(); |
+ new_cache->UpdateAllFrom(*from_context_->GetURLRequestContext()-> |
+ http_transaction_factory()->GetSession()->http_auth_cache()); |
} |
} // namespace |
@@ -151,18 +213,10 @@ void ProfileAuthData::Transfer( |
Profile* from_profile, |
Profile* to_profile, |
bool transfer_cookies, |
- const base::Callback<void()>& cookies_transfered_callback) { |
+ const base::Closure& completion_callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (transfer_cookies) { |
- TransferDefaultCookiesAndServerBoundCerts(from_profile, |
- to_profile, |
- cookies_transfered_callback); |
- } else { |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, cookies_transfered_callback); |
- } |
- |
- TransferDefaultAuthCache(from_profile, to_profile); |
+ (new ProfileAuthDataTransferer(from_profile, to_profile, transfer_cookies, |
+ completion_callback))->BeginTransfer(); |
} |
} // namespace chromeos |