OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/browser_sync/browser/profile_sync_service.h" | 5 #include "components/browser_sync/browser/profile_sync_service.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <cstddef> | 8 #include <cstddef> |
9 #include <map> | 9 #include <map> |
10 #include <utility> | 10 #include <utility> |
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 DCHECK(sync_error_controller_ == NULL) | 374 DCHECK(sync_error_controller_ == NULL) |
375 << "Initialize() called more than once."; | 375 << "Initialize() called more than once."; |
376 sync_error_controller_.reset(new SyncErrorController(this)); | 376 sync_error_controller_.reset(new SyncErrorController(this)); |
377 AddObserver(sync_error_controller_.get()); | 377 AddObserver(sync_error_controller_.get()); |
378 #endif | 378 #endif |
379 | 379 |
380 memory_pressure_listener_.reset(new base::MemoryPressureListener( | 380 memory_pressure_listener_.reset(new base::MemoryPressureListener( |
381 base::Bind(&ProfileSyncService::OnMemoryPressure, | 381 base::Bind(&ProfileSyncService::OnMemoryPressure, |
382 sync_enabled_weak_factory_.GetWeakPtr()))); | 382 sync_enabled_weak_factory_.GetWeakPtr()))); |
383 startup_controller_->Reset(GetRegisteredDataTypes()); | 383 startup_controller_->Reset(GetRegisteredDataTypes()); |
384 startup_controller_->TryStart(); | 384 |
| 385 // Auto-start means IsFirstSetupComplete gets set automatically, and the |
| 386 // first startup should be immediate, not deferred. |
| 387 if (start_behavior_ == AUTO_START && !IsFirstSetupComplete()) { |
| 388 SetFirstSetupComplete(); |
| 389 startup_controller_->TryStart(true); |
| 390 } else { |
| 391 startup_controller_->TryStart(false); |
| 392 } |
385 } | 393 } |
386 | 394 |
387 void ProfileSyncService::StartSyncingWithServer() { | 395 void ProfileSyncService::StartSyncingWithServer() { |
388 DCHECK(thread_checker_.CalledOnValidThread()); | 396 DCHECK(thread_checker_.CalledOnValidThread()); |
389 | 397 |
390 if (base::FeatureList::IsEnabled( | 398 if (base::FeatureList::IsEnabled( |
391 switches::kSyncClearDataOnPassphraseEncryption) && | 399 switches::kSyncClearDataOnPassphraseEncryption) && |
392 sync_prefs_.GetPassphraseEncryptionTransitionInProgress()) { | 400 sync_prefs_.GetPassphraseEncryptionTransitionInProgress()) { |
393 BeginConfigureCatchUpBeforeClear(); | 401 BeginConfigureCatchUpBeforeClear(); |
394 return; | 402 return; |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
619 token_receive_time_ = base::Time::Now(); | 627 token_receive_time_ = base::Time::Now(); |
620 last_get_token_error_ = GoogleServiceAuthError::AuthErrorNone(); | 628 last_get_token_error_ = GoogleServiceAuthError::AuthErrorNone(); |
621 | 629 |
622 if (sync_prefs_.SyncHasAuthError()) { | 630 if (sync_prefs_.SyncHasAuthError()) { |
623 sync_prefs_.SetSyncAuthError(false); | 631 sync_prefs_.SetSyncAuthError(false); |
624 } | 632 } |
625 | 633 |
626 if (HasSyncingBackend()) | 634 if (HasSyncingBackend()) |
627 backend_->UpdateCredentials(GetCredentials()); | 635 backend_->UpdateCredentials(GetCredentials()); |
628 else | 636 else |
629 startup_controller_->TryStart(); | 637 startup_controller_->TryStart(false); |
630 } | 638 } |
631 | 639 |
632 void ProfileSyncService::OnGetTokenFailure( | 640 void ProfileSyncService::OnGetTokenFailure( |
633 const OAuth2TokenService::Request* request, | 641 const OAuth2TokenService::Request* request, |
634 const GoogleServiceAuthError& error) { | 642 const GoogleServiceAuthError& error) { |
635 DCHECK_EQ(access_token_request_.get(), request); | 643 DCHECK_EQ(access_token_request_.get(), request); |
636 DCHECK_NE(error.state(), GoogleServiceAuthError::NONE); | 644 DCHECK_NE(error.state(), GoogleServiceAuthError::NONE); |
637 access_token_request_.reset(); | 645 access_token_request_.reset(); |
638 last_get_token_error_ = error; | 646 last_get_token_error_ = error; |
639 switch (error.state()) { | 647 switch (error.state()) { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
694 | 702 |
695 void ProfileSyncService::OnRefreshTokensLoaded() { | 703 void ProfileSyncService::OnRefreshTokensLoaded() { |
696 // This notification gets fired when OAuth2TokenService loads the tokens | 704 // This notification gets fired when OAuth2TokenService loads the tokens |
697 // from storage. | 705 // from storage. |
698 // Initialize the backend if sync is enabled. If the sync token was | 706 // Initialize the backend if sync is enabled. If the sync token was |
699 // not loaded, GetCredentials() will generate invalid credentials to | 707 // not loaded, GetCredentials() will generate invalid credentials to |
700 // cause the backend to generate an auth error (crbug.com/121755). | 708 // cause the backend to generate an auth error (crbug.com/121755). |
701 if (HasSyncingBackend()) { | 709 if (HasSyncingBackend()) { |
702 RequestAccessToken(); | 710 RequestAccessToken(); |
703 } else { | 711 } else { |
704 startup_controller_->TryStart(); | 712 startup_controller_->TryStart(false); |
705 } | 713 } |
706 } | 714 } |
707 | 715 |
708 void ProfileSyncService::Shutdown() { | 716 void ProfileSyncService::Shutdown() { |
709 UnregisterAuthNotifications(); | 717 UnregisterAuthNotifications(); |
710 | 718 |
711 ShutdownImpl(syncer::BROWSER_SHUTDOWN); | 719 ShutdownImpl(syncer::BROWSER_SHUTDOWN); |
712 if (sync_error_controller_) { | 720 if (sync_error_controller_) { |
713 // Destroy the SyncErrorController when the service shuts down for good. | 721 // Destroy the SyncErrorController when the service shuts down for good. |
714 RemoveObserver(sync_error_controller_.get()); | 722 RemoveObserver(sync_error_controller_.get()); |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
941 // case this operation affects the "passphrase required" status. | 949 // case this operation affects the "passphrase required" status. |
942 ConsumeCachedPassphraseIfPossible(); | 950 ConsumeCachedPassphraseIfPossible(); |
943 | 951 |
944 // The very first time the backend initializes is effectively the first time | 952 // The very first time the backend initializes is effectively the first time |
945 // we can say we successfully "synced". LastSyncedTime will only be null in | 953 // we can say we successfully "synced". LastSyncedTime will only be null in |
946 // this case, because the pref wasn't restored on StartUp. | 954 // this case, because the pref wasn't restored on StartUp. |
947 if (sync_prefs_.GetLastSyncedTime().is_null()) { | 955 if (sync_prefs_.GetLastSyncedTime().is_null()) { |
948 UpdateLastSyncedTime(); | 956 UpdateLastSyncedTime(); |
949 } | 957 } |
950 | 958 |
951 // Auto-start means IsFirstSetupComplete gets set automatically. | 959 if (CanConfigureDataTypes()) |
952 if (start_behavior_ == AUTO_START && !IsFirstSetupComplete()) { | |
953 // This will trigger a configure if it completes setup. | |
954 SetFirstSetupComplete(); | |
955 } else if (CanConfigureDataTypes()) { | |
956 ConfigureDataTypeManager(); | 960 ConfigureDataTypeManager(); |
957 } | |
958 | 961 |
959 // Check for a cookie jar mismatch. | 962 // Check for a cookie jar mismatch. |
960 std::vector<gaia::ListedAccount> accounts; | 963 std::vector<gaia::ListedAccount> accounts; |
961 std::vector<gaia::ListedAccount> signed_out_accounts; | 964 std::vector<gaia::ListedAccount> signed_out_accounts; |
962 GoogleServiceAuthError error(GoogleServiceAuthError::NONE); | 965 GoogleServiceAuthError error(GoogleServiceAuthError::NONE); |
963 if (gaia_cookie_manager_service_ && | 966 if (gaia_cookie_manager_service_ && |
964 gaia_cookie_manager_service_->ListAccounts( | 967 gaia_cookie_manager_service_->ListAccounts( |
965 &accounts, &signed_out_accounts)) { | 968 &accounts, &signed_out_accounts)) { |
966 OnGaiaAccountsInCookieUpdated(accounts, signed_out_accounts, error); | 969 OnGaiaAccountsInCookieUpdated(accounts, signed_out_accounts, error); |
967 } | 970 } |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1258 #endif | 1261 #endif |
1259 break; | 1262 break; |
1260 case syncer::STOP_SYNC_FOR_DISABLED_ACCOUNT: | 1263 case syncer::STOP_SYNC_FOR_DISABLED_ACCOUNT: |
1261 // Sync disabled by domain admin. we should stop syncing until next | 1264 // Sync disabled by domain admin. we should stop syncing until next |
1262 // restart. | 1265 // restart. |
1263 sync_disabled_by_admin_ = true; | 1266 sync_disabled_by_admin_ = true; |
1264 ShutdownImpl(syncer::DISABLE_SYNC); | 1267 ShutdownImpl(syncer::DISABLE_SYNC); |
1265 break; | 1268 break; |
1266 case syncer::RESET_LOCAL_SYNC_DATA: | 1269 case syncer::RESET_LOCAL_SYNC_DATA: |
1267 ShutdownImpl(syncer::DISABLE_SYNC); | 1270 ShutdownImpl(syncer::DISABLE_SYNC); |
1268 startup_controller_->TryStart(); | 1271 startup_controller_->TryStart(false); |
1269 break; | 1272 break; |
1270 default: | 1273 default: |
1271 NOTREACHED(); | 1274 NOTREACHED(); |
1272 } | 1275 } |
1273 NotifyObservers(); | 1276 NotifyObservers(); |
1274 } | 1277 } |
1275 | 1278 |
1276 void ProfileSyncService::OnLocalSetPassphraseEncryption( | 1279 void ProfileSyncService::OnLocalSetPassphraseEncryption( |
1277 const syncer::SyncEncryptionHandler::NigoriState& nigori_state) { | 1280 const syncer::SyncEncryptionHandler::NigoriState& nigori_state) { |
1278 DCHECK(thread_checker_.CalledOnValidThread()); | 1281 DCHECK(thread_checker_.CalledOnValidThread()); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1310 DCHECK(sync_prefs_.GetPassphraseEncryptionTransitionInProgress()); | 1313 DCHECK(sync_prefs_.GetPassphraseEncryptionTransitionInProgress()); |
1311 sync_prefs_.SetPassphraseEncryptionTransitionInProgress(false); | 1314 sync_prefs_.SetPassphraseEncryptionTransitionInProgress(false); |
1312 | 1315 |
1313 // Call to ClearServerData generates new keystore key on the server. This | 1316 // Call to ClearServerData generates new keystore key on the server. This |
1314 // makes keystore bootstrap token invalid. Let's clear it from preferences. | 1317 // makes keystore bootstrap token invalid. Let's clear it from preferences. |
1315 sync_prefs_.SetKeystoreEncryptionBootstrapToken(std::string()); | 1318 sync_prefs_.SetKeystoreEncryptionBootstrapToken(std::string()); |
1316 | 1319 |
1317 // Shutdown sync, delete the Directory, then restart, restoring the cached | 1320 // Shutdown sync, delete the Directory, then restart, restoring the cached |
1318 // nigori state. | 1321 // nigori state. |
1319 ShutdownImpl(syncer::DISABLE_SYNC); | 1322 ShutdownImpl(syncer::DISABLE_SYNC); |
1320 startup_controller_->TryStart(); | 1323 startup_controller_->TryStart(true); |
1321 } | 1324 } |
1322 | 1325 |
1323 void ProfileSyncService::OnConfigureDone( | 1326 void ProfileSyncService::OnConfigureDone( |
1324 const DataTypeManager::ConfigureResult& result) { | 1327 const DataTypeManager::ConfigureResult& result) { |
1325 configure_status_ = result.status; | 1328 configure_status_ = result.status; |
1326 data_type_status_table_ = result.data_type_status_table; | 1329 data_type_status_table_ = result.data_type_status_table; |
1327 | 1330 |
1328 // We should have cleared our cached passphrase before we get here (in | 1331 // We should have cleared our cached passphrase before we get here (in |
1329 // OnBackendInitialized()). | 1332 // OnBackendInitialized()). |
1330 DCHECK(cached_passphrase_.empty()); | 1333 DCHECK(cached_passphrase_.empty()); |
(...skipping 726 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2057 // We may be called during the setup process before we're | 2060 // We may be called during the setup process before we're |
2058 // initialized. In this case, we default to the sensitive types. | 2061 // initialized. In this case, we default to the sensitive types. |
2059 return encrypted_types_; | 2062 return encrypted_types_; |
2060 } | 2063 } |
2061 | 2064 |
2062 void ProfileSyncService::OnSyncManagedPrefChange(bool is_sync_managed) { | 2065 void ProfileSyncService::OnSyncManagedPrefChange(bool is_sync_managed) { |
2063 if (is_sync_managed) { | 2066 if (is_sync_managed) { |
2064 StopImpl(CLEAR_DATA); | 2067 StopImpl(CLEAR_DATA); |
2065 } else { | 2068 } else { |
2066 // Sync is no longer disabled by policy. Try starting it up if appropriate. | 2069 // Sync is no longer disabled by policy. Try starting it up if appropriate. |
2067 startup_controller_->TryStart(); | 2070 startup_controller_->TryStart(true); |
2068 } | 2071 } |
2069 } | 2072 } |
2070 | 2073 |
2071 void ProfileSyncService::GoogleSigninSucceeded(const std::string& account_id, | 2074 void ProfileSyncService::GoogleSigninSucceeded(const std::string& account_id, |
2072 const std::string& username, | 2075 const std::string& username, |
2073 const std::string& password) { | 2076 const std::string& password) { |
2074 if (IsSyncRequested() && !password.empty()) { | 2077 if (IsSyncRequested() && !password.empty()) { |
2075 cached_passphrase_ = password; | 2078 cached_passphrase_ = password; |
2076 // Try to consume the passphrase we just cached. If the sync backend | 2079 // Try to consume the passphrase we just cached. If the sync backend |
2077 // is not running yet, the passphrase will remain cached until the | 2080 // is not running yet, the passphrase will remain cached until the |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2328 void ProfileSyncService::RequestStart() { | 2331 void ProfileSyncService::RequestStart() { |
2329 if (!IsSyncAllowed()) { | 2332 if (!IsSyncAllowed()) { |
2330 // Sync cannot be requested if it's not allowed. | 2333 // Sync cannot be requested if it's not allowed. |
2331 return; | 2334 return; |
2332 } | 2335 } |
2333 DCHECK(sync_client_); | 2336 DCHECK(sync_client_); |
2334 if (!IsSyncRequested()) { | 2337 if (!IsSyncRequested()) { |
2335 sync_prefs_.SetSyncRequested(true); | 2338 sync_prefs_.SetSyncRequested(true); |
2336 NotifyObservers(); | 2339 NotifyObservers(); |
2337 } | 2340 } |
2338 startup_controller_->TryStart(); | 2341 startup_controller_->TryStart(true); |
2339 } | 2342 } |
2340 | 2343 |
2341 void ProfileSyncService::ReconfigureDatatypeManager() { | 2344 void ProfileSyncService::ReconfigureDatatypeManager() { |
2342 // If we haven't initialized yet, don't configure the DTM as it could cause | 2345 // If we haven't initialized yet, don't configure the DTM as it could cause |
2343 // association to start before a Directory has even been created. | 2346 // association to start before a Directory has even been created. |
2344 if (backend_initialized_) { | 2347 if (backend_initialized_) { |
2345 DCHECK(backend_.get()); | 2348 DCHECK(backend_.get()); |
2346 ConfigureDataTypeManager(); | 2349 ConfigureDataTypeManager(); |
2347 } else if (HasUnrecoverableError()) { | 2350 } else if (HasUnrecoverableError()) { |
2348 // There is nothing more to configure. So inform the listeners, | 2351 // There is nothing more to configure. So inform the listeners, |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2526 if (--outstanding_setup_in_progress_handles_ != 0) | 2529 if (--outstanding_setup_in_progress_handles_ != 0) |
2527 return; | 2530 return; |
2528 | 2531 |
2529 DCHECK(startup_controller_->IsSetupInProgress()); | 2532 DCHECK(startup_controller_->IsSetupInProgress()); |
2530 startup_controller_->SetSetupInProgress(false); | 2533 startup_controller_->SetSetupInProgress(false); |
2531 | 2534 |
2532 if (IsBackendInitialized()) | 2535 if (IsBackendInitialized()) |
2533 ReconfigureDatatypeManager(); | 2536 ReconfigureDatatypeManager(); |
2534 NotifyObservers(); | 2537 NotifyObservers(); |
2535 } | 2538 } |
OLD | NEW |