| 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 e6324fd1a5f67464797bc67c3194ab6f1edd012a..70e25e0a93b1a41e33713ec245430d113acb4bb2 100644
|
| --- a/chrome/browser/chromeos/login/profile_auth_data.cc
|
| +++ b/chrome/browser/chromeos/login/profile_auth_data.cc
|
| @@ -22,23 +22,64 @@ 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);
|
| +
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI, FROM_HERE, cookies_transfered_callback);
|
| + return;
|
| +}
|
| +
|
| +// 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) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| +
|
| + // Nothing to transfer over?
|
| + if (!cookies_to_transfer.size()) {
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI, FROM_HERE, cookies_transfered_callback);
|
| + 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));
|
| +}
|
| +
|
| // 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) {
|
| + net::URLRequestContextGetter* to_context,
|
| + const base::Callback<void()>& cookies_transfered_callback) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - net::CookieStore* new_store =
|
| + net::CookieStore* to_store =
|
| to_context->GetURLRequestContext()->cookie_store();
|
| - net::CookieMonster* new_monster = new_store->GetCookieMonster();
|
| + net::CookieMonster* to_monster = to_store->GetCookieMonster();
|
|
|
| - net::CookieStore* default_store =
|
| + net::CookieStore* from_store =
|
| from_context->GetURLRequestContext()->cookie_store();
|
| - net::CookieMonster* default_monster = default_store->GetCookieMonster();
|
| - default_monster->SetKeepExpiredCookies();
|
| - default_monster->GetAllCookiesAsync(
|
| - base::Bind(base::IgnoreResult(&net::CookieMonster::InitializeFrom),
|
| - new_monster));
|
| + net::CookieMonster* from_monster = from_store->GetCookieMonster();
|
| + from_monster->SetKeepExpiredCookies();
|
| + from_monster->GetAllCookiesAsync(base::Bind(&OnGetCookiesToTransfer,
|
| + make_scoped_refptr(to_monster),
|
| + cookies_transfered_callback));
|
| }
|
|
|
| // Transfers default server bound certs of |from_context| to server bound certs
|
| @@ -76,12 +117,14 @@ void TransferDefaultAuthCacheOnIOThread(
|
| // automatically transfered into the profile.
|
| void TransferDefaultCookiesAndServerBoundCerts(
|
| Profile* from_profile,
|
| - Profile* to_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())));
|
| + make_scoped_refptr(to_profile->GetRequestContext()),
|
| + cookies_transfered_callback));
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE,
|
| base::Bind(&TransferDefaultServerBoundCertsIOThread,
|
| @@ -104,12 +147,20 @@ void TransferDefaultAuthCache(Profile* from_profile,
|
|
|
| } // namespace
|
|
|
| -void ProfileAuthData::Transfer(Profile* from_profile,
|
| - Profile* to_profile,
|
| - bool transfer_cookies) {
|
| +void ProfileAuthData::Transfer(
|
| + Profile* from_profile,
|
| + Profile* to_profile,
|
| + bool transfer_cookies,
|
| + const base::Callback<void()>& cookies_transfered_callback) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - if (transfer_cookies)
|
| - TransferDefaultCookiesAndServerBoundCerts(from_profile, to_profile);
|
| + 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);
|
| }
|
|
|