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
BackupRollbackController(sync_driver::SyncPrefs * sync_prefs,const ManagedUserSigninManagerWrapper * signin,base::Closure start_backup,base::Closure start_rollback)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
~BackupRollbackController()37 BackupRollbackController::~BackupRollbackController() {
38 }
39
Start(base::TimeDelta delay)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
OnRollbackReceived()60 void BackupRollbackController::OnRollbackReceived() {
61 #if defined(ENABLE_PRE_SYNC_BACKUP)
62 sync_prefs_->SetRemainingRollbackTries(kRollbackLimits);
63 #endif
64 }
65
OnRollbackDone()66 void BackupRollbackController::OnRollbackDone() {
67 #if defined(ENABLE_PRE_SYNC_BACKUP)
68 sync_prefs_->SetRemainingRollbackTries(0);
69 #endif
70 }
71
TryStart()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
IsBackupEnabled()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