OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <algorithm> | 5 #include <algorithm> |
6 #include <set> | 6 #include <set> |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/at_exit.h" | 9 #include "base/at_exit.h" |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 904 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
915 const base::DictionaryValue* dict = | 915 const base::DictionaryValue* dict = |
916 profile()->GetPrefs()->GetDictionary("extensions.settings"); | 916 profile()->GetPrefs()->GetDictionary("extensions.settings"); |
917 if (!dict) { | 917 if (!dict) { |
918 ADD_FAILURE(); | 918 ADD_FAILURE(); |
919 return 0; | 919 return 0; |
920 } | 920 } |
921 return dict->size(); | 921 return dict->size(); |
922 } | 922 } |
923 | 923 |
924 void UninstallExtension(const std::string& id, bool use_helper) { | 924 void UninstallExtension(const std::string& id, bool use_helper) { |
| 925 UninstallExtension(id, use_helper, Extension::ENABLED); |
| 926 } |
| 927 |
| 928 void UninstallExtension(const std::string& id, bool use_helper, |
| 929 Extension::State expected_state) { |
925 // Verify that the extension is installed. | 930 // Verify that the extension is installed. |
926 base::FilePath extension_path = extensions_install_dir().AppendASCII(id); | 931 base::FilePath extension_path = extensions_install_dir().AppendASCII(id); |
927 EXPECT_TRUE(base::PathExists(extension_path)); | 932 EXPECT_TRUE(base::PathExists(extension_path)); |
928 size_t pref_key_count = GetPrefKeyCount(); | 933 size_t pref_key_count = GetPrefKeyCount(); |
929 EXPECT_GT(pref_key_count, 0u); | 934 EXPECT_GT(pref_key_count, 0u); |
930 ValidateIntegerPref(id, "state", Extension::ENABLED); | 935 ValidateIntegerPref(id, "state", expected_state); |
931 | 936 |
932 // Uninstall it. | 937 // Uninstall it. |
933 if (use_helper) { | 938 if (use_helper) { |
934 EXPECT_TRUE(ExtensionService::UninstallExtensionHelper( | 939 EXPECT_TRUE(ExtensionService::UninstallExtensionHelper( |
935 service(), id, extensions::UNINSTALL_REASON_FOR_TESTING)); | 940 service(), id, extensions::UNINSTALL_REASON_FOR_TESTING)); |
936 } else { | 941 } else { |
937 EXPECT_TRUE(service()->UninstallExtension( | 942 EXPECT_TRUE(service()->UninstallExtension( |
938 id, | 943 id, |
939 extensions::UNINSTALL_REASON_FOR_TESTING, | 944 extensions::UNINSTALL_REASON_FOR_TESTING, |
940 base::Bind(&base::DoNothing), | 945 base::Bind(&base::DoNothing), |
(...skipping 4929 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5870 | 5875 |
5871 service()->Init(); | 5876 service()->Init(); |
5872 ASSERT_TRUE(service()->is_ready()); | 5877 ASSERT_TRUE(service()->is_ready()); |
5873 | 5878 |
5874 ASSERT_EQ(3u, loaded_.size()); | 5879 ASSERT_EQ(3u, loaded_.size()); |
5875 | 5880 |
5876 // We start enabled. | 5881 // We start enabled. |
5877 const Extension* extension = service()->GetExtensionById(good0, true); | 5882 const Extension* extension = service()->GetExtensionById(good0, true); |
5878 ASSERT_TRUE(extension); | 5883 ASSERT_TRUE(extension); |
5879 ASSERT_TRUE(service()->IsExtensionEnabled(good0)); | 5884 ASSERT_TRUE(service()->IsExtensionEnabled(good0)); |
5880 ExtensionSyncData disable_good_crx(*extension, false, false, false, | |
5881 ExtensionSyncData::BOOLEAN_UNSET); | |
5882 | 5885 |
5883 // Then sync data arrives telling us to disable |good0|. | 5886 // Then sync data arrives telling us to disable |good0|. |
| 5887 ExtensionSyncData disable_good_crx(*extension, false, |
| 5888 Extension::DISABLE_USER_ACTION, false, |
| 5889 false, ExtensionSyncData::BOOLEAN_UNSET); |
5884 syncer::SyncDataList sync_data; | 5890 syncer::SyncDataList sync_data; |
5885 sync_data.push_back(disable_good_crx.GetSyncData()); | 5891 sync_data.push_back(disable_good_crx.GetSyncData()); |
5886 extension_sync_service()->MergeDataAndStartSyncing( | 5892 extension_sync_service()->MergeDataAndStartSyncing( |
5887 syncer::EXTENSIONS, | 5893 syncer::EXTENSIONS, |
5888 sync_data, | 5894 sync_data, |
5889 scoped_ptr<syncer::SyncChangeProcessor>( | 5895 scoped_ptr<syncer::SyncChangeProcessor>( |
5890 new syncer::FakeSyncChangeProcessor), | 5896 new syncer::FakeSyncChangeProcessor), |
5891 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | 5897 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
5892 ASSERT_FALSE(service()->IsExtensionEnabled(good0)); | 5898 ASSERT_FALSE(service()->IsExtensionEnabled(good0)); |
5893 } | 5899 } |
(...skipping 23 matching lines...) Expand all Loading... |
5917 // Disable extension before first sync data arrives. | 5923 // Disable extension before first sync data arrives. |
5918 service()->DisableExtension(good0, Extension::DISABLE_USER_ACTION); | 5924 service()->DisableExtension(good0, Extension::DISABLE_USER_ACTION); |
5919 ASSERT_FALSE(service()->IsExtensionEnabled(good0)); | 5925 ASSERT_FALSE(service()->IsExtensionEnabled(good0)); |
5920 | 5926 |
5921 // Enable extension - this is now the most recent state. | 5927 // Enable extension - this is now the most recent state. |
5922 service()->EnableExtension(good0); | 5928 service()->EnableExtension(good0); |
5923 ASSERT_TRUE(service()->IsExtensionEnabled(good0)); | 5929 ASSERT_TRUE(service()->IsExtensionEnabled(good0)); |
5924 | 5930 |
5925 // Now sync data comes in that says to disable good0. This should be | 5931 // Now sync data comes in that says to disable good0. This should be |
5926 // ignored. | 5932 // ignored. |
5927 ExtensionSyncData disable_good_crx(*extension, false, false, false, | 5933 ExtensionSyncData disable_good_crx(*extension, false, |
5928 ExtensionSyncData::BOOLEAN_FALSE); | 5934 Extension::DISABLE_USER_ACTION, false, |
| 5935 false, ExtensionSyncData::BOOLEAN_UNSET); |
5929 syncer::SyncDataList sync_data; | 5936 syncer::SyncDataList sync_data; |
5930 sync_data.push_back(disable_good_crx.GetSyncData()); | 5937 sync_data.push_back(disable_good_crx.GetSyncData()); |
5931 extension_sync_service()->MergeDataAndStartSyncing( | 5938 extension_sync_service()->MergeDataAndStartSyncing( |
5932 syncer::EXTENSIONS, | 5939 syncer::EXTENSIONS, |
5933 sync_data, | 5940 sync_data, |
5934 scoped_ptr<syncer::SyncChangeProcessor>( | 5941 scoped_ptr<syncer::SyncChangeProcessor>( |
5935 new syncer::FakeSyncChangeProcessor), | 5942 new syncer::FakeSyncChangeProcessor), |
5936 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | 5943 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
5937 | 5944 |
5938 // The extension was enabled locally before the sync data arrived, so it | 5945 // The extension was enabled locally before the sync data arrived, so it |
(...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6475 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); | 6482 EXPECT_TRUE(service()->IsExtensionEnabled(good_crx)); |
6476 EXPECT_TRUE(extensions::util::HasSetAllowedScriptingOnAllUrls( | 6483 EXPECT_TRUE(extensions::util::HasSetAllowedScriptingOnAllUrls( |
6477 good_crx, profile())); | 6484 good_crx, profile())); |
6478 EXPECT_EQ(kDefaultAllowedScripting, | 6485 EXPECT_EQ(kDefaultAllowedScripting, |
6479 extensions::util::AllowedScriptingOnAllUrls(good_crx, profile())); | 6486 extensions::util::AllowedScriptingOnAllUrls(good_crx, profile())); |
6480 } | 6487 } |
6481 | 6488 |
6482 EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); | 6489 EXPECT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); |
6483 } | 6490 } |
6484 | 6491 |
| 6492 TEST_F(ExtensionServiceTest, ProcessSyncDataNewExtension) { |
| 6493 InitializeEmptyExtensionService(); |
| 6494 InitializeExtensionSyncService(); |
| 6495 syncer::FakeSyncChangeProcessor processor; |
| 6496 extension_sync_service()->MergeDataAndStartSyncing( |
| 6497 syncer::EXTENSIONS, |
| 6498 syncer::SyncDataList(), |
| 6499 scoped_ptr<syncer::SyncChangeProcessor>( |
| 6500 new syncer::FakeSyncChangeProcessor), |
| 6501 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
| 6502 |
| 6503 sync_pb::EntitySpecifics specifics; |
| 6504 sync_pb::ExtensionSpecifics* ext_specifics = specifics.mutable_extension(); |
| 6505 ext_specifics->set_id(good_crx); |
| 6506 ext_specifics->set_version(base::Version("1").GetString()); |
| 6507 |
| 6508 const base::FilePath path = data_dir().AppendASCII("good.crx"); |
| 6509 const ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); |
| 6510 |
| 6511 { |
| 6512 ext_specifics->set_enabled(true); |
| 6513 ext_specifics->set_disable_reasons(0); |
| 6514 |
| 6515 syncer::SyncData sync_data = |
| 6516 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); |
| 6517 syncer::SyncChange sync_change(FROM_HERE, |
| 6518 syncer::SyncChange::ACTION_UPDATE, |
| 6519 sync_data); |
| 6520 syncer::SyncChangeList list(1); |
| 6521 list[0] = sync_change; |
| 6522 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 6523 |
| 6524 ASSERT_TRUE(service()->pending_extension_manager()->IsIdPending(good_crx)); |
| 6525 UpdateExtension(good_crx, path, ENABLED); |
| 6526 // Permissions should have been granted during installation. |
| 6527 EXPECT_FALSE(prefs->GetGrantedPermissions(good_crx)->IsEmpty()); |
| 6528 ASSERT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); |
| 6529 } |
| 6530 UninstallExtension(good_crx, false); |
| 6531 { |
| 6532 ext_specifics->set_enabled(false); |
| 6533 ext_specifics->set_disable_reasons(Extension::DISABLE_USER_ACTION); |
| 6534 |
| 6535 syncer::SyncData sync_data = |
| 6536 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); |
| 6537 syncer::SyncChange sync_change(FROM_HERE, |
| 6538 syncer::SyncChange::ACTION_UPDATE, |
| 6539 sync_data); |
| 6540 syncer::SyncChangeList list(1); |
| 6541 list[0] = sync_change; |
| 6542 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 6543 |
| 6544 ASSERT_TRUE(service()->pending_extension_manager()->IsIdPending(good_crx)); |
| 6545 UpdateExtension(good_crx, path, DISABLED); |
| 6546 // Even if the extension came in disabled, its permissions should have been |
| 6547 // granted (the user already approved them on another machine). |
| 6548 EXPECT_FALSE(prefs->GetGrantedPermissions(good_crx)->IsEmpty()); |
| 6549 ASSERT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); |
| 6550 } |
| 6551 UninstallExtension(good_crx, false, Extension::DISABLED); |
| 6552 { |
| 6553 ext_specifics->set_enabled(false); |
| 6554 ext_specifics->set_disable_reasons(Extension::DISABLE_PERMISSIONS_INCREASE); |
| 6555 |
| 6556 syncer::SyncData sync_data = |
| 6557 syncer::SyncData::CreateLocalData(good_crx, "Name", specifics); |
| 6558 syncer::SyncChange sync_change(FROM_HERE, |
| 6559 syncer::SyncChange::ACTION_UPDATE, |
| 6560 sync_data); |
| 6561 syncer::SyncChangeList list(1); |
| 6562 list[0] = sync_change; |
| 6563 extension_sync_service()->ProcessSyncChanges(FROM_HERE, list); |
| 6564 |
| 6565 ASSERT_TRUE(service()->pending_extension_manager()->IsIdPending(good_crx)); |
| 6566 UpdateExtension(good_crx, path, DISABLED); |
| 6567 // If the extension came in disabled due to a permissions increase, then the |
| 6568 // user has *not* approved the permissions, and they shouldn't be granted. |
| 6569 // crbug.com/484214 |
| 6570 EXPECT_TRUE(prefs->GetGrantedPermissions(good_crx)->IsEmpty()); |
| 6571 ASSERT_FALSE(service()->pending_extension_manager()->IsIdPending(good_crx)); |
| 6572 } |
| 6573 UninstallExtension(good_crx, false, Extension::DISABLED); |
| 6574 } |
| 6575 |
6485 TEST_F(ExtensionServiceTest, ProcessSyncDataTerminatedExtension) { | 6576 TEST_F(ExtensionServiceTest, ProcessSyncDataTerminatedExtension) { |
6486 InitializeExtensionServiceWithUpdater(); | 6577 InitializeExtensionServiceWithUpdater(); |
6487 InitializeExtensionSyncService(); | 6578 InitializeExtensionSyncService(); |
6488 syncer::FakeSyncChangeProcessor processor; | 6579 syncer::FakeSyncChangeProcessor processor; |
6489 extension_sync_service()->MergeDataAndStartSyncing( | 6580 extension_sync_service()->MergeDataAndStartSyncing( |
6490 syncer::EXTENSIONS, | 6581 syncer::EXTENSIONS, |
6491 syncer::SyncDataList(), | 6582 syncer::SyncDataList(), |
6492 scoped_ptr<syncer::SyncChangeProcessor>( | 6583 scoped_ptr<syncer::SyncChangeProcessor>( |
6493 new syncer::FakeSyncChangeProcessor), | 6584 new syncer::FakeSyncChangeProcessor), |
6494 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); | 6585 scoped_ptr<syncer::SyncErrorFactory>(new syncer::SyncErrorFactoryMock())); |
(...skipping 1276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7771 | 7862 |
7772 service()->Observe(chrome::NOTIFICATION_PROFILE_DESTRUCTION_STARTED, | 7863 service()->Observe(chrome::NOTIFICATION_PROFILE_DESTRUCTION_STARTED, |
7773 content::Source<Profile>(profile()), | 7864 content::Source<Profile>(profile()), |
7774 content::NotificationService::NoDetails()); | 7865 content::NotificationService::NoDetails()); |
7775 EXPECT_EQ(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_); | 7866 EXPECT_EQ(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_); |
7776 EXPECT_EQ(0u, registry()->enabled_extensions().size()); | 7867 EXPECT_EQ(0u, registry()->enabled_extensions().size()); |
7777 EXPECT_EQ(0u, registry()->disabled_extensions().size()); | 7868 EXPECT_EQ(0u, registry()->disabled_extensions().size()); |
7778 EXPECT_EQ(0u, registry()->terminated_extensions().size()); | 7869 EXPECT_EQ(0u, registry()->terminated_extensions().size()); |
7779 EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); | 7870 EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); |
7780 } | 7871 } |
OLD | NEW |