Chromium Code Reviews| 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 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 = |
| 206 api.IsAvailable(test_data[i].api_full_name, | 208 api.IsAvailable(test_data[i].api_full_name, NULL, 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", NULL, | |
|
Devlin
2016/11/17 01:11:15
nullptr in new code
tbarzic
2016/11/17 18:12:13
it's not really new, more of a product of git cl f
| |
| 229 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), | |
| 230 CheckAliasStatus::NOT_ALLOWED) | |
| 231 .is_available()); | |
| 232 ASSERT_TRUE(api.IsAvailable("alias_api_source", NULL, | |
| 233 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), | |
| 234 CheckAliasStatus::ALLOWED) | |
| 235 .is_available()); | |
| 236 ASSERT_TRUE(api.IsAvailable("alias_api_source.bar", NULL, | |
| 237 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), | |
| 238 CheckAliasStatus::ALLOWED) | |
| 239 .is_available()); | |
| 240 ASSERT_FALSE(api.IsAvailable("alias_api_source.foo", NULL, | |
| 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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 276 TestExtensionAPI api; | 320 TestExtensionAPI api; |
| 277 api.RegisterDependencyProvider("api", &api_feature_provider); | 321 api.RegisterDependencyProvider("api", &api_feature_provider); |
| 278 for (const auto& key : kTestFeatures) | 322 for (const auto& key : kTestFeatures) |
| 279 api.add_fake_schema(key); | 323 api.add_fake_schema(key); |
| 280 ExtensionAPI::OverrideSharedInstanceForTest scope(&api); | 324 ExtensionAPI::OverrideSharedInstanceForTest scope(&api); |
| 281 | 325 |
| 282 Feature* test_feature = | 326 Feature* test_feature = |
| 283 api_feature_provider.GetFeature(test_data[i].api_full_name); | 327 api_feature_provider.GetFeature(test_data[i].api_full_name); |
| 284 ASSERT_TRUE(test_feature); | 328 ASSERT_TRUE(test_feature); |
| 285 EXPECT_EQ(test_data[i].expect_is_available, | 329 EXPECT_EQ(test_data[i].expect_is_available, |
| 286 api.IsAnyFeatureAvailableToContext(*test_feature, | 330 api.IsAnyFeatureAvailableToContext( |
| 287 test_data[i].extension, | 331 *test_feature, test_data[i].extension, test_data[i].context, |
| 288 test_data[i].context, | 332 test_data[i].url, CheckAliasStatus::NOT_ALLOWED)) |
| 289 test_data[i].url)) | |
| 290 << i; | 333 << i; |
| 291 } | 334 } |
| 292 } | 335 } |
| 293 | 336 |
| 294 TEST(ExtensionAPITest, SessionTypeFeature) { | 337 TEST(ExtensionAPITest, SessionTypeFeature) { |
| 295 const std::vector<FeatureSessionTypesTestData> kTestData( | 338 const std::vector<FeatureSessionTypesTestData> kTestData( |
| 296 {{"kiosk_only", true, FeatureSessionType::KIOSK}, | 339 {{"kiosk_only", true, FeatureSessionType::KIOSK}, |
| 297 {"kiosk_only", false, FeatureSessionType::REGULAR}, | 340 {"kiosk_only", false, FeatureSessionType::REGULAR}, |
| 298 {"kiosk_only", false, FeatureSessionType::UNKNOWN}, | 341 {"kiosk_only", false, FeatureSessionType::UNKNOWN}, |
| 299 {"non_kiosk", false, FeatureSessionType::KIOSK}, | 342 {"non_kiosk", false, FeatureSessionType::KIOSK}, |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 312 TestExtensionAPI api; | 355 TestExtensionAPI api; |
| 313 api.RegisterDependencyProvider("api", &api_feature_provider); | 356 api.RegisterDependencyProvider("api", &api_feature_provider); |
| 314 for (const auto& key : kSessionTypeTestFeatures) | 357 for (const auto& key : kSessionTypeTestFeatures) |
| 315 api.add_fake_schema(key); | 358 api.add_fake_schema(key); |
| 316 ExtensionAPI::OverrideSharedInstanceForTest scope(&api); | 359 ExtensionAPI::OverrideSharedInstanceForTest scope(&api); |
| 317 | 360 |
| 318 std::unique_ptr<base::AutoReset<FeatureSessionType>> current_session( | 361 std::unique_ptr<base::AutoReset<FeatureSessionType>> current_session( |
| 319 ScopedCurrentFeatureSessionType(test.current_session_type)); | 362 ScopedCurrentFeatureSessionType(test.current_session_type)); |
| 320 EXPECT_EQ(test.expect_available, | 363 EXPECT_EQ(test.expect_available, |
| 321 api.IsAvailable(test.api_name, nullptr, | 364 api.IsAvailable(test.api_name, nullptr, |
| 322 Feature::BLESSED_EXTENSION_CONTEXT, GURL()) | 365 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 366 CheckAliasStatus::NOT_ALLOWED) | |
| 323 .is_available()) | 367 .is_available()) |
| 324 << "Test case (" << test.api_name << ", " | 368 << "Test case (" << test.api_name << ", " |
| 325 << static_cast<int>(test.current_session_type) << ")."; | 369 << static_cast<int>(test.current_session_type) << ")."; |
| 326 } | 370 } |
| 327 } | 371 } |
| 328 | 372 |
| 329 TEST(ExtensionAPITest, LazyGetSchema) { | 373 TEST(ExtensionAPITest, LazyGetSchema) { |
| 330 std::unique_ptr<ExtensionAPI> apis( | 374 std::unique_ptr<ExtensionAPI> apis( |
| 331 ExtensionAPI::CreateWithDefaultConfiguration()); | 375 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 332 | 376 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 388 extension = CreateExtensionWithPermissions(permissions); | 432 extension = CreateExtensionWithPermissions(permissions); |
| 389 } | 433 } |
| 390 | 434 |
| 391 std::unique_ptr<ExtensionAPI> extension_api( | 435 std::unique_ptr<ExtensionAPI> extension_api( |
| 392 ExtensionAPI::CreateWithDefaultConfiguration()); | 436 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 393 | 437 |
| 394 const FeatureProvider& api_features = *FeatureProvider::GetAPIFeatures(); | 438 const FeatureProvider& api_features = *FeatureProvider::GetAPIFeatures(); |
| 395 | 439 |
| 396 // "storage" is completely unprivileged. | 440 // "storage" is completely unprivileged. |
| 397 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 441 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 398 *api_features.GetFeature("storage"), | 442 *api_features.GetFeature("storage"), NULL, |
| 399 NULL, | 443 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 400 Feature::BLESSED_EXTENSION_CONTEXT, | 444 CheckAliasStatus::NOT_ALLOWED)); |
| 401 GURL())); | |
| 402 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 445 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 403 *api_features.GetFeature("storage"), | 446 *api_features.GetFeature("storage"), NULL, |
| 404 NULL, | 447 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), |
| 405 Feature::UNBLESSED_EXTENSION_CONTEXT, | 448 CheckAliasStatus::NOT_ALLOWED)); |
| 406 GURL())); | |
| 407 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 449 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 408 *api_features.GetFeature("storage"), | 450 *api_features.GetFeature("storage"), NULL, |
| 409 NULL, | 451 Feature::CONTENT_SCRIPT_CONTEXT, GURL(), CheckAliasStatus::NOT_ALLOWED)); |
| 410 Feature::CONTENT_SCRIPT_CONTEXT, | |
| 411 GURL())); | |
| 412 | 452 |
| 413 // "extension" is partially unprivileged. | 453 // "extension" is partially unprivileged. |
| 414 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 454 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 415 *api_features.GetFeature("extension"), | 455 *api_features.GetFeature("extension"), NULL, |
| 416 NULL, | 456 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 417 Feature::BLESSED_EXTENSION_CONTEXT, | 457 CheckAliasStatus::NOT_ALLOWED)); |
| 418 GURL())); | |
| 419 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 458 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 420 *api_features.GetFeature("extension"), | 459 *api_features.GetFeature("extension"), NULL, |
| 421 NULL, | 460 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), |
| 422 Feature::UNBLESSED_EXTENSION_CONTEXT, | 461 CheckAliasStatus::NOT_ALLOWED)); |
| 423 GURL())); | |
| 424 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 462 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 425 *api_features.GetFeature("extension"), | 463 *api_features.GetFeature("extension"), NULL, |
| 426 NULL, | 464 Feature::CONTENT_SCRIPT_CONTEXT, GURL(), CheckAliasStatus::NOT_ALLOWED)); |
| 427 Feature::CONTENT_SCRIPT_CONTEXT, | |
| 428 GURL())); | |
| 429 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 465 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 430 *api_features.GetFeature("extension.getURL"), | 466 *api_features.GetFeature("extension.getURL"), NULL, |
| 431 NULL, | 467 Feature::CONTENT_SCRIPT_CONTEXT, GURL(), CheckAliasStatus::NOT_ALLOWED)); |
| 432 Feature::CONTENT_SCRIPT_CONTEXT, | |
| 433 GURL())); | |
| 434 | 468 |
| 435 // "history" is entirely privileged. | 469 // "history" is entirely privileged. |
| 436 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 470 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 437 *api_features.GetFeature("history"), | 471 *api_features.GetFeature("history"), NULL, |
| 438 NULL, | 472 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 439 Feature::BLESSED_EXTENSION_CONTEXT, | 473 CheckAliasStatus::NOT_ALLOWED)); |
| 440 GURL())); | |
| 441 EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext( | 474 EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext( |
| 442 *api_features.GetFeature("history"), | 475 *api_features.GetFeature("history"), NULL, |
| 443 NULL, | 476 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), |
| 444 Feature::UNBLESSED_EXTENSION_CONTEXT, | 477 CheckAliasStatus::NOT_ALLOWED)); |
| 445 GURL())); | |
| 446 EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext( | 478 EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext( |
| 447 *api_features.GetFeature("history"), | 479 *api_features.GetFeature("history"), NULL, |
| 448 NULL, | 480 Feature::CONTENT_SCRIPT_CONTEXT, GURL(), CheckAliasStatus::NOT_ALLOWED)); |
| 449 Feature::CONTENT_SCRIPT_CONTEXT, | |
| 450 GURL())); | |
| 451 } | 481 } |
| 452 | 482 |
| 453 scoped_refptr<Extension> CreateHostedApp() { | 483 scoped_refptr<Extension> CreateHostedApp() { |
| 454 base::DictionaryValue values; | 484 base::DictionaryValue values; |
| 455 values.SetString(manifest_keys::kName, "test"); | 485 values.SetString(manifest_keys::kName, "test"); |
| 456 values.SetString(manifest_keys::kVersion, "0.1"); | 486 values.SetString(manifest_keys::kVersion, "0.1"); |
| 457 values.Set(manifest_keys::kWebURLs, new base::ListValue()); | 487 values.Set(manifest_keys::kWebURLs, new base::ListValue()); |
| 458 values.SetString(manifest_keys::kLaunchWebURL, | 488 values.SetString(manifest_keys::kLaunchWebURL, |
| 459 "http://www.example.com"); | 489 "http://www.example.com"); |
| 460 std::string error; | 490 std::string error; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 497 return extension; | 527 return extension; |
| 498 } | 528 } |
| 499 | 529 |
| 500 TEST(ExtensionAPITest, HostedAppPermissions) { | 530 TEST(ExtensionAPITest, HostedAppPermissions) { |
| 501 scoped_refptr<Extension> extension = CreateHostedApp(); | 531 scoped_refptr<Extension> extension = CreateHostedApp(); |
| 502 | 532 |
| 503 std::unique_ptr<ExtensionAPI> extension_api( | 533 std::unique_ptr<ExtensionAPI> extension_api( |
| 504 ExtensionAPI::CreateWithDefaultConfiguration()); | 534 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 505 | 535 |
| 506 // "runtime" and "tabs" should not be available in hosted apps. | 536 // "runtime" and "tabs" should not be available in hosted apps. |
| 507 EXPECT_FALSE(extension_api->IsAvailable("runtime", | 537 EXPECT_FALSE(extension_api |
| 508 extension.get(), | 538 ->IsAvailable("runtime", extension.get(), |
| 509 Feature::BLESSED_EXTENSION_CONTEXT, | 539 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 510 GURL()).is_available()); | 540 CheckAliasStatus::NOT_ALLOWED) |
| 511 EXPECT_FALSE(extension_api->IsAvailable("runtime.id", | 541 .is_available()); |
| 512 extension.get(), | 542 EXPECT_FALSE(extension_api |
| 513 Feature::BLESSED_EXTENSION_CONTEXT, | 543 ->IsAvailable("runtime.id", extension.get(), |
| 514 GURL()).is_available()); | 544 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 515 EXPECT_FALSE(extension_api->IsAvailable("runtime.sendMessage", | 545 CheckAliasStatus::NOT_ALLOWED) |
| 516 extension.get(), | 546 .is_available()); |
| 517 Feature::BLESSED_EXTENSION_CONTEXT, | 547 EXPECT_FALSE(extension_api |
| 518 GURL()).is_available()); | 548 ->IsAvailable("runtime.sendMessage", extension.get(), |
| 519 EXPECT_FALSE(extension_api->IsAvailable("runtime.sendNativeMessage", | 549 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 520 extension.get(), | 550 CheckAliasStatus::NOT_ALLOWED) |
| 521 Feature::BLESSED_EXTENSION_CONTEXT, | 551 .is_available()); |
| 522 GURL()).is_available()); | 552 EXPECT_FALSE(extension_api |
| 523 EXPECT_FALSE(extension_api->IsAvailable("tabs.create", | 553 ->IsAvailable("runtime.sendNativeMessage", extension.get(), |
| 524 extension.get(), | 554 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 525 Feature::BLESSED_EXTENSION_CONTEXT, | 555 CheckAliasStatus::NOT_ALLOWED) |
| 526 GURL()).is_available()); | 556 .is_available()); |
| 557 EXPECT_FALSE(extension_api | |
| 558 ->IsAvailable("tabs.create", extension.get(), | |
| 559 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), | |
| 560 CheckAliasStatus::NOT_ALLOWED) | |
| 561 .is_available()); | |
| 527 } | 562 } |
| 528 | 563 |
| 529 TEST(ExtensionAPITest, AppAndFriendsAvailability) { | 564 TEST(ExtensionAPITest, AppAndFriendsAvailability) { |
| 530 std::unique_ptr<ExtensionAPI> extension_api( | 565 std::unique_ptr<ExtensionAPI> extension_api( |
| 531 ExtensionAPI::CreateWithDefaultConfiguration()); | 566 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 532 | 567 |
| 533 // Make sure chrome.app.runtime and chrome.app.window are available to apps, | 568 // Make sure chrome.app.runtime and chrome.app.window are available to apps, |
| 534 // and chrome.app is not. | 569 // and chrome.app is not. |
| 535 { | 570 { |
| 536 std::set<std::string> permissions; | 571 std::set<std::string> permissions; |
| 537 permissions.insert("app.runtime"); | 572 permissions.insert("app.runtime"); |
| 538 permissions.insert("app.window"); | 573 permissions.insert("app.window"); |
| 539 scoped_refptr<Extension> extension = | 574 scoped_refptr<Extension> extension = |
| 540 CreatePackagedAppWithPermissions(permissions); | 575 CreatePackagedAppWithPermissions(permissions); |
| 541 EXPECT_FALSE(extension_api->IsAvailable( | 576 EXPECT_FALSE(extension_api |
| 542 "app", | 577 ->IsAvailable("app", extension.get(), |
| 543 extension.get(), | 578 Feature::BLESSED_EXTENSION_CONTEXT, |
| 544 Feature::BLESSED_EXTENSION_CONTEXT, | 579 GURL("http://foo.com"), |
| 545 GURL("http://foo.com")).is_available()); | 580 CheckAliasStatus::NOT_ALLOWED) |
| 546 EXPECT_TRUE(extension_api->IsAvailable( | 581 .is_available()); |
| 547 "app.runtime", | 582 EXPECT_TRUE(extension_api |
| 548 extension.get(), | 583 ->IsAvailable("app.runtime", extension.get(), |
| 549 Feature::BLESSED_EXTENSION_CONTEXT, | 584 Feature::BLESSED_EXTENSION_CONTEXT, |
| 550 GURL("http://foo.com")).is_available()); | 585 GURL("http://foo.com"), |
| 551 EXPECT_TRUE(extension_api->IsAvailable( | 586 CheckAliasStatus::NOT_ALLOWED) |
| 552 "app.window", | 587 .is_available()); |
| 553 extension.get(), | 588 EXPECT_TRUE(extension_api |
| 554 Feature::BLESSED_EXTENSION_CONTEXT, | 589 ->IsAvailable("app.window", extension.get(), |
| 555 GURL("http://foo.com")).is_available()); | 590 Feature::BLESSED_EXTENSION_CONTEXT, |
| 591 GURL("http://foo.com"), | |
| 592 CheckAliasStatus::NOT_ALLOWED) | |
| 593 .is_available()); | |
| 556 } | 594 } |
| 557 // Make sure chrome.app.runtime and chrome.app.window are not available to | 595 // Make sure chrome.app.runtime and chrome.app.window are not available to |
| 558 // extensions, and chrome.app is. | 596 // extensions, and chrome.app is. |
| 559 { | 597 { |
| 560 std::set<std::string> permissions; | 598 std::set<std::string> permissions; |
| 561 scoped_refptr<Extension> extension = | 599 scoped_refptr<Extension> extension = |
| 562 CreateExtensionWithPermissions(permissions); | 600 CreateExtensionWithPermissions(permissions); |
| 563 EXPECT_TRUE(extension_api->IsAvailable( | 601 EXPECT_TRUE(extension_api |
| 564 "app", | 602 ->IsAvailable("app", extension.get(), |
| 565 extension.get(), | 603 Feature::BLESSED_EXTENSION_CONTEXT, |
| 566 Feature::BLESSED_EXTENSION_CONTEXT, | 604 GURL("http://foo.com"), |
| 567 GURL("http://foo.com")).is_available()); | 605 CheckAliasStatus::NOT_ALLOWED) |
| 568 EXPECT_FALSE(extension_api->IsAvailable( | 606 .is_available()); |
| 569 "app.runtime", | 607 EXPECT_FALSE(extension_api |
| 570 extension.get(), | 608 ->IsAvailable("app.runtime", extension.get(), |
| 571 Feature::BLESSED_EXTENSION_CONTEXT, | 609 Feature::BLESSED_EXTENSION_CONTEXT, |
| 572 GURL("http://foo.com")).is_available()); | 610 GURL("http://foo.com"), |
| 573 EXPECT_FALSE(extension_api->IsAvailable( | 611 CheckAliasStatus::NOT_ALLOWED) |
| 574 "app.window", | 612 .is_available()); |
| 575 extension.get(), | 613 EXPECT_FALSE(extension_api |
| 576 Feature::BLESSED_EXTENSION_CONTEXT, | 614 ->IsAvailable("app.window", extension.get(), |
| 577 GURL("http://foo.com")).is_available()); | 615 Feature::BLESSED_EXTENSION_CONTEXT, |
| 616 GURL("http://foo.com"), | |
| 617 CheckAliasStatus::NOT_ALLOWED) | |
| 618 .is_available()); | |
| 578 } | 619 } |
| 579 } | 620 } |
| 580 | 621 |
| 581 TEST(ExtensionAPITest, ExtensionWithDependencies) { | 622 TEST(ExtensionAPITest, ExtensionWithDependencies) { |
| 582 // Extension with the "ttsEngine" permission but not the "tts" permission; it | 623 // Extension with the "ttsEngine" permission but not the "tts" permission; it |
| 583 // should not automatically get "tts" permission. | 624 // should not automatically get "tts" permission. |
| 584 { | 625 { |
| 585 scoped_refptr<Extension> extension = | 626 scoped_refptr<Extension> extension = |
| 586 CreateExtensionWithPermission("ttsEngine"); | 627 CreateExtensionWithPermission("ttsEngine"); |
| 587 std::unique_ptr<ExtensionAPI> api( | 628 std::unique_ptr<ExtensionAPI> api( |
| 588 ExtensionAPI::CreateWithDefaultConfiguration()); | 629 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 589 EXPECT_TRUE(api->IsAvailable("ttsEngine", | 630 EXPECT_TRUE(api->IsAvailable("ttsEngine", extension.get(), |
| 590 extension.get(), | 631 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 591 Feature::BLESSED_EXTENSION_CONTEXT, | 632 CheckAliasStatus::NOT_ALLOWED) |
| 592 GURL()).is_available()); | 633 .is_available()); |
| 593 EXPECT_FALSE(api->IsAvailable("tts", | 634 EXPECT_FALSE(api->IsAvailable("tts", extension.get(), |
| 594 extension.get(), | 635 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 595 Feature::BLESSED_EXTENSION_CONTEXT, | 636 CheckAliasStatus::NOT_ALLOWED) |
| 596 GURL()).is_available()); | 637 .is_available()); |
| 597 } | 638 } |
| 598 | 639 |
| 599 // Conversely, extension with the "tts" permission but not the "ttsEngine" | 640 // Conversely, extension with the "tts" permission but not the "ttsEngine" |
| 600 // permission shouldn't get the "ttsEngine" permission. | 641 // permission shouldn't get the "ttsEngine" permission. |
| 601 { | 642 { |
| 602 scoped_refptr<Extension> extension = | 643 scoped_refptr<Extension> extension = |
| 603 CreateExtensionWithPermission("tts"); | 644 CreateExtensionWithPermission("tts"); |
| 604 std::unique_ptr<ExtensionAPI> api( | 645 std::unique_ptr<ExtensionAPI> api( |
| 605 ExtensionAPI::CreateWithDefaultConfiguration()); | 646 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 606 EXPECT_FALSE(api->IsAvailable("ttsEngine", | 647 EXPECT_FALSE(api->IsAvailable("ttsEngine", extension.get(), |
| 607 extension.get(), | 648 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 608 Feature::BLESSED_EXTENSION_CONTEXT, | 649 CheckAliasStatus::NOT_ALLOWED) |
| 609 GURL()).is_available()); | 650 .is_available()); |
| 610 EXPECT_TRUE(api->IsAvailable("tts", | 651 EXPECT_TRUE(api->IsAvailable("tts", extension.get(), |
| 611 extension.get(), | 652 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 612 Feature::BLESSED_EXTENSION_CONTEXT, | 653 CheckAliasStatus::NOT_ALLOWED) |
| 613 GURL()).is_available()); | 654 .is_available()); |
| 614 } | 655 } |
| 615 } | 656 } |
| 616 | 657 |
| 617 bool MatchesURL( | 658 bool MatchesURL( |
| 618 ExtensionAPI* api, const std::string& api_name, const std::string& url) { | 659 ExtensionAPI* api, const std::string& api_name, const std::string& url) { |
| 619 return api->IsAvailable( | 660 return api |
| 620 api_name, NULL, Feature::WEB_PAGE_CONTEXT, GURL(url)).is_available(); | 661 ->IsAvailable(api_name, NULL, Feature::WEB_PAGE_CONTEXT, GURL(url), |
| 662 CheckAliasStatus::NOT_ALLOWED) | |
| 663 .is_available(); | |
| 621 } | 664 } |
| 622 | 665 |
| 623 TEST(ExtensionAPITest, URLMatching) { | 666 TEST(ExtensionAPITest, URLMatching) { |
| 624 std::unique_ptr<ExtensionAPI> api( | 667 std::unique_ptr<ExtensionAPI> api( |
| 625 ExtensionAPI::CreateWithDefaultConfiguration()); | 668 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 626 | 669 |
| 627 // "app" API is available to all URLs that content scripts can be injected. | 670 // "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")); | 671 EXPECT_TRUE(MatchesURL(api.get(), "app", "http://example.com/example.html")); |
| 629 EXPECT_TRUE(MatchesURL(api.get(), "app", "https://blah.net")); | 672 EXPECT_TRUE(MatchesURL(api.get(), "app", "https://blah.net")); |
| 630 EXPECT_TRUE(MatchesURL(api.get(), "app", "file://somefile.html")); | 673 EXPECT_TRUE(MatchesURL(api.get(), "app", "file://somefile.html")); |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 843 { "runtime.connectNative", false }, | 886 { "runtime.connectNative", false }, |
| 844 }; | 887 }; |
| 845 | 888 |
| 846 std::unique_ptr<ExtensionAPI> extension_api( | 889 std::unique_ptr<ExtensionAPI> extension_api( |
| 847 ExtensionAPI::CreateWithDefaultConfiguration()); | 890 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 848 scoped_refptr<Extension> extension = | 891 scoped_refptr<Extension> extension = |
| 849 BuildExtension(ExtensionBuilder()).Build(); | 892 BuildExtension(ExtensionBuilder()).Build(); |
| 850 | 893 |
| 851 for (size_t i = 0; i < arraysize(kTests); ++i) { | 894 for (size_t i = 0; i < arraysize(kTests); ++i) { |
| 852 EXPECT_EQ(kTests[i].expect_success, | 895 EXPECT_EQ(kTests[i].expect_success, |
| 853 extension_api->IsAvailable(kTests[i].permission_name, | 896 extension_api |
| 854 extension.get(), | 897 ->IsAvailable(kTests[i].permission_name, extension.get(), |
| 855 Feature::BLESSED_EXTENSION_CONTEXT, | 898 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 856 GURL()).is_available()) | 899 CheckAliasStatus::NOT_ALLOWED) |
| 900 .is_available()) | |
| 857 << "Permission being tested: " << kTests[i].permission_name; | 901 << "Permission being tested: " << kTests[i].permission_name; |
| 858 } | 902 } |
| 859 } | 903 } |
| 860 | 904 |
| 861 // Tests that permissions that require manifest keys are available when those | 905 // Tests that permissions that require manifest keys are available when those |
| 862 // keys are present. | 906 // keys are present. |
| 863 TEST(ExtensionAPITest, ManifestKeys) { | 907 TEST(ExtensionAPITest, ManifestKeys) { |
| 864 std::unique_ptr<ExtensionAPI> extension_api( | 908 std::unique_ptr<ExtensionAPI> extension_api( |
| 865 ExtensionAPI::CreateWithDefaultConfiguration()); | 909 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 866 | 910 |
| 867 scoped_refptr<Extension> extension = | 911 scoped_refptr<Extension> extension = |
| 868 BuildExtension(ExtensionBuilder()) | 912 BuildExtension(ExtensionBuilder()) |
| 869 .MergeManifest(DictionaryBuilder() | 913 .MergeManifest(DictionaryBuilder() |
| 870 .Set("browser_action", DictionaryBuilder().Build()) | 914 .Set("browser_action", DictionaryBuilder().Build()) |
| 871 .Build()) | 915 .Build()) |
| 872 .Build(); | 916 .Build(); |
| 873 | 917 |
| 874 EXPECT_TRUE(extension_api->IsAvailable("browserAction", | 918 EXPECT_TRUE(extension_api |
| 875 extension.get(), | 919 ->IsAvailable("browserAction", extension.get(), |
| 876 Feature::BLESSED_EXTENSION_CONTEXT, | 920 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 877 GURL()).is_available()); | 921 CheckAliasStatus::NOT_ALLOWED) |
| 878 EXPECT_FALSE(extension_api->IsAvailable("pageAction", | 922 .is_available()); |
| 879 extension.get(), | 923 EXPECT_FALSE(extension_api |
| 880 Feature::BLESSED_EXTENSION_CONTEXT, | 924 ->IsAvailable("pageAction", extension.get(), |
| 881 GURL()).is_available()); | 925 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 926 CheckAliasStatus::NOT_ALLOWED) | |
| 927 .is_available()); | |
| 882 } | 928 } |
| 883 | 929 |
| 884 } // namespace extensions | 930 } // namespace extensions |
| OLD | NEW |