| Index: chrome/browser/extensions/extension_service_unittest.cc
|
| diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
|
| index 4c09b9302fcdc4788a99664c7e54c1d6fda667aa..ae5b0dda8b1d757f21dc6f08bce564726a6f76d3 100644
|
| --- a/chrome/browser/extensions/extension_service_unittest.cc
|
| +++ b/chrome/browser/extensions/extension_service_unittest.cc
|
| @@ -871,6 +871,39 @@ class ExtensionServiceTest : public extensions::ExtensionServiceTestBase,
|
| service()->TrackTerminatedExtensionForTest(extension);
|
| }
|
|
|
| + testing::AssertionResult IsBlocked(const std::string& id) {
|
| + scoped_ptr<extensions::ExtensionSet> all_unblocked_extensions =
|
| + registry()->GenerateInstalledExtensionsSet(
|
| + ExtensionRegistry::EVERYTHING & ~ExtensionRegistry::BLOCKED);
|
| + if (all_unblocked_extensions.get()->Contains(id))
|
| + return testing::AssertionFailure() << id << " is still unblocked!";
|
| + if (!registry()->blocked_extensions().Contains(id))
|
| + return testing::AssertionFailure() << id << " is not blocked!";
|
| + return testing::AssertionSuccess();
|
| + }
|
| +
|
| + // Helper method to test that an extension moves through being blocked and
|
| + // unblocked as appropriate for its type.
|
| + void AssertExtensionBlocksAndUnblocks(
|
| + bool should_block, const std::string extension_id) {
|
| + // Assume we start in an unblocked state.
|
| + EXPECT_FALSE(IsBlocked(extension_id));
|
| +
|
| + // Block the extensions.
|
| + service()->BlockAllExtensions();
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + if (should_block)
|
| + ASSERT_TRUE(IsBlocked(extension_id));
|
| + else
|
| + ASSERT_FALSE(IsBlocked(extension_id));
|
| +
|
| + service()->UnblockAllExtensions();
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + ASSERT_FALSE(IsBlocked(extension_id));
|
| + }
|
| +
|
| size_t GetPrefKeyCount() {
|
| const base::DictionaryValue* dict =
|
| profile()->GetPrefs()->GetDictionary("extensions.settings");
|
| @@ -3585,6 +3618,157 @@ TEST_F(ExtensionServiceTest, ReloadBlacklistedExtension) {
|
|
|
| #endif // defined(ENABLE_BLACKLIST_TESTS)
|
|
|
| +// Tests blocking then unblocking enabled extensions after the service has been
|
| +// initialized.
|
| +TEST_F(ExtensionServiceTest, BlockAndUnblockEnabledExtension) {
|
| + InitializeGoodInstalledExtensionService();
|
| + service()->Init();
|
| +
|
| + AssertExtensionBlocksAndUnblocks(true, good0);
|
| +}
|
| +
|
| +// Tests blocking then unblocking disabled extensions after the service has been
|
| +// initialized.
|
| +TEST_F(ExtensionServiceTest, BlockAndUnblockDisabledExtension) {
|
| + InitializeGoodInstalledExtensionService();
|
| + service()->Init();
|
| +
|
| + service()->DisableExtension(good0, Extension::DISABLE_RELOAD);
|
| +
|
| + AssertExtensionBlocksAndUnblocks(true, good0);
|
| +}
|
| +
|
| +// Tests blocking then unblocking terminated extensions after the service has
|
| +// been initialized.
|
| +TEST_F(ExtensionServiceTest, BlockAndUnblockTerminatedExtension) {
|
| + InitializeGoodInstalledExtensionService();
|
| + service()->Init();
|
| +
|
| + TerminateExtension(good0);
|
| +
|
| + AssertExtensionBlocksAndUnblocks(true, good0);
|
| +}
|
| +
|
| +// Tests blocking then unblocking policy-forced extensions after the service has
|
| +// been initialized.
|
| +TEST_F(ExtensionServiceTest, BlockAndUnblockPolicyExtension) {
|
| + InitializeEmptyExtensionServiceWithTestingPrefs();
|
| +
|
| + {
|
| + ManagementPrefUpdater pref(profile_->GetTestingPrefService());
|
| + // // Blacklist everything.
|
| + // pref.SetBlacklistedByDefault(true);
|
| + // Mark good.crx for force-installation.
|
| + pref.SetIndividualExtensionAutoInstalled(
|
| + good_crx, "http://example.com/update_url", true);
|
| + }
|
| +
|
| + // Have policy force-install an extension.
|
| + MockExtensionProvider* provider =
|
| + new MockExtensionProvider(service(), Manifest::EXTERNAL_POLICY_DOWNLOAD);
|
| + AddMockExternalProvider(provider);
|
| + provider->UpdateOrAddExtension(
|
| + good_crx, "1.0.0.0", data_dir().AppendASCII("good_crx"));
|
| +
|
| + // Reloading extensions should find our externally registered extension
|
| + // and install it.
|
| + content::WindowedNotificationObserver observer(
|
| + extensions::NOTIFICATION_CRX_INSTALLER_DONE,
|
| + content::NotificationService::AllSources());
|
| + service()->CheckForExternalUpdates();
|
| + observer.Wait();
|
| +
|
| + AssertExtensionBlocksAndUnblocks(false, good_crx);
|
| +}
|
| +
|
| +
|
| +#if defined(ENABLE_BLACKLIST_TESTS)
|
| +// Tests blocking then unblocking extensions that are blacklisted both before
|
| +// and after Init().
|
| +TEST_F(ExtensionServiceTest, BlockAndUnblockBlacklistedExtension) {
|
| + extensions::TestBlacklist test_blacklist;
|
| +
|
| + InitializeGoodInstalledExtensionService();
|
| + test_blacklist.Attach(service()->blacklist_);
|
| +
|
| + test_blacklist.SetBlacklistState(
|
| + good0, extensions::BLACKLISTED_MALWARE, true);
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + service()->Init();
|
| +
|
| + test_blacklist.SetBlacklistState(
|
| + good1, extensions::BLACKLISTED_MALWARE, true);
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + // Blacklisted extensions stay blacklisted.
|
| + AssertExtensionBlocksAndUnblocks(false, good0);
|
| + AssertExtensionBlocksAndUnblocks(false, good1);
|
| +
|
| + service()->BlockAllExtensions();
|
| +
|
| + // Remove an extension from the blacklist while the service is blocked.
|
| + test_blacklist.SetBlacklistState(
|
| + good0, extensions::NOT_BLACKLISTED, true);
|
| + // Add an extension to the blacklist while the service is blocked.
|
| + test_blacklist.SetBlacklistState(
|
| + good2, extensions::BLACKLISTED_MALWARE, true);
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + // Go directly to blocked, do not pass go, do not collect $200.
|
| + ASSERT_TRUE(IsBlocked(good0));
|
| + // Get on the blacklist - even if you were blocked!
|
| + ASSERT_FALSE(IsBlocked(good2));
|
| +}
|
| +#endif // defined(ENABLE_BLACKLIST_TESTS)
|
| +
|
| +// Tests blocking then unblocking enabled component extensions after the service
|
| +// has been initialized.
|
| +TEST_F(ExtensionServiceTest, BlockAndUnblockEnabledComponentExtension) {
|
| + InitializeEmptyExtensionServiceWithTestingPrefs();
|
| +
|
| + // Install a component extension.
|
| + base::FilePath path = data_dir()
|
| + .AppendASCII("good")
|
| + .AppendASCII("Extensions")
|
| + .AppendASCII(good0)
|
| + .AppendASCII("1.0.0.0");
|
| + std::string manifest;
|
| + ASSERT_TRUE(base::ReadFileToString(
|
| + path.Append(extensions::kManifestFilename), &manifest));
|
| + service()->component_loader()->Add(manifest, path);
|
| + service()->Init();
|
| +
|
| + // Component extension should never block.
|
| + AssertExtensionBlocksAndUnblocks(false, good0);
|
| +}
|
| +
|
| +// Tests blocking then unblocking a theme after the service has been
|
| +// initialized.
|
| +TEST_F(ExtensionServiceTest, BlockAndUnblockTheme) {
|
| + InitializeEmptyExtensionService();
|
| + service()->Init();
|
| +
|
| + base::FilePath path = data_dir().AppendASCII("theme.crx");
|
| + InstallCRX(path, INSTALL_NEW);
|
| +
|
| + AssertExtensionBlocksAndUnblocks(true, theme_crx);
|
| +}
|
| +
|
| +// Tests that blocking extensions before Init() results in loading blocked
|
| +// extensions.
|
| +TEST_F(ExtensionServiceTest, WillNotLoadExtensionsWhenBlocked) {
|
| + InitializeGoodInstalledExtensionService();
|
| +
|
| + service()->BlockAllExtensions();
|
| +
|
| + service()->Init();
|
| +
|
| + ASSERT_TRUE(IsBlocked(good0));
|
| + ASSERT_TRUE(IsBlocked(good0));
|
| + ASSERT_TRUE(IsBlocked(good0));
|
| +}
|
| +
|
| // Will not install extension blacklisted by policy.
|
| TEST_F(ExtensionServiceTest, BlacklistedByPolicyWillNotInstall) {
|
| InitializeEmptyExtensionServiceWithTestingPrefs();
|
|
|