Home | History | Annotate | Download | only in sync
      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