Index: chrome/browser/managed_mode/managed_user_service.cc |
diff --git a/chrome/browser/managed_mode/managed_user_service.cc b/chrome/browser/managed_mode/managed_user_service.cc |
index 7ad603ad4f68849d0e70b588d30a4f74facc3536..7601dddad16cde5587a21beb649bf7c0b7c05db3 100644 |
--- a/chrome/browser/managed_mode/managed_user_service.cc |
+++ b/chrome/browser/managed_mode/managed_user_service.cc |
@@ -139,10 +139,21 @@ void ManagedUserService::URLFilterContext::SetManualURLs( |
ManagedUserService::ManagedUserService(Profile* profile) |
: weak_ptr_factory_(this), |
profile_(profile), |
- elevated_for_testing_(false) {} |
+ waiting_for_sync_initialization_(false), |
+ elevated_for_testing_(false) { |
+} |
ManagedUserService::~ManagedUserService() {} |
+void ManagedUserService::Shutdown() { |
+ if (!waiting_for_sync_initialization_) |
+ return; |
+ |
+ ProfileSyncService* sync_service = |
+ ProfileSyncServiceFactory::GetForProfile(profile_); |
+ sync_service->RemoveObserver(this); |
+} |
+ |
bool ManagedUserService::ProfileIsManaged() const { |
return ProfileIsManaged(profile_); |
} |
@@ -269,6 +280,21 @@ bool ManagedUserService::UserMayModifySettings( |
extension ? extension->id() : std::string(), error); |
} |
+void ManagedUserService::OnStateChanged() { |
+ ProfileSyncService* service = |
+ ProfileSyncServiceFactory::GetForProfile(profile_); |
+ if (waiting_for_sync_initialization_ && service->sync_initialized()) { |
+ SetupSync(); |
+ service->RemoveObserver(this); |
+ waiting_for_sync_initialization_ = false; |
+ return; |
+ } |
+ |
+ DLOG_IF(ERROR, service->GetAuthError().state() == |
+ GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS) |
+ << "Credentials rejected"; |
+} |
+ |
void ManagedUserService::Observe(int type, |
const content::NotificationSource& source, |
const content::NotificationDetails& details) { |
@@ -296,6 +322,21 @@ void ManagedUserService::Observe(int type, |
} |
} |
+void ManagedUserService::SetupSync() { |
+ ProfileSyncService* service = |
+ ProfileSyncServiceFactory::GetForProfile(profile_); |
+ DCHECK(service->sync_initialized()); |
+ |
+ bool sync_everything = false; |
+ syncer::ModelTypeSet synced_datatypes; |
+ synced_datatypes.Put(syncer::MANAGED_USER_SETTINGS); |
+ service->OnUserChoseDatatypes(sync_everything, synced_datatypes); |
+ |
+ // Notify ProfileSyncService that we are done with configuration. |
+ service->SetSetupInProgress(false); |
+ service->SetSyncSetupCompleted(); |
+} |
+ |
bool ManagedUserService::ExtensionManagementPolicyImpl( |
const std::string& extension_id, |
string16* error) const { |
@@ -413,25 +454,24 @@ void ManagedUserService::InitForTesting() { |
Init(); |
} |
-void ManagedUserService::InitSync(const std::string& sync_token) { |
+void ManagedUserService::InitSync(const std::string& refresh_token) { |
ProfileSyncService* service = |
ProfileSyncServiceFactory::GetForProfile(profile_); |
- DCHECK(!service->sync_initialized()); |
// Tell the sync service that setup is in progress so we don't start syncing |
// until we've finished configuration. |
service->SetSetupInProgress(true); |
TokenService* token_service = TokenServiceFactory::GetForProfile(profile_); |
- token_service->AddAuthTokenManually(GaiaConstants::kSyncService, sync_token); |
- |
- bool sync_everything = false; |
- syncer::ModelTypeSet synced_datatypes; |
- synced_datatypes.Put(syncer::MANAGED_USER_SETTINGS); |
- service->OnUserChoseDatatypes(sync_everything, synced_datatypes); |
- |
- // Notify ProfileSyncService that we are done with configuration. |
- service->SetSetupInProgress(false); |
- service->SetSyncSetupCompleted(); |
+ token_service->UpdateCredentialsWithOAuth2( |
+ GaiaAuthConsumer::ClientOAuthResult(refresh_token, std::string(), 0)); |
+ |
+ // Continue in SetupSync() once the Sync backend has been initialized. |
+ if (service->sync_initialized()) { |
+ SetupSync(); |
+ } else { |
+ ProfileSyncServiceFactory::GetForProfile(profile_)->AddObserver(this); |
+ waiting_for_sync_initialization_ = true; |
+ } |
} |
// static |
@@ -454,6 +494,11 @@ void ManagedUserService::Init() { |
command_line->GetSwitchValueASCII(switches::kManagedUserSyncToken)); |
} |
+ // TokenService only loads tokens automatically if we're signed in, so we have |
+ // to nudge it ourselves. |
+ TokenService* token_service = TokenServiceFactory::GetForProfile(profile_); |
+ token_service->LoadTokensFromDB(); |
+ |
extensions::ExtensionSystem* extension_system = |
extensions::ExtensionSystem::Get(profile_); |
extensions::ManagementPolicy* management_policy = |