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 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 using extensions::ExtensionCreator; | 158 using extensions::ExtensionCreator; |
159 using extensions::ExtensionPrefs; | 159 using extensions::ExtensionPrefs; |
160 using extensions::ExtensionRegistry; | 160 using extensions::ExtensionRegistry; |
161 using extensions::ExtensionResource; | 161 using extensions::ExtensionResource; |
162 using extensions::ExtensionSystem; | 162 using extensions::ExtensionSystem; |
163 using extensions::FakeSafeBrowsingDatabaseManager; | 163 using extensions::FakeSafeBrowsingDatabaseManager; |
164 using extensions::FeatureSwitch; | 164 using extensions::FeatureSwitch; |
165 using extensions::Manifest; | 165 using extensions::Manifest; |
166 using extensions::PermissionSet; | 166 using extensions::PermissionSet; |
167 using extensions::TestExtensionSystem; | 167 using extensions::TestExtensionSystem; |
| 168 using extensions::UnloadedExtensionInfo; |
168 using extensions::URLPatternSet; | 169 using extensions::URLPatternSet; |
169 | 170 |
170 namespace keys = extensions::manifest_keys; | 171 namespace keys = extensions::manifest_keys; |
171 | 172 |
172 namespace { | 173 namespace { |
173 | 174 |
174 // Extension ids used during testing. | 175 // Extension ids used during testing. |
175 const char good0[] = "behllobkkfkfnphdnhnkndlbkcpglgmj"; | 176 const char good0[] = "behllobkkfkfnphdnhnkndlbkcpglgmj"; |
176 const char good1[] = "hpiknbiabeeppbpihjehijgoemciehgk"; | 177 const char good1[] = "hpiknbiabeeppbpihjehijgoemciehgk"; |
177 const char good2[] = "bjafgdebaacbbbecmhlhpofkepfkgcpa"; | 178 const char good2[] = "bjafgdebaacbbbecmhlhpofkepfkgcpa"; |
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
659 params.profile_path = path; | 660 params.profile_path = path; |
660 params.pref_file = prefs_filename; | 661 params.pref_file = prefs_filename; |
661 params.extensions_install_dir = extensions_install_dir; | 662 params.extensions_install_dir = extensions_install_dir; |
662 return params; | 663 return params; |
663 } | 664 } |
664 | 665 |
665 class ExtensionServiceTest | 666 class ExtensionServiceTest |
666 : public ExtensionServiceTestBase, public content::NotificationObserver { | 667 : public ExtensionServiceTestBase, public content::NotificationObserver { |
667 public: | 668 public: |
668 ExtensionServiceTest() | 669 ExtensionServiceTest() |
669 : installed_(NULL), | 670 : unloaded_reason_(UnloadedExtensionInfo::REASON_UNDEFINED), |
| 671 installed_(NULL), |
670 was_update_(false), | 672 was_update_(false), |
671 override_external_install_prompt_( | 673 override_external_install_prompt_( |
672 FeatureSwitch::prompt_for_external_extensions(), false) { | 674 FeatureSwitch::prompt_for_external_extensions(), |
| 675 false) { |
673 registrar_.Add(this, | 676 registrar_.Add(this, |
674 chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, | 677 chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, |
675 content::NotificationService::AllSources()); | 678 content::NotificationService::AllSources()); |
676 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED, | 679 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED, |
677 content::NotificationService::AllSources()); | 680 content::NotificationService::AllSources()); |
678 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALLED, | 681 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALLED, |
679 content::NotificationService::AllSources()); | 682 content::NotificationService::AllSources()); |
680 } | 683 } |
681 | 684 |
682 virtual void Observe(int type, | 685 virtual void Observe(int type, |
683 const content::NotificationSource& source, | 686 const content::NotificationSource& source, |
684 const content::NotificationDetails& details) OVERRIDE { | 687 const content::NotificationDetails& details) OVERRIDE { |
685 switch (type) { | 688 switch (type) { |
686 case chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED: { | 689 case chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED: { |
687 const Extension* extension = | 690 const Extension* extension = |
688 content::Details<const Extension>(details).ptr(); | 691 content::Details<const Extension>(details).ptr(); |
689 loaded_.push_back(make_scoped_refptr(extension)); | 692 loaded_.push_back(make_scoped_refptr(extension)); |
690 // The tests rely on the errors being in a certain order, which can vary | 693 // The tests rely on the errors being in a certain order, which can vary |
691 // depending on how filesystem iteration works. | 694 // depending on how filesystem iteration works. |
692 std::stable_sort(loaded_.begin(), loaded_.end(), ExtensionsOrder()); | 695 std::stable_sort(loaded_.begin(), loaded_.end(), ExtensionsOrder()); |
693 break; | 696 break; |
694 } | 697 } |
695 | 698 |
696 case chrome::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED: { | 699 case chrome::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED: { |
697 const Extension* e = | 700 UnloadedExtensionInfo* unloaded_info = |
698 content::Details<extensions::UnloadedExtensionInfo>( | 701 content::Details<UnloadedExtensionInfo>(details).ptr(); |
699 details)->extension; | 702 const Extension* e = unloaded_info->extension; |
700 unloaded_id_ = e->id(); | 703 unloaded_id_ = e->id(); |
| 704 unloaded_reason_ = unloaded_info->reason; |
701 extensions::ExtensionList::iterator i = | 705 extensions::ExtensionList::iterator i = |
702 std::find(loaded_.begin(), loaded_.end(), e); | 706 std::find(loaded_.begin(), loaded_.end(), e); |
703 // TODO(erikkay) fix so this can be an assert. Right now the tests | 707 // TODO(erikkay) fix so this can be an assert. Right now the tests |
704 // are manually calling clear() on loaded_, so this isn't doable. | 708 // are manually calling clear() on loaded_, so this isn't doable. |
705 if (i == loaded_.end()) | 709 if (i == loaded_.end()) |
706 return; | 710 return; |
707 loaded_.erase(i); | 711 loaded_.erase(i); |
708 break; | 712 break; |
709 } | 713 } |
710 case chrome::NOTIFICATION_EXTENSION_INSTALLED: { | 714 case chrome::NOTIFICATION_EXTENSION_INSTALLED: { |
(...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1243 | 1247 |
1244 void InitPluginService() { | 1248 void InitPluginService() { |
1245 #if defined(ENABLE_PLUGINS) | 1249 #if defined(ENABLE_PLUGINS) |
1246 PluginService::GetInstance()->Init(); | 1250 PluginService::GetInstance()->Init(); |
1247 #endif | 1251 #endif |
1248 } | 1252 } |
1249 | 1253 |
1250 protected: | 1254 protected: |
1251 extensions::ExtensionList loaded_; | 1255 extensions::ExtensionList loaded_; |
1252 std::string unloaded_id_; | 1256 std::string unloaded_id_; |
| 1257 UnloadedExtensionInfo::Reason unloaded_reason_; |
1253 const Extension* installed_; | 1258 const Extension* installed_; |
1254 bool was_update_; | 1259 bool was_update_; |
1255 std::string old_name_; | 1260 std::string old_name_; |
1256 FeatureSwitch::ScopedOverride override_external_install_prompt_; | 1261 FeatureSwitch::ScopedOverride override_external_install_prompt_; |
1257 | 1262 |
1258 private: | 1263 private: |
1259 // Create a CrxInstaller and install the CRX file. | 1264 // Create a CrxInstaller and install the CRX file. |
1260 // Instead of calling this method yourself, use InstallCRX(), which does extra | 1265 // Instead of calling this method yourself, use InstallCRX(), which does extra |
1261 // error checking. | 1266 // error checking. |
1262 void InstallCRXInternal(const base::FilePath& crx_path) { | 1267 void InstallCRXInternal(const base::FilePath& crx_path) { |
(...skipping 2927 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4190 EXPECT_EQ(1u, registry_->enabled_extensions().size()); | 4195 EXPECT_EQ(1u, registry_->enabled_extensions().size()); |
4191 EXPECT_EQ(0u, registry_->disabled_extensions().size()); | 4196 EXPECT_EQ(0u, registry_->disabled_extensions().size()); |
4192 } | 4197 } |
4193 | 4198 |
4194 TEST_F(ExtensionServiceTest, UninstallExtension) { | 4199 TEST_F(ExtensionServiceTest, UninstallExtension) { |
4195 InitializeEmptyExtensionService(); | 4200 InitializeEmptyExtensionService(); |
4196 InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW); | 4201 InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW); |
4197 EXPECT_EQ(1u, registry_->enabled_extensions().size()); | 4202 EXPECT_EQ(1u, registry_->enabled_extensions().size()); |
4198 UninstallExtension(good_crx, false); | 4203 UninstallExtension(good_crx, false); |
4199 EXPECT_EQ(0u, registry_->enabled_extensions().size()); | 4204 EXPECT_EQ(0u, registry_->enabled_extensions().size()); |
| 4205 EXPECT_EQ(UnloadedExtensionInfo::REASON_UNINSTALL, unloaded_reason_); |
4200 } | 4206 } |
4201 | 4207 |
4202 TEST_F(ExtensionServiceTest, UninstallTerminatedExtension) { | 4208 TEST_F(ExtensionServiceTest, UninstallTerminatedExtension) { |
4203 InitializeEmptyExtensionService(); | 4209 InitializeEmptyExtensionService(); |
4204 InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW); | 4210 InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW); |
4205 TerminateExtension(good_crx); | 4211 TerminateExtension(good_crx); |
4206 UninstallExtension(good_crx, false); | 4212 UninstallExtension(good_crx, false); |
| 4213 EXPECT_EQ(UnloadedExtensionInfo::REASON_TERMINATE, unloaded_reason_); |
4207 } | 4214 } |
4208 | 4215 |
4209 // Tests the uninstaller helper. | 4216 // Tests the uninstaller helper. |
4210 TEST_F(ExtensionServiceTest, UninstallExtensionHelper) { | 4217 TEST_F(ExtensionServiceTest, UninstallExtensionHelper) { |
4211 InitializeEmptyExtensionService(); | 4218 InitializeEmptyExtensionService(); |
4212 InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW); | 4219 InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW); |
4213 UninstallExtension(good_crx, true); | 4220 UninstallExtension(good_crx, true); |
| 4221 EXPECT_EQ(UnloadedExtensionInfo::REASON_UNINSTALL, unloaded_reason_); |
4214 } | 4222 } |
4215 | 4223 |
4216 TEST_F(ExtensionServiceTest, UninstallExtensionHelperTerminated) { | 4224 TEST_F(ExtensionServiceTest, UninstallExtensionHelperTerminated) { |
4217 InitializeEmptyExtensionService(); | 4225 InitializeEmptyExtensionService(); |
4218 InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW); | 4226 InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW); |
4219 TerminateExtension(good_crx); | 4227 TerminateExtension(good_crx); |
4220 UninstallExtension(good_crx, true); | 4228 UninstallExtension(good_crx, true); |
| 4229 EXPECT_EQ(UnloadedExtensionInfo::REASON_TERMINATE, unloaded_reason_); |
4221 } | 4230 } |
4222 | 4231 |
4223 // An extension disabled because of unsupported requirements should re-enabled | 4232 // An extension disabled because of unsupported requirements should re-enabled |
4224 // if updated to a version with supported requirements as long as there are no | 4233 // if updated to a version with supported requirements as long as there are no |
4225 // other disable reasons. | 4234 // other disable reasons. |
4226 TEST_F(ExtensionServiceTest, UpgradingRequirementsEnabled) { | 4235 TEST_F(ExtensionServiceTest, UpgradingRequirementsEnabled) { |
4227 InitializeEmptyExtensionService(); | 4236 InitializeEmptyExtensionService(); |
4228 BlackListWebGL(); | 4237 BlackListWebGL(); |
4229 | 4238 |
4230 base::FilePath path = data_dir_.AppendASCII("requirements"); | 4239 base::FilePath path = data_dir_.AppendASCII("requirements"); |
(...skipping 2715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6946 // ReconcileKnownDisabled(). | 6955 // ReconcileKnownDisabled(). |
6947 service_->EnableExtension(good2); | 6956 service_->EnableExtension(good2); |
6948 service_->ReconcileKnownDisabled(); | 6957 service_->ReconcileKnownDisabled(); |
6949 expected_extensions.insert(good2); | 6958 expected_extensions.insert(good2); |
6950 expected_disabled_extensions.erase(good2); | 6959 expected_disabled_extensions.erase(good2); |
6951 | 6960 |
6952 EXPECT_EQ(expected_extensions, registry_->enabled_extensions().GetIDs()); | 6961 EXPECT_EQ(expected_extensions, registry_->enabled_extensions().GetIDs()); |
6953 EXPECT_EQ(expected_disabled_extensions, | 6962 EXPECT_EQ(expected_disabled_extensions, |
6954 registry_->disabled_extensions().GetIDs()); | 6963 registry_->disabled_extensions().GetIDs()); |
6955 } | 6964 } |
| 6965 |
| 6966 // Tests a profile being destroyed correctly disables extensions. |
| 6967 TEST_F(ExtensionServiceTest, DestroyingProfileClearsExtensions) { |
| 6968 InitializeEmptyExtensionService(); |
| 6969 |
| 6970 InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW); |
| 6971 EXPECT_NE(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_); |
| 6972 EXPECT_EQ(1u, registry_->enabled_extensions().size()); |
| 6973 EXPECT_EQ(0u, registry_->disabled_extensions().size()); |
| 6974 EXPECT_EQ(0u, registry_->terminated_extensions().size()); |
| 6975 EXPECT_EQ(0u, registry_->blacklisted_extensions().size()); |
| 6976 |
| 6977 service_->Observe(chrome::NOTIFICATION_PROFILE_DESTRUCTION_STARTED, |
| 6978 content::Source<Profile>(profile_.get()), |
| 6979 content::NotificationService::NoDetails()); |
| 6980 EXPECT_EQ(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_); |
| 6981 EXPECT_EQ(0u, registry_->enabled_extensions().size()); |
| 6982 EXPECT_EQ(0u, registry_->disabled_extensions().size()); |
| 6983 EXPECT_EQ(0u, registry_->terminated_extensions().size()); |
| 6984 EXPECT_EQ(0u, registry_->blacklisted_extensions().size()); |
| 6985 } |
OLD | NEW |