1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/sync/backup_rollback_controller.h" 6 7 #include "base/command_line.h" 8 #include "base/message_loop/message_loop.h" 9 #include "base/metrics/field_trial.h" 10 #include "chrome/browser/sync/managed_user_signin_manager_wrapper.h" 11 #include "chrome/common/chrome_switches.h" 12 #include "components/sync_driver/sync_prefs.h" 13 14 namespace browser_sync { 15 16 #if defined(ENABLE_PRE_SYNC_BACKUP) 17 // Number of rollback attempts to try before giving up. 18 static const int kRollbackLimits = 3; 19 20 // Finch experiment name and group. 21 static char kSyncBackupFinchName[] = "SyncBackup"; 22 static char kSyncBackupFinchDisabled[] = "disabled"; 23 #endif 24 25 BackupRollbackController::BackupRollbackController( 26 sync_driver::SyncPrefs* sync_prefs, 27 const ManagedUserSigninManagerWrapper* signin, 28 base::Closure start_backup, 29 base::Closure start_rollback) 30 : sync_prefs_(sync_prefs), 31 signin_(signin), 32 start_backup_(start_backup), 33 start_rollback_(start_rollback), 34 weak_ptr_factory_(this) { 35 } 36 37 BackupRollbackController::~BackupRollbackController() { 38 } 39 40 void BackupRollbackController::Start(base::TimeDelta delay) { 41 if (!IsBackupEnabled()) 42 return; 43 44 if (!CommandLine::ForCurrentProcess()->HasSwitch( 45 switches::kSyncEnableRollback)) { 46 sync_prefs_->SetRemainingRollbackTries(0); 47 } 48 49 if (delay == base::TimeDelta()) { 50 TryStart(); 51 } else { 52 base::MessageLoop::current()->PostDelayedTask( 53 FROM_HERE, 54 base::Bind(&BackupRollbackController::TryStart, 55 weak_ptr_factory_.GetWeakPtr()), 56 delay); 57 } 58 } 59 60 void BackupRollbackController::OnRollbackReceived() { 61 #if defined(ENABLE_PRE_SYNC_BACKUP) 62 sync_prefs_->SetRemainingRollbackTries(kRollbackLimits); 63 #endif 64 } 65 66 void BackupRollbackController::OnRollbackDone() { 67 #if defined(ENABLE_PRE_SYNC_BACKUP) 68 sync_prefs_->SetRemainingRollbackTries(0); 69 #endif 70 } 71 72 void BackupRollbackController::TryStart() { 73 if (!signin_->GetEffectiveUsername().empty()) { 74 DVLOG(1) << "Don't start backup/rollback when user is signed in."; 75 return; 76 } 77 78 int rollback_tries = sync_prefs_->GetRemainingRollbackTries(); 79 if (rollback_tries > 0) { 80 DVLOG(1) << "Start rollback."; 81 sync_prefs_->SetRemainingRollbackTries(rollback_tries - 1); 82 start_rollback_.Run(); 83 } else { 84 DVLOG(1) << "Start backup."; 85 start_backup_.Run(); 86 } 87 } 88 89 // static 90 bool BackupRollbackController::IsBackupEnabled() { 91 #if defined(ENABLE_PRE_SYNC_BACKUP) 92 const std::string group_name = 93 base::FieldTrialList::FindFullName(kSyncBackupFinchName); 94 95 if (CommandLine::ForCurrentProcess()->HasSwitch( 96 switches::kSyncDisableBackup) || 97 group_name == kSyncBackupFinchDisabled) { 98 return false; 99 } 100 return true; 101 #else 102 return false; 103 #endif 104 } 105 106 } // namespace browser_sync 107