| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/shared_module_service.h" | 5 #include "chrome/browser/extensions/shared_module_service.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 // |import_id|. | 31 // |import_id|. |
| 32 scoped_refptr<Extension> CreateExtensionImportingModule( | 32 scoped_refptr<Extension> CreateExtensionImportingModule( |
| 33 const std::string& import_id, | 33 const std::string& import_id, |
| 34 const std::string& id, | 34 const std::string& id, |
| 35 const std::string& version) { | 35 const std::string& version) { |
| 36 DictionaryBuilder builder; | 36 DictionaryBuilder builder; |
| 37 builder.Set("name", "Has Dependent Modules") | 37 builder.Set("name", "Has Dependent Modules") |
| 38 .Set("version", version) | 38 .Set("version", version) |
| 39 .Set("manifest_version", 2); | 39 .Set("manifest_version", 2); |
| 40 if (!import_id.empty()) { | 40 if (!import_id.empty()) { |
| 41 builder.Set("import", std::move(ListBuilder().Append(std::move( | 41 builder.Set("import", |
| 42 DictionaryBuilder().Set("id", import_id))))); | 42 ListBuilder() |
| 43 .Append(DictionaryBuilder().Set("id", import_id).Build()) |
| 44 .Build()); |
| 43 } | 45 } |
| 44 scoped_ptr<base::DictionaryValue> manifest = builder.Build(); | 46 scoped_ptr<base::DictionaryValue> manifest = builder.Build(); |
| 45 | 47 |
| 46 return ExtensionBuilder() | 48 return ExtensionBuilder() |
| 47 .SetManifest(std::move(manifest)) | 49 .SetManifest(std::move(manifest)) |
| 48 .AddFlags(Extension::FROM_WEBSTORE) | 50 .AddFlags(Extension::FROM_WEBSTORE) |
| 49 .SetID(id) | 51 .SetID(id) |
| 50 .Build(); | 52 .Build(); |
| 51 } | 53 } |
| 52 | 54 |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 } | 126 } |
| 125 | 127 |
| 126 TEST_F(SharedModuleServiceUnitTest, PruneSharedModulesOnUninstall) { | 128 TEST_F(SharedModuleServiceUnitTest, PruneSharedModulesOnUninstall) { |
| 127 // Create a module which exports a resource, and install it. | 129 // Create a module which exports a resource, and install it. |
| 128 scoped_ptr<base::DictionaryValue> manifest = | 130 scoped_ptr<base::DictionaryValue> manifest = |
| 129 DictionaryBuilder() | 131 DictionaryBuilder() |
| 130 .Set("name", "Shared Module") | 132 .Set("name", "Shared Module") |
| 131 .Set("version", "1.0") | 133 .Set("version", "1.0") |
| 132 .Set("manifest_version", 2) | 134 .Set("manifest_version", 2) |
| 133 .Set("export", | 135 .Set("export", |
| 134 std::move(DictionaryBuilder().Set( | 136 DictionaryBuilder() |
| 135 "resources", std::move(ListBuilder().Append("foo.js"))))) | 137 .Set("resources", ListBuilder().Append("foo.js").Build()) |
| 138 .Build()) |
| 136 .Build(); | 139 .Build(); |
| 137 scoped_refptr<Extension> shared_module = | 140 scoped_refptr<Extension> shared_module = |
| 138 ExtensionBuilder() | 141 ExtensionBuilder() |
| 139 .SetManifest(std::move(manifest)) | 142 .SetManifest(std::move(manifest)) |
| 140 .AddFlags(Extension::FROM_WEBSTORE) | 143 .AddFlags(Extension::FROM_WEBSTORE) |
| 141 .SetID(crx_file::id_util::GenerateId("shared_module")) | 144 .SetID(crx_file::id_util::GenerateId("shared_module")) |
| 142 .Build(); | 145 .Build(); |
| 143 | 146 |
| 144 EXPECT_TRUE(InstallExtension(shared_module.get(), false)); | 147 EXPECT_TRUE(InstallExtension(shared_module.get(), false)); |
| 145 | 148 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 165 } | 168 } |
| 166 | 169 |
| 167 TEST_F(SharedModuleServiceUnitTest, PruneSharedModulesOnUpdate) { | 170 TEST_F(SharedModuleServiceUnitTest, PruneSharedModulesOnUpdate) { |
| 168 // Create two modules which export a resource, and install them. | 171 // Create two modules which export a resource, and install them. |
| 169 scoped_ptr<base::DictionaryValue> manifest_1 = | 172 scoped_ptr<base::DictionaryValue> manifest_1 = |
| 170 DictionaryBuilder() | 173 DictionaryBuilder() |
| 171 .Set("name", "Shared Module 1") | 174 .Set("name", "Shared Module 1") |
| 172 .Set("version", "1.0") | 175 .Set("version", "1.0") |
| 173 .Set("manifest_version", 2) | 176 .Set("manifest_version", 2) |
| 174 .Set("export", | 177 .Set("export", |
| 175 std::move(DictionaryBuilder().Set( | 178 DictionaryBuilder() |
| 176 "resources", std::move(ListBuilder().Append("foo.js"))))) | 179 .Set("resources", ListBuilder().Append("foo.js").Build()) |
| 180 .Build()) |
| 177 .Build(); | 181 .Build(); |
| 178 scoped_refptr<Extension> shared_module_1 = | 182 scoped_refptr<Extension> shared_module_1 = |
| 179 ExtensionBuilder() | 183 ExtensionBuilder() |
| 180 .SetManifest(std::move(manifest_1)) | 184 .SetManifest(std::move(manifest_1)) |
| 181 .AddFlags(Extension::FROM_WEBSTORE) | 185 .AddFlags(Extension::FROM_WEBSTORE) |
| 182 .SetID(crx_file::id_util::GenerateId("shared_module_1")) | 186 .SetID(crx_file::id_util::GenerateId("shared_module_1")) |
| 183 .Build(); | 187 .Build(); |
| 184 EXPECT_TRUE(InstallExtension(shared_module_1.get(), false)); | 188 EXPECT_TRUE(InstallExtension(shared_module_1.get(), false)); |
| 185 | 189 |
| 186 scoped_ptr<base::DictionaryValue> manifest_2 = | 190 scoped_ptr<base::DictionaryValue> manifest_2 = |
| 187 DictionaryBuilder() | 191 DictionaryBuilder() |
| 188 .Set("name", "Shared Module 2") | 192 .Set("name", "Shared Module 2") |
| 189 .Set("version", "1.0") | 193 .Set("version", "1.0") |
| 190 .Set("manifest_version", 2) | 194 .Set("manifest_version", 2) |
| 191 .Set("export", | 195 .Set("export", |
| 192 std::move(DictionaryBuilder().Set( | 196 DictionaryBuilder() |
| 193 "resources", std::move(ListBuilder().Append("foo.js"))))) | 197 .Set("resources", ListBuilder().Append("foo.js").Build()) |
| 198 .Build()) |
| 194 .Build(); | 199 .Build(); |
| 195 scoped_refptr<Extension> shared_module_2 = | 200 scoped_refptr<Extension> shared_module_2 = |
| 196 ExtensionBuilder() | 201 ExtensionBuilder() |
| 197 .SetManifest(std::move(manifest_2)) | 202 .SetManifest(std::move(manifest_2)) |
| 198 .AddFlags(Extension::FROM_WEBSTORE) | 203 .AddFlags(Extension::FROM_WEBSTORE) |
| 199 .SetID(crx_file::id_util::GenerateId("shared_module_2")) | 204 .SetID(crx_file::id_util::GenerateId("shared_module_2")) |
| 200 .Build(); | 205 .Build(); |
| 201 EXPECT_TRUE(InstallExtension(shared_module_2.get(), false)); | 206 EXPECT_TRUE(InstallExtension(shared_module_2.get(), false)); |
| 202 | 207 |
| 203 std::string extension_id = crx_file::id_util::GenerateId("extension_id"); | 208 std::string extension_id = crx_file::id_util::GenerateId("extension_id"); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 std::string whitelisted_id = crx_file::id_util::GenerateId("whitelisted"); | 248 std::string whitelisted_id = crx_file::id_util::GenerateId("whitelisted"); |
| 244 std::string nonwhitelisted_id = | 249 std::string nonwhitelisted_id = |
| 245 crx_file::id_util::GenerateId("nonwhitelisted"); | 250 crx_file::id_util::GenerateId("nonwhitelisted"); |
| 246 // Create a module which exports to a restricted whitelist. | 251 // Create a module which exports to a restricted whitelist. |
| 247 scoped_ptr<base::DictionaryValue> manifest = | 252 scoped_ptr<base::DictionaryValue> manifest = |
| 248 DictionaryBuilder() | 253 DictionaryBuilder() |
| 249 .Set("name", "Shared Module") | 254 .Set("name", "Shared Module") |
| 250 .Set("version", "1.0") | 255 .Set("version", "1.0") |
| 251 .Set("manifest_version", 2) | 256 .Set("manifest_version", 2) |
| 252 .Set("export", | 257 .Set("export", |
| 253 std::move( | 258 DictionaryBuilder() |
| 254 DictionaryBuilder() | 259 .Set("whitelist", |
| 255 .Set("whitelist", | 260 ListBuilder().Append(whitelisted_id).Build()) |
| 256 std::move(ListBuilder().Append(whitelisted_id))) | 261 .Set("resources", ListBuilder().Append("*").Build()) |
| 257 .Set("resources", std::move(ListBuilder().Append("*"))))) | 262 .Build()) |
| 258 .Build(); | 263 .Build(); |
| 259 scoped_refptr<Extension> shared_module = | 264 scoped_refptr<Extension> shared_module = |
| 260 ExtensionBuilder() | 265 ExtensionBuilder() |
| 261 .SetManifest(std::move(manifest)) | 266 .SetManifest(std::move(manifest)) |
| 262 .AddFlags(Extension::FROM_WEBSTORE) | 267 .AddFlags(Extension::FROM_WEBSTORE) |
| 263 .SetID(crx_file::id_util::GenerateId("shared_module")) | 268 .SetID(crx_file::id_util::GenerateId("shared_module")) |
| 264 .Build(); | 269 .Build(); |
| 265 | 270 |
| 266 EXPECT_TRUE(InstallExtension(shared_module.get(), false)); | 271 EXPECT_TRUE(InstallExtension(shared_module.get(), false)); |
| 267 | 272 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 278 nonwhitelisted_id, | 283 nonwhitelisted_id, |
| 279 "1.0"); | 284 "1.0"); |
| 280 // This should succeed because only CRX installer (and by extension the | 285 // This should succeed because only CRX installer (and by extension the |
| 281 // WebStore Installer) checks the shared module whitelist. InstallExtension | 286 // WebStore Installer) checks the shared module whitelist. InstallExtension |
| 282 // bypasses the whitelist check because the SharedModuleService does not | 287 // bypasses the whitelist check because the SharedModuleService does not |
| 283 // care about whitelists. | 288 // care about whitelists. |
| 284 EXPECT_TRUE(InstallExtension(nonwhitelisted_extension.get(), false)); | 289 EXPECT_TRUE(InstallExtension(nonwhitelisted_extension.get(), false)); |
| 285 } | 290 } |
| 286 | 291 |
| 287 } // namespace extensions | 292 } // namespace extensions |
| OLD | NEW |