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 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 using extensions::AppSorting; | 157 using extensions::AppSorting; |
158 using extensions::Blacklist; | 158 using extensions::Blacklist; |
159 using extensions::CrxInstaller; | 159 using extensions::CrxInstaller; |
160 using extensions::Extension; | 160 using extensions::Extension; |
161 using extensions::ExtensionCreator; | 161 using extensions::ExtensionCreator; |
162 using extensions::ExtensionPrefs; | 162 using extensions::ExtensionPrefs; |
163 using extensions::ExtensionRegistry; | 163 using extensions::ExtensionRegistry; |
164 using extensions::ExtensionResource; | 164 using extensions::ExtensionResource; |
165 using extensions::ExtensionSystem; | 165 using extensions::ExtensionSystem; |
166 using extensions::FakeSafeBrowsingDatabaseManager; | 166 using extensions::FakeSafeBrowsingDatabaseManager; |
167 using extensions::FeatureSwitch; | |
168 using extensions::Manifest; | 167 using extensions::Manifest; |
169 using extensions::PermissionSet; | 168 using extensions::PermissionSet; |
170 using extensions::TestExtensionSystem; | 169 using extensions::TestExtensionSystem; |
171 using extensions::UnloadedExtensionInfo; | 170 using extensions::UnloadedExtensionInfo; |
172 using extensions::URLPatternSet; | 171 using extensions::URLPatternSet; |
173 | 172 |
174 namespace keys = extensions::manifest_keys; | 173 namespace keys = extensions::manifest_keys; |
175 | 174 |
176 namespace { | 175 namespace { |
177 | 176 |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 DISALLOW_COPY_AND_ASSIGN(MockProviderVisitor); | 464 DISALLOW_COPY_AND_ASSIGN(MockProviderVisitor); |
466 }; | 465 }; |
467 | 466 |
468 class ExtensionServiceTest : public extensions::ExtensionServiceTestBase, | 467 class ExtensionServiceTest : public extensions::ExtensionServiceTestBase, |
469 public content::NotificationObserver { | 468 public content::NotificationObserver { |
470 public: | 469 public: |
471 ExtensionServiceTest() | 470 ExtensionServiceTest() |
472 : unloaded_reason_(UnloadedExtensionInfo::REASON_UNDEFINED), | 471 : unloaded_reason_(UnloadedExtensionInfo::REASON_UNDEFINED), |
473 installed_(NULL), | 472 installed_(NULL), |
474 was_update_(false), | 473 was_update_(false), |
475 override_external_install_prompt_( | |
476 FeatureSwitch::prompt_for_external_extensions(), | |
477 false), | |
478 expected_extensions_count_(0) { | 474 expected_extensions_count_(0) { |
479 registrar_.Add(this, | 475 registrar_.Add(this, |
480 extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, | 476 extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, |
481 content::NotificationService::AllSources()); | 477 content::NotificationService::AllSources()); |
482 registrar_.Add(this, | 478 registrar_.Add(this, |
483 extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED, | 479 extensions::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED, |
484 content::NotificationService::AllSources()); | 480 content::NotificationService::AllSources()); |
485 registrar_.Add( | 481 registrar_.Add( |
486 this, | 482 this, |
487 extensions::NOTIFICATION_EXTENSION_WILL_BE_INSTALLED_DEPRECATED, | 483 extensions::NOTIFICATION_EXTENSION_WILL_BE_INSTALLED_DEPRECATED, |
(...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1109 protected: | 1105 protected: |
1110 typedef extensions::ExtensionManagementPrefUpdater<TestingPrefServiceSyncable> | 1106 typedef extensions::ExtensionManagementPrefUpdater<TestingPrefServiceSyncable> |
1111 ManagementPrefUpdater; | 1107 ManagementPrefUpdater; |
1112 scoped_ptr<ExtensionSyncService> extension_sync_service_; | 1108 scoped_ptr<ExtensionSyncService> extension_sync_service_; |
1113 extensions::ExtensionList loaded_; | 1109 extensions::ExtensionList loaded_; |
1114 std::string unloaded_id_; | 1110 std::string unloaded_id_; |
1115 UnloadedExtensionInfo::Reason unloaded_reason_; | 1111 UnloadedExtensionInfo::Reason unloaded_reason_; |
1116 const Extension* installed_; | 1112 const Extension* installed_; |
1117 bool was_update_; | 1113 bool was_update_; |
1118 std::string old_name_; | 1114 std::string old_name_; |
1119 FeatureSwitch::ScopedOverride override_external_install_prompt_; | |
1120 | 1115 |
1121 private: | 1116 private: |
1122 // Create a CrxInstaller and install the CRX file. | 1117 // Create a CrxInstaller and install the CRX file. |
1123 // Instead of calling this method yourself, use InstallCRX(), which does extra | 1118 // Instead of calling this method yourself, use InstallCRX(), which does extra |
1124 // error checking. | 1119 // error checking. |
1125 void InstallCRXInternal(const base::FilePath& crx_path) { | 1120 void InstallCRXInternal(const base::FilePath& crx_path) { |
1126 InstallCRXInternal(crx_path, Extension::NO_FLAGS); | 1121 InstallCRXInternal(crx_path, Extension::NO_FLAGS); |
1127 } | 1122 } |
1128 | 1123 |
1129 void InstallCRXInternal(const base::FilePath& crx_path, int creation_flags) { | 1124 void InstallCRXInternal(const base::FilePath& crx_path, int creation_flags) { |
(...skipping 5662 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6792 VerifyCrxInstall(crx_path_, INSTALL_NEW); | 6787 VerifyCrxInstall(crx_path_, INSTALL_NEW); |
6793 ASSERT_TRUE(IsCrxInstalled()); | 6788 ASSERT_TRUE(IsCrxInstalled()); |
6794 | 6789 |
6795 // Now that the extension is installed, sync request should fail | 6790 // Now that the extension is installed, sync request should fail |
6796 // because the extension is already installed. | 6791 // because the extension is already installed. |
6797 ASSERT_FALSE(AddPendingSyncInstall()); | 6792 ASSERT_FALSE(AddPendingSyncInstall()); |
6798 } | 6793 } |
6799 | 6794 |
6800 // Test that installing an external extension displays a GlobalError. | 6795 // Test that installing an external extension displays a GlobalError. |
6801 TEST_F(ExtensionServiceTest, ExternalInstallGlobalError) { | 6796 TEST_F(ExtensionServiceTest, ExternalInstallGlobalError) { |
6802 FeatureSwitch::ScopedOverride prompt( | |
6803 FeatureSwitch::prompt_for_external_extensions(), true); | |
6804 | 6797 |
6805 InitializeEmptyExtensionService(); | 6798 InitializeEmptyExtensionService(); |
6806 MockExtensionProvider* provider = | 6799 MockExtensionProvider* provider = |
6807 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); | 6800 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); |
6808 AddMockExternalProvider(provider); | 6801 AddMockExternalProvider(provider); |
6809 | 6802 |
6810 service()->external_install_manager()->UpdateExternalExtensionAlert(); | 6803 service()->external_install_manager()->UpdateExternalExtensionAlert(); |
6811 // Should return false, meaning there aren't any extensions that the user | 6804 // Should return false, meaning there aren't any extensions that the user |
6812 // needs to know about. | 6805 // needs to know about. |
6813 EXPECT_FALSE( | 6806 EXPECT_FALSE( |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6846 extensions::NOTIFICATION_CRX_INSTALLER_DONE, | 6839 extensions::NOTIFICATION_CRX_INSTALLER_DONE, |
6847 content::NotificationService::AllSources()); | 6840 content::NotificationService::AllSources()); |
6848 service()->CheckForExternalUpdates(); | 6841 service()->CheckForExternalUpdates(); |
6849 observer2.Wait(); | 6842 observer2.Wait(); |
6850 EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); | 6843 EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); |
6851 } | 6844 } |
6852 | 6845 |
6853 // Test that external extensions are initially disabled, and that enabling | 6846 // Test that external extensions are initially disabled, and that enabling |
6854 // them clears the prompt. | 6847 // them clears the prompt. |
6855 TEST_F(ExtensionServiceTest, ExternalInstallInitiallyDisabled) { | 6848 TEST_F(ExtensionServiceTest, ExternalInstallInitiallyDisabled) { |
6856 FeatureSwitch::ScopedOverride prompt( | |
6857 FeatureSwitch::prompt_for_external_extensions(), true); | |
6858 | 6849 |
6859 InitializeEmptyExtensionService(); | 6850 InitializeEmptyExtensionService(); |
6860 MockExtensionProvider* provider = | 6851 MockExtensionProvider* provider = |
6861 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); | 6852 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); |
6862 AddMockExternalProvider(provider); | 6853 AddMockExternalProvider(provider); |
6863 | 6854 |
6864 provider->UpdateOrAddExtension( | 6855 provider->UpdateOrAddExtension( |
6865 page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx")); | 6856 page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx")); |
6866 | 6857 |
6867 content::WindowedNotificationObserver observer( | 6858 content::WindowedNotificationObserver observer( |
(...skipping 16 matching lines...) Expand all Loading... |
6884 } | 6875 } |
6885 | 6876 |
6886 // Test that installing multiple external extensions works. | 6877 // Test that installing multiple external extensions works. |
6887 // Flaky on windows; http://crbug.com/295757 . | 6878 // Flaky on windows; http://crbug.com/295757 . |
6888 #if defined(OS_WIN) | 6879 #if defined(OS_WIN) |
6889 #define MAYBE_ExternalInstallMultiple DISABLED_ExternalInstallMultiple | 6880 #define MAYBE_ExternalInstallMultiple DISABLED_ExternalInstallMultiple |
6890 #else | 6881 #else |
6891 #define MAYBE_ExternalInstallMultiple ExternalInstallMultiple | 6882 #define MAYBE_ExternalInstallMultiple ExternalInstallMultiple |
6892 #endif | 6883 #endif |
6893 TEST_F(ExtensionServiceTest, MAYBE_ExternalInstallMultiple) { | 6884 TEST_F(ExtensionServiceTest, MAYBE_ExternalInstallMultiple) { |
6894 FeatureSwitch::ScopedOverride prompt( | |
6895 FeatureSwitch::prompt_for_external_extensions(), true); | |
6896 | 6885 |
6897 InitializeEmptyExtensionService(); | 6886 InitializeEmptyExtensionService(); |
6898 MockExtensionProvider* provider = | 6887 MockExtensionProvider* provider = |
6899 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); | 6888 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); |
6900 AddMockExternalProvider(provider); | 6889 AddMockExternalProvider(provider); |
6901 | 6890 |
6902 provider->UpdateOrAddExtension( | 6891 provider->UpdateOrAddExtension( |
6903 page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx")); | 6892 page_action, "1.0.0.0", data_dir().AppendASCII("page_action.crx")); |
6904 provider->UpdateOrAddExtension( | 6893 provider->UpdateOrAddExtension( |
6905 good_crx, "1.0.0.0", data_dir().AppendASCII("good.crx")); | 6894 good_crx, "1.0.0.0", data_dir().AppendASCII("good.crx")); |
(...skipping 27 matching lines...) Expand all Loading... |
6933 EXPECT_FALSE( | 6922 EXPECT_FALSE( |
6934 service()->external_install_manager()->HasExternalInstallError()); | 6923 service()->external_install_manager()->HasExternalInstallError()); |
6935 EXPECT_FALSE(service() | 6924 EXPECT_FALSE(service() |
6936 ->external_install_manager() | 6925 ->external_install_manager() |
6937 ->HasExternalInstallBubbleForTesting()); | 6926 ->HasExternalInstallBubbleForTesting()); |
6938 } | 6927 } |
6939 | 6928 |
6940 // Test that there is a bubble for external extensions that update | 6929 // Test that there is a bubble for external extensions that update |
6941 // from the webstore if the profile is not new. | 6930 // from the webstore if the profile is not new. |
6942 TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreOldProfile) { | 6931 TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreOldProfile) { |
6943 FeatureSwitch::ScopedOverride prompt( | |
6944 FeatureSwitch::prompt_for_external_extensions(), true); | |
6945 | 6932 |
6946 // This sets up the ExtensionPrefs used by our ExtensionService to be | 6933 // This sets up the ExtensionPrefs used by our ExtensionService to be |
6947 // post-first run. | 6934 // post-first run. |
6948 ExtensionServiceInitParams params = CreateDefaultInitParams(); | 6935 ExtensionServiceInitParams params = CreateDefaultInitParams(); |
6949 params.is_first_run = false; | 6936 params.is_first_run = false; |
6950 InitializeExtensionService(params); | 6937 InitializeExtensionService(params); |
6951 | 6938 |
6952 base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); | 6939 base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); |
6953 PackCRX(data_dir().AppendASCII("update_from_webstore"), | 6940 PackCRX(data_dir().AppendASCII("update_from_webstore"), |
6954 data_dir().AppendASCII("update_from_webstore.pem"), | 6941 data_dir().AppendASCII("update_from_webstore.pem"), |
(...skipping 11 matching lines...) Expand all Loading... |
6966 observer.Wait(); | 6953 observer.Wait(); |
6967 EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); | 6954 EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); |
6968 EXPECT_TRUE(service() | 6955 EXPECT_TRUE(service() |
6969 ->external_install_manager() | 6956 ->external_install_manager() |
6970 ->HasExternalInstallBubbleForTesting()); | 6957 ->HasExternalInstallBubbleForTesting()); |
6971 EXPECT_FALSE(service()->IsExtensionEnabled(updates_from_webstore)); | 6958 EXPECT_FALSE(service()->IsExtensionEnabled(updates_from_webstore)); |
6972 } | 6959 } |
6973 | 6960 |
6974 // Test that there is no bubble for external extensions if the profile is new. | 6961 // Test that there is no bubble for external extensions if the profile is new. |
6975 TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreNewProfile) { | 6962 TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreNewProfile) { |
6976 FeatureSwitch::ScopedOverride prompt( | |
6977 FeatureSwitch::prompt_for_external_extensions(), true); | |
6978 | 6963 |
6979 InitializeEmptyExtensionService(); | 6964 InitializeEmptyExtensionService(); |
6980 | 6965 |
6981 base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); | 6966 base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); |
6982 PackCRX(data_dir().AppendASCII("update_from_webstore"), | 6967 PackCRX(data_dir().AppendASCII("update_from_webstore"), |
6983 data_dir().AppendASCII("update_from_webstore.pem"), | 6968 data_dir().AppendASCII("update_from_webstore.pem"), |
6984 crx_path); | 6969 crx_path); |
6985 | 6970 |
6986 MockExtensionProvider* provider = | 6971 MockExtensionProvider* provider = |
6987 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); | 6972 new MockExtensionProvider(service(), Manifest::EXTERNAL_PREF); |
6988 AddMockExternalProvider(provider); | 6973 AddMockExternalProvider(provider); |
6989 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); | 6974 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); |
6990 | 6975 |
6991 content::WindowedNotificationObserver observer( | 6976 content::WindowedNotificationObserver observer( |
6992 extensions::NOTIFICATION_CRX_INSTALLER_DONE, | 6977 extensions::NOTIFICATION_CRX_INSTALLER_DONE, |
6993 content::NotificationService::AllSources()); | 6978 content::NotificationService::AllSources()); |
6994 service()->CheckForExternalUpdates(); | 6979 service()->CheckForExternalUpdates(); |
6995 observer.Wait(); | 6980 observer.Wait(); |
6996 EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); | 6981 EXPECT_TRUE(service()->external_install_manager()->HasExternalInstallError()); |
6997 EXPECT_FALSE(service() | 6982 EXPECT_FALSE(service() |
6998 ->external_install_manager() | 6983 ->external_install_manager() |
6999 ->HasExternalInstallBubbleForTesting()); | 6984 ->HasExternalInstallBubbleForTesting()); |
7000 EXPECT_FALSE(service()->IsExtensionEnabled(updates_from_webstore)); | 6985 EXPECT_FALSE(service()->IsExtensionEnabled(updates_from_webstore)); |
7001 } | 6986 } |
7002 | 6987 |
7003 // Test that clicking to remove the extension on an external install warning | 6988 // Test that clicking to remove the extension on an external install warning |
7004 // uninstalls the extension. | 6989 // uninstalls the extension. |
7005 TEST_F(ExtensionServiceTest, ExternalInstallClickToRemove) { | 6990 TEST_F(ExtensionServiceTest, ExternalInstallClickToRemove) { |
7006 FeatureSwitch::ScopedOverride prompt( | |
7007 FeatureSwitch::prompt_for_external_extensions(), true); | |
7008 | 6991 |
7009 ExtensionServiceInitParams params = CreateDefaultInitParams(); | 6992 ExtensionServiceInitParams params = CreateDefaultInitParams(); |
7010 params.is_first_run = false; | 6993 params.is_first_run = false; |
7011 InitializeExtensionService(params); | 6994 InitializeExtensionService(params); |
7012 | 6995 |
7013 base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); | 6996 base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); |
7014 PackCRX(data_dir().AppendASCII("update_from_webstore"), | 6997 PackCRX(data_dir().AppendASCII("update_from_webstore"), |
7015 data_dir().AppendASCII("update_from_webstore.pem"), | 6998 data_dir().AppendASCII("update_from_webstore.pem"), |
7016 crx_path); | 6999 crx_path); |
7017 | 7000 |
(...skipping 20 matching lines...) Expand all Loading... |
7038 // The Extension should be uninstalled. | 7021 // The Extension should be uninstalled. |
7039 EXPECT_FALSE(registry()->GetExtensionById(updates_from_webstore, | 7022 EXPECT_FALSE(registry()->GetExtensionById(updates_from_webstore, |
7040 ExtensionRegistry::EVERYTHING)); | 7023 ExtensionRegistry::EVERYTHING)); |
7041 // The error should be removed. | 7024 // The error should be removed. |
7042 EXPECT_FALSE(service_->external_install_manager()->HasExternalInstallError()); | 7025 EXPECT_FALSE(service_->external_install_manager()->HasExternalInstallError()); |
7043 } | 7026 } |
7044 | 7027 |
7045 // Test that clicking to keep the extension on an external install warning | 7028 // Test that clicking to keep the extension on an external install warning |
7046 // re-enables the extension. | 7029 // re-enables the extension. |
7047 TEST_F(ExtensionServiceTest, ExternalInstallClickToKeep) { | 7030 TEST_F(ExtensionServiceTest, ExternalInstallClickToKeep) { |
7048 FeatureSwitch::ScopedOverride prompt( | |
7049 FeatureSwitch::prompt_for_external_extensions(), true); | |
7050 | 7031 |
7051 ExtensionServiceInitParams params = CreateDefaultInitParams(); | 7032 ExtensionServiceInitParams params = CreateDefaultInitParams(); |
7052 params.is_first_run = false; | 7033 params.is_first_run = false; |
7053 InitializeExtensionService(params); | 7034 InitializeExtensionService(params); |
7054 | 7035 |
7055 base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); | 7036 base::FilePath crx_path = temp_dir().path().AppendASCII("webstore.crx"); |
7056 PackCRX(data_dir().AppendASCII("update_from_webstore"), | 7037 PackCRX(data_dir().AppendASCII("update_from_webstore"), |
7057 data_dir().AppendASCII("update_from_webstore.pem"), | 7038 data_dir().AppendASCII("update_from_webstore.pem"), |
7058 crx_path); | 7039 crx_path); |
7059 | 7040 |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7138 | 7119 |
7139 service()->Observe(chrome::NOTIFICATION_PROFILE_DESTRUCTION_STARTED, | 7120 service()->Observe(chrome::NOTIFICATION_PROFILE_DESTRUCTION_STARTED, |
7140 content::Source<Profile>(profile()), | 7121 content::Source<Profile>(profile()), |
7141 content::NotificationService::NoDetails()); | 7122 content::NotificationService::NoDetails()); |
7142 EXPECT_EQ(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_); | 7123 EXPECT_EQ(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_); |
7143 EXPECT_EQ(0u, registry()->enabled_extensions().size()); | 7124 EXPECT_EQ(0u, registry()->enabled_extensions().size()); |
7144 EXPECT_EQ(0u, registry()->disabled_extensions().size()); | 7125 EXPECT_EQ(0u, registry()->disabled_extensions().size()); |
7145 EXPECT_EQ(0u, registry()->terminated_extensions().size()); | 7126 EXPECT_EQ(0u, registry()->terminated_extensions().size()); |
7146 EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); | 7127 EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); |
7147 } | 7128 } |
OLD | NEW |