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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 #include "chrome/browser/extensions/external_install_error.h" | 48 #include "chrome/browser/extensions/external_install_error.h" |
49 #include "chrome/browser/extensions/external_install_manager.h" | 49 #include "chrome/browser/extensions/external_install_manager.h" |
50 #include "chrome/browser/extensions/external_policy_loader.h" | 50 #include "chrome/browser/extensions/external_policy_loader.h" |
51 #include "chrome/browser/extensions/external_pref_loader.h" | 51 #include "chrome/browser/extensions/external_pref_loader.h" |
52 #include "chrome/browser/extensions/external_provider_impl.h" | 52 #include "chrome/browser/extensions/external_provider_impl.h" |
53 #include "chrome/browser/extensions/fake_safe_browsing_database_manager.h" | 53 #include "chrome/browser/extensions/fake_safe_browsing_database_manager.h" |
54 #include "chrome/browser/extensions/installed_loader.h" | 54 #include "chrome/browser/extensions/installed_loader.h" |
55 #include "chrome/browser/extensions/pack_extension_job.h" | 55 #include "chrome/browser/extensions/pack_extension_job.h" |
56 #include "chrome/browser/extensions/pending_extension_info.h" | 56 #include "chrome/browser/extensions/pending_extension_info.h" |
57 #include "chrome/browser/extensions/pending_extension_manager.h" | 57 #include "chrome/browser/extensions/pending_extension_manager.h" |
| 58 #include "chrome/browser/extensions/permissions_updater.h" |
58 #include "chrome/browser/extensions/test_blacklist.h" | 59 #include "chrome/browser/extensions/test_blacklist.h" |
59 #include "chrome/browser/extensions/test_extension_system.h" | 60 #include "chrome/browser/extensions/test_extension_system.h" |
60 #include "chrome/browser/extensions/unpacked_installer.h" | 61 #include "chrome/browser/extensions/unpacked_installer.h" |
61 #include "chrome/browser/extensions/updater/extension_updater.h" | 62 #include "chrome/browser/extensions/updater/extension_updater.h" |
62 #include "chrome/browser/prefs/pref_service_syncable.h" | 63 #include "chrome/browser/prefs/pref_service_syncable.h" |
63 #include "chrome/browser/sync/profile_sync_service.h" | 64 #include "chrome/browser/sync/profile_sync_service.h" |
64 #include "chrome/browser/sync/profile_sync_service_factory.h" | 65 #include "chrome/browser/sync/profile_sync_service_factory.h" |
65 #include "chrome/common/chrome_constants.h" | 66 #include "chrome/common/chrome_constants.h" |
66 #include "chrome/common/chrome_switches.h" | 67 #include "chrome/common/chrome_switches.h" |
67 #include "chrome/common/extensions/api/plugins/plugins_handler.h" | 68 #include "chrome/common/extensions/api/plugins/plugins_handler.h" |
(...skipping 24 matching lines...) Expand all Loading... |
92 #include "extensions/browser/test_management_policy.h" | 93 #include "extensions/browser/test_management_policy.h" |
93 #include "extensions/browser/uninstall_reason.h" | 94 #include "extensions/browser/uninstall_reason.h" |
94 #include "extensions/common/constants.h" | 95 #include "extensions/common/constants.h" |
95 #include "extensions/common/extension.h" | 96 #include "extensions/common/extension.h" |
96 #include "extensions/common/extension_builder.h" | 97 #include "extensions/common/extension_builder.h" |
97 #include "extensions/common/extension_l10n_util.h" | 98 #include "extensions/common/extension_l10n_util.h" |
98 #include "extensions/common/extension_resource.h" | 99 #include "extensions/common/extension_resource.h" |
99 #include "extensions/common/feature_switch.h" | 100 #include "extensions/common/feature_switch.h" |
100 #include "extensions/common/manifest_constants.h" | 101 #include "extensions/common/manifest_constants.h" |
101 #include "extensions/common/manifest_handlers/background_info.h" | 102 #include "extensions/common/manifest_handlers/background_info.h" |
| 103 #include "extensions/common/manifest_handlers/permissions_parser.h" |
102 #include "extensions/common/manifest_url_handlers.h" | 104 #include "extensions/common/manifest_url_handlers.h" |
103 #include "extensions/common/permissions/permission_set.h" | 105 #include "extensions/common/permissions/permission_set.h" |
104 #include "extensions/common/permissions/permissions_data.h" | 106 #include "extensions/common/permissions/permissions_data.h" |
105 #include "extensions/common/switches.h" | 107 #include "extensions/common/switches.h" |
106 #include "extensions/common/url_pattern.h" | 108 #include "extensions/common/url_pattern.h" |
107 #include "extensions/common/value_builder.h" | 109 #include "extensions/common/value_builder.h" |
108 #include "gpu/config/gpu_info.h" | 110 #include "gpu/config/gpu_info.h" |
109 #include "grit/browser_resources.h" | 111 #include "grit/browser_resources.h" |
110 #include "net/cookies/canonical_cookie.h" | 112 #include "net/cookies/canonical_cookie.h" |
111 #include "net/cookies/cookie_monster.h" | 113 #include "net/cookies/cookie_monster.h" |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 const char all_zero[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; | 184 const char all_zero[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; |
183 const char good2048[] = "nmgjhmhbleinmjpbdhgajfjkbijcmgbh"; | 185 const char good2048[] = "nmgjhmhbleinmjpbdhgajfjkbijcmgbh"; |
184 const char good_crx[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf"; | 186 const char good_crx[] = "ldnnhddmnhbkjipkidpdiheffobcpfmf"; |
185 const char hosted_app[] = "kbmnembihfiondgfjekmnmcbddelicoi"; | 187 const char hosted_app[] = "kbmnembihfiondgfjekmnmcbddelicoi"; |
186 const char page_action[] = "obcimlgaoabeegjmmpldobjndiealpln"; | 188 const char page_action[] = "obcimlgaoabeegjmmpldobjndiealpln"; |
187 const char theme_crx[] = "iamefpfkojoapidjnbafmgkgncegbkad"; | 189 const char theme_crx[] = "iamefpfkojoapidjnbafmgkgncegbkad"; |
188 const char theme2_crx[] = "pjpgmfcmabopnnfonnhmdjglfpjjfkbf"; | 190 const char theme2_crx[] = "pjpgmfcmabopnnfonnhmdjglfpjjfkbf"; |
189 const char permissions_crx[] = "eagpmdpfmaekmmcejjbmjoecnejeiiin"; | 191 const char permissions_crx[] = "eagpmdpfmaekmmcejjbmjoecnejeiiin"; |
190 const char unpacked[] = "cbcdidchbppangcjoddlpdjlenngjldk"; | 192 const char unpacked[] = "cbcdidchbppangcjoddlpdjlenngjldk"; |
191 const char updates_from_webstore[] = "akjooamlhcgeopfifcmlggaebeocgokj"; | 193 const char updates_from_webstore[] = "akjooamlhcgeopfifcmlggaebeocgokj"; |
| 194 const char permissions_blocklist[] = "noffkehfcaggllbcojjbopcmlhcnhcdn"; |
192 | 195 |
193 struct ExtensionsOrder { | 196 struct ExtensionsOrder { |
194 bool operator()(const scoped_refptr<const Extension>& a, | 197 bool operator()(const scoped_refptr<const Extension>& a, |
195 const scoped_refptr<const Extension>& b) { | 198 const scoped_refptr<const Extension>& b) { |
196 return a->name() < b->name(); | 199 return a->name() < b->name(); |
197 } | 200 } |
198 }; | 201 }; |
199 | 202 |
200 static std::vector<base::string16> GetErrors() { | 203 static std::vector<base::string16> GetErrors() { |
201 const std::vector<base::string16>* errors = | 204 const std::vector<base::string16>* errors = |
(...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
765 " \"id\": 1,\n" | 768 " \"id\": 1,\n" |
766 " \"features\": [\"webgl\"]\n" | 769 " \"features\": [\"webgl\"]\n" |
767 " }\n" | 770 " }\n" |
768 " ]\n" | 771 " ]\n" |
769 "}"; | 772 "}"; |
770 gpu::GPUInfo gpu_info; | 773 gpu::GPUInfo gpu_info; |
771 content::GpuDataManager::GetInstance()->InitializeForTesting( | 774 content::GpuDataManager::GetInstance()->InitializeForTesting( |
772 json_blacklist, gpu_info); | 775 json_blacklist, gpu_info); |
773 } | 776 } |
774 | 777 |
| 778 // Grants all optional permissions stated in manifest to active permission |
| 779 // set for extension |id|. |
| 780 void GrantAllOptionalPermissions(const std::string& id) { |
| 781 const Extension* extension = service()->GetInstalledExtension(id); |
| 782 scoped_refptr<const PermissionSet> all_optional_permissions = |
| 783 extensions::PermissionsParser::GetOptionalPermissions(extension); |
| 784 extensions::PermissionsUpdater perms_updater(profile()); |
| 785 perms_updater.AddPermissions(extension, all_optional_permissions.get()); |
| 786 } |
| 787 |
775 // Helper method to set up a WindowedNotificationObserver to wait for a | 788 // Helper method to set up a WindowedNotificationObserver to wait for a |
776 // specific CrxInstaller to finish if we don't know the value of the | 789 // specific CrxInstaller to finish if we don't know the value of the |
777 // |installer| yet. | 790 // |installer| yet. |
778 static bool IsCrxInstallerDone(extensions::CrxInstaller** installer, | 791 static bool IsCrxInstallerDone(extensions::CrxInstaller** installer, |
779 const content::NotificationSource& source, | 792 const content::NotificationSource& source, |
780 const content::NotificationDetails& details) { | 793 const content::NotificationDetails& details) { |
781 return content::Source<extensions::CrxInstaller>(source).ptr() == | 794 return content::Source<extensions::CrxInstaller>(source).ptr() == |
782 *installer; | 795 *installer; |
783 } | 796 } |
784 | 797 |
(...skipping 3059 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3844 extensions::TestManagementPolicyProvider provider( | 3857 extensions::TestManagementPolicyProvider provider( |
3845 extensions::TestManagementPolicyProvider::MUST_REMAIN_ENABLED); | 3858 extensions::TestManagementPolicyProvider::MUST_REMAIN_ENABLED); |
3846 GetManagementPolicy()->RegisterProvider(&provider); | 3859 GetManagementPolicy()->RegisterProvider(&provider); |
3847 | 3860 |
3848 // Reinstall the extension. | 3861 // Reinstall the extension. |
3849 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_UPDATED); | 3862 InstallCRX(data_dir().AppendASCII("good.crx"), INSTALL_UPDATED); |
3850 EXPECT_EQ(1u, registry()->enabled_extensions().size()); | 3863 EXPECT_EQ(1u, registry()->enabled_extensions().size()); |
3851 EXPECT_EQ(0u, registry()->disabled_extensions().size()); | 3864 EXPECT_EQ(0u, registry()->disabled_extensions().size()); |
3852 } | 3865 } |
3853 | 3866 |
| 3867 // Tests that extensions with conflicting required permissions by enterprise |
| 3868 // policy cannot be installed. |
| 3869 TEST_F(ExtensionServiceTest, PolicyBlockedPermissionNewExtensionInstall) { |
| 3870 InitializeEmptyExtensionServiceWithTestingPrefs(); |
| 3871 base::FilePath path = data_dir().AppendASCII("permissions_blocklist"); |
| 3872 |
| 3873 { |
| 3874 // Update policy to block one of the required permissions of target. |
| 3875 ManagementPrefUpdater pref(profile_->GetTestingPrefService()); |
| 3876 pref.AddBlockedPermission("*", "tabs"); |
| 3877 } |
| 3878 |
| 3879 // The extension should be failed to install. |
| 3880 PackAndInstallCRX(path, INSTALL_FAILED); |
| 3881 |
| 3882 { |
| 3883 // Update policy to block one of the optional permissions instead. |
| 3884 ManagementPrefUpdater pref(profile_->GetTestingPrefService()); |
| 3885 pref.ClearBlockedPermissions("*"); |
| 3886 pref.AddBlockedPermission("*", "history"); |
| 3887 } |
| 3888 |
| 3889 // The extension should succeed to install this time. |
| 3890 PackAndInstallCRX(path, INSTALL_NEW); |
| 3891 } |
| 3892 |
| 3893 // Tests that extension supposed to be force installed but with conflicting |
| 3894 // required permissions cannot be installed. |
| 3895 TEST_F(ExtensionServiceTest, PolicyBlockedPermissionConflictsWithForceInstall) { |
| 3896 InitializeEmptyExtensionServiceWithTestingPrefs(); |
| 3897 |
| 3898 // Pack the crx file. |
| 3899 base::FilePath path = data_dir().AppendASCII("permissions_blocklist"); |
| 3900 base::FilePath pem_path = data_dir().AppendASCII("permissions_blocklist.pem"); |
| 3901 base::ScopedTempDir temp_dir; |
| 3902 EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); |
| 3903 base::FilePath crx_path = temp_dir.path().AppendASCII("temp.crx"); |
| 3904 |
| 3905 PackCRX(path, pem_path, crx_path); |
| 3906 |
| 3907 { |
| 3908 // Block one of the required permissions. |
| 3909 ManagementPrefUpdater pref(profile_->GetTestingPrefService()); |
| 3910 pref.AddBlockedPermission("*", "tabs"); |
| 3911 } |
| 3912 |
| 3913 // Use MockExtensionProvider to simulate force installing extension. |
| 3914 MockExtensionProvider* provider = |
| 3915 new MockExtensionProvider(service(), Manifest::EXTERNAL_POLICY_DOWNLOAD); |
| 3916 AddMockExternalProvider(provider); |
| 3917 provider->UpdateOrAddExtension(permissions_blocklist, "1.0", crx_path); |
| 3918 |
| 3919 { |
| 3920 // Attempts to force install this extension. |
| 3921 content::WindowedNotificationObserver observer( |
| 3922 extensions::NOTIFICATION_CRX_INSTALLER_DONE, |
| 3923 content::NotificationService::AllSources()); |
| 3924 service()->CheckForExternalUpdates(); |
| 3925 observer.Wait(); |
| 3926 } |
| 3927 |
| 3928 // The extension should not be installed. |
| 3929 ASSERT_FALSE(service()->GetInstalledExtension(permissions_blocklist)); |
| 3930 |
| 3931 // Remove this extension from pending extension manager as we would like to |
| 3932 // give another attempt later. |
| 3933 service()->pending_extension_manager()->Remove(permissions_blocklist); |
| 3934 |
| 3935 { |
| 3936 // Clears the permission block list. |
| 3937 ManagementPrefUpdater pref(profile_->GetTestingPrefService()); |
| 3938 pref.ClearBlockedPermissions("*"); |
| 3939 } |
| 3940 |
| 3941 { |
| 3942 // Attempts to force install this extension again. |
| 3943 content::WindowedNotificationObserver observer( |
| 3944 extensions::NOTIFICATION_CRX_INSTALLER_DONE, |
| 3945 content::NotificationService::AllSources()); |
| 3946 service()->CheckForExternalUpdates(); |
| 3947 observer.Wait(); |
| 3948 } |
| 3949 |
| 3950 const Extension* installed = |
| 3951 service()->GetInstalledExtension(permissions_blocklist); |
| 3952 ASSERT_TRUE(installed); |
| 3953 EXPECT_EQ(installed->location(), Manifest::EXTERNAL_POLICY_DOWNLOAD); |
| 3954 } |
| 3955 |
| 3956 // Tests that newer versions of an extension with conflicting required |
| 3957 // permissions by enterprise policy cannot be updated to. |
| 3958 TEST_F(ExtensionServiceTest, PolicyBlockedPermissionExtensionUpdate) { |
| 3959 InitializeEmptyExtensionServiceWithTestingPrefs(); |
| 3960 |
| 3961 base::FilePath path = data_dir().AppendASCII("permissions_blocklist"); |
| 3962 base::FilePath path2 = data_dir().AppendASCII("permissions_blocklist2"); |
| 3963 base::FilePath pem_path = data_dir().AppendASCII("permissions_blocklist.pem"); |
| 3964 |
| 3965 // Install 'permissions_blocklist'. |
| 3966 const Extension* installed = PackAndInstallCRX(path, pem_path, INSTALL_NEW); |
| 3967 EXPECT_EQ(installed->id(), permissions_blocklist); |
| 3968 |
| 3969 { |
| 3970 // Block one of the required permissions of 'permissions_blocklist2'. |
| 3971 ManagementPrefUpdater pref(profile_->GetTestingPrefService()); |
| 3972 pref.AddBlockedPermission("*", "downloads"); |
| 3973 } |
| 3974 |
| 3975 // Install 'permissions_blocklist' again, should be updated. |
| 3976 const Extension* updated = PackAndInstallCRX(path, pem_path, INSTALL_UPDATED); |
| 3977 EXPECT_EQ(updated->id(), permissions_blocklist); |
| 3978 |
| 3979 std::string old_version = updated->VersionString(); |
| 3980 |
| 3981 // Attempts to update to 'permissions_blocklist2' should fail. |
| 3982 PackAndInstallCRX(path2, pem_path, INSTALL_FAILED); |
| 3983 |
| 3984 // Verify that the old version is still enabled. |
| 3985 updated = service()->GetExtensionById(permissions_blocklist, false); |
| 3986 ASSERT_TRUE(updated); |
| 3987 EXPECT_EQ(old_version, updated->VersionString()); |
| 3988 } |
| 3989 |
| 3990 // Tests that policy update with additional permissions blocked revoke |
| 3991 // conflicting granted optional permissions and unload extensions with |
| 3992 // conflicting required permissions, including the force installed ones. |
| 3993 TEST_F(ExtensionServiceTest, PolicyBlockedPermissionPolicyUpdate) { |
| 3994 InitializeEmptyExtensionServiceWithTestingPrefs(); |
| 3995 |
| 3996 base::FilePath path = data_dir().AppendASCII("permissions_blocklist"); |
| 3997 base::FilePath path2 = data_dir().AppendASCII("permissions_blocklist2"); |
| 3998 base::FilePath pem_path = data_dir().AppendASCII("permissions_blocklist.pem"); |
| 3999 |
| 4000 // Pack the crx file. |
| 4001 base::ScopedTempDir temp_dir; |
| 4002 EXPECT_TRUE(temp_dir.CreateUniqueTempDir()); |
| 4003 base::FilePath crx_path = temp_dir.path().AppendASCII("temp.crx"); |
| 4004 |
| 4005 PackCRX(path2, pem_path, crx_path); |
| 4006 |
| 4007 // Install two arbitary extensions with specified manifest. |
| 4008 std::string ext1 = PackAndInstallCRX(path, INSTALL_NEW)->id(); |
| 4009 std::string ext2 = PackAndInstallCRX(path2, INSTALL_NEW)->id(); |
| 4010 ASSERT_NE(ext1, permissions_blocklist); |
| 4011 ASSERT_NE(ext2, permissions_blocklist); |
| 4012 ASSERT_NE(ext1, ext2); |
| 4013 |
| 4014 // Force install another extension with known id and same manifest as 'ext2'. |
| 4015 std::string ext2_forced = permissions_blocklist; |
| 4016 MockExtensionProvider* provider = |
| 4017 new MockExtensionProvider(service(), Manifest::EXTERNAL_POLICY_DOWNLOAD); |
| 4018 AddMockExternalProvider(provider); |
| 4019 provider->UpdateOrAddExtension(ext2_forced, "2.0", crx_path); |
| 4020 |
| 4021 content::WindowedNotificationObserver observer( |
| 4022 extensions::NOTIFICATION_CRX_INSTALLER_DONE, |
| 4023 content::NotificationService::AllSources()); |
| 4024 service()->CheckForExternalUpdates(); |
| 4025 observer.Wait(); |
| 4026 |
| 4027 extensions::ExtensionRegistry* registry = |
| 4028 extensions::ExtensionRegistry::Get(profile()); |
| 4029 |
| 4030 // Verify all three extensions are installed and enabled. |
| 4031 ASSERT_TRUE(registry->enabled_extensions().GetByID(ext1)); |
| 4032 ASSERT_TRUE(registry->enabled_extensions().GetByID(ext2)); |
| 4033 ASSERT_TRUE(registry->enabled_extensions().GetByID(ext2_forced)); |
| 4034 |
| 4035 // Grant all optional permissions to each extension. |
| 4036 GrantAllOptionalPermissions(ext1); |
| 4037 GrantAllOptionalPermissions(ext2); |
| 4038 GrantAllOptionalPermissions(ext2_forced); |
| 4039 |
| 4040 EXPECT_TRUE(ExtensionPrefs::Get(profile()) |
| 4041 ->GetActivePermissions(ext1) |
| 4042 ->HasAPIPermission(extensions::APIPermission::kDownloads)); |
| 4043 |
| 4044 // Set policy to block 'downloads' permission. |
| 4045 { |
| 4046 ManagementPrefUpdater pref(profile_->GetTestingPrefService()); |
| 4047 pref.AddBlockedPermission("*", "downloads"); |
| 4048 } |
| 4049 |
| 4050 base::RunLoop().RunUntilIdle(); |
| 4051 |
| 4052 // 'ext1' should still be enabled, but with 'downloads' permission revoked. |
| 4053 EXPECT_TRUE(registry->enabled_extensions().GetByID(ext1)); |
| 4054 EXPECT_FALSE(ExtensionPrefs::Get(profile()) |
| 4055 ->GetActivePermissions(ext1) |
| 4056 ->HasAPIPermission(extensions::APIPermission::kDownloads)); |
| 4057 |
| 4058 // 'ext2' should be disabled because one of its required permissions is |
| 4059 // blocked. |
| 4060 EXPECT_FALSE(registry->enabled_extensions().GetByID(ext2)); |
| 4061 |
| 4062 // 'ext2_forced' should be handled the same as 'ext2' |
| 4063 EXPECT_FALSE(registry->enabled_extensions().GetByID(ext2_forced)); |
| 4064 } |
| 4065 |
3854 // Flaky on windows; http://crbug.com/309833 | 4066 // Flaky on windows; http://crbug.com/309833 |
3855 #if defined(OS_WIN) | 4067 #if defined(OS_WIN) |
3856 #define MAYBE_ExternalExtensionAutoAcknowledgement DISABLED_ExternalExtensionAut
oAcknowledgement | 4068 #define MAYBE_ExternalExtensionAutoAcknowledgement DISABLED_ExternalExtensionAut
oAcknowledgement |
3857 #else | 4069 #else |
3858 #define MAYBE_ExternalExtensionAutoAcknowledgement ExternalExtensionAutoAcknowle
dgement | 4070 #define MAYBE_ExternalExtensionAutoAcknowledgement ExternalExtensionAutoAcknowle
dgement |
3859 #endif | 4071 #endif |
3860 TEST_F(ExtensionServiceTest, MAYBE_ExternalExtensionAutoAcknowledgement) { | 4072 TEST_F(ExtensionServiceTest, MAYBE_ExternalExtensionAutoAcknowledgement) { |
3861 InitializeEmptyExtensionService(); | 4073 InitializeEmptyExtensionService(); |
3862 service()->set_extensions_enabled(true); | 4074 service()->set_extensions_enabled(true); |
3863 | 4075 |
(...skipping 3274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7138 | 7350 |
7139 service()->Observe(chrome::NOTIFICATION_PROFILE_DESTRUCTION_STARTED, | 7351 service()->Observe(chrome::NOTIFICATION_PROFILE_DESTRUCTION_STARTED, |
7140 content::Source<Profile>(profile()), | 7352 content::Source<Profile>(profile()), |
7141 content::NotificationService::NoDetails()); | 7353 content::NotificationService::NoDetails()); |
7142 EXPECT_EQ(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_); | 7354 EXPECT_EQ(UnloadedExtensionInfo::REASON_PROFILE_SHUTDOWN, unloaded_reason_); |
7143 EXPECT_EQ(0u, registry()->enabled_extensions().size()); | 7355 EXPECT_EQ(0u, registry()->enabled_extensions().size()); |
7144 EXPECT_EQ(0u, registry()->disabled_extensions().size()); | 7356 EXPECT_EQ(0u, registry()->disabled_extensions().size()); |
7145 EXPECT_EQ(0u, registry()->terminated_extensions().size()); | 7357 EXPECT_EQ(0u, registry()->terminated_extensions().size()); |
7146 EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); | 7358 EXPECT_EQ(0u, registry()->blacklisted_extensions().size()); |
7147 } | 7359 } |
OLD | NEW |