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 "chrome/browser/extensions/extension_service_unittest.h" | 5 #include "chrome/browser/extensions/extension_service_unittest.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <set> | 8 #include <set> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 29 matching lines...) Expand all Loading... |
40 #include "chrome/browser/extensions/extension_creator.h" | 40 #include "chrome/browser/extensions/extension_creator.h" |
41 #include "chrome/browser/extensions/extension_error_reporter.h" | 41 #include "chrome/browser/extensions/extension_error_reporter.h" |
42 #include "chrome/browser/extensions/extension_error_ui.h" | 42 #include "chrome/browser/extensions/extension_error_ui.h" |
43 #include "chrome/browser/extensions/extension_garbage_collector_factory.h" | 43 #include "chrome/browser/extensions/extension_garbage_collector_factory.h" |
44 #include "chrome/browser/extensions/extension_notification_observer.h" | 44 #include "chrome/browser/extensions/extension_notification_observer.h" |
45 #include "chrome/browser/extensions/extension_service.h" | 45 #include "chrome/browser/extensions/extension_service.h" |
46 #include "chrome/browser/extensions/extension_special_storage_policy.h" | 46 #include "chrome/browser/extensions/extension_special_storage_policy.h" |
47 #include "chrome/browser/extensions/extension_sync_data.h" | 47 #include "chrome/browser/extensions/extension_sync_data.h" |
48 #include "chrome/browser/extensions/extension_sync_service.h" | 48 #include "chrome/browser/extensions/extension_sync_service.h" |
49 #include "chrome/browser/extensions/extension_util.h" | 49 #include "chrome/browser/extensions/extension_util.h" |
50 #include "chrome/browser/extensions/external_install_ui.h" | 50 #include "chrome/browser/extensions/external_install_manager.h" |
51 #include "chrome/browser/extensions/external_policy_loader.h" | 51 #include "chrome/browser/extensions/external_policy_loader.h" |
52 #include "chrome/browser/extensions/external_pref_loader.h" | 52 #include "chrome/browser/extensions/external_pref_loader.h" |
53 #include "chrome/browser/extensions/external_provider_impl.h" | 53 #include "chrome/browser/extensions/external_provider_impl.h" |
54 #include "chrome/browser/extensions/fake_safe_browsing_database_manager.h" | 54 #include "chrome/browser/extensions/fake_safe_browsing_database_manager.h" |
55 #include "chrome/browser/extensions/install_observer.h" | 55 #include "chrome/browser/extensions/install_observer.h" |
56 #include "chrome/browser/extensions/install_tracker.h" | 56 #include "chrome/browser/extensions/install_tracker.h" |
57 #include "chrome/browser/extensions/install_tracker_factory.h" | 57 #include "chrome/browser/extensions/install_tracker_factory.h" |
58 #include "chrome/browser/extensions/installed_loader.h" | 58 #include "chrome/browser/extensions/installed_loader.h" |
59 #include "chrome/browser/extensions/pack_extension_job.h" | 59 #include "chrome/browser/extensions/pack_extension_job.h" |
60 #include "chrome/browser/extensions/pending_extension_info.h" | 60 #include "chrome/browser/extensions/pending_extension_info.h" |
(...skipping 6675 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6736 FeatureSwitch::prompt_for_external_extensions(), true); | 6736 FeatureSwitch::prompt_for_external_extensions(), true); |
6737 | 6737 |
6738 InitializeEmptyExtensionService(); | 6738 InitializeEmptyExtensionService(); |
6739 MockExtensionProvider* provider = | 6739 MockExtensionProvider* provider = |
6740 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); | 6740 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); |
6741 AddMockExternalProvider(provider); | 6741 AddMockExternalProvider(provider); |
6742 | 6742 |
6743 service_->UpdateExternalExtensionAlert(); | 6743 service_->UpdateExternalExtensionAlert(); |
6744 // Should return false, meaning there aren't any extensions that the user | 6744 // Should return false, meaning there aren't any extensions that the user |
6745 // needs to know about. | 6745 // needs to know about. |
6746 EXPECT_FALSE(extensions::HasExternalInstallError(service_)); | 6746 EXPECT_FALSE(service_->external_install_manager()->HasExternalInstallError()); |
6747 | 6747 |
6748 // This is a normal extension, installed normally. | 6748 // This is a normal extension, installed normally. |
6749 // This should NOT trigger an alert. | 6749 // This should NOT trigger an alert. |
6750 set_extensions_enabled(true); | 6750 set_extensions_enabled(true); |
6751 base::FilePath path = data_dir_.AppendASCII("good.crx"); | 6751 base::FilePath path = data_dir_.AppendASCII("good.crx"); |
6752 InstallCRX(path, INSTALL_NEW); | 6752 InstallCRX(path, INSTALL_NEW); |
6753 | 6753 |
6754 service_->CheckForExternalUpdates(); | 6754 service_->CheckForExternalUpdates(); |
6755 base::RunLoop().RunUntilIdle(); | 6755 base::RunLoop().RunUntilIdle(); |
6756 EXPECT_FALSE(extensions::HasExternalInstallError(service_)); | 6756 EXPECT_FALSE(service_->external_install_manager()->HasExternalInstallError()); |
6757 | 6757 |
6758 // A hosted app, installed externally. | 6758 // A hosted app, installed externally. |
6759 // This should NOT trigger an alert. | 6759 // This should NOT trigger an alert. |
6760 provider->UpdateOrAddExtension(hosted_app, "1.0.0.0", | 6760 provider->UpdateOrAddExtension(hosted_app, "1.0.0.0", |
6761 data_dir_.AppendASCII("hosted_app.crx")); | 6761 data_dir_.AppendASCII("hosted_app.crx")); |
6762 | 6762 |
6763 content::WindowedNotificationObserver observer( | 6763 content::WindowedNotificationObserver observer( |
6764 chrome::NOTIFICATION_CRX_INSTALLER_DONE, | 6764 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
6765 content::NotificationService::AllSources()); | 6765 content::NotificationService::AllSources()); |
6766 service_->CheckForExternalUpdates(); | 6766 service_->CheckForExternalUpdates(); |
6767 observer.Wait(); | 6767 observer.Wait(); |
6768 EXPECT_FALSE(extensions::HasExternalInstallError(service_)); | 6768 EXPECT_FALSE(service_->external_install_manager()->HasExternalInstallError()); |
6769 | 6769 |
6770 // Another normal extension, but installed externally. | 6770 // Another normal extension, but installed externally. |
6771 // This SHOULD trigger an alert. | 6771 // This SHOULD trigger an alert. |
6772 provider->UpdateOrAddExtension(page_action, "1.0.0.0", | 6772 provider->UpdateOrAddExtension(page_action, "1.0.0.0", |
6773 data_dir_.AppendASCII("page_action.crx")); | 6773 data_dir_.AppendASCII("page_action.crx")); |
6774 | 6774 |
6775 content::WindowedNotificationObserver observer2( | 6775 content::WindowedNotificationObserver observer2( |
6776 chrome::NOTIFICATION_CRX_INSTALLER_DONE, | 6776 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
6777 content::NotificationService::AllSources()); | 6777 content::NotificationService::AllSources()); |
6778 service_->CheckForExternalUpdates(); | 6778 service_->CheckForExternalUpdates(); |
6779 observer2.Wait(); | 6779 observer2.Wait(); |
6780 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); | 6780 EXPECT_TRUE(service_->external_install_manager()->HasExternalInstallError()); |
6781 } | 6781 } |
6782 | 6782 |
6783 // Test that external extensions are initially disabled, and that enabling | 6783 // Test that external extensions are initially disabled, and that enabling |
6784 // them clears the prompt. | 6784 // them clears the prompt. |
6785 TEST_F(ExtensionServiceTest, ExternalInstallInitiallyDisabled) { | 6785 TEST_F(ExtensionServiceTest, ExternalInstallInitiallyDisabled) { |
6786 FeatureSwitch::ScopedOverride prompt( | 6786 FeatureSwitch::ScopedOverride prompt( |
6787 FeatureSwitch::prompt_for_external_extensions(), true); | 6787 FeatureSwitch::prompt_for_external_extensions(), true); |
6788 | 6788 |
6789 InitializeEmptyExtensionService(); | 6789 InitializeEmptyExtensionService(); |
6790 MockExtensionProvider* provider = | 6790 MockExtensionProvider* provider = |
6791 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); | 6791 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); |
6792 AddMockExternalProvider(provider); | 6792 AddMockExternalProvider(provider); |
6793 | 6793 |
6794 provider->UpdateOrAddExtension(page_action, "1.0.0.0", | 6794 provider->UpdateOrAddExtension(page_action, "1.0.0.0", |
6795 data_dir_.AppendASCII("page_action.crx")); | 6795 data_dir_.AppendASCII("page_action.crx")); |
6796 | 6796 |
6797 content::WindowedNotificationObserver observer( | 6797 content::WindowedNotificationObserver observer( |
6798 chrome::NOTIFICATION_CRX_INSTALLER_DONE, | 6798 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
6799 content::NotificationService::AllSources()); | 6799 content::NotificationService::AllSources()); |
6800 service_->CheckForExternalUpdates(); | 6800 service_->CheckForExternalUpdates(); |
6801 observer.Wait(); | 6801 observer.Wait(); |
6802 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); | 6802 EXPECT_TRUE(service_->external_install_manager()->HasExternalInstallError()); |
6803 EXPECT_FALSE(service_->IsExtensionEnabled(page_action)); | 6803 EXPECT_FALSE(service_->IsExtensionEnabled(page_action)); |
6804 | 6804 |
6805 const Extension* extension = | 6805 const Extension* extension = |
6806 registry_->disabled_extensions().GetByID(page_action); | 6806 registry_->disabled_extensions().GetByID(page_action); |
6807 EXPECT_TRUE(extension); | 6807 EXPECT_TRUE(extension); |
6808 EXPECT_EQ(page_action, extension->id()); | 6808 EXPECT_EQ(page_action, extension->id()); |
6809 | 6809 |
6810 service_->EnableExtension(page_action); | 6810 service_->EnableExtension(page_action); |
6811 EXPECT_FALSE(extensions::HasExternalInstallError(service_)); | 6811 EXPECT_FALSE(service_->external_install_manager()->HasExternalInstallError()); |
6812 EXPECT_TRUE(service_->IsExtensionEnabled(page_action)); | 6812 EXPECT_TRUE(service_->IsExtensionEnabled(page_action)); |
6813 } | 6813 } |
6814 | 6814 |
6815 // Test that installing multiple external extensions works. | 6815 // Test that installing multiple external extensions works. |
6816 // Flaky on windows; http://crbug.com/295757 . | 6816 // Flaky on windows; http://crbug.com/295757 . |
6817 #if defined(OS_WIN) | 6817 #if defined(OS_WIN) |
6818 #define MAYBE_ExternalInstallMultiple DISABLED_ExternalInstallMultiple | 6818 #define MAYBE_ExternalInstallMultiple DISABLED_ExternalInstallMultiple |
6819 #else | 6819 #else |
6820 #define MAYBE_ExternalInstallMultiple ExternalInstallMultiple | 6820 #define MAYBE_ExternalInstallMultiple ExternalInstallMultiple |
6821 #endif | 6821 #endif |
(...skipping 12 matching lines...) Expand all Loading... |
6834 data_dir_.AppendASCII("good.crx")); | 6834 data_dir_.AppendASCII("good.crx")); |
6835 provider->UpdateOrAddExtension(theme_crx, "2.0", | 6835 provider->UpdateOrAddExtension(theme_crx, "2.0", |
6836 data_dir_.AppendASCII("theme.crx")); | 6836 data_dir_.AppendASCII("theme.crx")); |
6837 | 6837 |
6838 int count = 3; | 6838 int count = 3; |
6839 content::WindowedNotificationObserver observer( | 6839 content::WindowedNotificationObserver observer( |
6840 chrome::NOTIFICATION_CRX_INSTALLER_DONE, | 6840 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
6841 base::Bind(&WaitForCountNotificationsCallback, &count)); | 6841 base::Bind(&WaitForCountNotificationsCallback, &count)); |
6842 service_->CheckForExternalUpdates(); | 6842 service_->CheckForExternalUpdates(); |
6843 observer.Wait(); | 6843 observer.Wait(); |
6844 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); | 6844 EXPECT_TRUE(service_->external_install_manager()->HasExternalInstallError()); |
6845 EXPECT_FALSE(service_->IsExtensionEnabled(page_action)); | 6845 EXPECT_FALSE(service_->IsExtensionEnabled(page_action)); |
6846 EXPECT_FALSE(service_->IsExtensionEnabled(good_crx)); | 6846 EXPECT_FALSE(service_->IsExtensionEnabled(good_crx)); |
6847 EXPECT_FALSE(service_->IsExtensionEnabled(theme_crx)); | 6847 EXPECT_FALSE(service_->IsExtensionEnabled(theme_crx)); |
6848 | 6848 |
6849 service_->EnableExtension(page_action); | 6849 service_->EnableExtension(page_action); |
6850 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); | 6850 EXPECT_TRUE(service_->external_install_manager()->HasExternalInstallError()); |
6851 EXPECT_FALSE(extensions::HasExternalInstallBubble(service_)); | 6851 EXPECT_FALSE( |
| 6852 service_->external_install_manager()->HasExternalInstallBubble()); |
| 6853 |
6852 service_->EnableExtension(theme_crx); | 6854 service_->EnableExtension(theme_crx); |
6853 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); | 6855 EXPECT_TRUE(service_->external_install_manager()->HasExternalInstallError()); |
6854 EXPECT_FALSE(extensions::HasExternalInstallBubble(service_)); | 6856 EXPECT_FALSE( |
| 6857 service_->external_install_manager()->HasExternalInstallBubble()); |
| 6858 |
6855 service_->EnableExtension(good_crx); | 6859 service_->EnableExtension(good_crx); |
6856 EXPECT_FALSE(extensions::HasExternalInstallError(service_)); | 6860 EXPECT_FALSE(service_->external_install_manager()->HasExternalInstallError()); |
6857 EXPECT_FALSE(extensions::HasExternalInstallBubble(service_)); | 6861 EXPECT_FALSE( |
| 6862 service_->external_install_manager()->HasExternalInstallBubble()); |
6858 } | 6863 } |
6859 | 6864 |
6860 // Test that there is a bubble for external extensions that update | 6865 // Test that there is a bubble for external extensions that update |
6861 // from the webstore if the profile is not new. | 6866 // from the webstore if the profile is not new. |
6862 TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreOldProfile) { | 6867 TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreOldProfile) { |
6863 FeatureSwitch::ScopedOverride prompt( | 6868 FeatureSwitch::ScopedOverride prompt( |
6864 FeatureSwitch::prompt_for_external_extensions(), true); | 6869 FeatureSwitch::prompt_for_external_extensions(), true); |
6865 | 6870 |
6866 // This sets up the ExtensionPrefs used by our ExtensionService to be | 6871 // This sets up the ExtensionPrefs used by our ExtensionService to be |
6867 // post-first run. | 6872 // post-first run. |
6868 ExtensionServiceInitParams params = CreateDefaultInitParams(); | 6873 ExtensionServiceInitParams params = CreateDefaultInitParams(); |
6869 params.is_first_run = false; | 6874 params.is_first_run = false; |
6870 InitializeExtensionService(params); | 6875 InitializeExtensionService(params); |
6871 | 6876 |
6872 base::FilePath crx_path = temp_dir_.path().AppendASCII("webstore.crx"); | 6877 base::FilePath crx_path = temp_dir_.path().AppendASCII("webstore.crx"); |
6873 PackCRX(data_dir_.AppendASCII("update_from_webstore"), | 6878 PackCRX(data_dir_.AppendASCII("update_from_webstore"), |
6874 data_dir_.AppendASCII("update_from_webstore.pem"), | 6879 data_dir_.AppendASCII("update_from_webstore.pem"), |
6875 crx_path); | 6880 crx_path); |
6876 | 6881 |
6877 MockExtensionProvider* provider = | 6882 MockExtensionProvider* provider = |
6878 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); | 6883 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); |
6879 AddMockExternalProvider(provider); | 6884 AddMockExternalProvider(provider); |
6880 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); | 6885 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); |
6881 | 6886 |
6882 content::WindowedNotificationObserver observer( | 6887 content::WindowedNotificationObserver observer( |
6883 chrome::NOTIFICATION_CRX_INSTALLER_DONE, | 6888 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
6884 content::NotificationService::AllSources()); | 6889 content::NotificationService::AllSources()); |
6885 service_->CheckForExternalUpdates(); | 6890 service_->CheckForExternalUpdates(); |
6886 observer.Wait(); | 6891 observer.Wait(); |
6887 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); | 6892 EXPECT_TRUE(service_->external_install_manager()->HasExternalInstallError()); |
6888 EXPECT_TRUE(extensions::HasExternalInstallBubble(service_)); | 6893 EXPECT_TRUE(service_->external_install_manager()->HasExternalInstallBubble()); |
6889 EXPECT_FALSE(service_->IsExtensionEnabled(updates_from_webstore)); | 6894 EXPECT_FALSE(service_->IsExtensionEnabled(updates_from_webstore)); |
6890 } | 6895 } |
6891 | 6896 |
6892 // Test that there is no bubble for external extensions if the profile is new. | 6897 // Test that there is no bubble for external extensions if the profile is new. |
6893 TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreNewProfile) { | 6898 TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreNewProfile) { |
6894 FeatureSwitch::ScopedOverride prompt( | 6899 FeatureSwitch::ScopedOverride prompt( |
6895 FeatureSwitch::prompt_for_external_extensions(), true); | 6900 FeatureSwitch::prompt_for_external_extensions(), true); |
6896 | 6901 |
6897 InitializeEmptyExtensionService(); | 6902 InitializeEmptyExtensionService(); |
6898 | 6903 |
6899 base::FilePath crx_path = temp_dir_.path().AppendASCII("webstore.crx"); | 6904 base::FilePath crx_path = temp_dir_.path().AppendASCII("webstore.crx"); |
6900 PackCRX(data_dir_.AppendASCII("update_from_webstore"), | 6905 PackCRX(data_dir_.AppendASCII("update_from_webstore"), |
6901 data_dir_.AppendASCII("update_from_webstore.pem"), | 6906 data_dir_.AppendASCII("update_from_webstore.pem"), |
6902 crx_path); | 6907 crx_path); |
6903 | 6908 |
6904 MockExtensionProvider* provider = | 6909 MockExtensionProvider* provider = |
6905 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); | 6910 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); |
6906 AddMockExternalProvider(provider); | 6911 AddMockExternalProvider(provider); |
6907 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); | 6912 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); |
6908 | 6913 |
6909 content::WindowedNotificationObserver observer( | 6914 content::WindowedNotificationObserver observer( |
6910 chrome::NOTIFICATION_CRX_INSTALLER_DONE, | 6915 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
6911 content::NotificationService::AllSources()); | 6916 content::NotificationService::AllSources()); |
6912 service_->CheckForExternalUpdates(); | 6917 service_->CheckForExternalUpdates(); |
6913 observer.Wait(); | 6918 observer.Wait(); |
6914 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); | 6919 EXPECT_TRUE(service_->external_install_manager()->HasExternalInstallError()); |
6915 EXPECT_FALSE(extensions::HasExternalInstallBubble(service_)); | 6920 EXPECT_FALSE( |
| 6921 service_->external_install_manager()->HasExternalInstallBubble()); |
6916 EXPECT_FALSE(service_->IsExtensionEnabled(updates_from_webstore)); | 6922 EXPECT_FALSE(service_->IsExtensionEnabled(updates_from_webstore)); |
6917 } | 6923 } |
6918 | 6924 |
6919 TEST_F(ExtensionServiceTest, InstallBlacklistedExtension) { | 6925 TEST_F(ExtensionServiceTest, InstallBlacklistedExtension) { |
6920 InitializeEmptyExtensionService(); | 6926 InitializeEmptyExtensionService(); |
6921 | 6927 |
6922 scoped_refptr<Extension> extension = extensions::ExtensionBuilder() | 6928 scoped_refptr<Extension> extension = extensions::ExtensionBuilder() |
6923 .SetManifest(extensions::DictionaryBuilder() | 6929 .SetManifest(extensions::DictionaryBuilder() |
6924 .Set("name", "extension") | 6930 .Set("name", "extension") |
6925 .Set("version", "1.0") | 6931 .Set("version", "1.0") |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7033 | 7039 |
7034 service_->Observe(chrome::NOTIFICATION_PROFILE_DESTRUCTION_STARTED, | 7040 service_->Observe(chrome::NOTIFICATION_PROFILE_DESTRUCTION_STARTED, |
7035 content::Source<Profile>(profile_.get()), | 7041 content::Source<Profile>(profile_.get()), |
7036 content::NotificationService::NoDetails()); | 7042 content::NotificationService::NoDetails()); |
7037 EXPECT_EQ(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_); | 7043 EXPECT_EQ(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_); |
7038 EXPECT_EQ(0u, registry_->enabled_extensions().size()); | 7044 EXPECT_EQ(0u, registry_->enabled_extensions().size()); |
7039 EXPECT_EQ(0u, registry_->disabled_extensions().size()); | 7045 EXPECT_EQ(0u, registry_->disabled_extensions().size()); |
7040 EXPECT_EQ(0u, registry_->terminated_extensions().size()); | 7046 EXPECT_EQ(0u, registry_->terminated_extensions().size()); |
7041 EXPECT_EQ(0u, registry_->blacklisted_extensions().size()); | 7047 EXPECT_EQ(0u, registry_->blacklisted_extensions().size()); |
7042 } | 7048 } |
OLD | NEW |