Index: chrome/browser/chromeos/login/login_utils.cc |
diff --git a/chrome/browser/chromeos/login/login_utils.cc b/chrome/browser/chromeos/login/login_utils.cc |
index 458304b399b32018ee04464cb1b1147b874c5335..b2d83e85cebdf64b6f3bbe72b5558fa1a1fb1f39 100644 |
--- a/chrome/browser/chromeos/login/login_utils.cc |
+++ b/chrome/browser/chromeos/login/login_utils.cc |
@@ -6,6 +6,7 @@ |
#include <vector> |
+#include "base/bind.h" |
#include "base/command_line.h" |
#include "base/compiler_specific.h" |
#include "base/file_path.h" |
@@ -542,7 +543,9 @@ class LoginUtilsImpl : public LoginUtils, |
using_oauth_(false), |
has_cookies_(false), |
delegate_(NULL), |
- job_restart_request_(NULL) { |
+ job_restart_request_(NULL), |
+ user_policy_ready_(false), |
+ profile_pending_creation_(NULL) { |
net::NetworkChangeNotifier::AddOnlineStateObserver(this); |
} |
@@ -648,6 +651,13 @@ class LoginUtilsImpl : public LoginUtils, |
void OnProfileCreated(Profile* profile, |
Profile::CreateStatus status); |
+ // Callback for asynchronous notification that user policy is ready. |
+ void OnUserPolicyReady(); |
+ |
+ // Invoked to resume profile creation after the profile is created and user |
+ // policy has been loaded. |
+ void ResumeProfileCreation(Profile* user_profile); |
+ |
std::string password_; |
GaiaAuthConsumer::ClientLoginResult credentials_; |
bool pending_requests_; |
@@ -665,6 +675,12 @@ class LoginUtilsImpl : public LoginUtils, |
// Used to restart Chrome to switch to the guest mode. |
JobRestartRequest* job_restart_request_; |
+ // Profile creation should only resume once user policy is ready. Since both |
+ // profile creation and user policy readiness notifications come |
Mattias Nissler (ping if slow)
2012/02/16 10:24:11
s/come/are reported/
|
+ // asynchronously, these fields are used to track whether both are done. |
+ bool user_policy_ready_; |
+ Profile* profile_pending_creation_; |
+ |
DISALLOW_COPY_AND_ASSIGN(LoginUtilsImpl); |
}; |
@@ -751,7 +767,12 @@ void LoginUtilsImpl::PrepareProfile( |
// Initialize user policy before the profile is created so the profile |
// initialization code sees the cached policy settings. |
- connector->InitializeUserPolicy(username, wait_for_policy_fetch); |
+ user_policy_ready_ = false; |
+ profile_pending_creation_ = NULL; |
+ connector->InitializeUserPolicy( |
Nikita (slow)
2012/02/20 16:10:24
What's the cost (and what happens behind the scene
Joao da Silva
2012/02/20 16:23:15
The cost is always the same. A couple of objects a
|
+ username, |
+ wait_for_policy_fetch, |
+ base::Bind(&LoginUtilsImpl::OnUserPolicyReady, AsWeakPtr())); |
if (wait_for_policy_fetch) { |
// Profile creation will block until user policy is fetched, which |
@@ -773,12 +794,24 @@ void LoginUtilsImpl::DelegateDeleted(LoginUtils::Delegate* delegate) { |
delegate_ = NULL; |
} |
+void LoginUtilsImpl::OnUserPolicyReady() { |
+ user_policy_ready_ = true; |
+ if (profile_pending_creation_) { |
+ ResumeProfileCreation(profile_pending_creation_); |
+ profile_pending_creation_ = NULL; |
+ } |
+} |
+ |
void LoginUtilsImpl::OnProfileCreated( |
Profile* user_profile, |
Profile::CreateStatus status) { |
CHECK(user_profile); |
switch (status) { |
case Profile::CREATE_STATUS_INITIALIZED: |
+ if (user_policy_ready_) |
+ ResumeProfileCreation(user_profile); |
+ else |
+ profile_pending_creation_ = user_profile; |
break; |
case Profile::CREATE_STATUS_CREATED: { |
if (UserManager::Get()->current_user_is_new()) |
@@ -798,14 +831,16 @@ void LoginUtilsImpl::OnProfileCreated( |
if (use_shared_proxies_pref->IsDefaultValue()) |
user_profile->GetPrefs()->SetBoolean(prefs::kUseSharedProxies, false); |
RespectLocalePreference(user_profile); |
- return; |
+ break; |
} |
case Profile::CREATE_STATUS_FAIL: |
default: |
NOTREACHED(); |
- return; |
+ break; |
} |
+} |
+void LoginUtilsImpl::ResumeProfileCreation(Profile* user_profile) { |
BootTimesLoader* btl = BootTimesLoader::Get(); |
btl->AddLoginTimeMarker("UserProfileGotten", false); |