| 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, false); |
| 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, |
| 229 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), |
| 230 false /* allow_alias */) |
| 231 .is_available()); |
| 232 ASSERT_TRUE(api.IsAvailable("alias_api_source", NULL, |
| 233 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), |
| 234 true /* allow_alias */) |
| 235 .is_available()); |
| 236 ASSERT_TRUE(api.IsAvailable("alias_api_source.bar", NULL, |
| 237 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), |
| 238 true /* allow_alias */) |
| 239 .is_available()); |
| 240 ASSERT_FALSE(api.IsAvailable("alias_api_source.foo", NULL, |
| 241 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), |
| 242 true /* allow_alias */) |
| 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(), false /* alow_alias */)); |
| 258 EXPECT_TRUE(api.IsAnyFeatureAvailableToContext( |
| 259 *test_feature, extension.get(), Feature::UNBLESSED_EXTENSION_CONTEXT, |
| 260 GURL(), true /* alow_alias */)); |
| 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, false)) |
| 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(), false) |
| 323 .is_available()) | 366 .is_available()) |
| 324 << "Test case (" << test.api_name << ", " | 367 << "Test case (" << test.api_name << ", " |
| 325 << static_cast<int>(test.current_session_type) << ")."; | 368 << static_cast<int>(test.current_session_type) << ")."; |
| 326 } | 369 } |
| 327 } | 370 } |
| 328 | 371 |
| 329 TEST(ExtensionAPITest, LazyGetSchema) { | 372 TEST(ExtensionAPITest, LazyGetSchema) { |
| 330 std::unique_ptr<ExtensionAPI> apis( | 373 std::unique_ptr<ExtensionAPI> apis( |
| 331 ExtensionAPI::CreateWithDefaultConfiguration()); | 374 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 332 | 375 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 388 extension = CreateExtensionWithPermissions(permissions); | 431 extension = CreateExtensionWithPermissions(permissions); |
| 389 } | 432 } |
| 390 | 433 |
| 391 std::unique_ptr<ExtensionAPI> extension_api( | 434 std::unique_ptr<ExtensionAPI> extension_api( |
| 392 ExtensionAPI::CreateWithDefaultConfiguration()); | 435 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 393 | 436 |
| 394 const FeatureProvider& api_features = *FeatureProvider::GetAPIFeatures(); | 437 const FeatureProvider& api_features = *FeatureProvider::GetAPIFeatures(); |
| 395 | 438 |
| 396 // "storage" is completely unprivileged. | 439 // "storage" is completely unprivileged. |
| 397 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 440 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 398 *api_features.GetFeature("storage"), | 441 *api_features.GetFeature("storage"), NULL, |
| 399 NULL, | 442 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), false)); |
| 400 Feature::BLESSED_EXTENSION_CONTEXT, | |
| 401 GURL())); | |
| 402 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 443 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 403 *api_features.GetFeature("storage"), | 444 *api_features.GetFeature("storage"), NULL, |
| 404 NULL, | 445 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), false)); |
| 405 Feature::UNBLESSED_EXTENSION_CONTEXT, | |
| 406 GURL())); | |
| 407 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 446 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 408 *api_features.GetFeature("storage"), | 447 *api_features.GetFeature("storage"), NULL, |
| 409 NULL, | 448 Feature::CONTENT_SCRIPT_CONTEXT, GURL(), false)); |
| 410 Feature::CONTENT_SCRIPT_CONTEXT, | |
| 411 GURL())); | |
| 412 | 449 |
| 413 // "extension" is partially unprivileged. | 450 // "extension" is partially unprivileged. |
| 414 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 451 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 415 *api_features.GetFeature("extension"), | 452 *api_features.GetFeature("extension"), NULL, |
| 416 NULL, | 453 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), false)); |
| 417 Feature::BLESSED_EXTENSION_CONTEXT, | |
| 418 GURL())); | |
| 419 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 454 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 420 *api_features.GetFeature("extension"), | 455 *api_features.GetFeature("extension"), NULL, |
| 421 NULL, | 456 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), false)); |
| 422 Feature::UNBLESSED_EXTENSION_CONTEXT, | |
| 423 GURL())); | |
| 424 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 457 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 425 *api_features.GetFeature("extension"), | 458 *api_features.GetFeature("extension"), NULL, |
| 426 NULL, | 459 Feature::CONTENT_SCRIPT_CONTEXT, GURL(), false)); |
| 427 Feature::CONTENT_SCRIPT_CONTEXT, | |
| 428 GURL())); | |
| 429 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 460 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 430 *api_features.GetFeature("extension.getURL"), | 461 *api_features.GetFeature("extension.getURL"), NULL, |
| 431 NULL, | 462 Feature::CONTENT_SCRIPT_CONTEXT, GURL(), false)); |
| 432 Feature::CONTENT_SCRIPT_CONTEXT, | |
| 433 GURL())); | |
| 434 | 463 |
| 435 // "history" is entirely privileged. | 464 // "history" is entirely privileged. |
| 436 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 465 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
| 437 *api_features.GetFeature("history"), | 466 *api_features.GetFeature("history"), NULL, |
| 438 NULL, | 467 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), false)); |
| 439 Feature::BLESSED_EXTENSION_CONTEXT, | |
| 440 GURL())); | |
| 441 EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext( | 468 EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext( |
| 442 *api_features.GetFeature("history"), | 469 *api_features.GetFeature("history"), NULL, |
| 443 NULL, | 470 Feature::UNBLESSED_EXTENSION_CONTEXT, GURL(), false)); |
| 444 Feature::UNBLESSED_EXTENSION_CONTEXT, | |
| 445 GURL())); | |
| 446 EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext( | 471 EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext( |
| 447 *api_features.GetFeature("history"), | 472 *api_features.GetFeature("history"), NULL, |
| 448 NULL, | 473 Feature::CONTENT_SCRIPT_CONTEXT, GURL(), false)); |
| 449 Feature::CONTENT_SCRIPT_CONTEXT, | |
| 450 GURL())); | |
| 451 } | 474 } |
| 452 | 475 |
| 453 scoped_refptr<Extension> CreateHostedApp() { | 476 scoped_refptr<Extension> CreateHostedApp() { |
| 454 base::DictionaryValue values; | 477 base::DictionaryValue values; |
| 455 values.SetString(manifest_keys::kName, "test"); | 478 values.SetString(manifest_keys::kName, "test"); |
| 456 values.SetString(manifest_keys::kVersion, "0.1"); | 479 values.SetString(manifest_keys::kVersion, "0.1"); |
| 457 values.Set(manifest_keys::kWebURLs, new base::ListValue()); | 480 values.Set(manifest_keys::kWebURLs, new base::ListValue()); |
| 458 values.SetString(manifest_keys::kLaunchWebURL, | 481 values.SetString(manifest_keys::kLaunchWebURL, |
| 459 "http://www.example.com"); | 482 "http://www.example.com"); |
| 460 std::string error; | 483 std::string error; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 497 return extension; | 520 return extension; |
| 498 } | 521 } |
| 499 | 522 |
| 500 TEST(ExtensionAPITest, HostedAppPermissions) { | 523 TEST(ExtensionAPITest, HostedAppPermissions) { |
| 501 scoped_refptr<Extension> extension = CreateHostedApp(); | 524 scoped_refptr<Extension> extension = CreateHostedApp(); |
| 502 | 525 |
| 503 std::unique_ptr<ExtensionAPI> extension_api( | 526 std::unique_ptr<ExtensionAPI> extension_api( |
| 504 ExtensionAPI::CreateWithDefaultConfiguration()); | 527 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 505 | 528 |
| 506 // "runtime" and "tabs" should not be available in hosted apps. | 529 // "runtime" and "tabs" should not be available in hosted apps. |
| 507 EXPECT_FALSE(extension_api->IsAvailable("runtime", | 530 EXPECT_FALSE(extension_api |
| 508 extension.get(), | 531 ->IsAvailable("runtime", extension.get(), |
| 509 Feature::BLESSED_EXTENSION_CONTEXT, | 532 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 510 GURL()).is_available()); | 533 false) |
| 511 EXPECT_FALSE(extension_api->IsAvailable("runtime.id", | 534 .is_available()); |
| 512 extension.get(), | 535 EXPECT_FALSE(extension_api |
| 513 Feature::BLESSED_EXTENSION_CONTEXT, | 536 ->IsAvailable("runtime.id", extension.get(), |
| 514 GURL()).is_available()); | 537 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 515 EXPECT_FALSE(extension_api->IsAvailable("runtime.sendMessage", | 538 false) |
| 516 extension.get(), | 539 .is_available()); |
| 517 Feature::BLESSED_EXTENSION_CONTEXT, | 540 EXPECT_FALSE(extension_api |
| 518 GURL()).is_available()); | 541 ->IsAvailable("runtime.sendMessage", extension.get(), |
| 519 EXPECT_FALSE(extension_api->IsAvailable("runtime.sendNativeMessage", | 542 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 520 extension.get(), | 543 false) |
| 521 Feature::BLESSED_EXTENSION_CONTEXT, | 544 .is_available()); |
| 522 GURL()).is_available()); | 545 EXPECT_FALSE(extension_api |
| 523 EXPECT_FALSE(extension_api->IsAvailable("tabs.create", | 546 ->IsAvailable("runtime.sendNativeMessage", extension.get(), |
| 524 extension.get(), | 547 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 525 Feature::BLESSED_EXTENSION_CONTEXT, | 548 false) |
| 526 GURL()).is_available()); | 549 .is_available()); |
| 550 EXPECT_FALSE(extension_api |
| 551 ->IsAvailable("tabs.create", extension.get(), |
| 552 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 553 false) |
| 554 .is_available()); |
| 527 } | 555 } |
| 528 | 556 |
| 529 TEST(ExtensionAPITest, AppAndFriendsAvailability) { | 557 TEST(ExtensionAPITest, AppAndFriendsAvailability) { |
| 530 std::unique_ptr<ExtensionAPI> extension_api( | 558 std::unique_ptr<ExtensionAPI> extension_api( |
| 531 ExtensionAPI::CreateWithDefaultConfiguration()); | 559 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 532 | 560 |
| 533 // Make sure chrome.app.runtime and chrome.app.window are available to apps, | 561 // Make sure chrome.app.runtime and chrome.app.window are available to apps, |
| 534 // and chrome.app is not. | 562 // and chrome.app is not. |
| 535 { | 563 { |
| 536 std::set<std::string> permissions; | 564 std::set<std::string> permissions; |
| 537 permissions.insert("app.runtime"); | 565 permissions.insert("app.runtime"); |
| 538 permissions.insert("app.window"); | 566 permissions.insert("app.window"); |
| 539 scoped_refptr<Extension> extension = | 567 scoped_refptr<Extension> extension = |
| 540 CreatePackagedAppWithPermissions(permissions); | 568 CreatePackagedAppWithPermissions(permissions); |
| 541 EXPECT_FALSE(extension_api->IsAvailable( | 569 EXPECT_FALSE(extension_api |
| 542 "app", | 570 ->IsAvailable("app", extension.get(), |
| 543 extension.get(), | 571 Feature::BLESSED_EXTENSION_CONTEXT, |
| 544 Feature::BLESSED_EXTENSION_CONTEXT, | 572 GURL("http://foo.com"), false) |
| 545 GURL("http://foo.com")).is_available()); | 573 .is_available()); |
| 546 EXPECT_TRUE(extension_api->IsAvailable( | 574 EXPECT_TRUE(extension_api |
| 547 "app.runtime", | 575 ->IsAvailable("app.runtime", extension.get(), |
| 548 extension.get(), | 576 Feature::BLESSED_EXTENSION_CONTEXT, |
| 549 Feature::BLESSED_EXTENSION_CONTEXT, | 577 GURL("http://foo.com"), false) |
| 550 GURL("http://foo.com")).is_available()); | 578 .is_available()); |
| 551 EXPECT_TRUE(extension_api->IsAvailable( | 579 EXPECT_TRUE(extension_api |
| 552 "app.window", | 580 ->IsAvailable("app.window", extension.get(), |
| 553 extension.get(), | 581 Feature::BLESSED_EXTENSION_CONTEXT, |
| 554 Feature::BLESSED_EXTENSION_CONTEXT, | 582 GURL("http://foo.com"), false) |
| 555 GURL("http://foo.com")).is_available()); | 583 .is_available()); |
| 556 } | 584 } |
| 557 // Make sure chrome.app.runtime and chrome.app.window are not available to | 585 // Make sure chrome.app.runtime and chrome.app.window are not available to |
| 558 // extensions, and chrome.app is. | 586 // extensions, and chrome.app is. |
| 559 { | 587 { |
| 560 std::set<std::string> permissions; | 588 std::set<std::string> permissions; |
| 561 scoped_refptr<Extension> extension = | 589 scoped_refptr<Extension> extension = |
| 562 CreateExtensionWithPermissions(permissions); | 590 CreateExtensionWithPermissions(permissions); |
| 563 EXPECT_TRUE(extension_api->IsAvailable( | 591 EXPECT_TRUE(extension_api |
| 564 "app", | 592 ->IsAvailable("app", extension.get(), |
| 565 extension.get(), | 593 Feature::BLESSED_EXTENSION_CONTEXT, |
| 566 Feature::BLESSED_EXTENSION_CONTEXT, | 594 GURL("http://foo.com"), false) |
| 567 GURL("http://foo.com")).is_available()); | 595 .is_available()); |
| 568 EXPECT_FALSE(extension_api->IsAvailable( | 596 EXPECT_FALSE(extension_api |
| 569 "app.runtime", | 597 ->IsAvailable("app.runtime", extension.get(), |
| 570 extension.get(), | 598 Feature::BLESSED_EXTENSION_CONTEXT, |
| 571 Feature::BLESSED_EXTENSION_CONTEXT, | 599 GURL("http://foo.com"), false) |
| 572 GURL("http://foo.com")).is_available()); | 600 .is_available()); |
| 573 EXPECT_FALSE(extension_api->IsAvailable( | 601 EXPECT_FALSE(extension_api |
| 574 "app.window", | 602 ->IsAvailable("app.window", extension.get(), |
| 575 extension.get(), | 603 Feature::BLESSED_EXTENSION_CONTEXT, |
| 576 Feature::BLESSED_EXTENSION_CONTEXT, | 604 GURL("http://foo.com"), false) |
| 577 GURL("http://foo.com")).is_available()); | 605 .is_available()); |
| 578 } | 606 } |
| 579 } | 607 } |
| 580 | 608 |
| 581 TEST(ExtensionAPITest, ExtensionWithDependencies) { | 609 TEST(ExtensionAPITest, ExtensionWithDependencies) { |
| 582 // Extension with the "ttsEngine" permission but not the "tts" permission; it | 610 // Extension with the "ttsEngine" permission but not the "tts" permission; it |
| 583 // should not automatically get "tts" permission. | 611 // should not automatically get "tts" permission. |
| 584 { | 612 { |
| 585 scoped_refptr<Extension> extension = | 613 scoped_refptr<Extension> extension = |
| 586 CreateExtensionWithPermission("ttsEngine"); | 614 CreateExtensionWithPermission("ttsEngine"); |
| 587 std::unique_ptr<ExtensionAPI> api( | 615 std::unique_ptr<ExtensionAPI> api( |
| 588 ExtensionAPI::CreateWithDefaultConfiguration()); | 616 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 589 EXPECT_TRUE(api->IsAvailable("ttsEngine", | 617 EXPECT_TRUE(api->IsAvailable("ttsEngine", extension.get(), |
| 590 extension.get(), | 618 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 591 Feature::BLESSED_EXTENSION_CONTEXT, | 619 false) |
| 592 GURL()).is_available()); | 620 .is_available()); |
| 593 EXPECT_FALSE(api->IsAvailable("tts", | 621 EXPECT_FALSE(api->IsAvailable("tts", extension.get(), |
| 594 extension.get(), | 622 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 595 Feature::BLESSED_EXTENSION_CONTEXT, | 623 false) |
| 596 GURL()).is_available()); | 624 .is_available()); |
| 597 } | 625 } |
| 598 | 626 |
| 599 // Conversely, extension with the "tts" permission but not the "ttsEngine" | 627 // Conversely, extension with the "tts" permission but not the "ttsEngine" |
| 600 // permission shouldn't get the "ttsEngine" permission. | 628 // permission shouldn't get the "ttsEngine" permission. |
| 601 { | 629 { |
| 602 scoped_refptr<Extension> extension = | 630 scoped_refptr<Extension> extension = |
| 603 CreateExtensionWithPermission("tts"); | 631 CreateExtensionWithPermission("tts"); |
| 604 std::unique_ptr<ExtensionAPI> api( | 632 std::unique_ptr<ExtensionAPI> api( |
| 605 ExtensionAPI::CreateWithDefaultConfiguration()); | 633 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 606 EXPECT_FALSE(api->IsAvailable("ttsEngine", | 634 EXPECT_FALSE(api->IsAvailable("ttsEngine", extension.get(), |
| 607 extension.get(), | 635 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 608 Feature::BLESSED_EXTENSION_CONTEXT, | 636 false) |
| 609 GURL()).is_available()); | 637 .is_available()); |
| 610 EXPECT_TRUE(api->IsAvailable("tts", | 638 EXPECT_TRUE(api->IsAvailable("tts", extension.get(), |
| 611 extension.get(), | 639 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 612 Feature::BLESSED_EXTENSION_CONTEXT, | 640 false) |
| 613 GURL()).is_available()); | 641 .is_available()); |
| 614 } | 642 } |
| 615 } | 643 } |
| 616 | 644 |
| 617 bool MatchesURL( | 645 bool MatchesURL( |
| 618 ExtensionAPI* api, const std::string& api_name, const std::string& url) { | 646 ExtensionAPI* api, const std::string& api_name, const std::string& url) { |
| 619 return api->IsAvailable( | 647 return api |
| 620 api_name, NULL, Feature::WEB_PAGE_CONTEXT, GURL(url)).is_available(); | 648 ->IsAvailable(api_name, NULL, Feature::WEB_PAGE_CONTEXT, GURL(url), false) |
| 649 .is_available(); |
| 621 } | 650 } |
| 622 | 651 |
| 623 TEST(ExtensionAPITest, URLMatching) { | 652 TEST(ExtensionAPITest, URLMatching) { |
| 624 std::unique_ptr<ExtensionAPI> api( | 653 std::unique_ptr<ExtensionAPI> api( |
| 625 ExtensionAPI::CreateWithDefaultConfiguration()); | 654 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 626 | 655 |
| 627 // "app" API is available to all URLs that content scripts can be injected. | 656 // "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")); | 657 EXPECT_TRUE(MatchesURL(api.get(), "app", "http://example.com/example.html")); |
| 629 EXPECT_TRUE(MatchesURL(api.get(), "app", "https://blah.net")); | 658 EXPECT_TRUE(MatchesURL(api.get(), "app", "https://blah.net")); |
| 630 EXPECT_TRUE(MatchesURL(api.get(), "app", "file://somefile.html")); | 659 EXPECT_TRUE(MatchesURL(api.get(), "app", "file://somefile.html")); |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 842 { "management.getPermissionWarningsById", false }, | 871 { "management.getPermissionWarningsById", false }, |
| 843 { "runtime.connectNative", false }, | 872 { "runtime.connectNative", false }, |
| 844 }; | 873 }; |
| 845 | 874 |
| 846 std::unique_ptr<ExtensionAPI> extension_api( | 875 std::unique_ptr<ExtensionAPI> extension_api( |
| 847 ExtensionAPI::CreateWithDefaultConfiguration()); | 876 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 848 scoped_refptr<Extension> extension = | 877 scoped_refptr<Extension> extension = |
| 849 BuildExtension(ExtensionBuilder()).Build(); | 878 BuildExtension(ExtensionBuilder()).Build(); |
| 850 | 879 |
| 851 for (size_t i = 0; i < arraysize(kTests); ++i) { | 880 for (size_t i = 0; i < arraysize(kTests); ++i) { |
| 852 EXPECT_EQ(kTests[i].expect_success, | 881 EXPECT_EQ( |
| 853 extension_api->IsAvailable(kTests[i].permission_name, | 882 kTests[i].expect_success, |
| 854 extension.get(), | 883 extension_api |
| 855 Feature::BLESSED_EXTENSION_CONTEXT, | 884 ->IsAvailable(kTests[i].permission_name, extension.get(), |
| 856 GURL()).is_available()) | 885 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), false) |
| 886 .is_available()) |
| 857 << "Permission being tested: " << kTests[i].permission_name; | 887 << "Permission being tested: " << kTests[i].permission_name; |
| 858 } | 888 } |
| 859 } | 889 } |
| 860 | 890 |
| 861 // Tests that permissions that require manifest keys are available when those | 891 // Tests that permissions that require manifest keys are available when those |
| 862 // keys are present. | 892 // keys are present. |
| 863 TEST(ExtensionAPITest, ManifestKeys) { | 893 TEST(ExtensionAPITest, ManifestKeys) { |
| 864 std::unique_ptr<ExtensionAPI> extension_api( | 894 std::unique_ptr<ExtensionAPI> extension_api( |
| 865 ExtensionAPI::CreateWithDefaultConfiguration()); | 895 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 866 | 896 |
| 867 scoped_refptr<Extension> extension = | 897 scoped_refptr<Extension> extension = |
| 868 BuildExtension(ExtensionBuilder()) | 898 BuildExtension(ExtensionBuilder()) |
| 869 .MergeManifest(DictionaryBuilder() | 899 .MergeManifest(DictionaryBuilder() |
| 870 .Set("browser_action", DictionaryBuilder().Build()) | 900 .Set("browser_action", DictionaryBuilder().Build()) |
| 871 .Build()) | 901 .Build()) |
| 872 .Build(); | 902 .Build(); |
| 873 | 903 |
| 874 EXPECT_TRUE(extension_api->IsAvailable("browserAction", | 904 EXPECT_TRUE(extension_api |
| 875 extension.get(), | 905 ->IsAvailable("browserAction", extension.get(), |
| 876 Feature::BLESSED_EXTENSION_CONTEXT, | 906 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 877 GURL()).is_available()); | 907 false) |
| 878 EXPECT_FALSE(extension_api->IsAvailable("pageAction", | 908 .is_available()); |
| 879 extension.get(), | 909 EXPECT_FALSE(extension_api |
| 880 Feature::BLESSED_EXTENSION_CONTEXT, | 910 ->IsAvailable("pageAction", extension.get(), |
| 881 GURL()).is_available()); | 911 Feature::BLESSED_EXTENSION_CONTEXT, GURL(), |
| 912 false) |
| 913 .is_available()); |
| 882 } | 914 } |
| 883 | 915 |
| 884 } // namespace extensions | 916 } // namespace extensions |
| OLD | NEW |