| Index: chrome/browser/signin/chrome_signin_client.cc
|
| diff --git a/chrome/browser/signin/chrome_signin_client.cc b/chrome/browser/signin/chrome_signin_client.cc
|
| index c533ab3f3558e7d25497f4ab2ba86965efe434e1..dd909b6b71a2a5334153a934e0fa000dcb7cd061 100644
|
| --- a/chrome/browser/signin/chrome_signin_client.cc
|
| +++ b/chrome/browser/signin/chrome_signin_client.cc
|
| @@ -40,7 +40,11 @@ const char kGoogleAccountsUrl[] = "https://accounts.google.com";
|
| } // namespace
|
|
|
| ChromeSigninClient::ChromeSigninClient(Profile* profile)
|
| - : profile_(profile), signin_host_id_(ChildProcessHost::kInvalidUniqueID) {}
|
| + : profile_(profile), signin_host_id_(ChildProcessHost::kInvalidUniqueID) {
|
| + callbacks_.set_removal_callback(
|
| + base::Bind(&ChromeSigninClient::UnregisterForCookieChangedNotification,
|
| + base::Unretained(this)));
|
| +}
|
|
|
| ChromeSigninClient::~ChromeSigninClient() {
|
| UnregisterForCookieChangedNotification();
|
| @@ -172,18 +176,13 @@ std::string ChromeSigninClient::GetProductVersion() {
|
| return chrome_version.CreateVersionString();
|
| }
|
|
|
| -void ChromeSigninClient::SetCookieChangedCallback(
|
| +scoped_ptr<SigninClient::CookieChangedCallbackList::Subscription>
|
| +ChromeSigninClient::AddCookieChangedCallback(
|
| const CookieChangedCallback& callback) {
|
| - if (callback_.Equals(callback))
|
| - return;
|
| -
|
| - // There should be only one callback active at a time.
|
| - DCHECK(callback.is_null() || callback_.is_null());
|
| - callback_ = callback;
|
| - if (!callback_.is_null())
|
| - RegisterForCookieChangedNotification();
|
| - else
|
| - UnregisterForCookieChangedNotification();
|
| + scoped_ptr<SigninClient::CookieChangedCallbackList::Subscription>
|
| + subscription = callbacks_.Add(callback);
|
| + RegisterForCookieChangedNotification();
|
| + return subscription.Pass();
|
| }
|
|
|
| void ChromeSigninClient::GoogleSigninSucceeded(const std::string& username,
|
| @@ -200,10 +199,10 @@ void ChromeSigninClient::Observe(int type,
|
| const content::NotificationDetails& details) {
|
| switch (type) {
|
| case chrome::NOTIFICATION_COOKIE_CHANGED: {
|
| - DCHECK(!callback_.is_null());
|
| + DCHECK(!callbacks_.empty());
|
| const net::CanonicalCookie* cookie =
|
| content::Details<ChromeCookieDetails>(details).ptr()->cookie;
|
| - callback_.Run(cookie);
|
| + callbacks_.Notify(cookie);
|
| break;
|
| }
|
| default:
|
| @@ -213,13 +212,17 @@ void ChromeSigninClient::Observe(int type,
|
| }
|
|
|
| void ChromeSigninClient::RegisterForCookieChangedNotification() {
|
| + if (callbacks_.empty())
|
| + return;
|
| content::Source<Profile> source(profile_);
|
| - DCHECK(!registrar_.IsRegistered(
|
| - this, chrome::NOTIFICATION_COOKIE_CHANGED, source));
|
| + if (!registrar_.IsRegistered(
|
| + this, chrome::NOTIFICATION_COOKIE_CHANGED, source))
|
| registrar_.Add(this, chrome::NOTIFICATION_COOKIE_CHANGED, source);
|
| }
|
|
|
| void ChromeSigninClient::UnregisterForCookieChangedNotification() {
|
| + if (!callbacks_.empty())
|
| + return;
|
| // Note that it's allowed to call this method multiple times without an
|
| // intervening call to |RegisterForCookieChangedNotification()|.
|
| content::Source<Profile> source(profile_);
|
|
|