Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(209)

Side by Side Diff: chrome/common/extensions/api/common_extension_api_unittest.cc

Issue 2494653005: Support API aliases (Closed)
Patch Set: . Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « chrome/common/extensions/api/_features.md ('k') | chrome/test/data/extensions/extension_api_unittest/api_features.json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698