| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "extensions/common/extension_api.h" | 5 #include "extensions/common/extension_api.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 | 32 |
| 33 namespace extensions { | 33 namespace extensions { |
| 34 | 34 |
| 35 namespace { | 35 namespace { |
| 36 | 36 |
| 37 const char* const kTestFeatures[] = { | 37 const char* const kTestFeatures[] = { |
| 38 "test1", "test2", "test3", "test4", "test5", | 38 "test1", "test2", "test3", "test4", "test5", |
| 39 "test6", "test7", "parent1", "parent2", "parent3", | 39 "test6", "test7", "parent1", "parent2", "parent3", |
| 40 }; | 40 }; |
| 41 | 41 |
| 42 const char* const kAliasTestApis[] = {"alias_api_source"}; |
| 43 |
| 42 const char* const kSessionTypeTestFeatures[] = { | 44 const char* const kSessionTypeTestFeatures[] = { |
| 43 "test1", "kiosk_only", "non_kiosk", "multiple_session_types"}; | 45 "test1", "kiosk_only", "non_kiosk", "multiple_session_types"}; |
| 44 | 46 |
| 45 struct FeatureSessionTypesTestData { | 47 struct FeatureSessionTypesTestData { |
| 46 std::string api_name; | 48 std::string api_name; |
| 47 bool expect_available; | 49 bool expect_available; |
| 48 FeatureSessionType current_session_type; | 50 FeatureSessionType current_session_type; |
| 49 }; | 51 }; |
| 50 | 52 |
| 51 class TestExtensionAPI : public ExtensionAPI { | 53 class TestExtensionAPI : public ExtensionAPI { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 ExtensionAPI* api; | 87 ExtensionAPI* api; |
| 86 bool expect_populated; | 88 bool expect_populated; |
| 87 } test_data[] = { | 89 } test_data[] = { |
| 88 { shared_instance, true }, | 90 { shared_instance, true }, |
| 89 { new_instance.get(), true }, | 91 { new_instance.get(), true }, |
| 90 { &empty_instance, false } | 92 { &empty_instance, false } |
| 91 }; | 93 }; |
| 92 | 94 |
| 93 for (size_t i = 0; i < arraysize(test_data); ++i) { | 95 for (size_t i = 0; i < arraysize(test_data); ++i) { |
| 94 EXPECT_EQ(test_data[i].expect_populated, | 96 EXPECT_EQ(test_data[i].expect_populated, |
| 95 test_data[i].api->GetSchema("bookmarks.create") != NULL); | 97 test_data[i].api->GetSchema("bookmarks.create") != nullptr); |
| 96 } | 98 } |
| 97 } | 99 } |
| 98 | 100 |
| 99 TEST(ExtensionAPITest, SplitDependencyName) { | 101 TEST(ExtensionAPITest, SplitDependencyName) { |
| 100 struct { | 102 struct { |
| 101 std::string input; | 103 std::string input; |
| 102 std::string expected_feature_type; | 104 std::string expected_feature_type; |
| 103 std::string expected_feature_name; | 105 std::string expected_feature_name; |
| 104 } test_data[] = {{"", "api", ""}, // assumes "api" when no type is present | 106 } test_data[] = {{"", "api", ""}, // assumes "api" when no type is present |
| 105 {"foo", "api", "foo"}, | 107 {"foo", "api", "foo"}, |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 UnittestFeatureProvider api_feature_provider; | 197 UnittestFeatureProvider api_feature_provider; |
| 196 | 198 |
| 197 for (size_t i = 0; i < arraysize(test_data); ++i) { | 199 for (size_t i = 0; i < arraysize(test_data); ++i) { |
| 198 TestExtensionAPI api; | 200 TestExtensionAPI api; |
| 199 api.RegisterDependencyProvider("api", &api_feature_provider); | 201 api.RegisterDependencyProvider("api", &api_feature_provider); |
| 200 for (const auto& key : kTestFeatures) | 202 for (const auto& key : kTestFeatures) |
| 201 api.add_fake_schema(key); | 203 api.add_fake_schema(key); |
| 202 ExtensionAPI::OverrideSharedInstanceForTest scope(&api); | 204 ExtensionAPI::OverrideSharedInstanceForTest scope(&api); |
| 203 | 205 |
| 204 bool expected = test_data[i].expect_is_available; | 206 bool expected = test_data[i].expect_is_available; |
| 205 Feature::Availability availability = | 207 Feature::Availability availability = api.IsAvailable( |
| 206 api.IsAvailable(test_data[i].api_full_name, | 208 test_data[i].api_full_name, nullptr, test_data[i].context, |
| 207 NULL, | 209 test_data[i].url, CheckAliasStatus::NOT_ALLOWED); |
| 208 test_data[i].context, | |
| 209 test_data[i].url); | |
| 210 EXPECT_EQ(expected, availability.is_available()) | 210 EXPECT_EQ(expected, availability.is_available()) |
| 211 << base::StringPrintf("Test %d: Feature '%s' was %s: %s", | 211 << base::StringPrintf("Test %d: Feature '%s' was %s: %s", |
| 212 static_cast<int>(i), | 212 static_cast<int>(i), |
| 213 test_data[i].api_full_name.c_str(), | 213 test_data[i].api_full_name.c_str(), |
| 214 expected ? "not available" : "available", | 214 expected ? "not available" : "available", |
| 215 availability.message().c_str()); | 215 availability.message().c_str()); |
| 216 } | 216 } |
| 217 } | 217 } |
| 218 | 218 |
| 219 TEST(ExtensionAPITest, APIFeaturesAlias) { |
| 220 UnittestFeatureProvider api_feature_provider; |
| 221 |
| 222 TestExtensionAPI api; |
| 223 api.RegisterDependencyProvider("api", &api_feature_provider); |
| 224 for (const auto& key : kAliasTestApis) |
| 225 api.add_fake_schema(key); |
| 226 ExtensionAPI::OverrideSharedInstanceForTest scope(&api); |
| 227 |
| 228 ASSERT_FALSE(api.IsAvailable("alias_api_source", nullptr, |
| 229 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), |
| 230 CheckAliasStatus::NOT_ALLOWED) |
| 231 .is_available()); |
| 232 ASSERT_TRUE(api.IsAvailable("alias_api_source", nullptr, |
| 233 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), |
| 234 CheckAliasStatus::ALLOWED) |
| 235 .is_available()); |
| 236 ASSERT_TRUE(api.IsAvailable("alias_api_source.bar", nullptr, |
| 237 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), |
| 238 CheckAliasStatus::ALLOWED) |
| 239 .is_available()); |
| 240 ASSERT_FALSE(api.IsAvailable("alias_api_source.foo", nullptr, |
| 241 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), |
| 242 CheckAliasStatus::ALLOWED) |
| 243 .is_available()); |
| 244 |
| 245 scoped_refptr<const Extension> extension = |
| 246 ExtensionBuilder() |
| 247 .SetManifest(DictionaryBuilder() |
| 248 .Set("name", "extension") |
| 249 .Set("version", "1") |
| 250 .Set("manifest_version", 2) |
| 251 .Build()) |
| 252 .Build(); |
| 253 Feature* test_feature = api_feature_provider.GetFeature("alias_api_source"); |
| 254 ASSERT_TRUE(test_feature); |
| 255 ASSERT_FALSE(api.IsAnyFeatureAvailableToContext( |
| 256 *test_feature, extension.get(), Feature::UNBLESSED_EXTENSION_CONTEXT, |
| 257 GURL(), CheckAliasStatus::NOT_ALLOWED)); |
| 258 EXPECT_TRUE(api.IsAnyFeatureAvailableToContext( |
| 259 *test_feature, extension.get(), Feature::UNBLESSED_EXTENSION_CONTEXT, |
| 260 GURL(), CheckAliasStatus::ALLOWED)); |
| 261 } |
| 262 |
| 219 TEST(ExtensionAPITest, IsAnyFeatureAvailableToContext) { | 263 TEST(ExtensionAPITest, IsAnyFeatureAvailableToContext) { |
| 220 scoped_refptr<const Extension> app = | 264 scoped_refptr<const Extension> app = |
| 221 ExtensionBuilder() | 265 ExtensionBuilder() |
| 222 .SetManifest( | 266 .SetManifest( |
| 223 DictionaryBuilder() | 267 DictionaryBuilder() |
| 224 .Set("name", "app") | 268 .Set("name", "app") |
| 225 .Set("app", | 269 .Set("app", |
| 226 DictionaryBuilder() | 270 DictionaryBuilder() |
| 227 .Set("background", | 271 .Set("background", |
| 228 DictionaryBuilder() | 272 DictionaryBuilder() |
| (...skipping 15 matching lines...) Expand all Loading... |
| 244 .Build()) | 288 .Build()) |
| 245 .Build(); | 289 .Build(); |
| 246 | 290 |
| 247 struct { | 291 struct { |
| 248 std::string api_full_name; | 292 std::string api_full_name; |
| 249 bool expect_is_available; | 293 bool expect_is_available; |
| 250 Feature::Context context; | 294 Feature::Context context; |
| 251 const Extension* extension; | 295 const Extension* extension; |
| 252 GURL url; | 296 GURL url; |
| 253 } test_data[] = { | 297 } test_data[] = { |
| 254 { "test1", false, Feature::WEB_PAGE_CONTEXT, NULL, GURL() }, | 298 {"test1", false, Feature::WEB_PAGE_CONTEXT, nullptr, GURL()}, |
| 255 { "test1", true, Feature::UNBLESSED_EXTENSION_CONTEXT, NULL, GURL() }, | 299 {"test1", true, Feature::UNBLESSED_EXTENSION_CONTEXT, nullptr, GURL()}, |
| 256 { "test1", false, Feature::UNBLESSED_EXTENSION_CONTEXT, app.get(), GURL() }, | 300 {"test1", false, Feature::UNBLESSED_EXTENSION_CONTEXT, app.get(), GURL()}, |
| 257 { "test1", true, Feature::UNBLESSED_EXTENSION_CONTEXT, extension.get(), | 301 {"test1", true, Feature::UNBLESSED_EXTENSION_CONTEXT, extension.get(), |
| 258 GURL() }, | 302 GURL()}, |
| 259 { "test2", true, Feature::CONTENT_SCRIPT_CONTEXT, NULL, GURL() }, | 303 {"test2", true, Feature::CONTENT_SCRIPT_CONTEXT, nullptr, GURL()}, |
| 260 { "test2", true, Feature::WEB_PAGE_CONTEXT, NULL, | 304 {"test2", true, Feature::WEB_PAGE_CONTEXT, nullptr, |
| 261 GURL("http://google.com") }, | 305 GURL("http://google.com")}, |
| 262 { "test2.foo", false, Feature::WEB_PAGE_CONTEXT, NULL, | 306 {"test2.foo", false, Feature::WEB_PAGE_CONTEXT, nullptr, |
| 263 GURL("http://google.com") }, | 307 GURL("http://google.com")}, |
| 264 { "test3", true, Feature::CONTENT_SCRIPT_CONTEXT, NULL, GURL() }, | 308 {"test3", true, Feature::CONTENT_SCRIPT_CONTEXT, nullptr, GURL()}, |
| 265 { "test3", true, Feature::WEB_PAGE_CONTEXT, NULL, GURL("http://foo.com") }, | 309 {"test3", true, Feature::WEB_PAGE_CONTEXT, nullptr, |
| 266 { "test4.foo", true, Feature::CONTENT_SCRIPT_CONTEXT, NULL, GURL() }, | 310 GURL("http://foo.com")}, |
| 267 { "test7", false, Feature::WEB_PAGE_CONTEXT, NULL, | 311 {"test4.foo", true, Feature::CONTENT_SCRIPT_CONTEXT, nullptr, GURL()}, |
| 268 GURL("http://google.com") }, | 312 {"test7", false, Feature::WEB_PAGE_CONTEXT, nullptr, |
| 269 { "test7", true, Feature::WEB_PAGE_CONTEXT, NULL, GURL("http://foo.com") }, | 313 GURL("http://google.com")}, |
| 270 { "test7", false, Feature::WEB_PAGE_CONTEXT, NULL, GURL("http://bar.com") } | 314 {"test7", true, Feature::WEB_PAGE_CONTEXT, nullptr, |
| 271 }; | 315 GURL("http://foo.com")}, |
| 316 {"test7", false, Feature::WEB_PAGE_CONTEXT, nullptr, |
| 317 GURL("http://bar.com")}}; |
| 272 | 318 |
| 273 UnittestFeatureProvider api_feature_provider; | 319 UnittestFeatureProvider api_feature_provider; |
| 274 | 320 |
| 275 for (size_t i = 0; i < arraysize(test_data); ++i) { | 321 for (size_t i = 0; i < arraysize(test_data); ++i) { |
| 276 TestExtensionAPI api; | 322 TestExtensionAPI api; |
| 277 api.RegisterDependencyProvider("api", &api_feature_provider); | 323 api.RegisterDependencyProvider("api", &api_feature_provider); |
| 278 for (const auto& key : kTestFeatures) | 324 for (const auto& key : kTestFeatures) |
| 279 api.add_fake_schema(key); | 325 api.add_fake_schema(key); |
| 280 ExtensionAPI::OverrideSharedInstanceForTest scope(&api); | 326 ExtensionAPI::OverrideSharedInstanceForTest scope(&api); |
| 281 | 327 |
| 282 Feature* test_feature = | 328 Feature* test_feature = |
| 283 api_feature_provider.GetFeature(test_data[i].api_full_name); | 329 api_feature_provider.GetFeature(test_data[i].api_full_name); |
| 284 ASSERT_TRUE(test_feature); | 330 ASSERT_TRUE(test_feature); |
| 285 EXPECT_EQ(test_data[i].expect_is_available, | 331 EXPECT_EQ(test_data[i].expect_is_available, |
| 286 api.IsAnyFeatureAvailableToContext(*test_feature, | 332 api.IsAnyFeatureAvailableToContext( |
| 287 test_data[i].extension, | 333 *test_feature, test_data[i].extension, test_data[i].context, |
| 288 test_data[i].context, | 334 test_data[i].url, CheckAliasStatus::NOT_ALLOWED)) |
| 289 test_data[i].url)) | |
| 290 << i; | 335 << i; |
| 291 } | 336 } |
| 292 } | 337 } |
| 293 | 338 |
| 294 TEST(ExtensionAPITest, SessionTypeFeature) { | 339 TEST(ExtensionAPITest, SessionTypeFeature) { |
| 295 const std::vector<FeatureSessionTypesTestData> kTestData( | 340 const std::vector<FeatureSessionTypesTestData> kTestData( |
| 296 {{"kiosk_only", true, FeatureSessionType::KIOSK}, | 341 {{"kiosk_only", true, FeatureSessionType::KIOSK}, |
| 297 {"kiosk_only", false, FeatureSessionType::REGULAR}, | 342 {"kiosk_only", false, FeatureSessionType::REGULAR}, |
| 298 {"kiosk_only", false, FeatureSessionType::UNKNOWN}, | 343 {"kiosk_only", false, FeatureSessionType::UNKNOWN}, |
| 299 {"non_kiosk", false, FeatureSessionType::KIOSK}, | 344 {"non_kiosk", false, FeatureSessionType::KIOSK}, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 312 TestExtensionAPI api; | 357 TestExtensionAPI api; |
| 313 api.RegisterDependencyProvider("api", &api_feature_provider); | 358 api.RegisterDependencyProvider("api", &api_feature_provider); |
| 314 for (const auto& key : kSessionTypeTestFeatures) | 359 for (const auto& key : kSessionTypeTestFeatures) |
| 315 api.add_fake_schema(key); | 360 api.add_fake_schema(key); |
| 316 ExtensionAPI::OverrideSharedInstanceForTest scope(&api); | 361 ExtensionAPI::OverrideSharedInstanceForTest scope(&api); |
| 317 | 362 |
| 318 std::unique_ptr<base::AutoReset<FeatureSessionType>> current_session( | 363 std::unique_ptr<base::AutoReset<FeatureSessionType>> current_session( |
| 319 ScopedCurrentFeatureSessionType(test.current_session_type)); | 364 ScopedCurrentFeatureSessionType(test.current_session_type)); |
| 320 EXPECT_EQ(test.expect_available, | 365 EXPECT_EQ(test.expect_available, |
| 321 api.IsAvailable(test.api_name, nullptr, | 366 api.IsAvailable(test.api_name, nullptr, |
| 322 Feature::BLESSED_EXTENSION_CONTEXT, GURL()) | 367 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 368 CheckAliasStatus::NOT_ALLOWED) |
| 323 .is_available()) | 369 .is_available()) |
| 324 << "Test case (" << test.api_name << ", " | 370 << "Test case (" << test.api_name << ", " |
| 325 << static_cast<int>(test.current_session_type) << ")."; | 371 << static_cast<int>(test.current_session_type) << ")."; |
| 326 } | 372 } |
| 327 } | 373 } |
| 328 | 374 |
| 329 TEST(ExtensionAPITest, LazyGetSchema) { | 375 TEST(ExtensionAPITest, LazyGetSchema) { |
| 330 std::unique_ptr<ExtensionAPI> apis( | 376 std::unique_ptr<ExtensionAPI> apis( |
| 331 ExtensionAPI::CreateWithDefaultConfiguration()); | 377 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 332 | 378 |
| 333 EXPECT_EQ(NULL, apis->GetSchema(std::string())); | 379 EXPECT_EQ(nullptr, apis->GetSchema(std::string())); |
| 334 EXPECT_EQ(NULL, apis->GetSchema(std::string())); | 380 EXPECT_EQ(nullptr, apis->GetSchema(std::string())); |
| 335 EXPECT_EQ(NULL, apis->GetSchema("experimental")); | 381 EXPECT_EQ(nullptr, apis->GetSchema("experimental")); |
| 336 EXPECT_EQ(NULL, apis->GetSchema("experimental")); | 382 EXPECT_EQ(nullptr, apis->GetSchema("experimental")); |
| 337 EXPECT_EQ(NULL, apis->GetSchema("foo")); | 383 EXPECT_EQ(nullptr, apis->GetSchema("foo")); |
| 338 EXPECT_EQ(NULL, apis->GetSchema("foo")); | 384 EXPECT_EQ(nullptr, apis->GetSchema("foo")); |
| 339 | 385 |
| 340 EXPECT_TRUE(apis->GetSchema("dns")); | 386 EXPECT_TRUE(apis->GetSchema("dns")); |
| 341 EXPECT_TRUE(apis->GetSchema("dns")); | 387 EXPECT_TRUE(apis->GetSchema("dns")); |
| 342 EXPECT_TRUE(apis->GetSchema("extension")); | 388 EXPECT_TRUE(apis->GetSchema("extension")); |
| 343 EXPECT_TRUE(apis->GetSchema("extension")); | 389 EXPECT_TRUE(apis->GetSchema("extension")); |
| 344 EXPECT_TRUE(apis->GetSchema("omnibox")); | 390 EXPECT_TRUE(apis->GetSchema("omnibox")); |
| 345 EXPECT_TRUE(apis->GetSchema("omnibox")); | 391 EXPECT_TRUE(apis->GetSchema("omnibox")); |
| 346 EXPECT_TRUE(apis->GetSchema("storage")); | 392 EXPECT_TRUE(apis->GetSchema("storage")); |
| 347 EXPECT_TRUE(apis->GetSchema("storage")); | 393 EXPECT_TRUE(apis->GetSchema("storage")); |
| 348 } | 394 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 388 extension = CreateExtensionWithPermissions(permissions); | 434 extension = CreateExtensionWithPermissions(permissions); |
| 389 } | 435 } |
| 390 | 436 |
| 391 std::unique_ptr<ExtensionAPI> extension_api( | 437 std::unique_ptr<ExtensionAPI> extension_api( |
| 392 ExtensionAPI::CreateWithDefaultConfiguration()); | 438 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 393 | 439 |
| 394 const FeatureProvider& api_features = *FeatureProvider::GetAPIFeatures(); | 440 const FeatureProvider& api_features = *FeatureProvider::GetAPIFeatures(); |
| 395 | 441 |
| 396 // "storage" is completely unprivileged. | 442 // "storage" is completely unprivileged. |
| 397 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 443 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 398 *api_features.GetFeature("storage"), | 444 *api_features.GetFeature("storage"), nullptr, |
| 399 NULL, | 445 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 400 Feature::BLESSED_EXTENSION_CONTEXT, | 446 CheckAliasStatus::NOT_ALLOWED)); |
| 401 GURL())); | |
| 402 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 447 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 403 *api_features.GetFeature("storage"), | 448 *api_features.GetFeature("storage"), nullptr, |
| 404 NULL, | 449 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), |
| 405 Feature::UNBLESSED_EXTENSION_CONTEXT, | 450 CheckAliasStatus::NOT_ALLOWED)); |
| 406 GURL())); | |
| 407 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 451 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 408 *api_features.GetFeature("storage"), | 452 *api_features.GetFeature("storage"), nullptr, |
| 409 NULL, | 453 Feature::CONTENT_SCRIPT_CONTEXT, GURL(), CheckAliasStatus::NOT_ALLOWED)); |
| 410 Feature::CONTENT_SCRIPT_CONTEXT, | |
| 411 GURL())); | |
| 412 | 454 |
| 413 // "extension" is partially unprivileged. | 455 // "extension" is partially unprivileged. |
| 414 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 456 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 415 *api_features.GetFeature("extension"), | 457 *api_features.GetFeature("extension"), nullptr, |
| 416 NULL, | 458 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 417 Feature::BLESSED_EXTENSION_CONTEXT, | 459 CheckAliasStatus::NOT_ALLOWED)); |
| 418 GURL())); | |
| 419 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 460 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 420 *api_features.GetFeature("extension"), | 461 *api_features.GetFeature("extension"), nullptr, |
| 421 NULL, | 462 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), |
| 422 Feature::UNBLESSED_EXTENSION_CONTEXT, | 463 CheckAliasStatus::NOT_ALLOWED)); |
| 423 GURL())); | |
| 424 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 464 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 425 *api_features.GetFeature("extension"), | 465 *api_features.GetFeature("extension"), nullptr, |
| 426 NULL, | 466 Feature::CONTENT_SCRIPT_CONTEXT, GURL(), CheckAliasStatus::NOT_ALLOWED)); |
| 427 Feature::CONTENT_SCRIPT_CONTEXT, | |
| 428 GURL())); | |
| 429 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 467 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 430 *api_features.GetFeature("extension.getURL"), | 468 *api_features.GetFeature("extension.getURL"), nullptr, |
| 431 NULL, | 469 Feature::CONTENT_SCRIPT_CONTEXT, GURL(), CheckAliasStatus::NOT_ALLOWED)); |
| 432 Feature::CONTENT_SCRIPT_CONTEXT, | |
| 433 GURL())); | |
| 434 | 470 |
| 435 // "history" is entirely privileged. | 471 // "history" is entirely privileged. |
| 436 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 472 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 437 *api_features.GetFeature("history"), | 473 *api_features.GetFeature("history"), nullptr, |
| 438 NULL, | 474 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 439 Feature::BLESSED_EXTENSION_CONTEXT, | 475 CheckAliasStatus::NOT_ALLOWED)); |
| 440 GURL())); | |
| 441 EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext( | 476 EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext( |
| 442 *api_features.GetFeature("history"), | 477 *api_features.GetFeature("history"), nullptr, |
| 443 NULL, | 478 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), |
| 444 Feature::UNBLESSED_EXTENSION_CONTEXT, | 479 CheckAliasStatus::NOT_ALLOWED)); |
| 445 GURL())); | |
| 446 EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext( | 480 EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext( |
| 447 *api_features.GetFeature("history"), | 481 *api_features.GetFeature("history"), nullptr, |
| 448 NULL, | 482 Feature::CONTENT_SCRIPT_CONTEXT, GURL(), CheckAliasStatus::NOT_ALLOWED)); |
| 449 Feature::CONTENT_SCRIPT_CONTEXT, | |
| 450 GURL())); | |
| 451 } | 483 } |
| 452 | 484 |
| 453 scoped_refptr<Extension> CreateHostedApp() { | 485 scoped_refptr<Extension> CreateHostedApp() { |
| 454 base::DictionaryValue values; | 486 base::DictionaryValue values; |
| 455 values.SetString(manifest_keys::kName, "test"); | 487 values.SetString(manifest_keys::kName, "test"); |
| 456 values.SetString(manifest_keys::kVersion, "0.1"); | 488 values.SetString(manifest_keys::kVersion, "0.1"); |
| 457 values.Set(manifest_keys::kWebURLs, new base::ListValue()); | 489 values.Set(manifest_keys::kWebURLs, new base::ListValue()); |
| 458 values.SetString(manifest_keys::kLaunchWebURL, | 490 values.SetString(manifest_keys::kLaunchWebURL, |
| 459 "http://www.example.com"); | 491 "http://www.example.com"); |
| 460 std::string error; | 492 std::string error; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 497 return extension; | 529 return extension; |
| 498 } | 530 } |
| 499 | 531 |
| 500 TEST(ExtensionAPITest, HostedAppPermissions) { | 532 TEST(ExtensionAPITest, HostedAppPermissions) { |
| 501 scoped_refptr<Extension> extension = CreateHostedApp(); | 533 scoped_refptr<Extension> extension = CreateHostedApp(); |
| 502 | 534 |
| 503 std::unique_ptr<ExtensionAPI> extension_api( | 535 std::unique_ptr<ExtensionAPI> extension_api( |
| 504 ExtensionAPI::CreateWithDefaultConfiguration()); | 536 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 505 | 537 |
| 506 // "runtime" and "tabs" should not be available in hosted apps. | 538 // "runtime" and "tabs" should not be available in hosted apps. |
| 507 EXPECT_FALSE(extension_api->IsAvailable("runtime", | 539 EXPECT_FALSE(extension_api |
| 508 extension.get(), | 540 ->IsAvailable("runtime", extension.get(), |
| 509 Feature::BLESSED_EXTENSION_CONTEXT, | 541 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 510 GURL()).is_available()); | 542 CheckAliasStatus::NOT_ALLOWED) |
| 511 EXPECT_FALSE(extension_api->IsAvailable("runtime.id", | 543 .is_available()); |
| 512 extension.get(), | 544 EXPECT_FALSE(extension_api |
| 513 Feature::BLESSED_EXTENSION_CONTEXT, | 545 ->IsAvailable("runtime.id", extension.get(), |
| 514 GURL()).is_available()); | 546 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 515 EXPECT_FALSE(extension_api->IsAvailable("runtime.sendMessage", | 547 CheckAliasStatus::NOT_ALLOWED) |
| 516 extension.get(), | 548 .is_available()); |
| 517 Feature::BLESSED_EXTENSION_CONTEXT, | 549 EXPECT_FALSE(extension_api |
| 518 GURL()).is_available()); | 550 ->IsAvailable("runtime.sendMessage", extension.get(), |
| 519 EXPECT_FALSE(extension_api->IsAvailable("runtime.sendNativeMessage", | 551 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 520 extension.get(), | 552 CheckAliasStatus::NOT_ALLOWED) |
| 521 Feature::BLESSED_EXTENSION_CONTEXT, | 553 .is_available()); |
| 522 GURL()).is_available()); | 554 EXPECT_FALSE(extension_api |
| 523 EXPECT_FALSE(extension_api->IsAvailable("tabs.create", | 555 ->IsAvailable("runtime.sendNativeMessage", extension.get(), |
| 524 extension.get(), | 556 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 525 Feature::BLESSED_EXTENSION_CONTEXT, | 557 CheckAliasStatus::NOT_ALLOWED) |
| 526 GURL()).is_available()); | 558 .is_available()); |
| 559 EXPECT_FALSE(extension_api |
| 560 ->IsAvailable("tabs.create", extension.get(), |
| 561 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 562 CheckAliasStatus::NOT_ALLOWED) |
| 563 .is_available()); |
| 527 } | 564 } |
| 528 | 565 |
| 529 TEST(ExtensionAPITest, AppAndFriendsAvailability) { | 566 TEST(ExtensionAPITest, AppAndFriendsAvailability) { |
| 530 std::unique_ptr<ExtensionAPI> extension_api( | 567 std::unique_ptr<ExtensionAPI> extension_api( |
| 531 ExtensionAPI::CreateWithDefaultConfiguration()); | 568 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 532 | 569 |
| 533 // Make sure chrome.app.runtime and chrome.app.window are available to apps, | 570 // Make sure chrome.app.runtime and chrome.app.window are available to apps, |
| 534 // and chrome.app is not. | 571 // and chrome.app is not. |
| 535 { | 572 { |
| 536 std::set<std::string> permissions; | 573 std::set<std::string> permissions; |
| 537 permissions.insert("app.runtime"); | 574 permissions.insert("app.runtime"); |
| 538 permissions.insert("app.window"); | 575 permissions.insert("app.window"); |
| 539 scoped_refptr<Extension> extension = | 576 scoped_refptr<Extension> extension = |
| 540 CreatePackagedAppWithPermissions(permissions); | 577 CreatePackagedAppWithPermissions(permissions); |
| 541 EXPECT_FALSE(extension_api->IsAvailable( | 578 EXPECT_FALSE(extension_api |
| 542 "app", | 579 ->IsAvailable("app", extension.get(), |
| 543 extension.get(), | 580 Feature::BLESSED_EXTENSION_CONTEXT, |
| 544 Feature::BLESSED_EXTENSION_CONTEXT, | 581 GURL("http://foo.com"), |
| 545 GURL("http://foo.com")).is_available()); | 582 CheckAliasStatus::NOT_ALLOWED) |
| 546 EXPECT_TRUE(extension_api->IsAvailable( | 583 .is_available()); |
| 547 "app.runtime", | 584 EXPECT_TRUE(extension_api |
| 548 extension.get(), | 585 ->IsAvailable("app.runtime", extension.get(), |
| 549 Feature::BLESSED_EXTENSION_CONTEXT, | 586 Feature::BLESSED_EXTENSION_CONTEXT, |
| 550 GURL("http://foo.com")).is_available()); | 587 GURL("http://foo.com"), |
| 551 EXPECT_TRUE(extension_api->IsAvailable( | 588 CheckAliasStatus::NOT_ALLOWED) |
| 552 "app.window", | 589 .is_available()); |
| 553 extension.get(), | 590 EXPECT_TRUE(extension_api |
| 554 Feature::BLESSED_EXTENSION_CONTEXT, | 591 ->IsAvailable("app.window", extension.get(), |
| 555 GURL("http://foo.com")).is_available()); | 592 Feature::BLESSED_EXTENSION_CONTEXT, |
| 593 GURL("http://foo.com"), |
| 594 CheckAliasStatus::NOT_ALLOWED) |
| 595 .is_available()); |
| 556 } | 596 } |
| 557 // Make sure chrome.app.runtime and chrome.app.window are not available to | 597 // Make sure chrome.app.runtime and chrome.app.window are not available to |
| 558 // extensions, and chrome.app is. | 598 // extensions, and chrome.app is. |
| 559 { | 599 { |
| 560 std::set<std::string> permissions; | 600 std::set<std::string> permissions; |
| 561 scoped_refptr<Extension> extension = | 601 scoped_refptr<Extension> extension = |
| 562 CreateExtensionWithPermissions(permissions); | 602 CreateExtensionWithPermissions(permissions); |
| 563 EXPECT_TRUE(extension_api->IsAvailable( | 603 EXPECT_TRUE(extension_api |
| 564 "app", | 604 ->IsAvailable("app", extension.get(), |
| 565 extension.get(), | 605 Feature::BLESSED_EXTENSION_CONTEXT, |
| 566 Feature::BLESSED_EXTENSION_CONTEXT, | 606 GURL("http://foo.com"), |
| 567 GURL("http://foo.com")).is_available()); | 607 CheckAliasStatus::NOT_ALLOWED) |
| 568 EXPECT_FALSE(extension_api->IsAvailable( | 608 .is_available()); |
| 569 "app.runtime", | 609 EXPECT_FALSE(extension_api |
| 570 extension.get(), | 610 ->IsAvailable("app.runtime", extension.get(), |
| 571 Feature::BLESSED_EXTENSION_CONTEXT, | 611 Feature::BLESSED_EXTENSION_CONTEXT, |
| 572 GURL("http://foo.com")).is_available()); | 612 GURL("http://foo.com"), |
| 573 EXPECT_FALSE(extension_api->IsAvailable( | 613 CheckAliasStatus::NOT_ALLOWED) |
| 574 "app.window", | 614 .is_available()); |
| 575 extension.get(), | 615 EXPECT_FALSE(extension_api |
| 576 Feature::BLESSED_EXTENSION_CONTEXT, | 616 ->IsAvailable("app.window", extension.get(), |
| 577 GURL("http://foo.com")).is_available()); | 617 Feature::BLESSED_EXTENSION_CONTEXT, |
| 618 GURL("http://foo.com"), |
| 619 CheckAliasStatus::NOT_ALLOWED) |
| 620 .is_available()); |
| 578 } | 621 } |
| 579 } | 622 } |
| 580 | 623 |
| 581 TEST(ExtensionAPITest, ExtensionWithDependencies) { | 624 TEST(ExtensionAPITest, ExtensionWithDependencies) { |
| 582 // Extension with the "ttsEngine" permission but not the "tts" permission; it | 625 // Extension with the "ttsEngine" permission but not the "tts" permission; it |
| 583 // should not automatically get "tts" permission. | 626 // should not automatically get "tts" permission. |
| 584 { | 627 { |
| 585 scoped_refptr<Extension> extension = | 628 scoped_refptr<Extension> extension = |
| 586 CreateExtensionWithPermission("ttsEngine"); | 629 CreateExtensionWithPermission("ttsEngine"); |
| 587 std::unique_ptr<ExtensionAPI> api( | 630 std::unique_ptr<ExtensionAPI> api( |
| 588 ExtensionAPI::CreateWithDefaultConfiguration()); | 631 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 589 EXPECT_TRUE(api->IsAvailable("ttsEngine", | 632 EXPECT_TRUE(api->IsAvailable("ttsEngine", extension.get(), |
| 590 extension.get(), | 633 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 591 Feature::BLESSED_EXTENSION_CONTEXT, | 634 CheckAliasStatus::NOT_ALLOWED) |
| 592 GURL()).is_available()); | 635 .is_available()); |
| 593 EXPECT_FALSE(api->IsAvailable("tts", | 636 EXPECT_FALSE(api->IsAvailable("tts", extension.get(), |
| 594 extension.get(), | 637 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 595 Feature::BLESSED_EXTENSION_CONTEXT, | 638 CheckAliasStatus::NOT_ALLOWED) |
| 596 GURL()).is_available()); | 639 .is_available()); |
| 597 } | 640 } |
| 598 | 641 |
| 599 // Conversely, extension with the "tts" permission but not the "ttsEngine" | 642 // Conversely, extension with the "tts" permission but not the "ttsEngine" |
| 600 // permission shouldn't get the "ttsEngine" permission. | 643 // permission shouldn't get the "ttsEngine" permission. |
| 601 { | 644 { |
| 602 scoped_refptr<Extension> extension = | 645 scoped_refptr<Extension> extension = |
| 603 CreateExtensionWithPermission("tts"); | 646 CreateExtensionWithPermission("tts"); |
| 604 std::unique_ptr<ExtensionAPI> api( | 647 std::unique_ptr<ExtensionAPI> api( |
| 605 ExtensionAPI::CreateWithDefaultConfiguration()); | 648 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 606 EXPECT_FALSE(api->IsAvailable("ttsEngine", | 649 EXPECT_FALSE(api->IsAvailable("ttsEngine", extension.get(), |
| 607 extension.get(), | 650 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 608 Feature::BLESSED_EXTENSION_CONTEXT, | 651 CheckAliasStatus::NOT_ALLOWED) |
| 609 GURL()).is_available()); | 652 .is_available()); |
| 610 EXPECT_TRUE(api->IsAvailable("tts", | 653 EXPECT_TRUE(api->IsAvailable("tts", extension.get(), |
| 611 extension.get(), | 654 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 612 Feature::BLESSED_EXTENSION_CONTEXT, | 655 CheckAliasStatus::NOT_ALLOWED) |
| 613 GURL()).is_available()); | 656 .is_available()); |
| 614 } | 657 } |
| 615 } | 658 } |
| 616 | 659 |
| 617 bool MatchesURL( | 660 bool MatchesURL( |
| 618 ExtensionAPI* api, const std::string& api_name, const std::string& url) { | 661 ExtensionAPI* api, const std::string& api_name, const std::string& url) { |
| 619 return api->IsAvailable( | 662 return api |
| 620 api_name, NULL, Feature::WEB_PAGE_CONTEXT, GURL(url)).is_available(); | 663 ->IsAvailable(api_name, nullptr, Feature::WEB_PAGE_CONTEXT, GURL(url), |
| 664 CheckAliasStatus::NOT_ALLOWED) |
| 665 .is_available(); |
| 621 } | 666 } |
| 622 | 667 |
| 623 TEST(ExtensionAPITest, URLMatching) { | 668 TEST(ExtensionAPITest, URLMatching) { |
| 624 std::unique_ptr<ExtensionAPI> api( | 669 std::unique_ptr<ExtensionAPI> api( |
| 625 ExtensionAPI::CreateWithDefaultConfiguration()); | 670 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 626 | 671 |
| 627 // "app" API is available to all URLs that content scripts can be injected. | 672 // "app" API is available to all URLs that content scripts can be injected. |
| 628 EXPECT_TRUE(MatchesURL(api.get(), "app", "http://example.com/example.html")); | 673 EXPECT_TRUE(MatchesURL(api.get(), "app", "http://example.com/example.html")); |
| 629 EXPECT_TRUE(MatchesURL(api.get(), "app", "https://blah.net")); | 674 EXPECT_TRUE(MatchesURL(api.get(), "app", "https://blah.net")); |
| 630 EXPECT_TRUE(MatchesURL(api.get(), "app", "file://somefile.html")); | 675 EXPECT_TRUE(MatchesURL(api.get(), "app", "file://somefile.html")); |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 840 { "runtime.connectNative", false }, | 885 { "runtime.connectNative", false }, |
| 841 }; | 886 }; |
| 842 | 887 |
| 843 std::unique_ptr<ExtensionAPI> extension_api( | 888 std::unique_ptr<ExtensionAPI> extension_api( |
| 844 ExtensionAPI::CreateWithDefaultConfiguration()); | 889 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 845 scoped_refptr<Extension> extension = | 890 scoped_refptr<Extension> extension = |
| 846 BuildExtension(ExtensionBuilder()).Build(); | 891 BuildExtension(ExtensionBuilder()).Build(); |
| 847 | 892 |
| 848 for (size_t i = 0; i < arraysize(kTests); ++i) { | 893 for (size_t i = 0; i < arraysize(kTests); ++i) { |
| 849 EXPECT_EQ(kTests[i].expect_success, | 894 EXPECT_EQ(kTests[i].expect_success, |
| 850 extension_api->IsAvailable(kTests[i].permission_name, | 895 extension_api |
| 851 extension.get(), | 896 ->IsAvailable(kTests[i].permission_name, extension.get(), |
| 852 Feature::BLESSED_EXTENSION_CONTEXT, | 897 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 853 GURL()).is_available()) | 898 CheckAliasStatus::NOT_ALLOWED) |
| 899 .is_available()) |
| 854 << "Permission being tested: " << kTests[i].permission_name; | 900 << "Permission being tested: " << kTests[i].permission_name; |
| 855 } | 901 } |
| 856 } | 902 } |
| 857 | 903 |
| 858 // Tests that permissions that require manifest keys are available when those | 904 // Tests that permissions that require manifest keys are available when those |
| 859 // keys are present. | 905 // keys are present. |
| 860 TEST(ExtensionAPITest, ManifestKeys) { | 906 TEST(ExtensionAPITest, ManifestKeys) { |
| 861 std::unique_ptr<ExtensionAPI> extension_api( | 907 std::unique_ptr<ExtensionAPI> extension_api( |
| 862 ExtensionAPI::CreateWithDefaultConfiguration()); | 908 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 863 | 909 |
| 864 scoped_refptr<Extension> extension = | 910 scoped_refptr<Extension> extension = |
| 865 BuildExtension(ExtensionBuilder()) | 911 BuildExtension(ExtensionBuilder()) |
| 866 .MergeManifest(DictionaryBuilder() | 912 .MergeManifest(DictionaryBuilder() |
| 867 .Set("browser_action", DictionaryBuilder().Build()) | 913 .Set("browser_action", DictionaryBuilder().Build()) |
| 868 .Build()) | 914 .Build()) |
| 869 .Build(); | 915 .Build(); |
| 870 | 916 |
| 871 EXPECT_TRUE(extension_api->IsAvailable("browserAction", | 917 EXPECT_TRUE(extension_api |
| 872 extension.get(), | 918 ->IsAvailable("browserAction", extension.get(), |
| 873 Feature::BLESSED_EXTENSION_CONTEXT, | 919 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 874 GURL()).is_available()); | 920 CheckAliasStatus::NOT_ALLOWED) |
| 875 EXPECT_FALSE(extension_api->IsAvailable("pageAction", | 921 .is_available()); |
| 876 extension.get(), | 922 EXPECT_FALSE(extension_api |
| 877 Feature::BLESSED_EXTENSION_CONTEXT, | 923 ->IsAvailable("pageAction", extension.get(), |
| 878 GURL()).is_available()); | 924 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 925 CheckAliasStatus::NOT_ALLOWED) |
| 926 .is_available()); |
| 879 } | 927 } |
| 880 | 928 |
| 881 } // namespace extensions | 929 } // namespace extensions |
| OLD | NEW |