| 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 25 matching lines...) Expand all Loading... |
| 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", std::move(ListBuilder().Append(std::move( |
| 42 DictionaryBuilder().Set("id", import_id))))); | 42 DictionaryBuilder().Set("id", import_id))))); |
| 43 } | 43 } |
| 44 scoped_ptr<base::DictionaryValue> manifest = builder.Build(); | 44 scoped_ptr<base::DictionaryValue> manifest = builder.Build(); |
| 45 | 45 |
| 46 return ExtensionBuilder().SetManifest(manifest.Pass()) | 46 return ExtensionBuilder() |
| 47 .AddFlags(Extension::FROM_WEBSTORE) | 47 .SetManifest(std::move(manifest)) |
| 48 .SetID(id) | 48 .AddFlags(Extension::FROM_WEBSTORE) |
| 49 .Build(); | 49 .SetID(id) |
| 50 .Build(); |
| 50 } | 51 } |
| 51 | 52 |
| 52 } // namespace | 53 } // namespace |
| 53 | 54 |
| 54 class SharedModuleServiceUnitTest : public ExtensionServiceTestBase { | 55 class SharedModuleServiceUnitTest : public ExtensionServiceTestBase { |
| 55 public: | 56 public: |
| 56 SharedModuleServiceUnitTest() : | 57 SharedModuleServiceUnitTest() : |
| 57 // The "export" key is open for dev-channel only, but unit tests | 58 // The "export" key is open for dev-channel only, but unit tests |
| 58 // run as stable channel on the official Windows build. | 59 // run as stable channel on the official Windows build. |
| 59 current_channel_(version_info::Channel::UNKNOWN) {} | 60 current_channel_(version_info::Channel::UNKNOWN) {} |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 DictionaryBuilder() | 129 DictionaryBuilder() |
| 129 .Set("name", "Shared Module") | 130 .Set("name", "Shared Module") |
| 130 .Set("version", "1.0") | 131 .Set("version", "1.0") |
| 131 .Set("manifest_version", 2) | 132 .Set("manifest_version", 2) |
| 132 .Set("export", | 133 .Set("export", |
| 133 std::move(DictionaryBuilder().Set( | 134 std::move(DictionaryBuilder().Set( |
| 134 "resources", std::move(ListBuilder().Append("foo.js"))))) | 135 "resources", std::move(ListBuilder().Append("foo.js"))))) |
| 135 .Build(); | 136 .Build(); |
| 136 scoped_refptr<Extension> shared_module = | 137 scoped_refptr<Extension> shared_module = |
| 137 ExtensionBuilder() | 138 ExtensionBuilder() |
| 138 .SetManifest(manifest.Pass()) | 139 .SetManifest(std::move(manifest)) |
| 139 .AddFlags(Extension::FROM_WEBSTORE) | 140 .AddFlags(Extension::FROM_WEBSTORE) |
| 140 .SetID(crx_file::id_util::GenerateId("shared_module")) | 141 .SetID(crx_file::id_util::GenerateId("shared_module")) |
| 141 .Build(); | 142 .Build(); |
| 142 | 143 |
| 143 EXPECT_TRUE(InstallExtension(shared_module.get(), false)); | 144 EXPECT_TRUE(InstallExtension(shared_module.get(), false)); |
| 144 | 145 |
| 145 std::string extension_id = crx_file::id_util::GenerateId("extension_id"); | 146 std::string extension_id = crx_file::id_util::GenerateId("extension_id"); |
| 146 // Create and install an extension that imports our new module. | 147 // Create and install an extension that imports our new module. |
| 147 scoped_refptr<Extension> importing_extension = | 148 scoped_refptr<Extension> importing_extension = |
| 148 CreateExtensionImportingModule(shared_module->id(), extension_id, "1.0"); | 149 CreateExtensionImportingModule(shared_module->id(), extension_id, "1.0"); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 169 DictionaryBuilder() | 170 DictionaryBuilder() |
| 170 .Set("name", "Shared Module 1") | 171 .Set("name", "Shared Module 1") |
| 171 .Set("version", "1.0") | 172 .Set("version", "1.0") |
| 172 .Set("manifest_version", 2) | 173 .Set("manifest_version", 2) |
| 173 .Set("export", | 174 .Set("export", |
| 174 std::move(DictionaryBuilder().Set( | 175 std::move(DictionaryBuilder().Set( |
| 175 "resources", std::move(ListBuilder().Append("foo.js"))))) | 176 "resources", std::move(ListBuilder().Append("foo.js"))))) |
| 176 .Build(); | 177 .Build(); |
| 177 scoped_refptr<Extension> shared_module_1 = | 178 scoped_refptr<Extension> shared_module_1 = |
| 178 ExtensionBuilder() | 179 ExtensionBuilder() |
| 179 .SetManifest(manifest_1.Pass()) | 180 .SetManifest(std::move(manifest_1)) |
| 180 .AddFlags(Extension::FROM_WEBSTORE) | 181 .AddFlags(Extension::FROM_WEBSTORE) |
| 181 .SetID(crx_file::id_util::GenerateId("shared_module_1")) | 182 .SetID(crx_file::id_util::GenerateId("shared_module_1")) |
| 182 .Build(); | 183 .Build(); |
| 183 EXPECT_TRUE(InstallExtension(shared_module_1.get(), false)); | 184 EXPECT_TRUE(InstallExtension(shared_module_1.get(), false)); |
| 184 | 185 |
| 185 scoped_ptr<base::DictionaryValue> manifest_2 = | 186 scoped_ptr<base::DictionaryValue> manifest_2 = |
| 186 DictionaryBuilder() | 187 DictionaryBuilder() |
| 187 .Set("name", "Shared Module 2") | 188 .Set("name", "Shared Module 2") |
| 188 .Set("version", "1.0") | 189 .Set("version", "1.0") |
| 189 .Set("manifest_version", 2) | 190 .Set("manifest_version", 2) |
| 190 .Set("export", | 191 .Set("export", |
| 191 std::move(DictionaryBuilder().Set( | 192 std::move(DictionaryBuilder().Set( |
| 192 "resources", std::move(ListBuilder().Append("foo.js"))))) | 193 "resources", std::move(ListBuilder().Append("foo.js"))))) |
| 193 .Build(); | 194 .Build(); |
| 194 scoped_refptr<Extension> shared_module_2 = | 195 scoped_refptr<Extension> shared_module_2 = |
| 195 ExtensionBuilder() | 196 ExtensionBuilder() |
| 196 .SetManifest(manifest_2.Pass()) | 197 .SetManifest(std::move(manifest_2)) |
| 197 .AddFlags(Extension::FROM_WEBSTORE) | 198 .AddFlags(Extension::FROM_WEBSTORE) |
| 198 .SetID(crx_file::id_util::GenerateId("shared_module_2")) | 199 .SetID(crx_file::id_util::GenerateId("shared_module_2")) |
| 199 .Build(); | 200 .Build(); |
| 200 EXPECT_TRUE(InstallExtension(shared_module_2.get(), false)); | 201 EXPECT_TRUE(InstallExtension(shared_module_2.get(), false)); |
| 201 | 202 |
| 202 std::string extension_id = crx_file::id_util::GenerateId("extension_id"); | 203 std::string extension_id = crx_file::id_util::GenerateId("extension_id"); |
| 203 | 204 |
| 204 // Create and install an extension v1.0 that imports our new module 1. | 205 // Create and install an extension v1.0 that imports our new module 1. |
| 205 scoped_refptr<Extension> importing_extension_1 = | 206 scoped_refptr<Extension> importing_extension_1 = |
| 206 CreateExtensionImportingModule(shared_module_1->id(), | 207 CreateExtensionImportingModule(shared_module_1->id(), |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 .Set("manifest_version", 2) | 251 .Set("manifest_version", 2) |
| 251 .Set("export", | 252 .Set("export", |
| 252 std::move( | 253 std::move( |
| 253 DictionaryBuilder() | 254 DictionaryBuilder() |
| 254 .Set("whitelist", | 255 .Set("whitelist", |
| 255 std::move(ListBuilder().Append(whitelisted_id))) | 256 std::move(ListBuilder().Append(whitelisted_id))) |
| 256 .Set("resources", std::move(ListBuilder().Append("*"))))) | 257 .Set("resources", std::move(ListBuilder().Append("*"))))) |
| 257 .Build(); | 258 .Build(); |
| 258 scoped_refptr<Extension> shared_module = | 259 scoped_refptr<Extension> shared_module = |
| 259 ExtensionBuilder() | 260 ExtensionBuilder() |
| 260 .SetManifest(manifest.Pass()) | 261 .SetManifest(std::move(manifest)) |
| 261 .AddFlags(Extension::FROM_WEBSTORE) | 262 .AddFlags(Extension::FROM_WEBSTORE) |
| 262 .SetID(crx_file::id_util::GenerateId("shared_module")) | 263 .SetID(crx_file::id_util::GenerateId("shared_module")) |
| 263 .Build(); | 264 .Build(); |
| 264 | 265 |
| 265 EXPECT_TRUE(InstallExtension(shared_module.get(), false)); | 266 EXPECT_TRUE(InstallExtension(shared_module.get(), false)); |
| 266 | 267 |
| 267 // Create and install an extension with the whitelisted ID. | 268 // Create and install an extension with the whitelisted ID. |
| 268 scoped_refptr<Extension> whitelisted_extension = | 269 scoped_refptr<Extension> whitelisted_extension = |
| 269 CreateExtensionImportingModule(shared_module->id(), | 270 CreateExtensionImportingModule(shared_module->id(), |
| 270 whitelisted_id, | 271 whitelisted_id, |
| 271 "1.0"); | 272 "1.0"); |
| 272 EXPECT_TRUE(InstallExtension(whitelisted_extension.get(), false)); | 273 EXPECT_TRUE(InstallExtension(whitelisted_extension.get(), false)); |
| 273 | 274 |
| 274 // Try to install an extension with an ID that is not whitelisted. | 275 // Try to install an extension with an ID that is not whitelisted. |
| 275 scoped_refptr<Extension> nonwhitelisted_extension = | 276 scoped_refptr<Extension> nonwhitelisted_extension = |
| 276 CreateExtensionImportingModule(shared_module->id(), | 277 CreateExtensionImportingModule(shared_module->id(), |
| 277 nonwhitelisted_id, | 278 nonwhitelisted_id, |
| 278 "1.0"); | 279 "1.0"); |
| 279 // This should succeed because only CRX installer (and by extension the | 280 // This should succeed because only CRX installer (and by extension the |
| 280 // WebStore Installer) checks the shared module whitelist. InstallExtension | 281 // WebStore Installer) checks the shared module whitelist. InstallExtension |
| 281 // bypasses the whitelist check because the SharedModuleService does not | 282 // bypasses the whitelist check because the SharedModuleService does not |
| 282 // care about whitelists. | 283 // care about whitelists. |
| 283 EXPECT_TRUE(InstallExtension(nonwhitelisted_extension.get(), false)); | 284 EXPECT_TRUE(InstallExtension(nonwhitelisted_extension.get(), false)); |
| 284 } | 285 } |
| 285 | 286 |
| 286 } // namespace extensions | 287 } // namespace extensions |
| OLD | NEW |