| 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/extensions/extension_set.h" | 14 #include "chrome/common/extensions/extension_set.h" |
| 15 #include "chrome/common/pref_names.h" | 15 #include "chrome/common/pref_names.h" |
| 16 #include "chrome/test/base/testing_pref_service.h" | 16 #include "chrome/test/base/testing_pref_service.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
| 18 | 18 |
| 19 namespace { | 19 namespace { |
| 20 | 20 |
| 21 class MockExtensionService : public TestExtensionService { | 21 class MockExtensionService : public TestExtensionService { |
| 22 private: | 22 private: |
| 23 bool ready_; | 23 bool ready_; |
| 24 size_t unloaded_count_; |
| 24 ExtensionSet extension_set_; | 25 ExtensionSet extension_set_; |
| 25 | 26 |
| 26 public: | 27 public: |
| 27 MockExtensionService() : ready_(false) { | 28 MockExtensionService() : ready_(false), unloaded_count_(0) { |
| 28 } | 29 } |
| 29 | 30 |
| 30 virtual void AddExtension(const Extension* extension) OVERRIDE { | 31 virtual void AddExtension(const Extension* extension) OVERRIDE { |
| 32 ASSERT_FALSE(extension_set_.Contains(extension->id())); |
| 31 // ExtensionService must become the owner of the extension object. | 33 // ExtensionService must become the owner of the extension object. |
| 32 extension_set_.Insert(extension); | 34 extension_set_.Insert(extension); |
| 33 } | 35 } |
| 34 | 36 |
| 35 virtual void UnloadExtension( | 37 virtual void UnloadExtension( |
| 36 const std::string& extension_id, | 38 const std::string& extension_id, |
| 37 extension_misc::UnloadedExtensionReason reason) OVERRIDE { | 39 extension_misc::UnloadedExtensionReason reason) OVERRIDE { |
| 40 ASSERT_TRUE(extension_set_.Contains(extension_id)); |
| 38 // Remove the extension with the matching id. | 41 // Remove the extension with the matching id. |
| 39 extension_set_.Remove(extension_id); | 42 extension_set_.Remove(extension_id); |
| 43 unloaded_count_++; |
| 40 } | 44 } |
| 41 | 45 |
| 42 virtual bool is_ready() OVERRIDE { | 46 virtual bool is_ready() OVERRIDE { |
| 43 return ready_; | 47 return ready_; |
| 44 } | 48 } |
| 45 | 49 |
| 46 virtual const ExtensionSet* extensions() const OVERRIDE { | 50 virtual const ExtensionSet* extensions() const OVERRIDE { |
| 47 return &extension_set_; | 51 return &extension_set_; |
| 48 } | 52 } |
| 49 | 53 |
| 50 void set_ready(bool ready) { | 54 void set_ready(bool ready) { |
| 51 ready_ = ready; | 55 ready_ = ready; |
| 52 } | 56 } |
| 53 | 57 |
| 58 size_t unloaded_count() const { |
| 59 return unloaded_count_; |
| 60 } |
| 61 |
| 54 void clear_extensions() { | 62 void clear_extensions() { |
| 55 extension_set_.Clear(); | 63 extension_set_.Clear(); |
| 56 } | 64 } |
| 57 }; | 65 }; |
| 58 | 66 |
| 59 } // namespace | 67 } // namespace |
| 60 | 68 |
| 61 namespace extensions { | 69 namespace extensions { |
| 62 | 70 |
| 63 class ComponentLoaderTest : public testing::Test { | 71 class ComponentLoaderTest : public testing::Test { |
| 64 public: | 72 public: |
| 65 ComponentLoaderTest() : | 73 ComponentLoaderTest() : |
| 66 // Note: we pass the same pref service here, to stand in for both | 74 // Note: we pass the same pref service here, to stand in for both |
| 67 // user prefs and local state. | 75 // user prefs and local state. |
| 68 component_loader_(&extension_service_, &prefs_, &prefs_) { | 76 component_loader_(&extension_service_, &prefs_, &prefs_) { |
| 69 } | 77 } |
| 70 | 78 |
| 71 void SetUp() { | 79 void SetUp() { |
| 72 FilePath test_data_dir; | |
| 73 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir)); | |
| 74 extension_path_ = | 80 extension_path_ = |
| 75 test_data_dir.AppendASCII("extensions") | 81 GetBasePath().AppendASCII("good") |
| 76 .AppendASCII("good") | |
| 77 .AppendASCII("Extensions") | 82 .AppendASCII("Extensions") |
| 78 .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") | 83 .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") |
| 79 .AppendASCII("1.0.0.0"); | 84 .AppendASCII("1.0.0.0"); |
| 80 | 85 |
| 81 // Read in the extension manifest. | 86 // Read in the extension manifest. |
| 82 ASSERT_TRUE(file_util::ReadFileToString( | 87 ASSERT_TRUE(file_util::ReadFileToString( |
| 83 extension_path_.Append(Extension::kManifestFilename), | 88 extension_path_.Append(Extension::kManifestFilename), |
| 84 &manifest_contents_)); | 89 &manifest_contents_)); |
| 85 | 90 |
| 86 // Register the user prefs that ComponentLoader will read. | 91 // Register the user prefs that ComponentLoader will read. |
| 87 prefs_.RegisterStringPref(prefs::kEnterpriseWebStoreURL, std::string()); | 92 prefs_.RegisterStringPref(prefs::kEnterpriseWebStoreURL, std::string()); |
| 88 prefs_.RegisterStringPref(prefs::kEnterpriseWebStoreName, std::string()); | 93 prefs_.RegisterStringPref(prefs::kEnterpriseWebStoreName, std::string()); |
| 89 | 94 |
| 90 // Register the local state prefs. | 95 // Register the local state prefs. |
| 91 #if defined(OS_CHROMEOS) | 96 #if defined(OS_CHROMEOS) |
| 92 prefs_.RegisterBooleanPref(prefs::kAccessibilityEnabled, false); | 97 prefs_.RegisterBooleanPref(prefs::kAccessibilityEnabled, false); |
| 93 #endif | 98 #endif |
| 94 } | 99 } |
| 95 | 100 |
| 96 protected: | 101 protected: |
| 97 MockExtensionService extension_service_; | 102 MockExtensionService extension_service_; |
| 98 TestingPrefService prefs_; | 103 TestingPrefService prefs_; |
| 99 ComponentLoader component_loader_; | 104 ComponentLoader component_loader_; |
| 100 | 105 |
| 101 // The root directory of the text extension. | 106 // The root directory of the text extension. |
| 102 FilePath extension_path_; | 107 FilePath extension_path_; |
| 103 | 108 |
| 104 // The contents of the text extension's manifest file. | 109 // The contents of the text extension's manifest file. |
| 105 std::string manifest_contents_; | 110 std::string manifest_contents_; |
| 111 |
| 112 FilePath GetBasePath() { |
| 113 FilePath test_data_dir; |
| 114 PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir); |
| 115 return test_data_dir.AppendASCII("extensions"); |
| 116 } |
| 106 }; | 117 }; |
| 107 | 118 |
| 108 TEST_F(ComponentLoaderTest, ParseManifest) { | 119 TEST_F(ComponentLoaderTest, ParseManifest) { |
| 109 scoped_ptr<DictionaryValue> manifest; | 120 scoped_ptr<DictionaryValue> manifest; |
| 110 | 121 |
| 111 // Test invalid JSON. | 122 // Test invalid JSON. |
| 112 manifest.reset( | 123 manifest.reset( |
| 113 component_loader_.ParseManifest("{ 'test': 3 } invalid")); | 124 component_loader_.ParseManifest("{ 'test': 3 } invalid")); |
| 114 ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); | 125 ASSERT_EQ((DictionaryValue*)NULL, manifest.get()); |
| 115 | 126 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 ASSERT_TRUE(manifest->GetString("background_page", &string_value)); | 164 ASSERT_TRUE(manifest->GetString("background_page", &string_value)); |
| 154 ASSERT_EQ("backgroundpage.html", string_value); | 165 ASSERT_EQ("backgroundpage.html", string_value); |
| 155 } | 166 } |
| 156 | 167 |
| 157 // Test that the extension isn't loaded if the extension service isn't ready. | 168 // Test that the extension isn't loaded if the extension service isn't ready. |
| 158 TEST_F(ComponentLoaderTest, AddWhenNotReady) { | 169 TEST_F(ComponentLoaderTest, AddWhenNotReady) { |
| 159 scoped_refptr<const Extension> extension; | 170 scoped_refptr<const Extension> extension; |
| 160 extension_service_.set_ready(false); | 171 extension_service_.set_ready(false); |
| 161 extension = component_loader_.Add(manifest_contents_, extension_path_); | 172 extension = component_loader_.Add(manifest_contents_, extension_path_); |
| 162 ASSERT_EQ((Extension*)NULL, extension.get()); | 173 ASSERT_EQ((Extension*)NULL, extension.get()); |
| 163 ASSERT_EQ(0U, extension_service_.extensions()->size()); | 174 ASSERT_EQ(0u, extension_service_.extensions()->size()); |
| 164 } | 175 } |
| 165 | 176 |
| 166 // Test that it *is* loaded when the extension service *is* ready. | 177 // Test that it *is* loaded when the extension service *is* ready. |
| 167 TEST_F(ComponentLoaderTest, AddWhenReady) { | 178 TEST_F(ComponentLoaderTest, AddWhenReady) { |
| 168 scoped_refptr<const Extension> extension; | 179 scoped_refptr<const Extension> extension; |
| 169 extension_service_.set_ready(true); | 180 extension_service_.set_ready(true); |
| 170 extension = component_loader_.Add(manifest_contents_, extension_path_); | 181 extension = component_loader_.Add(manifest_contents_, extension_path_); |
| 171 ASSERT_NE((Extension*)NULL, extension.get()); | 182 ASSERT_NE((Extension*)NULL, extension.get()); |
| 172 ASSERT_EQ(1U, extension_service_.extensions()->size()); | 183 ASSERT_EQ(1u, extension_service_.extensions()->size()); |
| 173 } | 184 } |
| 174 | 185 |
| 175 TEST_F(ComponentLoaderTest, Remove) { | 186 TEST_F(ComponentLoaderTest, Remove) { |
| 176 extension_service_.set_ready(false); | 187 extension_service_.set_ready(false); |
| 177 | 188 |
| 178 // Removing an extension that was never added should be ok. | 189 // Removing an extension that was never added should be ok. |
| 179 component_loader_.Remove(extension_path_); | 190 component_loader_.Remove(extension_path_); |
| 180 ASSERT_EQ(0U, extension_service_.extensions()->size()); | 191 ASSERT_EQ(0u, extension_service_.extensions()->size()); |
| 181 | 192 |
| 182 // Try adding and removing before LoadAll() is called. | 193 // Try adding and removing before LoadAll() is called. |
| 183 component_loader_.Add(manifest_contents_, extension_path_); | 194 component_loader_.Add(manifest_contents_, extension_path_); |
| 184 component_loader_.Remove(extension_path_); | 195 component_loader_.Remove(extension_path_); |
| 185 component_loader_.LoadAll(); | 196 component_loader_.LoadAll(); |
| 186 ASSERT_EQ(0U, extension_service_.extensions()->size()); | 197 ASSERT_EQ(0u, extension_service_.extensions()->size()); |
| 187 | 198 |
| 188 // Load an extension, and check that it's unloaded when Remove() is called. | 199 // Load an extension, and check that it's unloaded when Remove() is called. |
| 189 scoped_refptr<const Extension> extension; | 200 scoped_refptr<const Extension> extension; |
| 190 extension_service_.set_ready(true); | 201 extension_service_.set_ready(true); |
| 191 extension = component_loader_.Add(manifest_contents_, extension_path_); | 202 extension = component_loader_.Add(manifest_contents_, extension_path_); |
| 192 ASSERT_NE((Extension*)NULL, extension.get()); | 203 ASSERT_NE((Extension*)NULL, extension.get()); |
| 193 component_loader_.Remove(extension_path_); | 204 component_loader_.Remove(extension_path_); |
| 194 ASSERT_EQ(0U, extension_service_.extensions()->size()); | 205 ASSERT_EQ(0u, extension_service_.extensions()->size()); |
| 195 | 206 |
| 196 // And after calling LoadAll(), it shouldn't get loaded. | 207 // And after calling LoadAll(), it shouldn't get loaded. |
| 197 component_loader_.LoadAll(); | 208 component_loader_.LoadAll(); |
| 198 ASSERT_EQ(0U, extension_service_.extensions()->size()); | 209 ASSERT_EQ(0u, extension_service_.extensions()->size()); |
| 199 } | 210 } |
| 200 | 211 |
| 201 TEST_F(ComponentLoaderTest, LoadAll) { | 212 TEST_F(ComponentLoaderTest, LoadAll) { |
| 202 extension_service_.set_ready(false); | 213 extension_service_.set_ready(false); |
| 203 | 214 |
| 204 // No extensions should be loaded if none were added. | 215 // No extensions should be loaded if none were added. |
| 205 component_loader_.LoadAll(); | 216 component_loader_.LoadAll(); |
| 206 ASSERT_EQ(0U, extension_service_.extensions()->size()); | 217 ASSERT_EQ(0u, extension_service_.extensions()->size()); |
| 207 | 218 |
| 208 // Use LoadAll() to load the default extensions. | 219 // Use LoadAll() to load the default extensions. |
| 209 component_loader_.AddDefaultComponentExtensions(); | 220 component_loader_.AddDefaultComponentExtensions(); |
| 210 component_loader_.LoadAll(); | 221 component_loader_.LoadAll(); |
| 211 unsigned int default_count = extension_service_.extensions()->size(); | 222 unsigned int default_count = extension_service_.extensions()->size(); |
| 212 | 223 |
| 213 // Clear the list of loaded extensions, and reload with one more. | 224 // Clear the list of loaded extensions, and reload with one more. |
| 214 extension_service_.clear_extensions(); | 225 extension_service_.clear_extensions(); |
| 215 component_loader_.Add(manifest_contents_, extension_path_); | 226 component_loader_.Add(manifest_contents_, extension_path_); |
| 216 component_loader_.LoadAll(); | 227 component_loader_.LoadAll(); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 236 component_loader_.AddDefaultComponentExtensions(); | 247 component_loader_.AddDefaultComponentExtensions(); |
| 237 component_loader_.LoadAll(); | 248 component_loader_.LoadAll(); |
| 238 ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); | 249 ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); |
| 239 | 250 |
| 240 // Number of loaded extensions should be the same after changing the pref. | 251 // Number of loaded extensions should be the same after changing the pref. |
| 241 prefs_.SetUserPref(prefs::kEnterpriseWebStoreURL, | 252 prefs_.SetUserPref(prefs::kEnterpriseWebStoreURL, |
| 242 Value::CreateStringValue("http://www.google.de")); | 253 Value::CreateStringValue("http://www.google.de")); |
| 243 ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); | 254 ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); |
| 244 } | 255 } |
| 245 | 256 |
| 257 TEST_F(ComponentLoaderTest, AddOrReplace) { |
| 258 ASSERT_EQ(0u, component_loader_.registered_extensions_count()); |
| 259 component_loader_.AddDefaultComponentExtensions(); |
| 260 size_t const default_count = component_loader_.registered_extensions_count(); |
| 261 FilePath known_extension = GetBasePath() |
| 262 .AppendASCII("override_component_extension"); |
| 263 FilePath unknow_extension = extension_path_; |
| 264 |
| 265 // Replace a default component extension. |
| 266 component_loader_.AddOrReplace(known_extension); |
| 267 ASSERT_EQ(default_count, |
| 268 component_loader_.registered_extensions_count()); |
| 269 |
| 270 // Add a new component extension. |
| 271 component_loader_.AddOrReplace(unknow_extension); |
| 272 ASSERT_EQ(default_count + 1, |
| 273 component_loader_.registered_extensions_count()); |
| 274 |
| 275 extension_service_.set_ready(true); |
| 276 component_loader_.LoadAll(); |
| 277 |
| 278 ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); |
| 279 ASSERT_EQ(0u, extension_service_.unloaded_count()); |
| 280 |
| 281 // replace loaded component extension. |
| 282 component_loader_.AddOrReplace(known_extension); |
| 283 ASSERT_EQ(default_count + 1, extension_service_.extensions()->size()); |
| 284 ASSERT_EQ(1u, extension_service_.unloaded_count()); |
| 285 } |
| 286 |
| 246 } // namespace extensions | 287 } // namespace extensions |
| OLD | NEW |