| Index: components/signin/core/browser/about_signin_internals.cc
|
| diff --git a/components/signin/core/browser/about_signin_internals.cc b/components/signin/core/browser/about_signin_internals.cc
|
| index c567d8d4979c4bdc61ca56009cdcc367728e4fb1..01f578220907893bf0c47fd3f2c2f7cdd4c73419 100644
|
| --- a/components/signin/core/browser/about_signin_internals.cc
|
| +++ b/components/signin/core/browser/about_signin_internals.cc
|
| @@ -18,7 +18,11 @@
|
| #include "components/signin/core/browser/signin_manager.h"
|
| #include "components/signin/core/common/profile_management_switches.h"
|
| #include "components/signin/core/common/signin_switches.h"
|
| +#include "google_apis/gaia/gaia_auth_fetcher.h"
|
| +#include "google_apis/gaia/gaia_auth_util.h"
|
| #include "google_apis/gaia/gaia_constants.h"
|
| +#include "google_apis/gaia/gaia_urls.h"
|
| +#include "net/cookies/canonical_cookie.h"
|
|
|
| using base::Time;
|
| using namespace signin_internals_util;
|
| @@ -51,6 +55,15 @@ void AddSectionEntry(base::ListValue* section_list,
|
| section_list->Append(entry.release());
|
| }
|
|
|
| +void AddCookieEntry(base::ListValue* accounts_list,
|
| + const std::string& field_email,
|
| + const std::string& field_valid) {
|
| + scoped_ptr<base::DictionaryValue> entry(new base::DictionaryValue());
|
| + entry->SetString("email", field_email);
|
| + entry->SetString("valid", field_valid);
|
| + accounts_list->Append(entry.release());
|
| +}
|
| +
|
| std::string SigninStatusFieldToLabel(UntimedSigninStatusField field) {
|
| switch (field) {
|
| case USERNAME:
|
| @@ -195,11 +208,15 @@ void AboutSigninInternals::Initialize(SigninClient* client) {
|
|
|
| signin_manager_->AddSigninDiagnosticsObserver(this);
|
| token_service_->AddDiagnosticsObserver(this);
|
| + cookie_changed_subscription_ = client_->AddCookieChangedCallback(
|
| + base::Bind(&AboutSigninInternals::OnCookieChanged,
|
| + base::Unretained(this)));
|
| }
|
|
|
| void AboutSigninInternals::Shutdown() {
|
| signin_manager_->RemoveSigninDiagnosticsObserver(this);
|
| token_service_->RemoveDiagnosticsObserver(this);
|
| + cookie_changed_subscription_.reset();
|
| }
|
|
|
| void AboutSigninInternals::NotifyObservers() {
|
| @@ -267,6 +284,65 @@ void AboutSigninInternals::OnAuthenticationResultReceived(std::string status) {
|
| NotifySigninValueChanged(AUTHENTICATION_RESULT_RECEIVED, status);
|
| }
|
|
|
| +void AboutSigninInternals::OnCookieChanged(
|
| + const net::CanonicalCookie* cookie) {
|
| + if (cookie->Name() == "LSID" &&
|
| + cookie->Domain() == GaiaUrls::GetInstance()->gaia_url().host() &&
|
| + cookie->IsSecure() &&
|
| + cookie->IsHttpOnly()) {
|
| + GetCookieAccountsAsync();
|
| + }
|
| +}
|
| +
|
| +void AboutSigninInternals::GetCookieAccountsAsync() {
|
| + if (!gaia_fetcher_) {
|
| + // There is no list account request in flight.
|
| + gaia_fetcher_.reset(new GaiaAuthFetcher(
|
| + this, GaiaConstants::kChromeSource, client_->GetURLRequestContext()));
|
| + gaia_fetcher_->StartListAccounts();
|
| + }
|
| +}
|
| +
|
| +void AboutSigninInternals::OnListAccountsSuccess(const std::string& data) {
|
| + gaia_fetcher_.reset();
|
| +
|
| + // Get account information from response data.
|
| + std::vector<std::pair<std::string, bool> > gaia_accounts;
|
| + bool valid_json = gaia::ParseListAccountsData(data, &gaia_accounts);
|
| + if (!valid_json) {
|
| + VLOG(1) << "AboutSigninInternals::OnListAccountsSuccess: parsing error";
|
| + } else {
|
| + OnListAccountsComplete(gaia_accounts);
|
| + }
|
| +}
|
| +
|
| +void AboutSigninInternals::OnListAccountsFailure(
|
| + const GoogleServiceAuthError& error) {
|
| + gaia_fetcher_.reset();
|
| + VLOG(1) << "AboutSigninInternals::OnListAccountsFailure:" << error.ToString();
|
| +}
|
| +
|
| +void AboutSigninInternals::OnListAccountsComplete(
|
| + std::vector<std::pair<std::string, bool> >& gaia_accounts) {
|
| + scoped_ptr<base::DictionaryValue> signin_status(new base::DictionaryValue());
|
| + base::ListValue* cookie_info = new base::ListValue();
|
| + signin_status->Set("cookie_info", cookie_info);
|
| +
|
| + for (size_t i = 0; i < gaia_accounts.size(); ++i) {
|
| + AddCookieEntry(cookie_info,
|
| + gaia_accounts[i].first,
|
| + gaia_accounts[i].second ? "Valid" : "Invalid");
|
| + }
|
| +
|
| + if (gaia_accounts.size() == 0)
|
| + AddCookieEntry(cookie_info, "No Accounts Present.", "");
|
| +
|
| + // Update the observers that the cookie's accounts are updated.
|
| + FOR_EACH_OBSERVER(AboutSigninInternals::Observer,
|
| + signin_observers_,
|
| + OnCookieAccountsFetched(signin_status.Pass()));
|
| +}
|
| +
|
| AboutSigninInternals::TokenInfo::TokenInfo(
|
| const std::string& consumer_id,
|
| const OAuth2TokenService::ScopeSet& scopes)
|
|
|