• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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