diff options
author | haitaol@chromium.org <haitaol@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-10 20:05:25 +0000 |
---|---|---|
committer | haitaol@chromium.org <haitaol@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-10 20:05:25 +0000 |
commit | 7ca2621a29e6b70b8358b53e4cd9ba9a94adb6e0 (patch) | |
tree | 754663cbd2559663674707b649b3508a371c0b42 | |
parent | 22f34355f3419d5a1e1ae9ceee4b63e7efc1c53f (diff) | |
download | chromium_src-7ca2621a29e6b70b8358b53e4cd9ba9a94adb6e0.zip chromium_src-7ca2621a29e6b70b8358b53e4cd9ba9a94adb6e0.tar.gz chromium_src-7ca2621a29e6b70b8358b53e4cd9ba9a94adb6e0.tar.bz2 |
Use new sync backup DB if settings are reset to avoid undoing reset from backup data, e.g. reinstall removed extensions, etc.
BUG=389690
Review URL: https://codereview.chromium.org/367063005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@282409 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/sync/profile_sync_service.cc | 20 | ||||
-rw-r--r-- | chrome/browser/sync/profile_sync_service_unittest.cc | 38 |
2 files changed, 45 insertions, 13 deletions
diff --git a/chrome/browser/sync/profile_sync_service.cc b/chrome/browser/sync/profile_sync_service.cc index 03001b4..cd24db0e 100644 --- a/chrome/browser/sync/profile_sync_service.cc +++ b/chrome/browser/sync/profile_sync_service.cc @@ -32,6 +32,7 @@ #include "chrome/browser/defaults.h" #include "chrome/browser/invalidation/profile_invalidation_provider_factory.h" #include "chrome/browser/net/chrome_cookie_notification_details.h" +#include "chrome/browser/prefs/chrome_pref_service_factory.h" #include "chrome/browser/prefs/pref_service_syncable.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/services/gcm/gcm_profile_service.h" @@ -521,11 +522,20 @@ bool ProfileSyncService::ShouldDeleteSyncFolder() { if (backend_mode_ == SYNC) return !HasSyncSetupCompleted(); - // Start fresh if it's the first time backup after user stopped syncing. - // This is needed because backup DB may contain items deleted by user during - // sync period and can cause back-from-dead issues. - if (backend_mode_ == BACKUP && !sync_prefs_.GetFirstSyncTime().is_null()) - return true; + if (backend_mode_ == BACKUP) { + base::Time reset_time = chrome_prefs::GetResetTime(profile_); + + // Start fresh if: + // * It's the first time backup after user stopped syncing because backup + // DB may contain items deleted by user during sync period and can cause + // back-from-dead issues if user didn't choose rollback. + // * Settings are reset during startup because of tampering to avoid + // restoring settings from backup. + if (!sync_prefs_.GetFirstSyncTime().is_null() || + (!reset_time.is_null() && profile_->GetStartTime() <= reset_time)) { + return true; + } + } return false; } diff --git a/chrome/browser/sync/profile_sync_service_unittest.cc b/chrome/browser/sync/profile_sync_service_unittest.cc index 44361a2..387345c 100644 --- a/chrome/browser/sync/profile_sync_service_unittest.cc +++ b/chrome/browser/sync/profile_sync_service_unittest.cc @@ -7,6 +7,7 @@ #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" #include "base/run_loop.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "chrome/browser/invalidation/fake_invalidation_service.h" @@ -492,10 +493,6 @@ TEST_F(ProfileSyncServiceTest, GetSyncTokenStatus) { } #if defined(ENABLE_PRE_SYNC_BACKUP) -void QuitLoop() { - base::MessageLoop::current()->Quit(); -} - TEST_F(ProfileSyncServiceTest, StartBackup) { CreateServiceWithoutSignIn(); ExpectDataTypeManagerCreation(1); @@ -503,10 +500,11 @@ TEST_F(ProfileSyncServiceTest, StartBackup) { ExpectSyncBackendHostCreationCollectDeleteDir(1, &delete_dir_param); Initialize(); EXPECT_EQ(ProfileSyncService::IDLE, service()->backend_mode()); + base::RunLoop run_loop; base::MessageLoop::current()->PostDelayedTask( - FROM_HERE, base::Bind(&QuitLoop), + FROM_HERE, run_loop.QuitClosure(), base::TimeDelta::FromMilliseconds(100)); - base::MessageLoop::current()->Run(); + run_loop.Run(); EXPECT_EQ(ProfileSyncService::BACKUP, service()->backend_mode()); EXPECT_EQ(1u, delete_dir_param.size()); @@ -521,7 +519,6 @@ TEST_F(ProfileSyncServiceTest, BackupAfterSyncDisabled) { ExpectSyncBackendHostCreationCollectDeleteDir(2, &delete_dir_param); IssueTestTokens(); Initialize(); - base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(&QuitLoop)); EXPECT_TRUE(service()->sync_initialized()); EXPECT_EQ(ProfileSyncService::SYNC, service()->backend_mode()); @@ -556,7 +553,6 @@ TEST_F(ProfileSyncServiceTest, RollbackThenBackup) { ExpectSyncBackendHostCreationCollectDeleteDir(3, &delete_dir_param); IssueTestTokens(); Initialize(); - base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(&QuitLoop)); EXPECT_TRUE(service()->sync_initialized()); EXPECT_EQ(ProfileSyncService::SYNC, service()->backend_mode()); @@ -587,6 +583,32 @@ TEST_F(ProfileSyncServiceTest, RollbackThenBackup) { EXPECT_FALSE(delete_dir_param[1]); EXPECT_TRUE(delete_dir_param[2]); } + +TEST_F(ProfileSyncServiceTest, StartNewBackupDbOnSettingsReset) { + CreateServiceWithoutSignIn(); + ExpectDataTypeManagerCreation(1); + std::vector<bool> delete_dir_param; + ExpectSyncBackendHostCreationCollectDeleteDir(1, &delete_dir_param); + Initialize(); + EXPECT_EQ(ProfileSyncService::IDLE, service()->backend_mode()); + + // Set reset time to pretend settings reset happened. + profile()->GetPrefs()->SetString( + prefs::kPreferenceResetTime, + base::Int64ToString(base::Time::Now().ToInternalValue())); + + base::RunLoop run_loop; + base::MessageLoop::current()->PostDelayedTask( + FROM_HERE, run_loop.QuitClosure(), + base::TimeDelta::FromMilliseconds(100)); + run_loop.Run(); + + EXPECT_EQ(ProfileSyncService::BACKUP, service()->backend_mode()); + + EXPECT_EQ(1u, delete_dir_param.size()); + EXPECT_TRUE(delete_dir_param[0]); +} + #endif TEST_F(ProfileSyncServiceTest, GetSyncServiceURL) { |