| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/sync/backup_rollback_controller.h" |
| |
| #include "base/command_line.h" |
| #include "base/message_loop/message_loop.h" |
| #include "base/metrics/field_trial.h" |
| #include "chrome/browser/sync/supervised_user_signin_manager_wrapper.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "components/sync_driver/sync_prefs.h" |
| |
| namespace browser_sync { |
| |
| #if defined(ENABLE_PRE_SYNC_BACKUP) |
| // Number of rollback attempts to try before giving up. |
| static const int kRollbackLimits = 3; |
| |
| // Finch experiment name and group. |
| static char kSyncBackupFinchName[] = "SyncBackup"; |
| static char kSyncBackupFinchDisabled[] = "disabled"; |
| #endif |
| |
| BackupRollbackController::BackupRollbackController( |
| sync_driver::SyncPrefs* sync_prefs, |
| const SupervisedUserSigninManagerWrapper* signin, |
| base::Closure start_backup, |
| base::Closure start_rollback) |
| : sync_prefs_(sync_prefs), |
| signin_(signin), |
| start_backup_(start_backup), |
| start_rollback_(start_rollback), |
| weak_ptr_factory_(this) { |
| } |
| |
| BackupRollbackController::~BackupRollbackController() { |
| } |
| |
| void BackupRollbackController::Start(base::TimeDelta delay) { |
| if (!IsBackupEnabled()) |
| return; |
| |
| if (!CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kSyncEnableRollback)) { |
| sync_prefs_->SetRemainingRollbackTries(0); |
| } |
| |
| if (delay == base::TimeDelta()) { |
| TryStart(); |
| } else { |
| base::MessageLoop::current()->PostDelayedTask( |
| FROM_HERE, |
| base::Bind(&BackupRollbackController::TryStart, |
| weak_ptr_factory_.GetWeakPtr()), |
| delay); |
| } |
| } |
| |
| void BackupRollbackController::OnRollbackReceived() { |
| #if defined(ENABLE_PRE_SYNC_BACKUP) |
| sync_prefs_->SetRemainingRollbackTries(kRollbackLimits); |
| #endif |
| } |
| |
| void BackupRollbackController::OnRollbackDone() { |
| #if defined(ENABLE_PRE_SYNC_BACKUP) |
| sync_prefs_->SetRemainingRollbackTries(0); |
| #endif |
| } |
| |
| void BackupRollbackController::TryStart() { |
| if (!signin_->GetEffectiveUsername().empty()) { |
| DVLOG(1) << "Don't start backup/rollback when user is signed in."; |
| return; |
| } |
| |
| int rollback_tries = sync_prefs_->GetRemainingRollbackTries(); |
| if (rollback_tries > 0) { |
| DVLOG(1) << "Start rollback."; |
| sync_prefs_->SetRemainingRollbackTries(rollback_tries - 1); |
| start_rollback_.Run(); |
| } else { |
| DVLOG(1) << "Start backup."; |
| start_backup_.Run(); |
| } |
| } |
| |
| // static |
| bool BackupRollbackController::IsBackupEnabled() { |
| #if defined(ENABLE_PRE_SYNC_BACKUP) |
| const std::string group_name = |
| base::FieldTrialList::FindFullName(kSyncBackupFinchName); |
| |
| if (CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kSyncDisableBackup) || |
| group_name == kSyncBackupFinchDisabled) { |
| return false; |
| } |
| return true; |
| #else |
| return false; |
| #endif |
| } |
| |
| } // namespace browser_sync |