Index: chrome/browser/extensions/extension_service_unittest.cc |
=================================================================== |
--- chrome/browser/extensions/extension_service_unittest.cc (revision 234311) |
+++ chrome/browser/extensions/extension_service_unittest.cc (working copy) |
@@ -5279,6 +5279,91 @@ |
ASSERT_EQ(syncer::UNSPECIFIED, triggered_type); |
} |
+TEST_F(ExtensionServiceTest, DisableExtensionFromSync) { |
+ // Start the extensions service with one external extension already installed. |
+ base::FilePath source_install_dir = data_dir_ |
+ .AppendASCII("good") |
+ .AppendASCII("Extensions"); |
+ base::FilePath pref_path = source_install_dir |
+ .DirName() |
+ .AppendASCII("Preferences"); |
+ |
+ InitializeInstalledExtensionService(pref_path, source_install_dir); |
+ InitializeExtensionSyncService(); |
+ |
+ // The user has enabled sync. |
+ ProfileSyncService* sync_service = |
+ ProfileSyncServiceFactory::GetForProfile(profile_.get()); |
+ sync_service->SetSyncSetupCompleted(); |
+ |
+ service_->Init(); |
+ ASSERT_TRUE(service_->is_ready()); |
+ |
+ ASSERT_EQ(3u, loaded_.size()); |
+ |
+ // We start enabled. |
+ const Extension* extension = service_->GetExtensionById(good0, true); |
+ ASSERT_TRUE(extension); |
+ ASSERT_TRUE(service_->IsExtensionEnabled(good0)); |
+ extensions::ExtensionSyncData disable_good_crx(*extension, false, false); |
+ |
+ // Then sync data arrives telling us to disable |good0|. |
+ syncer::SyncDataList sync_data; |
+ sync_data.push_back(disable_good_crx.GetSyncData()); |
+ extension_sync_service_->MergeDataAndStartSyncing( |
+ syncer::EXTENSIONS, sync_data, |
+ scoped_ptr<syncer::SyncChangeProcessor>(new TestSyncProcessorStub), |
+ scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
+ ASSERT_FALSE(service_->IsExtensionEnabled(good0)); |
+} |
+ |
+TEST_F(ExtensionServiceTest, DontDisableExtensionWithPendingEnableFromSync) { |
+ // Start the extensions service with one external extension already installed. |
+ base::FilePath source_install_dir = data_dir_ |
+ .AppendASCII("good") |
+ .AppendASCII("Extensions"); |
+ base::FilePath pref_path = source_install_dir |
+ .DirName() |
+ .AppendASCII("Preferences"); |
+ |
+ InitializeInstalledExtensionService(pref_path, source_install_dir); |
+ InitializeExtensionSyncService(); |
+ |
+ // The user has enabled sync. |
+ ProfileSyncService* sync_service = |
+ ProfileSyncServiceFactory::GetForProfile(profile_.get()); |
+ sync_service->SetSyncSetupCompleted(); |
+ |
+ service_->Init(); |
+ ASSERT_TRUE(service_->is_ready()); |
+ ASSERT_EQ(3u, loaded_.size()); |
+ |
+ const Extension* extension = service_->GetExtensionById(good0, true); |
+ ASSERT_TRUE(service_->IsExtensionEnabled(good0)); |
+ |
+ // Disable extension before first sync data arrives. |
+ service_->DisableExtension(good0, Extension::DISABLE_USER_ACTION); |
+ ASSERT_FALSE(service_->IsExtensionEnabled(good0)); |
+ |
+ // Enable extension - this is now the most recent state. |
+ service_->EnableExtension(good0); |
+ ASSERT_TRUE(service_->IsExtensionEnabled(good0)); |
+ |
+ // Now sync data comes in that says to disable good0. This should be |
+ // ignored. |
+ extensions::ExtensionSyncData disable_good_crx(*extension, false, false); |
+ syncer::SyncDataList sync_data; |
+ sync_data.push_back(disable_good_crx.GetSyncData()); |
+ extension_sync_service_->MergeDataAndStartSyncing( |
+ syncer::EXTENSIONS, sync_data, |
+ scoped_ptr<syncer::SyncChangeProcessor>(new TestSyncProcessorStub), |
+ scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
+ |
+ // The extension was enabled locally before the sync data arrived, so it |
+ // should still be enabled now. |
+ ASSERT_TRUE(service_->IsExtensionEnabled(good0)); |
+} |
+ |
TEST_F(ExtensionServiceTest, GetSyncData) { |
InitializeEmptyExtensionService(); |
InitializeExtensionSyncService(); |
@@ -5297,6 +5382,7 @@ |
extensions::ExtensionSyncData data(list[0]); |
EXPECT_EQ(extension->id(), data.id()); |
EXPECT_FALSE(data.uninstalled()); |
+ EXPECT_EQ(service_->IsExtensionEnabled(good_crx), data.enabled()); |
EXPECT_EQ(extension_util::IsIncognitoEnabled(good_crx, service_), |
data.incognito_enabled()); |
EXPECT_TRUE(data.version().Equals(*extension->version())); |
@@ -5325,6 +5411,7 @@ |
extensions::ExtensionSyncData data(list[0]); |
EXPECT_EQ(extension->id(), data.id()); |
EXPECT_FALSE(data.uninstalled()); |
+ EXPECT_EQ(service_->IsExtensionEnabled(good_crx), data.enabled()); |
EXPECT_EQ(extension_util::IsIncognitoEnabled(good_crx, service_), |
data.incognito_enabled()); |
EXPECT_TRUE(data.version().Equals(*extension->version())); |
@@ -5370,17 +5457,39 @@ |
syncer::EXTENSIONS); |
ASSERT_EQ(list.size(), 1U); |
extensions::ExtensionSyncData data(list[0]); |
+ EXPECT_TRUE(data.enabled()); |
EXPECT_FALSE(data.incognito_enabled()); |
} |
+ service_->DisableExtension(good_crx, Extension::DISABLE_USER_ACTION); |
+ { |
+ syncer::SyncDataList list = extension_sync_service_->GetAllSyncData( |
+ syncer::EXTENSIONS); |
+ ASSERT_EQ(list.size(), 1U); |
+ extensions::ExtensionSyncData data(list[0]); |
+ EXPECT_FALSE(data.enabled()); |
+ EXPECT_FALSE(data.incognito_enabled()); |
+ } |
+ |
extension_util::SetIsIncognitoEnabled(good_crx, service_, true); |
{ |
syncer::SyncDataList list = extension_sync_service_->GetAllSyncData( |
syncer::EXTENSIONS); |
ASSERT_EQ(list.size(), 1U); |
extensions::ExtensionSyncData data(list[0]); |
+ EXPECT_FALSE(data.enabled()); |
EXPECT_TRUE(data.incognito_enabled()); |
} |
+ |
+ service_->EnableExtension(good_crx); |
+ { |
+ syncer::SyncDataList list = extension_sync_service_->GetAllSyncData( |
+ syncer::EXTENSIONS); |
+ ASSERT_EQ(list.size(), 1U); |
+ extensions::ExtensionSyncData data(list[0]); |
+ EXPECT_TRUE(data.enabled()); |
+ EXPECT_TRUE(data.incognito_enabled()); |
+ } |
} |
TEST_F(ExtensionServiceTest, SyncForUninstalledExternalExtension) { |
@@ -5406,6 +5515,7 @@ |
app_specifics->mutable_extension(); |
extension_specifics->set_id(good_crx); |
extension_specifics->set_version("1.0"); |
+ extension_specifics->set_enabled(true); |
syncer::SyncData sync_data = |
syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); |
@@ -5598,6 +5708,7 @@ |
service_->GetInstalledExtension(good_crx)->version()->GetString()); |
{ |
+ extension_specifics->set_enabled(true); |
syncer::SyncData sync_data = |
syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); |
syncer::SyncChange sync_change(FROM_HERE, |
@@ -5612,6 +5723,7 @@ |
} |
{ |
+ extension_specifics->set_enabled(false); |
syncer::SyncData sync_data = |
syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); |
syncer::SyncChange sync_change(FROM_HERE, |
@@ -5645,6 +5757,7 @@ |
ext_specifics->set_id(good_crx); |
ext_specifics->set_version( |
service_->GetInstalledExtension(good_crx)->version()->GetString()); |
+ ext_specifics->set_enabled(false); |
{ |
syncer::SyncData sync_data = |
@@ -5655,13 +5768,12 @@ |
syncer::SyncChangeList list(1); |
list[0] = sync_change; |
extension_sync_service_->ProcessSyncChanges(FROM_HERE, list); |
+ EXPECT_FALSE(service_->IsExtensionEnabled(good_crx)); |
EXPECT_FALSE(extension_util::IsIncognitoEnabled(good_crx, service_)); |
} |
{ |
- // Note: enabled is a deprecated field. Although clients may set it, |
- // we should ignore it. |
- ext_specifics->set_enabled(false); |
+ ext_specifics->set_enabled(true); |
ext_specifics->set_incognito_enabled(true); |
syncer::SyncData sync_data = |
syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); |
@@ -5675,6 +5787,21 @@ |
EXPECT_TRUE(extension_util::IsIncognitoEnabled(good_crx, service_)); |
} |
+ { |
+ ext_specifics->set_enabled(false); |
+ ext_specifics->set_incognito_enabled(true); |
+ syncer::SyncData sync_data = |
+ syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); |
+ syncer::SyncChange sync_change(FROM_HERE, |
+ syncer::SyncChange::ACTION_UPDATE, |
+ sync_data); |
+ syncer::SyncChangeList list(1); |
+ list[0] = sync_change; |
+ extension_sync_service_->ProcessSyncChanges(FROM_HERE, list); |
+ EXPECT_FALSE(service_->IsExtensionEnabled(good_crx)); |
+ EXPECT_TRUE(extension_util::IsIncognitoEnabled(good_crx, service_)); |
+ } |
+ |
EXPECT_FALSE(service_->pending_extension_manager()->IsIdPending(good_crx)); |
} |
@@ -5697,6 +5824,7 @@ |
ext_specifics->set_id(good_crx); |
ext_specifics->set_version( |
service_->GetInstalledExtension(good_crx)->version()->GetString()); |
+ ext_specifics->set_enabled(false); |
ext_specifics->set_incognito_enabled(true); |
syncer::SyncData sync_data = |
syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); |
@@ -5707,6 +5835,7 @@ |
list[0] = sync_change; |
extension_sync_service_->ProcessSyncChanges(FROM_HERE, list); |
+ EXPECT_FALSE(service_->IsExtensionEnabled(good_crx)); |
EXPECT_TRUE(extension_util::IsIncognitoEnabled(good_crx, service_)); |
EXPECT_FALSE(service_->pending_extension_manager()->IsIdPending(good_crx)); |
@@ -5728,6 +5857,7 @@ |
sync_pb::EntitySpecifics specifics; |
sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); |
ext_specifics->set_id(good_crx); |
+ ext_specifics->set_enabled(true); |
{ |
ext_specifics->set_version( |
@@ -5791,6 +5921,7 @@ |
sync_pb::EntitySpecifics specifics; |
sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); |
ext_specifics->set_id(good_crx); |
+ ext_specifics->set_enabled(false); |
ext_specifics->set_incognito_enabled(true); |
ext_specifics->set_update_url("http://www.google.com/"); |
ext_specifics->set_version("1.2.3.4"); |
@@ -5807,6 +5938,7 @@ |
EXPECT_FALSE(extension_util::IsIncognitoEnabled(good_crx, service_)); |
extension_sync_service_->ProcessSyncChanges(FROM_HERE, list); |
EXPECT_TRUE(service_->updater()->WillCheckSoon()); |
+ EXPECT_FALSE(service_->IsExtensionEnabled(good_crx)); |
EXPECT_TRUE(extension_util::IsIncognitoEnabled(good_crx, service_)); |
const extensions::PendingExtensionInfo* info; |