[email protected] | eb75f7b | 2012-01-04 09:07:28 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 5 | #include "chrome/browser/extensions/component_loader.h" |
| 6 | |
avi | a2f4804a | 2015-12-24 23:11:13 | [diff] [blame] | 7 | #include <stddef.h> |
| 8 | |
[email protected] | 443e931 | 2013-05-06 06:17:34 | [diff] [blame] | 9 | #include <string> |
| 10 | |
rlp | 997840ad | 2014-11-20 08:45:03 | [diff] [blame] | 11 | #include "base/command_line.h" |
thestig | 18dfb7a5 | 2014-08-26 10:44:04 | [diff] [blame] | 12 | #include "base/files/file_util.h" |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 13 | #include "base/path_service.h" |
avi | a2f4804a | 2015-12-24 23:11:13 | [diff] [blame] | 14 | #include "build/build_config.h" |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 15 | #include "chrome/browser/extensions/test_extension_service.h" |
| 16 | #include "chrome/common/chrome_paths.h" |
rlp | 997840ad | 2014-11-20 08:45:03 | [diff] [blame] | 17 | #include "chrome/common/chrome_switches.h" |
[email protected] | 55e16cd | 2013-12-18 04:36:08 | [diff] [blame] | 18 | #include "chrome/test/base/testing_profile.h" |
Gabriel Charette | c710874 | 2019-08-23 03:31:40 | [diff] [blame] | 19 | #include "content/public/test/browser_task_environment.h" |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 20 | #include "extensions/browser/extension_registry.h" |
[email protected] | 993da5e | 2013-03-23 21:25:16 | [diff] [blame] | 21 | #include "extensions/common/constants.h" |
[email protected] | e4452d3 | 2013-11-15 23:07:41 | [diff] [blame] | 22 | #include "extensions/common/extension.h" |
[email protected] | 289c44b | 2013-12-17 03:26:57 | [diff] [blame] | 23 | #include "extensions/common/extension_set.h" |
[email protected] | 558878cc8 | 2013-11-09 01:25:51 | [diff] [blame] | 24 | #include "extensions/common/manifest_handlers/background_info.h" |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 25 | #include "testing/gtest/include/gtest/gtest.h" |
| 26 | |
[email protected] | 06492ed | 2013-03-24 22:13:14 | [diff] [blame] | 27 | namespace extensions { |
[email protected] | 1c321ee5 | 2012-05-21 03:02:34 | [diff] [blame] | 28 | |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 29 | namespace { |
| 30 | |
| 31 | class MockExtensionService : public TestExtensionService { |
| 32 | private: |
| 33 | bool ready_; |
[email protected] | 43cbd759 | 2011-12-08 08:52:10 | [diff] [blame] | 34 | size_t unloaded_count_; |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 35 | ExtensionRegistry* registry_; |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 36 | |
| 37 | public: |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 38 | explicit MockExtensionService(Profile* profile) |
| 39 | : ready_(false), |
| 40 | unloaded_count_(0), |
| 41 | registry_(ExtensionRegistry::Get(profile)) {} |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 42 | |
dcheng | ae36a4a | 2014-10-21 12:36:36 | [diff] [blame] | 43 | void AddComponentExtension(const Extension* extension) override { |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 44 | EXPECT_FALSE(registry_->enabled_extensions().Contains(extension->id())); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 45 | // ExtensionService must become the owner of the extension object. |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 46 | registry_->AddEnabled(extension); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 47 | } |
| 48 | |
dcheng | ae36a4a | 2014-10-21 12:36:36 | [diff] [blame] | 49 | void UnloadExtension(const std::string& extension_id, |
limasdf | 0deef204 | 2017-05-03 19:17:17 | [diff] [blame] | 50 | UnloadedExtensionReason reason) override { |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 51 | ASSERT_TRUE(registry_->enabled_extensions().Contains(extension_id)); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 52 | // Remove the extension with the matching id. |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 53 | registry_->RemoveEnabled(extension_id); |
[email protected] | 43cbd759 | 2011-12-08 08:52:10 | [diff] [blame] | 54 | unloaded_count_++; |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 55 | } |
| 56 | |
dcheng | ae36a4a | 2014-10-21 12:36:36 | [diff] [blame] | 57 | void RemoveComponentExtension(const std::string& extension_id) override { |
limasdf | 0deef204 | 2017-05-03 19:17:17 | [diff] [blame] | 58 | UnloadExtension(extension_id, UnloadedExtensionReason::DISABLE); |
[email protected] | 8b1ec20 | 2013-09-05 02:09:50 | [diff] [blame] | 59 | } |
| 60 | |
dcheng | ae36a4a | 2014-10-21 12:36:36 | [diff] [blame] | 61 | bool is_ready() override { return ready_; } |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 62 | |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 63 | void set_ready(bool ready) { |
| 64 | ready_ = ready; |
| 65 | } |
| 66 | |
[email protected] | 43cbd759 | 2011-12-08 08:52:10 | [diff] [blame] | 67 | size_t unloaded_count() const { |
| 68 | return unloaded_count_; |
| 69 | } |
| 70 | |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 71 | void clear_extensions() { registry_->ClearAll(); } |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 72 | }; |
| 73 | |
| 74 | } // namespace |
| 75 | |
[email protected] | d592b1bd | 2013-05-06 06:40:47 | [diff] [blame] | 76 | class ComponentLoaderTest : public testing::Test { |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 77 | public: |
[email protected] | e676f8f | 2013-04-04 09:04:37 | [diff] [blame] | 78 | ComponentLoaderTest() |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 79 | : extension_service_(&profile_), |
| 80 | component_loader_(&extension_service_, |
jam | 726de9f | 2015-06-02 15:36:06 | [diff] [blame] | 81 | &profile_) { |
| 82 | component_loader_.set_ignore_whitelist_for_testing(true); |
| 83 | } |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 84 | |
dcheng | 7219181 | 2014-10-28 20:49:56 | [diff] [blame] | 85 | void SetUp() override { |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 86 | extension_path_ = |
[email protected] | 43cbd759 | 2011-12-08 08:52:10 | [diff] [blame] | 87 | GetBasePath().AppendASCII("good") |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 88 | .AppendASCII("Extensions") |
| 89 | .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") |
| 90 | .AppendASCII("1.0.0.0"); |
| 91 | |
| 92 | // Read in the extension manifest. |
[email protected] | 82f84b9 | 2013-08-30 18:23:50 | [diff] [blame] | 93 | ASSERT_TRUE(base::ReadFileToString( |
[email protected] | 993da5e | 2013-03-23 21:25:16 | [diff] [blame] | 94 | extension_path_.Append(kManifestFilename), |
| 95 | &manifest_contents_)); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 96 | } |
| 97 | |
| 98 | protected: |
Gabriel Charette | 798fde7 | 2019-08-20 22:24:04 | [diff] [blame] | 99 | content::BrowserTaskEnvironment task_environment_; |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 100 | TestingProfile profile_; |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 101 | MockExtensionService extension_service_; |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 102 | ComponentLoader component_loader_; |
| 103 | |
| 104 | // The root directory of the text extension. |
[email protected] | 650b2d5 | 2013-02-10 03:41:45 | [diff] [blame] | 105 | base::FilePath extension_path_; |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 106 | |
| 107 | // The contents of the text extension's manifest file. |
| 108 | std::string manifest_contents_; |
[email protected] | 43cbd759 | 2011-12-08 08:52:10 | [diff] [blame] | 109 | |
[email protected] | 650b2d5 | 2013-02-10 03:41:45 | [diff] [blame] | 110 | base::FilePath GetBasePath() { |
| 111 | base::FilePath test_data_dir; |
Avi Drissman | 9098f900 | 2018-05-04 00:11:52 | [diff] [blame] | 112 | base::PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir); |
[email protected] | 43cbd759 | 2011-12-08 08:52:10 | [diff] [blame] | 113 | return test_data_dir.AppendASCII("extensions"); |
| 114 | } |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 115 | }; |
| 116 | |
| 117 | TEST_F(ComponentLoaderTest, ParseManifest) { |
dcheng | c963c714 | 2016-04-08 03:55:22 | [diff] [blame] | 118 | std::unique_ptr<base::DictionaryValue> manifest; |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 119 | |
| 120 | // Test invalid JSON. |
lazyboy | f4e5cdb | 2016-11-18 02:58:45 | [diff] [blame] | 121 | manifest = component_loader_.ParseManifest("{ 'test': 3 } invalid"); |
| 122 | EXPECT_FALSE(manifest); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 123 | |
| 124 | // Test manifests that are valid JSON, but don't have an object literal |
| 125 | // at the root. ParseManifest() should always return NULL. |
| 126 | |
lazyboy | f4e5cdb | 2016-11-18 02:58:45 | [diff] [blame] | 127 | manifest = component_loader_.ParseManifest(std::string()); |
| 128 | EXPECT_FALSE(manifest); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 129 | |
lazyboy | f4e5cdb | 2016-11-18 02:58:45 | [diff] [blame] | 130 | manifest = component_loader_.ParseManifest("[{ \"foo\": 3 }]"); |
| 131 | EXPECT_FALSE(manifest); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 132 | |
lazyboy | f4e5cdb | 2016-11-18 02:58:45 | [diff] [blame] | 133 | manifest = component_loader_.ParseManifest("\"Test\""); |
| 134 | EXPECT_FALSE(manifest); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 135 | |
lazyboy | f4e5cdb | 2016-11-18 02:58:45 | [diff] [blame] | 136 | manifest = component_loader_.ParseManifest("42"); |
| 137 | EXPECT_FALSE(manifest); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 138 | |
lazyboy | f4e5cdb | 2016-11-18 02:58:45 | [diff] [blame] | 139 | manifest = component_loader_.ParseManifest("true"); |
| 140 | EXPECT_FALSE(manifest); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 141 | |
lazyboy | f4e5cdb | 2016-11-18 02:58:45 | [diff] [blame] | 142 | manifest = component_loader_.ParseManifest("false"); |
| 143 | EXPECT_FALSE(manifest); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 144 | |
lazyboy | f4e5cdb | 2016-11-18 02:58:45 | [diff] [blame] | 145 | manifest = component_loader_.ParseManifest("null"); |
| 146 | EXPECT_FALSE(manifest); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 147 | |
| 148 | // Test parsing valid JSON. |
| 149 | |
[email protected] | ee837d3 | 2012-10-02 22:25:49 | [diff] [blame] | 150 | int value = 0; |
lazyboy | f4e5cdb | 2016-11-18 02:58:45 | [diff] [blame] | 151 | manifest = component_loader_.ParseManifest( |
| 152 | "{ \"test\": { \"one\": 1 }, \"two\": 2 }"); |
| 153 | ASSERT_TRUE(manifest); |
[email protected] | ee837d3 | 2012-10-02 22:25:49 | [diff] [blame] | 154 | EXPECT_TRUE(manifest->GetInteger("test.one", &value)); |
| 155 | EXPECT_EQ(1, value); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 156 | ASSERT_TRUE(manifest->GetInteger("two", &value)); |
[email protected] | ee837d3 | 2012-10-02 22:25:49 | [diff] [blame] | 157 | EXPECT_EQ(2, value); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 158 | |
| 159 | std::string string_value; |
lazyboy | f4e5cdb | 2016-11-18 02:58:45 | [diff] [blame] | 160 | manifest = component_loader_.ParseManifest(manifest_contents_); |
[email protected] | eb75f7b | 2012-01-04 09:07:28 | [diff] [blame] | 161 | ASSERT_TRUE(manifest->GetString("background.page", &string_value)); |
[email protected] | ee837d3 | 2012-10-02 22:25:49 | [diff] [blame] | 162 | EXPECT_EQ("backgroundpage.html", string_value); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 163 | } |
| 164 | |
| 165 | // Test that the extension isn't loaded if the extension service isn't ready. |
| 166 | TEST_F(ComponentLoaderTest, AddWhenNotReady) { |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 167 | extension_service_.set_ready(false); |
[email protected] | ee837d3 | 2012-10-02 22:25:49 | [diff] [blame] | 168 | std::string extension_id = |
| 169 | component_loader_.Add(manifest_contents_, extension_path_); |
| 170 | EXPECT_NE("", extension_id); |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 171 | ExtensionRegistry* registry = ExtensionRegistry::Get(&profile_); |
| 172 | EXPECT_EQ(0u, registry->enabled_extensions().size()); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 173 | } |
| 174 | |
| 175 | // Test that it *is* loaded when the extension service *is* ready. |
| 176 | TEST_F(ComponentLoaderTest, AddWhenReady) { |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 177 | extension_service_.set_ready(true); |
[email protected] | ee837d3 | 2012-10-02 22:25:49 | [diff] [blame] | 178 | std::string extension_id = |
| 179 | component_loader_.Add(manifest_contents_, extension_path_); |
| 180 | EXPECT_NE("", extension_id); |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 181 | ExtensionRegistry* registry = ExtensionRegistry::Get(&profile_); |
| 182 | EXPECT_EQ(1u, registry->enabled_extensions().size()); |
| 183 | EXPECT_TRUE(registry->enabled_extensions().GetByID(extension_id)); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 184 | } |
| 185 | |
| 186 | TEST_F(ComponentLoaderTest, Remove) { |
| 187 | extension_service_.set_ready(false); |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 188 | ExtensionRegistry* registry = ExtensionRegistry::Get(&profile_); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 189 | |
| 190 | // Removing an extension that was never added should be ok. |
| 191 | component_loader_.Remove(extension_path_); |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 192 | EXPECT_EQ(0u, registry->enabled_extensions().size()); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 193 | |
[email protected] | eac8833 | 2012-12-26 17:57:45 | [diff] [blame] | 194 | // Try adding and removing before LoadAll() is called. |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 195 | component_loader_.Add(manifest_contents_, extension_path_); |
| 196 | component_loader_.Remove(extension_path_); |
[email protected] | eac8833 | 2012-12-26 17:57:45 | [diff] [blame] | 197 | component_loader_.LoadAll(); |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 198 | EXPECT_EQ(0u, registry->enabled_extensions().size()); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 199 | |
| 200 | // Load an extension, and check that it's unloaded when Remove() is called. |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 201 | extension_service_.set_ready(true); |
[email protected] | ee837d3 | 2012-10-02 22:25:49 | [diff] [blame] | 202 | std::string extension_id = |
| 203 | component_loader_.Add(manifest_contents_, extension_path_); |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 204 | EXPECT_EQ(1u, registry->enabled_extensions().size()); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 205 | component_loader_.Remove(extension_path_); |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 206 | EXPECT_EQ(0u, registry->enabled_extensions().size()); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 207 | |
[email protected] | eac8833 | 2012-12-26 17:57:45 | [diff] [blame] | 208 | // And after calling LoadAll(), it shouldn't get loaded. |
| 209 | component_loader_.LoadAll(); |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 210 | EXPECT_EQ(0u, registry->enabled_extensions().size()); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 211 | } |
| 212 | |
| 213 | TEST_F(ComponentLoaderTest, LoadAll) { |
| 214 | extension_service_.set_ready(false); |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 215 | ExtensionRegistry* registry = ExtensionRegistry::Get(&profile_); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 216 | |
| 217 | // No extensions should be loaded if none were added. |
[email protected] | eac8833 | 2012-12-26 17:57:45 | [diff] [blame] | 218 | component_loader_.LoadAll(); |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 219 | EXPECT_EQ(0u, registry->enabled_extensions().size()); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 220 | |
[email protected] | eac8833 | 2012-12-26 17:57:45 | [diff] [blame] | 221 | // Use LoadAll() to load the default extensions. |
[email protected] | bb12148 | 2012-12-08 06:49:38 | [diff] [blame] | 222 | component_loader_.AddDefaultComponentExtensions(false); |
[email protected] | eac8833 | 2012-12-26 17:57:45 | [diff] [blame] | 223 | component_loader_.LoadAll(); |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 224 | unsigned int default_count = registry->enabled_extensions().size(); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 225 | |
| 226 | // Clear the list of loaded extensions, and reload with one more. |
[email protected] | 84df833 | 2011-12-06 18:22:46 | [diff] [blame] | 227 | extension_service_.clear_extensions(); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 228 | component_loader_.Add(manifest_contents_, extension_path_); |
[email protected] | eac8833 | 2012-12-26 17:57:45 | [diff] [blame] | 229 | component_loader_.LoadAll(); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 230 | |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 231 | EXPECT_EQ(default_count + 1, registry->enabled_extensions().size()); |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 232 | } |
| 233 | |
[email protected] | 43cbd759 | 2011-12-08 08:52:10 | [diff] [blame] | 234 | TEST_F(ComponentLoaderTest, AddOrReplace) { |
[email protected] | ee837d3 | 2012-10-02 22:25:49 | [diff] [blame] | 235 | EXPECT_EQ(0u, component_loader_.registered_extensions_count()); |
[email protected] | bb12148 | 2012-12-08 06:49:38 | [diff] [blame] | 236 | component_loader_.AddDefaultComponentExtensions(false); |
[email protected] | 43cbd759 | 2011-12-08 08:52:10 | [diff] [blame] | 237 | size_t const default_count = component_loader_.registered_extensions_count(); |
[email protected] | 650b2d5 | 2013-02-10 03:41:45 | [diff] [blame] | 238 | base::FilePath known_extension = GetBasePath() |
[email protected] | 43cbd759 | 2011-12-08 08:52:10 | [diff] [blame] | 239 | .AppendASCII("override_component_extension"); |
calamity | ae7fed4 | 2017-06-22 04:58:22 | [diff] [blame] | 240 | base::FilePath unknown_extension = extension_path_; |
rob | ca0af32 | 2014-12-08 12:42:59 | [diff] [blame] | 241 | base::FilePath invalid_extension = GetBasePath() |
| 242 | .AppendASCII("this_path_does_not_exist"); |
[email protected] | 43cbd759 | 2011-12-08 08:52:10 | [diff] [blame] | 243 | |
| 244 | // Replace a default component extension. |
| 245 | component_loader_.AddOrReplace(known_extension); |
calamity | ae7fed4 | 2017-06-22 04:58:22 | [diff] [blame] | 246 | EXPECT_EQ(default_count, component_loader_.registered_extensions_count()); |
[email protected] | 43cbd759 | 2011-12-08 08:52:10 | [diff] [blame] | 247 | |
| 248 | // Add a new component extension. |
calamity | ae7fed4 | 2017-06-22 04:58:22 | [diff] [blame] | 249 | component_loader_.AddOrReplace(unknown_extension); |
| 250 | EXPECT_EQ(default_count + 1, component_loader_.registered_extensions_count()); |
[email protected] | 43cbd759 | 2011-12-08 08:52:10 | [diff] [blame] | 251 | |
| 252 | extension_service_.set_ready(true); |
[email protected] | eac8833 | 2012-12-26 17:57:45 | [diff] [blame] | 253 | component_loader_.LoadAll(); |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 254 | ExtensionRegistry* registry = ExtensionRegistry::Get(&profile_); |
[email protected] | 43cbd759 | 2011-12-08 08:52:10 | [diff] [blame] | 255 | |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 256 | EXPECT_EQ(default_count + 1, registry->enabled_extensions().size()); |
[email protected] | ee837d3 | 2012-10-02 22:25:49 | [diff] [blame] | 257 | EXPECT_EQ(0u, extension_service_.unloaded_count()); |
[email protected] | 43cbd759 | 2011-12-08 08:52:10 | [diff] [blame] | 258 | |
| 259 | // replace loaded component extension. |
| 260 | component_loader_.AddOrReplace(known_extension); |
reillyg | a3acbc1 | 2014-11-11 23:17:12 | [diff] [blame] | 261 | EXPECT_EQ(default_count + 1, registry->enabled_extensions().size()); |
[email protected] | ee837d3 | 2012-10-02 22:25:49 | [diff] [blame] | 262 | EXPECT_EQ(1u, extension_service_.unloaded_count()); |
[email protected] | 5583c05 | 2013-05-29 02:18:22 | [diff] [blame] | 263 | |
| 264 | // Add an invalid component extension. |
| 265 | std::string extension_id = component_loader_.AddOrReplace(invalid_extension); |
| 266 | EXPECT_TRUE(extension_id.empty()); |
[email protected] | 43cbd759 | 2011-12-08 08:52:10 | [diff] [blame] | 267 | } |
| 268 | |
[email protected] | 25ae015 | 2011-11-18 14:40:02 | [diff] [blame] | 269 | } // namespace extensions |