Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <string> | 5 #include <string> |
| 6 | 6 |
| 7 #include "chrome/browser/extensions/component_loader.h" | 7 #include "chrome/browser/extensions/component_loader.h" |
| 8 | 8 |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
| 11 #include "chrome/browser/extensions/test_extension_service.h" | 11 #include "chrome/browser/extensions/test_extension_service.h" |
| 12 #include "chrome/common/chrome_paths.h" | 12 #include "chrome/common/chrome_paths.h" |
| 13 #include "chrome/common/extensions/extension.h" | 13 #include "chrome/common/extensions/extension.h" |
| 14 #include "chrome/common/pref_names.h" | 14 #include "chrome/common/pref_names.h" |
| 15 #include "chrome/test/base/testing_pref_service.h" | 15 #include "chrome/test/base/testing_pref_service.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 | 17 |
| 18 namespace { | 18 namespace { |
| 19 | 19 |
| 20 class MockExtensionService : public TestExtensionService { | 20 class MockExtensionService : public TestExtensionService { |
| 21 private: | 21 private: |
| 22 bool find(std::string id) { | |
|
Aaron Boodman
2011/12/06 19:43:35
There is already GetExtensionById in TestExtension
SeRya
2011/12/06 22:19:37
Irrelevant after merge.
Aaron Boodman
2011/12/07 00:09:02
What I mean is that the TestExtensionService base
| |
| 23 for (ExtensionList::iterator it = extension_list_.begin(); | |
| 24 it != extension_list_.end(); | |
| 25 ++it) | |
| 26 if ((*it)->id() == id) | |
| 27 return true; | |
| 28 | |
| 29 return false; | |
| 30 } | |
| 31 | |
| 22 bool ready_; | 32 bool ready_; |
| 23 ExtensionList extension_list_; | 33 ExtensionList extension_list_; |
| 34 size_t unloaded_count_; | |
| 24 | 35 |
| 25 public: | 36 public: |
| 26 MockExtensionService() : ready_(false) { | 37 MockExtensionService() : ready_(false), unloaded_count_(0) { |
| 27 } | 38 } |
| 28 | 39 |
| 29 virtual void AddExtension(const Extension* extension) OVERRIDE { | 40 virtual void AddExtension(const Extension* extension) OVERRIDE { |
| 41 ASSERT_FALSE(find(extension->id())); | |
| 30 // ExtensionService must become the owner of the extension object. | 42 // ExtensionService must become the owner of the extension object. |
| 31 extension_list_.push_back(extension); | 43 extension_list_.push_back(extension); |
| 32 } | 44 } |
| 33 | 45 |
| 34 virtual void UnloadExtension( | 46 virtual void UnloadExtension( |
| 35 const std::string& extension_id, | 47 const std::string& extension_id, |
| 36 extension_misc::UnloadedExtensionReason reason) OVERRIDE { | 48 extension_misc::UnloadedExtensionReason reason) OVERRIDE { |
| 49 ASSERT_TRUE(find(extension_id)); | |
| 37 // Remove the extension with the matching id. | 50 // Remove the extension with the matching id. |
| 38 for (ExtensionList::iterator it = extension_list_.begin(); | 51 for (ExtensionList::iterator it = extension_list_.begin(); |
| 39 it != extension_list_.end(); | 52 it != extension_list_.end(); |
| 40 ++it) { | 53 ++it) { |
| 41 if ((*it)->id() == extension_id) { | 54 if ((*it)->id() == extension_id) { |
| 42 extension_list_.erase(it); | 55 extension_list_.erase(it); |
| 56 unloaded_count_++; | |
| 43 return; | 57 return; |
| 44 } | 58 } |
| 45 } | 59 } |
| 46 } | 60 } |
| 47 | 61 |
| 48 virtual bool is_ready() OVERRIDE { | 62 virtual bool is_ready() OVERRIDE { |
| 49 return ready_; | 63 return ready_; |
| 50 } | 64 } |
| 51 | 65 |
| 52 virtual const ExtensionList* extensions() const OVERRIDE { | 66 virtual const ExtensionList* extensions() const OVERRIDE { |
| 53 return &extension_list_; | 67 return &extension_list_; |
| 54 } | 68 } |
| 55 | 69 |
| 56 void set_ready(bool ready) { | 70 void set_ready(bool ready) { |
| 57 ready_ = ready; | 71 ready_ = ready; |
| 58 } | 72 } |
| 59 | 73 |
| 74 size_t unloaded_count() const { | |
| 75 return unloaded_count_; | |
| 76 } | |
| 77 | |
| 60 void clear_extension_list() { | 78 void clear_extension_list() { |
| 61 extension_list_.clear(); | 79 extension_list_.clear(); |
| 62 } | 80 } |
| 63 }; | 81 }; |
| 64 | 82 |
| 65 } // namespace | 83 } // namespace |
| 66 | 84 |
| 67 namespace extensions { | 85 namespace extensions { |
| 68 | 86 |
| 69 class ComponentLoaderTest : public testing::Test { | 87 class ComponentLoaderTest : public testing::Test { |
| 70 public: | 88 public: |
| 71 ComponentLoaderTest() : | 89 ComponentLoaderTest() : |
| 72 // Note: we pass the same pref service here, to stand in for both | 90 // Note: we pass the same pref service here, to stand in for both |
| 73 // user prefs and local state. | 91 // user prefs and local state. |
| 74 component_loader_(&extension_service_, &prefs_, &prefs_) { | 92 component_loader_(&extension_service_, &prefs_, &prefs_) { |
| 75 } | 93 } |
| 76 | 94 |
| 77 void SetUp() { | 95 void SetUp() { |
| 78 FilePath test_data_dir; | |
| 79 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir)); | |
| 80 extension_path_ = | 96 extension_path_ = |
| 81 test_data_dir.AppendASCII("extensions") | 97 GetBasePath().AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") |
| 82 .AppendASCII("good") | |
| 83 .AppendASCII("Extensions") | |
| 84 .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") | |
| 85 .AppendASCII("1.0.0.0"); | 98 .AppendASCII("1.0.0.0"); |
| 86 | 99 |
| 87 // Read in the extension manifest. | 100 // Read in the extension manifest. |
| 88 ASSERT_TRUE(file_util::ReadFileToString( | 101 ASSERT_TRUE(file_util::ReadFileToString( |
| 89 extension_path_.Append(Extension::kManifestFilename), | 102 extension_path_.Append(Extension::kManifestFilename), |
| 90 &manifest_contents_)); | 103 &manifest_contents_)); |
| 91 | 104 |
| 92 // Register the user prefs that ComponentLoader will read. | 105 // Register the user prefs that ComponentLoader will read. |
| 93 prefs_.RegisterStringPref(prefs::kEnterpriseWebStoreURL, std::string()); | 106 prefs_.RegisterStringPref(prefs::kEnterpriseWebStoreURL, std::string()); |
| 94 prefs_.RegisterStringPref(prefs::kEnterpriseWebStoreName, std::string()); | 107 prefs_.RegisterStringPref(prefs::kEnterpriseWebStoreName, std::string()); |
| 95 | 108 |
| 96 // Register the local state prefs. | 109 // Register the local state prefs. |
| 97 #if defined(OS_CHROMEOS) | 110 #if defined(OS_CHROMEOS) |
| 98 prefs_.RegisterBooleanPref(prefs::kAccessibilityEnabled, false); | 111 prefs_.RegisterBooleanPref(prefs::kAccessibilityEnabled, false); |
| 99 #endif | 112 #endif |
| 100 } | 113 } |
| 101 | 114 |
| 102 protected: | 115 protected: |
| 103 MockExtensionService extension_service_; | 116 MockExtensionService extension_service_; |
| 104 TestingPrefService prefs_; | 117 TestingPrefService prefs_; |
| 105 ComponentLoader component_loader_; | 118 ComponentLoader component_loader_; |
| 106 | 119 |
| 107 // The root directory of the text extension. | 120 // The root directory of the text extension. |
| 108 FilePath extension_path_; | 121 FilePath extension_path_; |
| 109 | 122 |
| 110 // The contents of the text extension's manifest file. | 123 // The contents of the text extension's manifest file. |
| 111 std::string manifest_contents_; | 124 std::string manifest_contents_; |
| 125 | |
| 126 FilePath GetBasePath() { | |
| 127 FilePath test_data_dir; | |
| 128 PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir); | |
| 129 return test_data_dir.AppendASCII("extensions") | |
| 130 .AppendASCII("good") | |
| 131 .AppendASCII("Extensions"); | |
| 132 } | |
| 112 }; | 133 }; |
| 113 | 134 |
| 114 TEST_F(ComponentLoaderTest, ParseManifest) { | 135 TEST_F(ComponentLoaderTest, ParseManifest) { |
| 115 scoped_ptr<DictionaryValue> manifest; | 136 scoped_ptr<DictionaryValue> manifest; |
| 116 | 137 |
| 117 // Test invalid JSON. | 138 // Test invalid JSON. |
| 118 manifest.reset( | 139 manifest.reset( |
| 119 component_loader_.ParseManifest("{ 'test': 3 } invalid")); | 140 component_loader_.ParseManifest("{ 'test': 3 } invalid")); |
| 120 ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); | 141 ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); |
| 121 | 142 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 159 ASSERT_TRUE(manifest->GetString("background_page", &string_value)); | 180 ASSERT_TRUE(manifest->GetString("background_page", &string_value)); |
| 160 ASSERT_EQ("backgroundpage.html", string_value); | 181 ASSERT_EQ("backgroundpage.html", string_value); |
| 161 } | 182 } |
| 162 | 183 |
| 163 // Test that the extension isn't loaded if the extension service isn't ready. | 184 // Test that the extension isn't loaded if the extension service isn't ready. |
| 164 TEST_F(ComponentLoaderTest, AddWhenNotReady) { | 185 TEST_F(ComponentLoaderTest, AddWhenNotReady) { |
| 165 scoped_refptr<const Extension> extension; | 186 scoped_refptr<const Extension> extension; |
| 166 extension_service_.set_ready(false); | 187 extension_service_.set_ready(false); |
| 167 extension = component_loader_.Add(manifest_contents_, extension_path_); | 188 extension = component_loader_.Add(manifest_contents_, extension_path_); |
| 168 ASSERT_EQ((Extension*)NULL, extension.get()); | 189 ASSERT_EQ((Extension*)NULL, extension.get()); |
| 169 ASSERT_EQ(0U, extension_service_.extensions()->size()); | 190 ASSERT_EQ(0u, extension_service_.extensions()->size()); |
| 170 } | 191 } |
| 171 | 192 |
| 172 // Test that it *is* loaded when the extension service *is* ready. | 193 // Test that it *is* loaded when the extension service *is* ready. |
| 173 TEST_F(ComponentLoaderTest, AddWhenReady) { | 194 TEST_F(ComponentLoaderTest, AddWhenReady) { |
| 174 scoped_refptr<const Extension> extension; | 195 scoped_refptr<const Extension> extension; |
| 175 extension_service_.set_ready(true); | 196 extension_service_.set_ready(true); |
| 176 extension = component_loader_.Add(manifest_contents_, extension_path_); | 197 extension = component_loader_.Add(manifest_contents_, extension_path_); |
| 177 ASSERT_NE((Extension*)NULL, extension.get()); | 198 ASSERT_NE((Extension*)NULL, extension.get()); |
| 178 ASSERT_EQ(1U, extension_service_.extensions()->size()); | 199 ASSERT_EQ(1u, extension_service_.extensions()->size()); |
| 179 } | 200 } |
| 180 | 201 |
| 181 TEST_F(ComponentLoaderTest, Remove) { | 202 TEST_F(ComponentLoaderTest, Remove) { |
| 182 extension_service_.set_ready(false); | 203 extension_service_.set_ready(false); |
| 183 | 204 |
| 184 // Removing an extension that was never added should be ok. | 205 // Removing an extension that was never added should be ok. |
| 185 component_loader_.Remove(extension_path_); | 206 component_loader_.Remove(extension_path_); |
| 186 ASSERT_EQ(0U, extension_service_.extensions()->size()); | 207 ASSERT_EQ(0u, extension_service_.extensions()->size()); |
| 187 | 208 |
| 188 // Try adding and removing before LoadAll() is called. | 209 // Try adding and removing before LoadAll() is called. |
| 189 component_loader_.Add(manifest_contents_, extension_path_); | 210 component_loader_.Add(manifest_contents_, extension_path_); |
| 190 component_loader_.Remove(extension_path_); | 211 component_loader_.Remove(extension_path_); |
| 191 component_loader_.LoadAll(); | 212 component_loader_.LoadAll(); |
| 192 ASSERT_EQ(0U, extension_service_.extensions()->size()); | 213 ASSERT_EQ(0u, extension_service_.extensions()->size()); |
| 193 | 214 |
| 194 // Load an extension, and check that it's unloaded when Remove() is called. | 215 // Load an extension, and check that it's unloaded when Remove() is called. |
| 195 scoped_refptr<const Extension> extension; | 216 scoped_refptr<const Extension> extension; |
| 196 extension_service_.set_ready(true); | 217 extension_service_.set_ready(true); |
| 197 extension = component_loader_.Add(manifest_contents_, extension_path_); | 218 extension = component_loader_.Add(manifest_contents_, extension_path_); |
| 198 ASSERT_NE((Extension*)NULL, extension.get()); | 219 ASSERT_NE((Extension*)NULL, extension.get()); |
| 199 component_loader_.Remove(extension_path_); | 220 component_loader_.Remove(extension_path_); |
| 200 ASSERT_EQ(0U, extension_service_.extensions()->size()); | 221 ASSERT_EQ(0u, extension_service_.extensions()->size()); |
| 201 | 222 |
| 202 // And after calling LoadAll(), it shouldn't get loaded. | 223 // And after calling LoadAll(), it shouldn't get loaded. |
| 203 component_loader_.LoadAll(); | 224 component_loader_.LoadAll(); |
| 204 ASSERT_EQ(0U, extension_service_.extensions()->size()); | 225 ASSERT_EQ(0u, extension_service_.extensions()->size()); |
| 205 } | 226 } |
| 206 | 227 |
| 207 TEST_F(ComponentLoaderTest, LoadAll) { | 228 TEST_F(ComponentLoaderTest, LoadAll) { |
| 208 extension_service_.set_ready(false); | 229 extension_service_.set_ready(false); |
| 209 | 230 |
| 210 // No extensions should be loaded if none were added. | 231 // No extensions should be loaded if none were added. |
| 211 component_loader_.LoadAll(); | 232 component_loader_.LoadAll(); |
| 212 ASSERT_EQ(0U, extension_service_.extensions()->size()); | 233 ASSERT_EQ(0u, extension_service_.extensions()->size()); |
|
Aaron Boodman
2011/12/06 19:43:35
thank-you!
| |
| 213 | 234 |
| 214 // Use LoadAll() to load the default extensions. | 235 // Use LoadAll() to load the default extensions. |
| 215 component_loader_.AddDefaultComponentExtensions(); | 236 component_loader_.AddDefaultComponentExtensions(); |
| 216 component_loader_.LoadAll(); | 237 component_loader_.LoadAll(); |
| 217 unsigned int default_count = extension_service_.extensions()->size(); | 238 unsigned int default_count = extension_service_.extensions()->size(); |
| 218 | 239 |
| 219 // Clear the list of loaded extensions, and reload with one more. | 240 // Clear the list of loaded extensions, and reload with one more. |
| 220 extension_service_.clear_extension_list(); | 241 extension_service_.clear_extension_list(); |
| 221 component_loader_.Add(manifest_contents_, extension_path_); | 242 component_loader_.Add(manifest_contents_, extension_path_); |
| 222 component_loader_.LoadAll(); | 243 component_loader_.LoadAll(); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 242 component_loader_.AddDefaultComponentExtensions(); | 263 component_loader_.AddDefaultComponentExtensions(); |
| 243 component_loader_.LoadAll(); | 264 component_loader_.LoadAll(); |
| 244 ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); | 265 ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); |
| 245 | 266 |
| 246 // Number of loaded extensions should be the same after changing the pref. | 267 // Number of loaded extensions should be the same after changing the pref. |
| 247 prefs_.SetUserPref(prefs::kEnterpriseWebStoreURL, | 268 prefs_.SetUserPref(prefs::kEnterpriseWebStoreURL, |
| 248 Value::CreateStringValue("http://www.google.de")); | 269 Value::CreateStringValue("http://www.google.de")); |
| 249 ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); | 270 ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); |
| 250 } | 271 } |
| 251 | 272 |
| 273 TEST_F(ComponentLoaderTest, AddOrReplace) { | |
| 274 ASSERT_EQ(0u, component_loader_.GetRegisteredExtensionsCount()); | |
| 275 component_loader_.AddDefaultComponentExtensions(); | |
| 276 size_t const default_count = component_loader_.GetRegisteredExtensionsCount(); | |
| 277 FilePath known_extension = GetBasePath() | |
| 278 .AppendASCII("mndnfokpggljbaajbnioimlmbfngpief"); | |
| 279 FilePath unknow_extension = GetBasePath() | |
| 280 .AppendASCII("hpiknbiabeeppbpihjehijgoemciehgk") | |
| 281 .AppendASCII("2"); | |
| 282 | |
| 283 // Replace a default component extension. | |
| 284 component_loader_.AddOrReplace(known_extension); | |
| 285 ASSERT_EQ(default_count, | |
| 286 component_loader_.GetRegisteredExtensionsCount()); | |
| 287 | |
| 288 // Add a new component extension. | |
| 289 component_loader_.AddOrReplace(unknow_extension); | |
| 290 ASSERT_EQ(default_count + 1, | |
| 291 component_loader_.GetRegisteredExtensionsCount()); | |
| 292 | |
| 293 extension_service_.set_ready(true); | |
| 294 component_loader_.LoadAll(); | |
| 295 | |
| 296 ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); | |
| 297 ASSERT_EQ(0u, extension_service_.unloaded_count()); | |
| 298 | |
| 299 // replace loaded component extension. | |
| 300 component_loader_.AddOrReplace(known_extension); | |
| 301 ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); | |
| 302 ASSERT_EQ(1u, extension_service_.unloaded_count()); | |
| 303 } | |
| 304 | |
| 252 } // namespace extensions | 305 } // namespace extensions |
| OLD | NEW |