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 <string> | 10 #include <string> |
10 #include <utility> | 11 #include <utility> |
11 #include <vector> | 12 #include <vector> |
12 | 13 |
13 #include "base/files/file_path.h" | 14 #include "base/files/file_path.h" |
14 #include "base/files/file_util.h" | 15 #include "base/files/file_util.h" |
15 #include "base/json/json_reader.h" | 16 #include "base/json/json_reader.h" |
16 #include "base/json/json_writer.h" | 17 #include "base/json/json_writer.h" |
17 #include "base/macros.h" | 18 #include "base/macros.h" |
18 #include "base/memory/ref_counted.h" | 19 #include "base/memory/ref_counted.h" |
19 #include "base/memory/scoped_ptr.h" | |
20 #include "base/path_service.h" | 20 #include "base/path_service.h" |
21 #include "base/strings/stringprintf.h" | 21 #include "base/strings/stringprintf.h" |
22 #include "base/values.h" | 22 #include "base/values.h" |
23 #include "chrome/common/chrome_paths.h" | 23 #include "chrome/common/chrome_paths.h" |
24 #include "extensions/common/extension.h" | 24 #include "extensions/common/extension.h" |
25 #include "extensions/common/extension_builder.h" | 25 #include "extensions/common/extension_builder.h" |
26 #include "extensions/common/features/api_feature.h" | 26 #include "extensions/common/features/api_feature.h" |
27 #include "extensions/common/features/base_feature_provider.h" | 27 #include "extensions/common/features/base_feature_provider.h" |
28 #include "extensions/common/features/simple_feature.h" | 28 #include "extensions/common/features/simple_feature.h" |
29 #include "extensions/common/manifest.h" | 29 #include "extensions/common/manifest.h" |
30 #include "extensions/common/manifest_constants.h" | 30 #include "extensions/common/manifest_constants.h" |
31 #include "extensions/common/test_util.h" | 31 #include "extensions/common/test_util.h" |
32 #include "extensions/common/value_builder.h" | 32 #include "extensions/common/value_builder.h" |
33 #include "testing/gtest/include/gtest/gtest.h" | 33 #include "testing/gtest/include/gtest/gtest.h" |
34 | 34 |
35 namespace extensions { | 35 namespace extensions { |
36 | 36 |
37 using test_util::BuildExtension; | 37 using test_util::BuildExtension; |
38 | 38 |
39 SimpleFeature* CreateAPIFeature() { | 39 SimpleFeature* CreateAPIFeature() { |
40 return new APIFeature(); | 40 return new APIFeature(); |
41 } | 41 } |
42 | 42 |
43 TEST(ExtensionAPITest, Creation) { | 43 TEST(ExtensionAPITest, Creation) { |
44 ExtensionAPI* shared_instance = ExtensionAPI::GetSharedInstance(); | 44 ExtensionAPI* shared_instance = ExtensionAPI::GetSharedInstance(); |
45 EXPECT_EQ(shared_instance, ExtensionAPI::GetSharedInstance()); | 45 EXPECT_EQ(shared_instance, ExtensionAPI::GetSharedInstance()); |
46 | 46 |
47 scoped_ptr<ExtensionAPI> new_instance( | 47 std::unique_ptr<ExtensionAPI> new_instance( |
48 ExtensionAPI::CreateWithDefaultConfiguration()); | 48 ExtensionAPI::CreateWithDefaultConfiguration()); |
49 EXPECT_NE(new_instance.get(), | 49 EXPECT_NE(new_instance.get(), |
50 scoped_ptr<ExtensionAPI>( | 50 std::unique_ptr<ExtensionAPI>( |
51 ExtensionAPI::CreateWithDefaultConfiguration()).get()); | 51 ExtensionAPI::CreateWithDefaultConfiguration()) |
| 52 .get()); |
52 | 53 |
53 ExtensionAPI empty_instance; | 54 ExtensionAPI empty_instance; |
54 | 55 |
55 struct { | 56 struct { |
56 ExtensionAPI* api; | 57 ExtensionAPI* api; |
57 bool expect_populated; | 58 bool expect_populated; |
58 } test_data[] = { | 59 } test_data[] = { |
59 { shared_instance, true }, | 60 { shared_instance, true }, |
60 { new_instance.get(), true }, | 61 { new_instance.get(), true }, |
61 { &empty_instance, false } | 62 { &empty_instance, false } |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
166 base::FilePath api_features_path; | 167 base::FilePath api_features_path; |
167 PathService::Get(chrome::DIR_TEST_DATA, &api_features_path); | 168 PathService::Get(chrome::DIR_TEST_DATA, &api_features_path); |
168 api_features_path = api_features_path.AppendASCII("extensions") | 169 api_features_path = api_features_path.AppendASCII("extensions") |
169 .AppendASCII("extension_api_unittest") | 170 .AppendASCII("extension_api_unittest") |
170 .AppendASCII("api_features.json"); | 171 .AppendASCII("api_features.json"); |
171 | 172 |
172 std::string api_features_str; | 173 std::string api_features_str; |
173 ASSERT_TRUE(base::ReadFileToString( | 174 ASSERT_TRUE(base::ReadFileToString( |
174 api_features_path, &api_features_str)) << "api_features.json"; | 175 api_features_path, &api_features_str)) << "api_features.json"; |
175 | 176 |
176 scoped_ptr<base::DictionaryValue> value(static_cast<base::DictionaryValue*>( | 177 std::unique_ptr<base::DictionaryValue> value( |
177 base::JSONReader::Read(api_features_str).release())); | 178 static_cast<base::DictionaryValue*>( |
| 179 base::JSONReader::Read(api_features_str).release())); |
178 BaseFeatureProvider api_feature_provider(*value, CreateAPIFeature); | 180 BaseFeatureProvider api_feature_provider(*value, CreateAPIFeature); |
179 | 181 |
180 for (size_t i = 0; i < arraysize(test_data); ++i) { | 182 for (size_t i = 0; i < arraysize(test_data); ++i) { |
181 ExtensionAPI api; | 183 ExtensionAPI api; |
182 api.RegisterDependencyProvider("api", &api_feature_provider); | 184 api.RegisterDependencyProvider("api", &api_feature_provider); |
183 for (base::DictionaryValue::Iterator iter(*value); !iter.IsAtEnd(); | 185 for (base::DictionaryValue::Iterator iter(*value); !iter.IsAtEnd(); |
184 iter.Advance()) { | 186 iter.Advance()) { |
185 if (iter.key().find(".") == std::string::npos) | 187 if (iter.key().find(".") == std::string::npos) |
186 api.RegisterSchemaResource(iter.key(), 0); | 188 api.RegisterSchemaResource(iter.key(), 0); |
187 } | 189 } |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 base::FilePath api_features_path; | 261 base::FilePath api_features_path; |
260 PathService::Get(chrome::DIR_TEST_DATA, &api_features_path); | 262 PathService::Get(chrome::DIR_TEST_DATA, &api_features_path); |
261 api_features_path = api_features_path.AppendASCII("extensions") | 263 api_features_path = api_features_path.AppendASCII("extensions") |
262 .AppendASCII("extension_api_unittest") | 264 .AppendASCII("extension_api_unittest") |
263 .AppendASCII("api_features.json"); | 265 .AppendASCII("api_features.json"); |
264 | 266 |
265 std::string api_features_str; | 267 std::string api_features_str; |
266 ASSERT_TRUE(base::ReadFileToString( | 268 ASSERT_TRUE(base::ReadFileToString( |
267 api_features_path, &api_features_str)) << "api_features.json"; | 269 api_features_path, &api_features_str)) << "api_features.json"; |
268 | 270 |
269 scoped_ptr<base::DictionaryValue> value(static_cast<base::DictionaryValue*>( | 271 std::unique_ptr<base::DictionaryValue> value( |
270 base::JSONReader::Read(api_features_str).release())); | 272 static_cast<base::DictionaryValue*>( |
| 273 base::JSONReader::Read(api_features_str).release())); |
271 BaseFeatureProvider api_feature_provider(*value, CreateAPIFeature); | 274 BaseFeatureProvider api_feature_provider(*value, CreateAPIFeature); |
272 | 275 |
273 for (size_t i = 0; i < arraysize(test_data); ++i) { | 276 for (size_t i = 0; i < arraysize(test_data); ++i) { |
274 ExtensionAPI api; | 277 ExtensionAPI api; |
275 api.RegisterDependencyProvider("api", &api_feature_provider); | 278 api.RegisterDependencyProvider("api", &api_feature_provider); |
276 for (base::DictionaryValue::Iterator iter(*value); !iter.IsAtEnd(); | 279 for (base::DictionaryValue::Iterator iter(*value); !iter.IsAtEnd(); |
277 iter.Advance()) { | 280 iter.Advance()) { |
278 if (iter.key().find(".") == std::string::npos) | 281 if (iter.key().find(".") == std::string::npos) |
279 api.RegisterSchemaResource(iter.key(), 0); | 282 api.RegisterSchemaResource(iter.key(), 0); |
280 } | 283 } |
281 | 284 |
282 Feature* test_feature = | 285 Feature* test_feature = |
283 api_feature_provider.GetFeature(test_data[i].api_full_name); | 286 api_feature_provider.GetFeature(test_data[i].api_full_name); |
284 ASSERT_TRUE(test_feature); | 287 ASSERT_TRUE(test_feature); |
285 EXPECT_EQ(test_data[i].expect_is_available, | 288 EXPECT_EQ(test_data[i].expect_is_available, |
286 api.IsAnyFeatureAvailableToContext(*test_feature, | 289 api.IsAnyFeatureAvailableToContext(*test_feature, |
287 test_data[i].extension, | 290 test_data[i].extension, |
288 test_data[i].context, | 291 test_data[i].context, |
289 test_data[i].url)) | 292 test_data[i].url)) |
290 << i; | 293 << i; |
291 } | 294 } |
292 } | 295 } |
293 | 296 |
294 TEST(ExtensionAPITest, LazyGetSchema) { | 297 TEST(ExtensionAPITest, LazyGetSchema) { |
295 scoped_ptr<ExtensionAPI> apis(ExtensionAPI::CreateWithDefaultConfiguration()); | 298 std::unique_ptr<ExtensionAPI> apis( |
| 299 ExtensionAPI::CreateWithDefaultConfiguration()); |
296 | 300 |
297 EXPECT_EQ(NULL, apis->GetSchema(std::string())); | 301 EXPECT_EQ(NULL, apis->GetSchema(std::string())); |
298 EXPECT_EQ(NULL, apis->GetSchema(std::string())); | 302 EXPECT_EQ(NULL, apis->GetSchema(std::string())); |
299 EXPECT_EQ(NULL, apis->GetSchema("experimental")); | 303 EXPECT_EQ(NULL, apis->GetSchema("experimental")); |
300 EXPECT_EQ(NULL, apis->GetSchema("experimental")); | 304 EXPECT_EQ(NULL, apis->GetSchema("experimental")); |
301 EXPECT_EQ(NULL, apis->GetSchema("foo")); | 305 EXPECT_EQ(NULL, apis->GetSchema("foo")); |
302 EXPECT_EQ(NULL, apis->GetSchema("foo")); | 306 EXPECT_EQ(NULL, apis->GetSchema("foo")); |
303 | 307 |
304 EXPECT_TRUE(apis->GetSchema("dns")); | 308 EXPECT_TRUE(apis->GetSchema("dns")); |
305 EXPECT_TRUE(apis->GetSchema("dns")); | 309 EXPECT_TRUE(apis->GetSchema("dns")); |
306 EXPECT_TRUE(apis->GetSchema("extension")); | 310 EXPECT_TRUE(apis->GetSchema("extension")); |
307 EXPECT_TRUE(apis->GetSchema("extension")); | 311 EXPECT_TRUE(apis->GetSchema("extension")); |
308 EXPECT_TRUE(apis->GetSchema("omnibox")); | 312 EXPECT_TRUE(apis->GetSchema("omnibox")); |
309 EXPECT_TRUE(apis->GetSchema("omnibox")); | 313 EXPECT_TRUE(apis->GetSchema("omnibox")); |
310 EXPECT_TRUE(apis->GetSchema("storage")); | 314 EXPECT_TRUE(apis->GetSchema("storage")); |
311 EXPECT_TRUE(apis->GetSchema("storage")); | 315 EXPECT_TRUE(apis->GetSchema("storage")); |
312 } | 316 } |
313 | 317 |
314 scoped_refptr<Extension> CreateExtensionWithPermissions( | 318 scoped_refptr<Extension> CreateExtensionWithPermissions( |
315 const std::set<std::string>& permissions) { | 319 const std::set<std::string>& permissions) { |
316 base::DictionaryValue manifest; | 320 base::DictionaryValue manifest; |
317 manifest.SetString("name", "extension"); | 321 manifest.SetString("name", "extension"); |
318 manifest.SetString("version", "1.0"); | 322 manifest.SetString("version", "1.0"); |
319 manifest.SetInteger("manifest_version", 2); | 323 manifest.SetInteger("manifest_version", 2); |
320 { | 324 { |
321 scoped_ptr<base::ListValue> permissions_list(new base::ListValue()); | 325 std::unique_ptr<base::ListValue> permissions_list(new base::ListValue()); |
322 for (std::set<std::string>::const_iterator i = permissions.begin(); | 326 for (std::set<std::string>::const_iterator i = permissions.begin(); |
323 i != permissions.end(); ++i) { | 327 i != permissions.end(); ++i) { |
324 permissions_list->Append(new base::StringValue(*i)); | 328 permissions_list->Append(new base::StringValue(*i)); |
325 } | 329 } |
326 manifest.Set("permissions", permissions_list.release()); | 330 manifest.Set("permissions", permissions_list.release()); |
327 } | 331 } |
328 | 332 |
329 std::string error; | 333 std::string error; |
330 scoped_refptr<Extension> extension(Extension::Create( | 334 scoped_refptr<Extension> extension(Extension::Create( |
331 base::FilePath(), Manifest::UNPACKED, | 335 base::FilePath(), Manifest::UNPACKED, |
(...skipping 13 matching lines...) Expand all Loading... |
345 | 349 |
346 TEST(ExtensionAPITest, ExtensionWithUnprivilegedAPIs) { | 350 TEST(ExtensionAPITest, ExtensionWithUnprivilegedAPIs) { |
347 scoped_refptr<Extension> extension; | 351 scoped_refptr<Extension> extension; |
348 { | 352 { |
349 std::set<std::string> permissions; | 353 std::set<std::string> permissions; |
350 permissions.insert("storage"); | 354 permissions.insert("storage"); |
351 permissions.insert("history"); | 355 permissions.insert("history"); |
352 extension = CreateExtensionWithPermissions(permissions); | 356 extension = CreateExtensionWithPermissions(permissions); |
353 } | 357 } |
354 | 358 |
355 scoped_ptr<ExtensionAPI> extension_api( | 359 std::unique_ptr<ExtensionAPI> extension_api( |
356 ExtensionAPI::CreateWithDefaultConfiguration()); | 360 ExtensionAPI::CreateWithDefaultConfiguration()); |
357 | 361 |
358 const FeatureProvider& api_features = *FeatureProvider::GetAPIFeatures(); | 362 const FeatureProvider& api_features = *FeatureProvider::GetAPIFeatures(); |
359 | 363 |
360 // "storage" is completely unprivileged. | 364 // "storage" is completely unprivileged. |
361 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( | 365 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( |
362 *api_features.GetFeature("storage"), | 366 *api_features.GetFeature("storage"), |
363 NULL, | 367 NULL, |
364 Feature::BLESSED_EXTENSION_CONTEXT, | 368 Feature::BLESSED_EXTENSION_CONTEXT, |
365 GURL())); | 369 GURL())); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 "http://www.example.com"); | 442 "http://www.example.com"); |
439 | 443 |
440 base::DictionaryValue* app = new base::DictionaryValue(); | 444 base::DictionaryValue* app = new base::DictionaryValue(); |
441 base::DictionaryValue* background = new base::DictionaryValue(); | 445 base::DictionaryValue* background = new base::DictionaryValue(); |
442 base::ListValue* scripts = new base::ListValue(); | 446 base::ListValue* scripts = new base::ListValue(); |
443 scripts->Append(new base::StringValue("test.js")); | 447 scripts->Append(new base::StringValue("test.js")); |
444 background->Set("scripts", scripts); | 448 background->Set("scripts", scripts); |
445 app->Set("background", background); | 449 app->Set("background", background); |
446 values.Set(manifest_keys::kApp, app); | 450 values.Set(manifest_keys::kApp, app); |
447 { | 451 { |
448 scoped_ptr<base::ListValue> permissions_list(new base::ListValue()); | 452 std::unique_ptr<base::ListValue> permissions_list(new base::ListValue()); |
449 for (std::set<std::string>::const_iterator i = permissions.begin(); | 453 for (std::set<std::string>::const_iterator i = permissions.begin(); |
450 i != permissions.end(); ++i) { | 454 i != permissions.end(); ++i) { |
451 permissions_list->Append(new base::StringValue(*i)); | 455 permissions_list->Append(new base::StringValue(*i)); |
452 } | 456 } |
453 values.Set("permissions", permissions_list.release()); | 457 values.Set("permissions", permissions_list.release()); |
454 } | 458 } |
455 | 459 |
456 std::string error; | 460 std::string error; |
457 scoped_refptr<Extension> extension(Extension::Create( | 461 scoped_refptr<Extension> extension(Extension::Create( |
458 base::FilePath(), Manifest::INTERNAL, values, Extension::NO_FLAGS, | 462 base::FilePath(), Manifest::INTERNAL, values, Extension::NO_FLAGS, |
459 &error)); | 463 &error)); |
460 CHECK(extension.get()) << error; | 464 CHECK(extension.get()) << error; |
461 return extension; | 465 return extension; |
462 } | 466 } |
463 | 467 |
464 TEST(ExtensionAPITest, HostedAppPermissions) { | 468 TEST(ExtensionAPITest, HostedAppPermissions) { |
465 scoped_refptr<Extension> extension = CreateHostedApp(); | 469 scoped_refptr<Extension> extension = CreateHostedApp(); |
466 | 470 |
467 scoped_ptr<ExtensionAPI> extension_api( | 471 std::unique_ptr<ExtensionAPI> extension_api( |
468 ExtensionAPI::CreateWithDefaultConfiguration()); | 472 ExtensionAPI::CreateWithDefaultConfiguration()); |
469 | 473 |
470 // "runtime" and "tabs" should not be available in hosted apps. | 474 // "runtime" and "tabs" should not be available in hosted apps. |
471 EXPECT_FALSE(extension_api->IsAvailable("runtime", | 475 EXPECT_FALSE(extension_api->IsAvailable("runtime", |
472 extension.get(), | 476 extension.get(), |
473 Feature::BLESSED_EXTENSION_CONTEXT, | 477 Feature::BLESSED_EXTENSION_CONTEXT, |
474 GURL()).is_available()); | 478 GURL()).is_available()); |
475 EXPECT_FALSE(extension_api->IsAvailable("runtime.id", | 479 EXPECT_FALSE(extension_api->IsAvailable("runtime.id", |
476 extension.get(), | 480 extension.get(), |
477 Feature::BLESSED_EXTENSION_CONTEXT, | 481 Feature::BLESSED_EXTENSION_CONTEXT, |
478 GURL()).is_available()); | 482 GURL()).is_available()); |
479 EXPECT_FALSE(extension_api->IsAvailable("runtime.sendMessage", | 483 EXPECT_FALSE(extension_api->IsAvailable("runtime.sendMessage", |
480 extension.get(), | 484 extension.get(), |
481 Feature::BLESSED_EXTENSION_CONTEXT, | 485 Feature::BLESSED_EXTENSION_CONTEXT, |
482 GURL()).is_available()); | 486 GURL()).is_available()); |
483 EXPECT_FALSE(extension_api->IsAvailable("runtime.sendNativeMessage", | 487 EXPECT_FALSE(extension_api->IsAvailable("runtime.sendNativeMessage", |
484 extension.get(), | 488 extension.get(), |
485 Feature::BLESSED_EXTENSION_CONTEXT, | 489 Feature::BLESSED_EXTENSION_CONTEXT, |
486 GURL()).is_available()); | 490 GURL()).is_available()); |
487 EXPECT_FALSE(extension_api->IsAvailable("tabs.create", | 491 EXPECT_FALSE(extension_api->IsAvailable("tabs.create", |
488 extension.get(), | 492 extension.get(), |
489 Feature::BLESSED_EXTENSION_CONTEXT, | 493 Feature::BLESSED_EXTENSION_CONTEXT, |
490 GURL()).is_available()); | 494 GURL()).is_available()); |
491 } | 495 } |
492 | 496 |
493 TEST(ExtensionAPITest, AppAndFriendsAvailability) { | 497 TEST(ExtensionAPITest, AppAndFriendsAvailability) { |
494 | 498 std::unique_ptr<ExtensionAPI> extension_api( |
495 scoped_ptr<ExtensionAPI> extension_api( | |
496 ExtensionAPI::CreateWithDefaultConfiguration()); | 499 ExtensionAPI::CreateWithDefaultConfiguration()); |
497 | 500 |
498 // Make sure chrome.app.runtime and chrome.app.window are available to apps, | 501 // Make sure chrome.app.runtime and chrome.app.window are available to apps, |
499 // and chrome.app is not. | 502 // and chrome.app is not. |
500 { | 503 { |
501 std::set<std::string> permissions; | 504 std::set<std::string> permissions; |
502 permissions.insert("app.runtime"); | 505 permissions.insert("app.runtime"); |
503 permissions.insert("app.window"); | 506 permissions.insert("app.window"); |
504 scoped_refptr<Extension> extension = | 507 scoped_refptr<Extension> extension = |
505 CreatePackagedAppWithPermissions(permissions); | 508 CreatePackagedAppWithPermissions(permissions); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
542 GURL("http://foo.com")).is_available()); | 545 GURL("http://foo.com")).is_available()); |
543 } | 546 } |
544 } | 547 } |
545 | 548 |
546 TEST(ExtensionAPITest, ExtensionWithDependencies) { | 549 TEST(ExtensionAPITest, ExtensionWithDependencies) { |
547 // Extension with the "ttsEngine" permission but not the "tts" permission; it | 550 // Extension with the "ttsEngine" permission but not the "tts" permission; it |
548 // should not automatically get "tts" permission. | 551 // should not automatically get "tts" permission. |
549 { | 552 { |
550 scoped_refptr<Extension> extension = | 553 scoped_refptr<Extension> extension = |
551 CreateExtensionWithPermission("ttsEngine"); | 554 CreateExtensionWithPermission("ttsEngine"); |
552 scoped_ptr<ExtensionAPI> api( | 555 std::unique_ptr<ExtensionAPI> api( |
553 ExtensionAPI::CreateWithDefaultConfiguration()); | 556 ExtensionAPI::CreateWithDefaultConfiguration()); |
554 EXPECT_TRUE(api->IsAvailable("ttsEngine", | 557 EXPECT_TRUE(api->IsAvailable("ttsEngine", |
555 extension.get(), | 558 extension.get(), |
556 Feature::BLESSED_EXTENSION_CONTEXT, | 559 Feature::BLESSED_EXTENSION_CONTEXT, |
557 GURL()).is_available()); | 560 GURL()).is_available()); |
558 EXPECT_FALSE(api->IsAvailable("tts", | 561 EXPECT_FALSE(api->IsAvailable("tts", |
559 extension.get(), | 562 extension.get(), |
560 Feature::BLESSED_EXTENSION_CONTEXT, | 563 Feature::BLESSED_EXTENSION_CONTEXT, |
561 GURL()).is_available()); | 564 GURL()).is_available()); |
562 } | 565 } |
563 | 566 |
564 // Conversely, extension with the "tts" permission but not the "ttsEngine" | 567 // Conversely, extension with the "tts" permission but not the "ttsEngine" |
565 // permission shouldn't get the "ttsEngine" permission. | 568 // permission shouldn't get the "ttsEngine" permission. |
566 { | 569 { |
567 scoped_refptr<Extension> extension = | 570 scoped_refptr<Extension> extension = |
568 CreateExtensionWithPermission("tts"); | 571 CreateExtensionWithPermission("tts"); |
569 scoped_ptr<ExtensionAPI> api( | 572 std::unique_ptr<ExtensionAPI> api( |
570 ExtensionAPI::CreateWithDefaultConfiguration()); | 573 ExtensionAPI::CreateWithDefaultConfiguration()); |
571 EXPECT_FALSE(api->IsAvailable("ttsEngine", | 574 EXPECT_FALSE(api->IsAvailable("ttsEngine", |
572 extension.get(), | 575 extension.get(), |
573 Feature::BLESSED_EXTENSION_CONTEXT, | 576 Feature::BLESSED_EXTENSION_CONTEXT, |
574 GURL()).is_available()); | 577 GURL()).is_available()); |
575 EXPECT_TRUE(api->IsAvailable("tts", | 578 EXPECT_TRUE(api->IsAvailable("tts", |
576 extension.get(), | 579 extension.get(), |
577 Feature::BLESSED_EXTENSION_CONTEXT, | 580 Feature::BLESSED_EXTENSION_CONTEXT, |
578 GURL()).is_available()); | 581 GURL()).is_available()); |
579 } | 582 } |
580 } | 583 } |
581 | 584 |
582 bool MatchesURL( | 585 bool MatchesURL( |
583 ExtensionAPI* api, const std::string& api_name, const std::string& url) { | 586 ExtensionAPI* api, const std::string& api_name, const std::string& url) { |
584 return api->IsAvailable( | 587 return api->IsAvailable( |
585 api_name, NULL, Feature::WEB_PAGE_CONTEXT, GURL(url)).is_available(); | 588 api_name, NULL, Feature::WEB_PAGE_CONTEXT, GURL(url)).is_available(); |
586 } | 589 } |
587 | 590 |
588 TEST(ExtensionAPITest, URLMatching) { | 591 TEST(ExtensionAPITest, URLMatching) { |
589 scoped_ptr<ExtensionAPI> api(ExtensionAPI::CreateWithDefaultConfiguration()); | 592 std::unique_ptr<ExtensionAPI> api( |
| 593 ExtensionAPI::CreateWithDefaultConfiguration()); |
590 | 594 |
591 // "app" API is available to all URLs that content scripts can be injected. | 595 // "app" API is available to all URLs that content scripts can be injected. |
592 EXPECT_TRUE(MatchesURL(api.get(), "app", "http://example.com/example.html")); | 596 EXPECT_TRUE(MatchesURL(api.get(), "app", "http://example.com/example.html")); |
593 EXPECT_TRUE(MatchesURL(api.get(), "app", "https://blah.net")); | 597 EXPECT_TRUE(MatchesURL(api.get(), "app", "https://blah.net")); |
594 EXPECT_TRUE(MatchesURL(api.get(), "app", "file://somefile.html")); | 598 EXPECT_TRUE(MatchesURL(api.get(), "app", "file://somefile.html")); |
595 | 599 |
596 // Also to internal URLs. | 600 // Also to internal URLs. |
597 EXPECT_TRUE(MatchesURL(api.get(), "app", "about:flags")); | 601 EXPECT_TRUE(MatchesURL(api.get(), "app", "about:flags")); |
598 EXPECT_TRUE(MatchesURL(api.get(), "app", "chrome://flags")); | 602 EXPECT_TRUE(MatchesURL(api.get(), "app", "chrome://flags")); |
599 | 603 |
(...skipping 23 matching lines...) Expand all Loading... |
623 { "bookmarks", "bookmarks", "" }, | 627 { "bookmarks", "bookmarks", "" }, |
624 { "bookmarks.", "bookmarks", "" }, | 628 { "bookmarks.", "bookmarks", "" }, |
625 { ".bookmarks", "", "" }, | 629 { ".bookmarks", "", "" }, |
626 { "bookmarks.create", "bookmarks", "create" }, | 630 { "bookmarks.create", "bookmarks", "create" }, |
627 { "bookmarks.create.", "bookmarks", "create." }, | 631 { "bookmarks.create.", "bookmarks", "create." }, |
628 { "bookmarks.create.monkey", "bookmarks", "create.monkey" }, | 632 { "bookmarks.create.monkey", "bookmarks", "create.monkey" }, |
629 { "bookmarkManagerPrivate", "bookmarkManagerPrivate", "" }, | 633 { "bookmarkManagerPrivate", "bookmarkManagerPrivate", "" }, |
630 { "bookmarkManagerPrivate.copy", "bookmarkManagerPrivate", "copy" } | 634 { "bookmarkManagerPrivate.copy", "bookmarkManagerPrivate", "copy" } |
631 }; | 635 }; |
632 | 636 |
633 scoped_ptr<ExtensionAPI> api(ExtensionAPI::CreateWithDefaultConfiguration()); | 637 std::unique_ptr<ExtensionAPI> api( |
| 638 ExtensionAPI::CreateWithDefaultConfiguration()); |
634 for (size_t i = 0; i < arraysize(test_data); ++i) { | 639 for (size_t i = 0; i < arraysize(test_data); ++i) { |
635 std::string child_name; | 640 std::string child_name; |
636 std::string api_name = api->GetAPINameFromFullName(test_data[i].input, | 641 std::string api_name = api->GetAPINameFromFullName(test_data[i].input, |
637 &child_name); | 642 &child_name); |
638 EXPECT_EQ(test_data[i].api_name, api_name) << test_data[i].input; | 643 EXPECT_EQ(test_data[i].api_name, api_name) << test_data[i].input; |
639 EXPECT_EQ(test_data[i].child_name, child_name) << test_data[i].input; | 644 EXPECT_EQ(test_data[i].child_name, child_name) << test_data[i].input; |
640 } | 645 } |
641 } | 646 } |
642 | 647 |
643 TEST(ExtensionAPITest, DefaultConfigurationFeatures) { | 648 TEST(ExtensionAPITest, DefaultConfigurationFeatures) { |
644 scoped_ptr<ExtensionAPI> api(ExtensionAPI::CreateWithDefaultConfiguration()); | 649 std::unique_ptr<ExtensionAPI> api( |
| 650 ExtensionAPI::CreateWithDefaultConfiguration()); |
645 | 651 |
646 SimpleFeature* bookmarks = static_cast<SimpleFeature*>( | 652 SimpleFeature* bookmarks = static_cast<SimpleFeature*>( |
647 api->GetFeatureDependency("api:bookmarks")); | 653 api->GetFeatureDependency("api:bookmarks")); |
648 SimpleFeature* bookmarks_create = static_cast<SimpleFeature*>( | 654 SimpleFeature* bookmarks_create = static_cast<SimpleFeature*>( |
649 api->GetFeatureDependency("api:bookmarks.create")); | 655 api->GetFeatureDependency("api:bookmarks.create")); |
650 | 656 |
651 struct { | 657 struct { |
652 SimpleFeature* feature; | 658 SimpleFeature* feature; |
653 // TODO(aa): More stuff to test over time. | 659 // TODO(aa): More stuff to test over time. |
654 } test_data[] = { | 660 } test_data[] = { |
(...skipping 10 matching lines...) Expand all Loading... |
665 | 671 |
666 EXPECT_EQ(SimpleFeature::UNSPECIFIED_LOCATION, feature->location()); | 672 EXPECT_EQ(SimpleFeature::UNSPECIFIED_LOCATION, feature->location()); |
667 EXPECT_TRUE(feature->platforms()->empty()); | 673 EXPECT_TRUE(feature->platforms()->empty()); |
668 EXPECT_EQ(0, feature->min_manifest_version()); | 674 EXPECT_EQ(0, feature->min_manifest_version()); |
669 EXPECT_EQ(0, feature->max_manifest_version()); | 675 EXPECT_EQ(0, feature->max_manifest_version()); |
670 } | 676 } |
671 } | 677 } |
672 | 678 |
673 TEST(ExtensionAPITest, FeaturesRequireContexts) { | 679 TEST(ExtensionAPITest, FeaturesRequireContexts) { |
674 // TODO(cduvall): Make this check API featues. | 680 // TODO(cduvall): Make this check API featues. |
675 scoped_ptr<base::DictionaryValue> api_features1(new base::DictionaryValue()); | 681 std::unique_ptr<base::DictionaryValue> api_features1( |
676 scoped_ptr<base::DictionaryValue> api_features2(new base::DictionaryValue()); | 682 new base::DictionaryValue()); |
| 683 std::unique_ptr<base::DictionaryValue> api_features2( |
| 684 new base::DictionaryValue()); |
677 base::DictionaryValue* test1 = new base::DictionaryValue(); | 685 base::DictionaryValue* test1 = new base::DictionaryValue(); |
678 base::DictionaryValue* test2 = new base::DictionaryValue(); | 686 base::DictionaryValue* test2 = new base::DictionaryValue(); |
679 base::ListValue* contexts = new base::ListValue(); | 687 base::ListValue* contexts = new base::ListValue(); |
680 contexts->Append(new base::StringValue("content_script")); | 688 contexts->Append(new base::StringValue("content_script")); |
681 test1->Set("contexts", contexts); | 689 test1->Set("contexts", contexts); |
682 test1->SetString("channel", "stable"); | 690 test1->SetString("channel", "stable"); |
683 test2->SetString("channel", "stable"); | 691 test2->SetString("channel", "stable"); |
684 api_features1->Set("test", test1); | 692 api_features1->Set("test", test1); |
685 api_features2->Set("test", test2); | 693 api_features2->Set("test", test2); |
686 | 694 |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 { "app.getIsInstalled", true }, | 816 { "app.getIsInstalled", true }, |
809 { "app.installState", true }, | 817 { "app.installState", true }, |
810 { "app.runningState", true }, | 818 { "app.runningState", true }, |
811 { "management.getPermissionWarningsByManifest", true }, | 819 { "management.getPermissionWarningsByManifest", true }, |
812 { "management.uninstallSelf", true }, | 820 { "management.uninstallSelf", true }, |
813 // But other functions in those modules do. | 821 // But other functions in those modules do. |
814 { "management.getPermissionWarningsById", false }, | 822 { "management.getPermissionWarningsById", false }, |
815 { "runtime.connectNative", false }, | 823 { "runtime.connectNative", false }, |
816 }; | 824 }; |
817 | 825 |
818 scoped_ptr<ExtensionAPI> extension_api( | 826 std::unique_ptr<ExtensionAPI> extension_api( |
819 ExtensionAPI::CreateWithDefaultConfiguration()); | 827 ExtensionAPI::CreateWithDefaultConfiguration()); |
820 scoped_refptr<Extension> extension = | 828 scoped_refptr<Extension> extension = |
821 BuildExtension(ExtensionBuilder()).Build(); | 829 BuildExtension(ExtensionBuilder()).Build(); |
822 | 830 |
823 for (size_t i = 0; i < arraysize(kTests); ++i) { | 831 for (size_t i = 0; i < arraysize(kTests); ++i) { |
824 EXPECT_EQ(kTests[i].expect_success, | 832 EXPECT_EQ(kTests[i].expect_success, |
825 extension_api->IsAvailable(kTests[i].permission_name, | 833 extension_api->IsAvailable(kTests[i].permission_name, |
826 extension.get(), | 834 extension.get(), |
827 Feature::BLESSED_EXTENSION_CONTEXT, | 835 Feature::BLESSED_EXTENSION_CONTEXT, |
828 GURL()).is_available()) | 836 GURL()).is_available()) |
829 << "Permission being tested: " << kTests[i].permission_name; | 837 << "Permission being tested: " << kTests[i].permission_name; |
830 } | 838 } |
831 } | 839 } |
832 | 840 |
833 // Tests that permissions that require manifest keys are available when those | 841 // Tests that permissions that require manifest keys are available when those |
834 // keys are present. | 842 // keys are present. |
835 TEST(ExtensionAPITest, ManifestKeys) { | 843 TEST(ExtensionAPITest, ManifestKeys) { |
836 scoped_ptr<ExtensionAPI> extension_api( | 844 std::unique_ptr<ExtensionAPI> extension_api( |
837 ExtensionAPI::CreateWithDefaultConfiguration()); | 845 ExtensionAPI::CreateWithDefaultConfiguration()); |
838 | 846 |
839 scoped_refptr<Extension> extension = | 847 scoped_refptr<Extension> extension = |
840 BuildExtension(ExtensionBuilder()) | 848 BuildExtension(ExtensionBuilder()) |
841 .MergeManifest(DictionaryBuilder() | 849 .MergeManifest(DictionaryBuilder() |
842 .Set("browser_action", DictionaryBuilder().Build()) | 850 .Set("browser_action", DictionaryBuilder().Build()) |
843 .Build()) | 851 .Build()) |
844 .Build(); | 852 .Build(); |
845 | 853 |
846 EXPECT_TRUE(extension_api->IsAvailable("browserAction", | 854 EXPECT_TRUE(extension_api->IsAvailable("browserAction", |
847 extension.get(), | 855 extension.get(), |
848 Feature::BLESSED_EXTENSION_CONTEXT, | 856 Feature::BLESSED_EXTENSION_CONTEXT, |
849 GURL()).is_available()); | 857 GURL()).is_available()); |
850 EXPECT_FALSE(extension_api->IsAvailable("pageAction", | 858 EXPECT_FALSE(extension_api->IsAvailable("pageAction", |
851 extension.get(), | 859 extension.get(), |
852 Feature::BLESSED_EXTENSION_CONTEXT, | 860 Feature::BLESSED_EXTENSION_CONTEXT, |
853 GURL()).is_available()); | 861 GURL()).is_available()); |
854 } | 862 } |
855 | 863 |
856 } // namespace extensions | 864 } // namespace extensions |
OLD | NEW |