| 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 "chrome/browser/sync/profile_sync_service.h" | 5 #include "chrome/browser/sync/profile_sync_service.h" |
| 6 | 6 |
| 7 #include <cstddef> | 7 #include <cstddef> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 #include "content/public/browser/notification_service.h" | 82 #include "content/public/browser/notification_service.h" |
| 83 #include "content/public/browser/notification_source.h" | 83 #include "content/public/browser/notification_source.h" |
| 84 #include "grit/generated_resources.h" | 84 #include "grit/generated_resources.h" |
| 85 #include "net/cookies/cookie_monster.h" | 85 #include "net/cookies/cookie_monster.h" |
| 86 #include "net/url_request/url_request_context_getter.h" | 86 #include "net/url_request/url_request_context_getter.h" |
| 87 #include "sync/api/sync_error.h" | 87 #include "sync/api/sync_error.h" |
| 88 #include "sync/internal_api/public/configure_reason.h" | 88 #include "sync/internal_api/public/configure_reason.h" |
| 89 #include "sync/internal_api/public/http_bridge_network_resources.h" | 89 #include "sync/internal_api/public/http_bridge_network_resources.h" |
| 90 #include "sync/internal_api/public/network_resources.h" | 90 #include "sync/internal_api/public/network_resources.h" |
| 91 #include "sync/internal_api/public/sessions/type_debug_info_observer.h" | 91 #include "sync/internal_api/public/sessions/type_debug_info_observer.h" |
| 92 #include "sync/internal_api/public/shutdown_reason.h" |
| 92 #include "sync/internal_api/public/sync_context_proxy.h" | 93 #include "sync/internal_api/public/sync_context_proxy.h" |
| 93 #include "sync/internal_api/public/sync_encryption_handler.h" | 94 #include "sync/internal_api/public/sync_encryption_handler.h" |
| 94 #include "sync/internal_api/public/util/experiments.h" | 95 #include "sync/internal_api/public/util/experiments.h" |
| 95 #include "sync/internal_api/public/util/sync_db_util.h" | 96 #include "sync/internal_api/public/util/sync_db_util.h" |
| 96 #include "sync/internal_api/public/util/sync_string_conversions.h" | 97 #include "sync/internal_api/public/util/sync_string_conversions.h" |
| 97 #include "sync/js/js_event_details.h" | 98 #include "sync/js/js_event_details.h" |
| 98 #include "sync/util/cryptographer.h" | 99 #include "sync/util/cryptographer.h" |
| 99 #include "ui/base/l10n/l10n_util.h" | 100 #include "ui/base/l10n/l10n_util.h" |
| 100 #include "ui/base/l10n/time_format.h" | 101 #include "ui/base/l10n/time_format.h" |
| 101 | 102 |
| (...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 638 | 639 |
| 639 void ProfileSyncService::StartUpSlowBackendComponents( | 640 void ProfileSyncService::StartUpSlowBackendComponents( |
| 640 ProfileSyncService::BackendMode mode) { | 641 ProfileSyncService::BackendMode mode) { |
| 641 DCHECK_NE(IDLE, mode); | 642 DCHECK_NE(IDLE, mode); |
| 642 if (backend_mode_ == mode) { | 643 if (backend_mode_ == mode) { |
| 643 return; | 644 return; |
| 644 } | 645 } |
| 645 | 646 |
| 646 DVLOG(1) << "Start backend mode: " << mode; | 647 DVLOG(1) << "Start backend mode: " << mode; |
| 647 | 648 |
| 648 if (backend_) | 649 if (backend_) { |
| 649 ShutdownImpl(browser_sync::SyncBackendHost::STOP_AND_CLAIM_THREAD); | 650 if (mode == SYNC) |
| 651 ShutdownImpl(syncer::SWITCH_MODE_SYNC); |
| 652 else |
| 653 ShutdownImpl(syncer::STOP_SYNC); |
| 654 } |
| 650 | 655 |
| 651 backend_mode_ = mode; | 656 backend_mode_ = mode; |
| 652 | 657 |
| 653 if (backend_mode_ == ROLLBACK) | 658 if (backend_mode_ == ROLLBACK) |
| 654 ClearBrowsingDataSinceFirstSync(); | 659 ClearBrowsingDataSinceFirstSync(); |
| 655 else if (backend_mode_ == SYNC) | 660 else if (backend_mode_ == SYNC) |
| 656 CheckSyncBackupIfNeeded(); | 661 CheckSyncBackupIfNeeded(); |
| 657 | 662 |
| 658 base::FilePath sync_folder = backend_mode_ == SYNC ? | 663 base::FilePath sync_folder = backend_mode_ == SYNC ? |
| 659 base::FilePath(kSyncDataFolderName) : | 664 base::FilePath(kSyncDataFolderName) : |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 776 if (HasSyncingBackend()) { | 781 if (HasSyncingBackend()) { |
| 777 RequestAccessToken(); | 782 RequestAccessToken(); |
| 778 } else { | 783 } else { |
| 779 startup_controller_.TryStart(); | 784 startup_controller_.TryStart(); |
| 780 } | 785 } |
| 781 } | 786 } |
| 782 | 787 |
| 783 void ProfileSyncService::Shutdown() { | 788 void ProfileSyncService::Shutdown() { |
| 784 UnregisterAuthNotifications(); | 789 UnregisterAuthNotifications(); |
| 785 | 790 |
| 786 ShutdownImpl(browser_sync::SyncBackendHost::STOP); | 791 ShutdownImpl(syncer::BROWSER_SHUTDOWN); |
| 787 if (sync_error_controller_) { | 792 if (sync_error_controller_) { |
| 788 // Destroy the SyncErrorController when the service shuts down for good. | 793 // Destroy the SyncErrorController when the service shuts down for good. |
| 789 RemoveObserver(sync_error_controller_.get()); | 794 RemoveObserver(sync_error_controller_.get()); |
| 790 sync_error_controller_.reset(); | 795 sync_error_controller_.reset(); |
| 791 } | 796 } |
| 792 | 797 |
| 793 if (sync_thread_) | 798 if (sync_thread_) |
| 794 sync_thread_->Stop(); | 799 sync_thread_->Stop(); |
| 795 } | 800 } |
| 796 | 801 |
| 797 void ProfileSyncService::ShutdownImpl( | 802 void ProfileSyncService::ShutdownImpl(syncer::ShutdownReason reason) { |
| 798 browser_sync::SyncBackendHost::ShutdownOption option) { | |
| 799 if (!backend_) | 803 if (!backend_) |
| 800 return; | 804 return; |
| 801 | 805 |
| 802 non_blocking_data_type_manager_.DisconnectSyncBackend(); | 806 non_blocking_data_type_manager_.DisconnectSyncBackend(); |
| 803 | 807 |
| 804 // First, we spin down the backend to stop change processing as soon as | 808 // First, we spin down the backend to stop change processing as soon as |
| 805 // possible. | 809 // possible. |
| 806 base::Time shutdown_start_time = base::Time::Now(); | 810 base::Time shutdown_start_time = base::Time::Now(); |
| 807 backend_->StopSyncingForShutdown(); | 811 backend_->StopSyncingForShutdown(); |
| 808 | 812 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 823 | 827 |
| 824 // Shutdown the migrator before the backend to ensure it doesn't pull a null | 828 // Shutdown the migrator before the backend to ensure it doesn't pull a null |
| 825 // snapshot. | 829 // snapshot. |
| 826 migrator_.reset(); | 830 migrator_.reset(); |
| 827 sync_js_controller_.AttachJsBackend(WeakHandle<syncer::JsBackend>()); | 831 sync_js_controller_.AttachJsBackend(WeakHandle<syncer::JsBackend>()); |
| 828 | 832 |
| 829 // Move aside the backend so nobody else tries to use it while we are | 833 // Move aside the backend so nobody else tries to use it while we are |
| 830 // shutting it down. | 834 // shutting it down. |
| 831 scoped_ptr<SyncBackendHost> doomed_backend(backend_.release()); | 835 scoped_ptr<SyncBackendHost> doomed_backend(backend_.release()); |
| 832 if (doomed_backend) { | 836 if (doomed_backend) { |
| 833 sync_thread_ = doomed_backend->Shutdown(option); | 837 sync_thread_ = doomed_backend->Shutdown(reason); |
| 834 doomed_backend.reset(); | 838 doomed_backend.reset(); |
| 835 } | 839 } |
| 836 base::TimeDelta shutdown_time = base::Time::Now() - shutdown_start_time; | 840 base::TimeDelta shutdown_time = base::Time::Now() - shutdown_start_time; |
| 837 UMA_HISTOGRAM_TIMES("Sync.Shutdown.BackendDestroyedTime", shutdown_time); | 841 UMA_HISTOGRAM_TIMES("Sync.Shutdown.BackendDestroyedTime", shutdown_time); |
| 838 | 842 |
| 839 weak_factory_.InvalidateWeakPtrs(); | 843 weak_factory_.InvalidateWeakPtrs(); |
| 840 | 844 |
| 841 if (backend_mode_ == SYNC) | 845 if (backend_mode_ == SYNC) |
| 842 startup_controller_.Reset(GetRegisteredDataTypes()); | 846 startup_controller_.Reset(GetRegisteredDataTypes()); |
| 843 | 847 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 858 UpdateAuthErrorState(GoogleServiceAuthError::AuthErrorNone()); | 862 UpdateAuthErrorState(GoogleServiceAuthError::AuthErrorNone()); |
| 859 | 863 |
| 860 NotifyObservers(); | 864 NotifyObservers(); |
| 861 } | 865 } |
| 862 | 866 |
| 863 void ProfileSyncService::DisableForUser() { | 867 void ProfileSyncService::DisableForUser() { |
| 864 // Clear prefs (including SyncSetupHasCompleted) before shutting down so | 868 // Clear prefs (including SyncSetupHasCompleted) before shutting down so |
| 865 // PSS clients don't think we're set up while we're shutting down. | 869 // PSS clients don't think we're set up while we're shutting down. |
| 866 sync_prefs_.ClearPreferences(); | 870 sync_prefs_.ClearPreferences(); |
| 867 ClearUnrecoverableError(); | 871 ClearUnrecoverableError(); |
| 868 ShutdownImpl(browser_sync::SyncBackendHost::DISABLE_AND_CLAIM_THREAD); | 872 ShutdownImpl(syncer::DISABLE_SYNC); |
| 869 } | 873 } |
| 870 | 874 |
| 871 bool ProfileSyncService::HasSyncSetupCompleted() const { | 875 bool ProfileSyncService::HasSyncSetupCompleted() const { |
| 872 return sync_prefs_.HasSyncSetupCompleted(); | 876 return sync_prefs_.HasSyncSetupCompleted(); |
| 873 } | 877 } |
| 874 | 878 |
| 875 void ProfileSyncService::SetSyncSetupCompleted() { | 879 void ProfileSyncService::SetSyncSetupCompleted() { |
| 876 sync_prefs_.SetSyncSetupCompleted(); | 880 sync_prefs_.SetSyncSetupCompleted(); |
| 877 } | 881 } |
| 878 | 882 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 937 from_here.Write(true, true, &location); | 941 from_here.Write(true, true, &location); |
| 938 LOG(ERROR) | 942 LOG(ERROR) |
| 939 << "Unrecoverable error detected at " << location | 943 << "Unrecoverable error detected at " << location |
| 940 << " -- ProfileSyncService unusable: " << message; | 944 << " -- ProfileSyncService unusable: " << message; |
| 941 | 945 |
| 942 // Shut all data types down. | 946 // Shut all data types down. |
| 943 base::MessageLoop::current()->PostTask(FROM_HERE, | 947 base::MessageLoop::current()->PostTask(FROM_HERE, |
| 944 base::Bind(&ProfileSyncService::ShutdownImpl, | 948 base::Bind(&ProfileSyncService::ShutdownImpl, |
| 945 weak_factory_.GetWeakPtr(), | 949 weak_factory_.GetWeakPtr(), |
| 946 delete_sync_database ? | 950 delete_sync_database ? |
| 947 browser_sync::SyncBackendHost::DISABLE_AND_CLAIM_THREAD : | 951 syncer::DISABLE_SYNC : syncer::STOP_SYNC)); |
| 948 browser_sync::SyncBackendHost::STOP_AND_CLAIM_THREAD)); | |
| 949 } | 952 } |
| 950 | 953 |
| 951 // TODO(zea): Move this logic into the DataTypeController/DataTypeManager. | 954 // TODO(zea): Move this logic into the DataTypeController/DataTypeManager. |
| 952 void ProfileSyncService::DisableDatatype(const syncer::SyncError& error) { | 955 void ProfileSyncService::DisableDatatype(const syncer::SyncError& error) { |
| 953 // First deactivate the type so that no further server changes are | 956 // First deactivate the type so that no further server changes are |
| 954 // passed onto the change processor. | 957 // passed onto the change processor. |
| 955 DeactivateDataType(error.model_type()); | 958 DeactivateDataType(error.model_type()); |
| 956 | 959 |
| 957 std::map<syncer::ModelType, syncer::SyncError> errors; | 960 std::map<syncer::ModelType, syncer::SyncError> errors; |
| 958 errors[error.model_type()] = error; | 961 errors[error.model_type()] = error; |
| (...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1441 } | 1444 } |
| 1442 #endif | 1445 #endif |
| 1443 break; | 1446 break; |
| 1444 case syncer::ROLLBACK_DONE: | 1447 case syncer::ROLLBACK_DONE: |
| 1445 backup_rollback_controller_.OnRollbackDone(); | 1448 backup_rollback_controller_.OnRollbackDone(); |
| 1446 break; | 1449 break; |
| 1447 case syncer::STOP_SYNC_FOR_DISABLED_ACCOUNT: | 1450 case syncer::STOP_SYNC_FOR_DISABLED_ACCOUNT: |
| 1448 // Sync disabled by domain admin. we should stop syncing until next | 1451 // Sync disabled by domain admin. we should stop syncing until next |
| 1449 // restart. | 1452 // restart. |
| 1450 sync_disabled_by_admin_ = true; | 1453 sync_disabled_by_admin_ = true; |
| 1451 ShutdownImpl(browser_sync::SyncBackendHost::DISABLE_AND_CLAIM_THREAD); | 1454 ShutdownImpl(syncer::DISABLE_SYNC); |
| 1452 break; | 1455 break; |
| 1453 default: | 1456 default: |
| 1454 NOTREACHED(); | 1457 NOTREACHED(); |
| 1455 } | 1458 } |
| 1456 NotifyObservers(); | 1459 NotifyObservers(); |
| 1457 | 1460 |
| 1458 backup_rollback_controller_.Start(base::TimeDelta()); | 1461 backup_rollback_controller_.Start(base::TimeDelta()); |
| 1459 } | 1462 } |
| 1460 | 1463 |
| 1461 void ProfileSyncService::OnConfigureDone( | 1464 void ProfileSyncService::OnConfigureDone( |
| 1462 const DataTypeManager::ConfigureResult& result) { | 1465 const DataTypeManager::ConfigureResult& result) { |
| 1463 // We should have cleared our cached passphrase before we get here (in | 1466 // We should have cleared our cached passphrase before we get here (in |
| 1464 // OnBackendInitialized()). | 1467 // OnBackendInitialized()). |
| 1465 DCHECK(cached_passphrase_.empty()); | 1468 DCHECK(cached_passphrase_.empty()); |
| 1466 | 1469 |
| 1467 configure_status_ = result.status; | 1470 configure_status_ = result.status; |
| 1468 | 1471 |
| 1469 if (backend_mode_ != SYNC) { | 1472 if (backend_mode_ != SYNC) { |
| 1470 if (configure_status_ == DataTypeManager::OK || | 1473 if (configure_status_ == DataTypeManager::OK || |
| 1471 configure_status_ == DataTypeManager::PARTIAL_SUCCESS) { | 1474 configure_status_ == DataTypeManager::PARTIAL_SUCCESS) { |
| 1472 StartSyncingWithServer(); | 1475 StartSyncingWithServer(); |
| 1473 } else if (!expect_sync_configuration_aborted_) { | 1476 } else if (!expect_sync_configuration_aborted_) { |
| 1474 DVLOG(1) << "Backup/rollback backend failed to configure."; | 1477 DVLOG(1) << "Backup/rollback backend failed to configure."; |
| 1475 ShutdownImpl(browser_sync::SyncBackendHost::STOP_AND_CLAIM_THREAD); | 1478 ShutdownImpl(syncer::STOP_SYNC); |
| 1476 } | 1479 } |
| 1477 | 1480 |
| 1478 return; | 1481 return; |
| 1479 } | 1482 } |
| 1480 | 1483 |
| 1481 if (!sync_configure_start_time_.is_null()) { | 1484 if (!sync_configure_start_time_.is_null()) { |
| 1482 if (result.status == DataTypeManager::OK || | 1485 if (result.status == DataTypeManager::OK || |
| 1483 result.status == DataTypeManager::PARTIAL_SUCCESS) { | 1486 result.status == DataTypeManager::PARTIAL_SUCCESS) { |
| 1484 base::Time sync_configure_stop_time = base::Time::Now(); | 1487 base::Time sync_configure_stop_time = base::Time::Now(); |
| 1485 base::TimeDelta delta = sync_configure_stop_time - | 1488 base::TimeDelta delta = sync_configure_stop_time - |
| (...skipping 940 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2426 return false; | 2429 return false; |
| 2427 | 2430 |
| 2428 return directory_data_type_manager_->state() == DataTypeManager::CONFIGURED; | 2431 return directory_data_type_manager_->state() == DataTypeManager::CONFIGURED; |
| 2429 } | 2432 } |
| 2430 | 2433 |
| 2431 void ProfileSyncService::StopAndSuppress() { | 2434 void ProfileSyncService::StopAndSuppress() { |
| 2432 sync_prefs_.SetStartSuppressed(true); | 2435 sync_prefs_.SetStartSuppressed(true); |
| 2433 if (HasSyncingBackend()) { | 2436 if (HasSyncingBackend()) { |
| 2434 backend_->UnregisterInvalidationIds(); | 2437 backend_->UnregisterInvalidationIds(); |
| 2435 } | 2438 } |
| 2436 ShutdownImpl(browser_sync::SyncBackendHost::STOP_AND_CLAIM_THREAD); | 2439 ShutdownImpl(syncer::STOP_SYNC); |
| 2437 } | 2440 } |
| 2438 | 2441 |
| 2439 bool ProfileSyncService::IsStartSuppressed() const { | 2442 bool ProfileSyncService::IsStartSuppressed() const { |
| 2440 return sync_prefs_.IsStartSuppressed(); | 2443 return sync_prefs_.IsStartSuppressed(); |
| 2441 } | 2444 } |
| 2442 | 2445 |
| 2443 SigninManagerBase* ProfileSyncService::signin() const { | 2446 SigninManagerBase* ProfileSyncService::signin() const { |
| 2444 if (!signin_) | 2447 if (!signin_) |
| 2445 return NULL; | 2448 return NULL; |
| 2446 return signin_->GetOriginal(); | 2449 return signin_->GetOriginal(); |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2609 LOG(WARNING) << "The following sync URL specified at the command-line " | 2612 LOG(WARNING) << "The following sync URL specified at the command-line " |
| 2610 << "is invalid: " << value; | 2613 << "is invalid: " << value; |
| 2611 } | 2614 } |
| 2612 } | 2615 } |
| 2613 } | 2616 } |
| 2614 return result; | 2617 return result; |
| 2615 } | 2618 } |
| 2616 | 2619 |
| 2617 void ProfileSyncService::StartStopBackupForTesting() { | 2620 void ProfileSyncService::StartStopBackupForTesting() { |
| 2618 if (backend_mode_ == BACKUP) | 2621 if (backend_mode_ == BACKUP) |
| 2619 ShutdownImpl(browser_sync::SyncBackendHost::STOP_AND_CLAIM_THREAD); | 2622 ShutdownImpl(syncer::STOP_SYNC); |
| 2620 else | 2623 else |
| 2621 backup_rollback_controller_.Start(base::TimeDelta()); | 2624 backup_rollback_controller_.Start(base::TimeDelta()); |
| 2622 } | 2625 } |
| 2623 | 2626 |
| 2624 void ProfileSyncService::CheckSyncBackupIfNeeded() { | 2627 void ProfileSyncService::CheckSyncBackupIfNeeded() { |
| 2625 DCHECK_EQ(backend_mode_, SYNC); | 2628 DCHECK_EQ(backend_mode_, SYNC); |
| 2626 | 2629 |
| 2627 #if defined(ENABLE_PRE_SYNC_BACKUP) | 2630 #if defined(ENABLE_PRE_SYNC_BACKUP) |
| 2628 // Check backup once a day. | 2631 // Check backup once a day. |
| 2629 if (!last_backup_time_ && | 2632 if (!last_backup_time_ && |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2660 browser_sync::SyncedDeviceTracker* device_tracker = | 2663 browser_sync::SyncedDeviceTracker* device_tracker = |
| 2661 backend_->GetSyncedDeviceTracker(); | 2664 backend_->GetSyncedDeviceTracker(); |
| 2662 if (device_tracker) | 2665 if (device_tracker) |
| 2663 device_tracker->UpdateLocalDeviceBackupTime(*last_backup_time_); | 2666 device_tracker->UpdateLocalDeviceBackupTime(*last_backup_time_); |
| 2664 } | 2667 } |
| 2665 } | 2668 } |
| 2666 | 2669 |
| 2667 base::Time ProfileSyncService::GetDeviceBackupTimeForTesting() const { | 2670 base::Time ProfileSyncService::GetDeviceBackupTimeForTesting() const { |
| 2668 return backend_->GetSyncedDeviceTracker()->GetLocalDeviceBackupTime(); | 2671 return backend_->GetSyncedDeviceTracker()->GetLocalDeviceBackupTime(); |
| 2669 } | 2672 } |
| OLD | NEW |