Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3020)

Unified Diff: chrome/browser/signin/google_auto_login_helper.cc

Issue 110373007: Delay loading the NTP after sign in until MergeSession has been performed in (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix typo in chromeos Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/signin/google_auto_login_helper.cc
diff --git a/chrome/browser/signin/google_auto_login_helper.cc b/chrome/browser/signin/google_auto_login_helper.cc
index 1cf1cf2ec6ea914048a4a7ed6a04ee8cf87e14bf..ab0399aa75f8b6ddc77cfdb0d7ccddddf7f0dfcc 100644
--- a/chrome/browser/signin/google_auto_login_helper.cc
+++ b/chrome/browser/signin/google_auto_login_helper.cc
@@ -5,86 +5,108 @@
#include "chrome/browser/signin/google_auto_login_helper.h"
#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/signin/profile_oauth2_token_service.h"
+#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
+#include "content/public/browser/notification_service.h"
#include "google_apis/gaia/gaia_auth_fetcher.h"
#include "google_apis/gaia/gaia_constants.h"
-GoogleAutoLoginHelper::GoogleAutoLoginHelper(Profile* profile)
- : profile_(profile) {}
+GoogleAutoLoginHelper::GoogleAutoLoginHelper(Profile* profile,
+ Observer* observer)
+ : profile_(profile) {
+ if (observer)
+ AddObserver(observer);
+}
GoogleAutoLoginHelper::~GoogleAutoLoginHelper() {
DCHECK(accounts_.empty());
}
void GoogleAutoLoginHelper::LogIn() {
- // This is the code path for non-mirror world.
- uber_token_fetcher_.reset(CreateNewUbertokenFetcher());
- uber_token_fetcher_->StartFetchingToken();
- DCHECK(accounts_.empty());
+ ProfileOAuth2TokenService* token_service =
+ ProfileOAuth2TokenServiceFactory::GetForProfile(profile_);
+ LogIn(token_service->GetPrimaryAccountId());
}
void GoogleAutoLoginHelper::LogIn(const std::string& account_id) {
- if (uber_token_fetcher_.get()) {
- accounts_.push_back(account_id);
- } else {
- uber_token_fetcher_.reset(CreateNewUbertokenFetcher());
- uber_token_fetcher_->StartFetchingToken(account_id);
- }
+ accounts_.push_back(account_id);
+ if (accounts_.size() == 1)
+ StartFetching();
+}
+
+void GoogleAutoLoginHelper::AddObserver(Observer* observer) {
+ observer_list_.AddObserver(observer);
+}
+
+void GoogleAutoLoginHelper::RemoveObserver(Observer* observer) {
+ observer_list_.RemoveObserver(observer);
+}
+
+void GoogleAutoLoginHelper::CancelAll() {
+ gaia_auth_fetcher_.reset();
+ uber_token_fetcher_.reset();
+ accounts_.clear();
}
void GoogleAutoLoginHelper::OnUbertokenSuccess(const std::string& uber_token) {
- VLOG(1) << "GoogleAutoLoginHelper::OnUbertokenSuccess";
- gaia_auth_fetcher_.reset(CreateNewGaiaAuthFetcher());
+ VLOG(1) << "GoogleAutoLoginHelper::OnUbertokenSuccess"
+ << " account=" << accounts_.front();
+ gaia_auth_fetcher_.reset(
+ new GaiaAuthFetcher(this, GaiaConstants::kChromeSource,
+ profile_->GetRequestContext()));
gaia_auth_fetcher_->StartMergeSession(uber_token);
}
void GoogleAutoLoginHelper::OnUbertokenFailure(
const GoogleServiceAuthError& error) {
- VLOG(1) << "Failed to retrieve ubertoken, error: " << error.ToString();
- if (base::MessageLoop::current()) {
- base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
- } else {
- delete this;
- }
+ VLOG(1) << "Failed to retrieve ubertoken"
+ << " account=" << accounts_.front()
+ << " error=" << error.ToString();
+ const std::string account_id = accounts_.front();
+ MergeNextAccount();
+ SignalComplete(account_id, error);
}
void GoogleAutoLoginHelper::OnMergeSessionSuccess(const std::string& data) {
- DVLOG(1) << "MergeSession successful." << data;
- if (accounts_.empty()) {
- if (base::MessageLoop::current()) {
- base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
- } else {
- delete this;
- }
- } else {
- uber_token_fetcher_.reset(CreateNewUbertokenFetcher());
- uber_token_fetcher_->StartFetchingToken(accounts_.front());
- accounts_.pop_front();
- }
+ DVLOG(1) << "MergeSession successful account=" << accounts_.front();
+ const std::string account_id = accounts_.front();
+ MergeNextAccount();
+ SignalComplete(account_id, GoogleServiceAuthError::AuthErrorNone());
}
void GoogleAutoLoginHelper::OnMergeSessionFailure(
const GoogleServiceAuthError& error) {
- VLOG(1) << "Failed MergeSession request, error: " << error.ToString();
- // TODO(acleung): Depending on the return error we should probably
- // take different actions instead of just throw our hands up.
-
- // Clearning pending accounts for now.
- accounts_.clear();
-
- if (base::MessageLoop::current()) {
- base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
- } else {
- delete this;
- }
+ VLOG(1) << "Failed MergeSession"
+ << " account=" << accounts_.front()
+ << " error=" << error.ToString();
+ const std::string account_id = accounts_.front();
+ MergeNextAccount();
+ SignalComplete(account_id, error);
}
-UbertokenFetcher* GoogleAutoLoginHelper::CreateNewUbertokenFetcher() {
- return new UbertokenFetcher(profile_, this);
+void GoogleAutoLoginHelper::StartFetching() {
+ uber_token_fetcher_.reset(new UbertokenFetcher(profile_, this));
+ uber_token_fetcher_->StartFetchingToken(accounts_.front());
}
-GaiaAuthFetcher* GoogleAutoLoginHelper::CreateNewGaiaAuthFetcher() {
- return new GaiaAuthFetcher(
- this, GaiaConstants::kChromeSource, profile_->GetRequestContext());
+void GoogleAutoLoginHelper::SignalComplete(
+ const std::string& account_id,
+ const GoogleServiceAuthError& error) {
+ // Its possible for the observer to delete |this| object. Don't access
+ // access any members after this calling the observer. This method should
+ // be the last call in any other method.
+ FOR_EACH_OBSERVER(Observer, observer_list_,
+ MergeSessionCompleted(account_id, error));
}
+void GoogleAutoLoginHelper::MergeNextAccount() {
+ gaia_auth_fetcher_.reset();
+ accounts_.pop_front();
+ if (accounts_.empty()) {
+ uber_token_fetcher_.reset();
+ } else {
+ StartFetching();
+ }
+}
« no previous file with comments | « chrome/browser/signin/google_auto_login_helper.h ('k') | chrome/browser/signin/google_auto_login_helper_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698