1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/signin/signin_manager_cookie_helper.h" 6 7 #include <vector> 8 9 #include "content/public/browser/browser_thread.h" 10 #include "google_apis/gaia/gaia_urls.h" 11 #include "net/cookies/cookie_monster.h" 12 #include "net/url_request/url_request_context.h" 13 14 using content::BrowserThread; 15 16 SigninManagerCookieHelper::SigninManagerCookieHelper( 17 net::URLRequestContextGetter* request_context_getter) 18 : request_context_getter_(request_context_getter) { 19 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 20 } 21 22 SigninManagerCookieHelper::~SigninManagerCookieHelper() { 23 } 24 25 void SigninManagerCookieHelper::StartFetchingGaiaCookiesOnUIThread( 26 const base::Callback<void(const net::CookieList& cookies)>& callback) { 27 StartFetchingCookiesOnUIThread( 28 GaiaUrls::GetInstance()->gaia_url(), callback); 29 } 30 31 void SigninManagerCookieHelper::StartFetchingCookiesOnUIThread( 32 const GURL& url, 33 const base::Callback<void(const net::CookieList& cookies)>& callback) { 34 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 35 DCHECK(!callback.is_null()); 36 DCHECK(completion_callback_.is_null()); 37 38 completion_callback_ = callback; 39 BrowserThread::PostTask( 40 BrowserThread::IO, FROM_HERE, 41 base::Bind(&SigninManagerCookieHelper::FetchCookiesOnIOThread, this, 42 url)); 43 } 44 45 void SigninManagerCookieHelper::FetchCookiesOnIOThread(const GURL& url) { 46 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 47 48 scoped_refptr<net::CookieMonster> cookie_monster = 49 request_context_getter_->GetURLRequestContext()-> 50 cookie_store()->GetCookieMonster(); 51 if (cookie_monster.get()) { 52 cookie_monster->GetAllCookiesForURLAsync( 53 url, base::Bind(&SigninManagerCookieHelper::OnCookiesFetched, this)); 54 } else { 55 OnCookiesFetched(net::CookieList()); 56 } 57 } 58 59 void SigninManagerCookieHelper::OnCookiesFetched( 60 const net::CookieList& cookies) { 61 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 62 BrowserThread::PostTask( 63 BrowserThread::UI, FROM_HERE, 64 base::Bind(&SigninManagerCookieHelper::NotifyOnUIThread, this, cookies)); 65 } 66 67 void SigninManagerCookieHelper::NotifyOnUIThread( 68 const net::CookieList& cookies) { 69 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 70 base::ResetAndReturn(&completion_callback_).Run(cookies); 71 } 72