| Index: components/browser_sync/browser/profile_sync_service.cc
|
| diff --git a/components/browser_sync/browser/profile_sync_service.cc b/components/browser_sync/browser/profile_sync_service.cc
|
| index 1b2911e47c5e158e9faa91cd299b4145c9d69d90..305693d1c93fb76997841ed675597b202f21e93c 100644
|
| --- a/components/browser_sync/browser/profile_sync_service.cc
|
| +++ b/components/browser_sync/browser/profile_sync_service.cc
|
| @@ -234,8 +234,8 @@ ProfileSyncService::ProfileSyncService(InitParams init_params)
|
| base_directory_.Append(base::FilePath(kSyncDataFolderName))),
|
| catch_up_configure_in_progress_(false),
|
| passphrase_prompt_triggered_by_version_(false),
|
| - weak_factory_(this),
|
| - startup_controller_weak_factory_(this) {
|
| + sync_enabled_weak_factory_(this),
|
| + weak_factory_(this) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| DCHECK(sync_client_);
|
| std::string last_version = sync_prefs_.GetLastRunVersion();
|
| @@ -269,7 +269,7 @@ void ProfileSyncService::Initialize() {
|
| &sync_prefs_,
|
| base::Bind(&ProfileSyncService::CanBackendStart, base::Unretained(this)),
|
| base::Bind(&ProfileSyncService::StartUpSlowBackendComponents,
|
| - startup_controller_weak_factory_.GetWeakPtr())));
|
| + weak_factory_.GetWeakPtr())));
|
| std::unique_ptr<browser_sync::LocalSessionEventRouter> router(
|
| sync_client_->GetSyncSessionsClient()->GetLocalSessionEventRouter());
|
| local_device_ = sync_client_->GetSyncApiComponentFactory()
|
| @@ -282,9 +282,9 @@ void ProfileSyncService::Initialize() {
|
| sync_client_->GetSyncSessionsClient(), &sync_prefs_, local_device_.get(),
|
| std::move(router),
|
| base::Bind(&ProfileSyncService::NotifyForeignSessionUpdated,
|
| - weak_factory_.GetWeakPtr()),
|
| + sync_enabled_weak_factory_.GetWeakPtr()),
|
| base::Bind(&ProfileSyncService::TriggerRefresh,
|
| - weak_factory_.GetWeakPtr(),
|
| + sync_enabled_weak_factory_.GetWeakPtr(),
|
| syncer::ModelTypeSet(syncer::SESSIONS))));
|
|
|
| if (channel_ == version_info::Channel::UNKNOWN &&
|
| @@ -375,8 +375,9 @@ void ProfileSyncService::Initialize() {
|
| AddObserver(sync_error_controller_.get());
|
| #endif
|
|
|
| - memory_pressure_listener_.reset(new base::MemoryPressureListener(base::Bind(
|
| - &ProfileSyncService::OnMemoryPressure, weak_factory_.GetWeakPtr())));
|
| + memory_pressure_listener_.reset(new base::MemoryPressureListener(
|
| + base::Bind(&ProfileSyncService::OnMemoryPressure,
|
| + sync_enabled_weak_factory_.GetWeakPtr())));
|
| startup_controller_->Reset(GetRegisteredDataTypes());
|
| startup_controller_->TryStart();
|
| }
|
| @@ -511,7 +512,7 @@ void ProfileSyncService::InitializeBackend(bool delete_stale_data) {
|
| credentials, delete_stale_data,
|
| std::unique_ptr<syncer::SyncManagerFactory>(
|
| new syncer::SyncManagerFactory()),
|
| - MakeWeakHandle(weak_factory_.GetWeakPtr()),
|
| + MakeWeakHandle(sync_enabled_weak_factory_.GetWeakPtr()),
|
| base::Bind(browser_sync::ChromeReportUnrecoverableError, channel_),
|
| http_post_provider_factory_getter, std::move(saved_nigori_state_));
|
| }
|
| @@ -643,10 +644,9 @@ void ProfileSyncService::OnGetTokenFailure(
|
| next_token_request_time_ = base::Time::Now() +
|
| request_access_token_backoff_.GetTimeUntilRelease();
|
| request_access_token_retry_timer_.Start(
|
| - FROM_HERE,
|
| - request_access_token_backoff_.GetTimeUntilRelease(),
|
| - base::Bind(&ProfileSyncService::RequestAccessToken,
|
| - weak_factory_.GetWeakPtr()));
|
| + FROM_HERE, request_access_token_backoff_.GetTimeUntilRelease(),
|
| + base::Bind(&ProfileSyncService::RequestAccessToken,
|
| + sync_enabled_weak_factory_.GetWeakPtr()));
|
| NotifyObservers();
|
| break;
|
| }
|
| @@ -768,7 +768,7 @@ void ProfileSyncService::ShutdownImpl(syncer::ShutdownReason reason) {
|
| base::TimeDelta shutdown_time = base::Time::Now() - shutdown_start_time;
|
| UMA_HISTOGRAM_TIMES("Sync.Shutdown.BackendDestroyedTime", shutdown_time);
|
|
|
| - weak_factory_.InvalidateWeakPtrs();
|
| + sync_enabled_weak_factory_.InvalidateWeakPtrs();
|
|
|
| startup_controller_->Reset(GetRegisteredDataTypes());
|
|
|
| @@ -894,10 +894,10 @@ void ProfileSyncService::OnUnrecoverableErrorImpl(
|
|
|
| // Shut all data types down.
|
| base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(
|
| - &ProfileSyncService::ShutdownImpl, weak_factory_.GetWeakPtr(),
|
| - delete_sync_database ? syncer::DISABLE_SYNC : syncer::STOP_SYNC));
|
| + FROM_HERE, base::Bind(&ProfileSyncService::ShutdownImpl,
|
| + sync_enabled_weak_factory_.GetWeakPtr(),
|
| + delete_sync_database ? syncer::DISABLE_SYNC
|
| + : syncer::STOP_SYNC));
|
| }
|
|
|
| void ProfileSyncService::ReenableDatatype(syncer::ModelType type) {
|
| @@ -1106,10 +1106,9 @@ void ProfileSyncService::OnConnectionStatusChange(
|
| } else {
|
| request_access_token_backoff_.InformOfRequest(false);
|
| request_access_token_retry_timer_.Start(
|
| - FROM_HERE,
|
| - request_access_token_backoff_.GetTimeUntilRelease(),
|
| + FROM_HERE, request_access_token_backoff_.GetTimeUntilRelease(),
|
| base::Bind(&ProfileSyncService::RequestAccessToken,
|
| - weak_factory_.GetWeakPtr()));
|
| + sync_enabled_weak_factory_.GetWeakPtr()));
|
| }
|
| } else {
|
| // Reset backoff time after successful connection.
|
| @@ -1300,8 +1299,9 @@ void ProfileSyncService::BeginConfigureCatchUpBeforeClear() {
|
|
|
| void ProfileSyncService::ClearAndRestartSyncForPassphraseEncryption() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| - backend_->ClearServerData(base::Bind(
|
| - &ProfileSyncService::OnClearServerDataDone, weak_factory_.GetWeakPtr()));
|
| + backend_->ClearServerData(
|
| + base::Bind(&ProfileSyncService::OnClearServerDataDone,
|
| + sync_enabled_weak_factory_.GetWeakPtr()));
|
| }
|
|
|
| void ProfileSyncService::OnClearServerDataDone() {
|
| @@ -1492,15 +1492,19 @@ bool ProfileSyncService::IsFirstSetupInProgress() const {
|
| return !IsFirstSetupComplete() && startup_controller_->IsSetupInProgress();
|
| }
|
|
|
| -void ProfileSyncService::SetSetupInProgress(bool setup_in_progress) {
|
| - // This method is a no-op if |setup_in_progress_| remains unchanged.
|
| - if (startup_controller_->IsSetupInProgress() == setup_in_progress)
|
| - return;
|
| +std::unique_ptr<sync_driver::SyncSetupInProgressHandle>
|
| +ProfileSyncService::GetSetupInProgressHandle() {
|
| + if (++outstanding_setup_in_progress_handles_ == 1) {
|
| + DCHECK(!startup_controller_->IsSetupInProgress());
|
| + startup_controller_->SetSetupInProgress(true);
|
|
|
| - startup_controller_->SetSetupInProgress(setup_in_progress);
|
| - if (!setup_in_progress && IsBackendInitialized())
|
| - ReconfigureDatatypeManager();
|
| - NotifyObservers();
|
| + NotifyObservers();
|
| + }
|
| +
|
| + return std::unique_ptr<sync_driver::SyncSetupInProgressHandle>(
|
| + new sync_driver::SyncSetupInProgressHandle(
|
| + base::Bind(&ProfileSyncService::OnSetupInProgressHandleDestroyed,
|
| + weak_factory_.GetWeakPtr())));
|
| }
|
|
|
| bool ProfileSyncService::IsSyncAllowed() const {
|
| @@ -2508,3 +2512,18 @@ tracked_objects::Location ProfileSyncService::unrecoverable_error_location()
|
| const {
|
| return unrecoverable_error_location_;
|
| }
|
| +
|
| +void ProfileSyncService::OnSetupInProgressHandleDestroyed() {
|
| + DCHECK_GT(outstanding_setup_in_progress_handles_, 0);
|
| +
|
| + // Don't re-start Sync until all outstanding handles are destroyed.
|
| + if (--outstanding_setup_in_progress_handles_ != 0)
|
| + return;
|
| +
|
| + DCHECK(startup_controller_->IsSetupInProgress());
|
| + startup_controller_->SetSetupInProgress(false);
|
| +
|
| + if (IsBackendInitialized())
|
| + ReconfigureDatatypeManager();
|
| + NotifyObservers();
|
| +}
|
|
|