| Index: components/signin/core/browser/gaia_cookie_manager_service.cc
|
| diff --git a/components/signin/core/browser/gaia_cookie_manager_service.cc b/components/signin/core/browser/gaia_cookie_manager_service.cc
|
| index 36ba75a96fa725b20ce0d281a7c88f1872f328e0..1aef48f0c9d3e9394c4a54103dff45e590155616 100644
|
| --- a/components/signin/core/browser/gaia_cookie_manager_service.cc
|
| +++ b/components/signin/core/browser/gaia_cookie_manager_service.cc
|
| @@ -136,9 +136,9 @@ void GaiaCookieManagerService::ExternalCcResultFetcher::Start() {
|
|
|
| CleanupTransientState();
|
| results_.clear();
|
| - gaia_auth_fetcher_.reset(
|
| + helper_->gaia_auth_fetcher_.reset(
|
| new GaiaAuthFetcher(this, helper_->source_, helper_->request_context()));
|
| - gaia_auth_fetcher_->StartGetCheckConnectionInfo();
|
| + helper_->gaia_auth_fetcher_->StartGetCheckConnectionInfo();
|
|
|
| // Some fetches may timeout. Start a timer to decide when the result fetcher
|
| // has waited long enough.
|
| @@ -150,7 +150,7 @@ void GaiaCookieManagerService::ExternalCcResultFetcher::Start() {
|
| }
|
|
|
| bool GaiaCookieManagerService::ExternalCcResultFetcher::IsRunning() {
|
| - return gaia_auth_fetcher_ || fetchers_.size() > 0u;
|
| + return helper_->gaia_auth_fetcher_ || fetchers_.size() > 0u;
|
| }
|
|
|
| void GaiaCookieManagerService::ExternalCcResultFetcher::TimeoutForTests() {
|
| @@ -159,18 +159,20 @@ void GaiaCookieManagerService::ExternalCcResultFetcher::TimeoutForTests() {
|
|
|
| void GaiaCookieManagerService::ExternalCcResultFetcher::
|
| OnGetCheckConnectionInfoSuccess(const std::string& data) {
|
| + helper_->gaia_auth_fetcher_backoff_.InformOfRequest(true);
|
| + gaia_auth_fetcher_timer_.Stop();
|
| scoped_ptr<base::Value> value(base::JSONReader::Read(data));
|
| const base::ListValue* list;
|
| if (!value || !value->GetAsList(&list)) {
|
| CleanupTransientState();
|
| - FireGetCheckConnectionInfoCompleted(false);
|
| + GetCheckConnectionInfoCompleted(false);
|
| return;
|
| }
|
|
|
| // If there is nothing to check, terminate immediately.
|
| if (list->GetSize() == 0) {
|
| CleanupTransientState();
|
| - FireGetCheckConnectionInfoCompleted(true);
|
| + GetCheckConnectionInfoCompleted(true);
|
| return;
|
| }
|
|
|
| @@ -193,8 +195,17 @@ void GaiaCookieManagerService::ExternalCcResultFetcher::
|
|
|
| void GaiaCookieManagerService::ExternalCcResultFetcher::
|
| OnGetCheckConnectionInfoError(const GoogleServiceAuthError& error) {
|
| + if (++helper_->gaia_auth_fetcher_retries_ < kMaxGaiaAuthFetcherRetries &&
|
| + IsTransientError(error)) {
|
| + helper_->gaia_auth_fetcher_backoff_.InformOfRequest(false);
|
| + gaia_auth_fetcher_timer_.Start(
|
| + FROM_HERE, helper_->gaia_auth_fetcher_backoff_.GetTimeUntilRelease(),
|
| + this, &GaiaCookieManagerService::ExternalCcResultFetcher::Start);
|
| + return;
|
| + }
|
| +
|
| CleanupTransientState();
|
| - FireGetCheckConnectionInfoCompleted(false);
|
| + GetCheckConnectionInfoCompleted(false);
|
| }
|
|
|
| net::URLFetcher*
|
| @@ -237,20 +248,20 @@ void GaiaCookieManagerService::ExternalCcResultFetcher::OnURLFetchComplete(
|
| // report the result.
|
| if (fetchers_.empty()) {
|
| CleanupTransientState();
|
| - FireGetCheckConnectionInfoCompleted(true);
|
| + GetCheckConnectionInfoCompleted(true);
|
| }
|
| }
|
| }
|
|
|
| void GaiaCookieManagerService::ExternalCcResultFetcher::Timeout() {
|
| CleanupTransientState();
|
| - FireGetCheckConnectionInfoCompleted(false);
|
| + GetCheckConnectionInfoCompleted(false);
|
| }
|
|
|
| void GaiaCookieManagerService::ExternalCcResultFetcher::
|
| CleanupTransientState() {
|
| timer_.Stop();
|
| - gaia_auth_fetcher_.reset();
|
| + helper_->gaia_auth_fetcher_.reset();
|
|
|
| for (URLToTokenAndFetcher::const_iterator it = fetchers_.begin();
|
| it != fetchers_.end(); ++it) {
|
| @@ -260,13 +271,18 @@ void GaiaCookieManagerService::ExternalCcResultFetcher::
|
| }
|
|
|
| void GaiaCookieManagerService::ExternalCcResultFetcher::
|
| - FireGetCheckConnectionInfoCompleted(bool succeeded) {
|
| + GetCheckConnectionInfoCompleted(bool succeeded) {
|
| base::TimeDelta time_to_check_connections =
|
| base::Time::Now() - m_external_cc_result_start_time_;
|
| signin_metrics::LogExternalCcResultFetches(succeeded,
|
| time_to_check_connections);
|
| - FOR_EACH_OBSERVER(Observer, helper_->observer_list_,
|
| - GetCheckConnectionInfoCompleted(succeeded));
|
| +
|
| + helper_->external_cc_result_fetched_ = true;
|
| + // Since the ExternalCCResultFetcher is only Started in place of calling
|
| + // StartFetchingMergeSession, we can assume we need to call
|
| + // StartFetchingMergeSession. If this assumption becomes invalid, a Callback
|
| + // will need to be passed to Start() and Run() here.
|
| + helper_->StartFetchingMergeSession();
|
| }
|
|
|
| GaiaCookieManagerService::GaiaCookieManagerService(
|
| @@ -278,7 +294,8 @@ GaiaCookieManagerService::GaiaCookieManagerService(
|
| external_cc_result_fetcher_(this),
|
| gaia_auth_fetcher_backoff_(&kBackoffPolicy),
|
| gaia_auth_fetcher_retries_(0),
|
| - source_(source) {
|
| + source_(source),
|
| + external_cc_result_fetched_(false) {
|
| }
|
|
|
| GaiaCookieManagerService::~GaiaCookieManagerService() {
|
| @@ -387,11 +404,6 @@ void GaiaCookieManagerService::SignalComplete(
|
| OnAddAccountToCookieCompleted(account_id, error));
|
| }
|
|
|
| -void GaiaCookieManagerService::StartFetchingExternalCcResult() {
|
| - if (!external_cc_result_fetcher_.IsRunning())
|
| - external_cc_result_fetcher_.Start();
|
| -}
|
| -
|
| void GaiaCookieManagerService::StartLogOutUrlFetch() {
|
| DCHECK(requests_.front().request_type() == GaiaCookieRequestType::LOG_OUT);
|
| VLOG(1) << "GaiaCookieManagerService::StartLogOutUrlFetch";
|
| @@ -405,10 +417,19 @@ void GaiaCookieManagerService::StartLogOutUrlFetch() {
|
|
|
| void GaiaCookieManagerService::OnUbertokenSuccess(
|
| const std::string& uber_token) {
|
| + DCHECK(requests_.front().request_type() ==
|
| + GaiaCookieRequestType::ADD_ACCOUNT);
|
| VLOG(1) << "GaiaCookieManagerService::OnUbertokenSuccess"
|
| << " account=" << requests_.front().account_id();
|
| gaia_auth_fetcher_retries_ = 0;
|
| uber_token_ = uber_token;
|
| +
|
| + if (!external_cc_result_fetched_ &&
|
| + !external_cc_result_fetcher_.IsRunning()) {
|
| + external_cc_result_fetcher_.Start();
|
| + return;
|
| + }
|
| +
|
| StartFetchingMergeSession();
|
| }
|
|
|
| @@ -469,8 +490,6 @@ void GaiaCookieManagerService::StartFetchingMergeSession() {
|
| new GaiaAuthFetcher(this, source_,
|
| signin_client_->GetURLRequestContext()));
|
|
|
| - // It's possible that not all external checks have completed.
|
| - // GetExternalCcResult() returns results for those that have.
|
| gaia_auth_fetcher_->StartMergeSession(uber_token_,
|
| external_cc_result_fetcher_.GetExternalCcResult());
|
| }
|
|
|