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

Side by Side Diff: chrome/common/extensions/extension_manifests_unittest.cc

Issue 8429023: Add platform_app flag to manifest. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Merge conflict resolution. Created 9 years, 1 month 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "chrome/common/extensions/extension.h" 5 #include "chrome/common/extensions/extension.h"
6 6
7 #if defined(TOOLKIT_GTK) 7 #if defined(TOOLKIT_GTK)
8 #include <gtk/gtk.h> 8 #include <gtk/gtk.h>
9 #endif 9 #endif
10 10
11 #include "base/command_line.h"
12 #include "base/file_path.h" 11 #include "base/file_path.h"
13 #include "base/file_util.h" 12 #include "base/file_util.h"
14 #include "base/i18n/rtl.h" 13 #include "base/i18n/rtl.h"
15 #include "base/json/json_value_serializer.h" 14 #include "base/json/json_value_serializer.h"
16 #include "base/memory/scoped_ptr.h" 15 #include "base/memory/scoped_ptr.h"
17 #include "base/path_service.h" 16 #include "base/path_service.h"
18 #include "base/stringprintf.h"
19 #include "base/string_number_conversions.h" 17 #include "base/string_number_conversions.h"
20 #include "base/string_util.h" 18 #include "base/string_util.h"
19 #include "base/stringprintf.h"
21 #include "base/utf_string_conversions.h" 20 #include "base/utf_string_conversions.h"
22 #include "chrome/common/chrome_paths.h" 21 #include "chrome/common/chrome_paths.h"
23 #include "chrome/common/chrome_switches.h" 22 #include "chrome/common/chrome_switches.h"
24 #include "chrome/common/extensions/extension.h" 23 #include "chrome/common/extensions/extension.h"
25 #include "chrome/common/extensions/extension_constants.h" 24 #include "chrome/common/extensions/extension_constants.h"
26 #include "chrome/common/extensions/extension_error_utils.h" 25 #include "chrome/common/extensions/extension_error_utils.h"
27 #include "chrome/common/extensions/extension_sidebar_defaults.h" 26 #include "chrome/common/extensions/extension_sidebar_defaults.h"
28 #include "chrome/common/extensions/file_browser_handler.h" 27 #include "chrome/common/extensions/file_browser_handler.h"
29 #include "chrome/common/extensions/url_pattern.h" 28 #include "chrome/common/extensions/url_pattern.h"
29 #include "chrome/test/base/scoped_command_line_override.h"
30 #include "testing/gtest/include/gtest/gtest.h" 30 #include "testing/gtest/include/gtest/gtest.h"
31 #include "ui/base/l10n/l10n_util.h" 31 #include "ui/base/l10n/l10n_util.h"
32 32
33 33
34 namespace { 34 namespace {
35 35
36 static void AddPattern(URLPatternSet* extent, const std::string& pattern) { 36 static void AddPattern(URLPatternSet* extent, const std::string& pattern) {
37 int schemes = URLPattern::SCHEME_ALL; 37 int schemes = URLPattern::SCHEME_ALL;
38 extent->AddPattern(URLPattern(schemes, pattern)); 38 extent->AddPattern(URLPattern(schemes, pattern));
39 } 39 }
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 // distinguish between API and host permissions. 214 // distinguish between API and host permissions.
215 extension = LoadAndExpectSuccess("init_valid_permissions.json"); 215 extension = LoadAndExpectSuccess("init_valid_permissions.json");
216 216
217 // Test with an options page. 217 // Test with an options page.
218 extension = LoadAndExpectSuccess("init_valid_options.json"); 218 extension = LoadAndExpectSuccess("init_valid_options.json");
219 EXPECT_EQ("chrome-extension", extension->options_url().scheme()); 219 EXPECT_EQ("chrome-extension", extension->options_url().scheme());
220 EXPECT_EQ("/options.html", extension->options_url().path()); 220 EXPECT_EQ("/options.html", extension->options_url().path());
221 221
222 // Test that an empty list of page actions does not stop a browser action 222 // Test that an empty list of page actions does not stop a browser action
223 // from being loaded. 223 // from being loaded.
224 extension = LoadAndExpectSuccess("init_valid_empty_page_actions.json"); 224 LoadAndExpectSuccess("init_valid_empty_page_actions.json");
225 225
226 // Test with a minimum_chrome_version. 226 // Test with a minimum_chrome_version.
227 extension = LoadAndExpectSuccess("init_valid_minimum_chrome.json"); 227 LoadAndExpectSuccess("init_valid_minimum_chrome.json");
228 228
229 // Test a hosted app with a minimum_chrome_version. 229 // Test a hosted app with a minimum_chrome_version.
230 extension = LoadAndExpectSuccess("init_valid_app_minimum_chrome.json"); 230 LoadAndExpectSuccess("init_valid_app_minimum_chrome.json");
231 231
232 // Test a hosted app with a requirements section. 232 // Test a hosted app with a requirements section.
233 extension = LoadAndExpectSuccess("init_valid_app_requirements.json"); 233 LoadAndExpectSuccess("init_valid_app_requirements.json");
234 234
235 // Verify empty permission settings are considered valid. 235 // Verify empty permission settings are considered valid.
236 LoadAndExpectSuccess("init_valid_permissions_empty.json"); 236 LoadAndExpectSuccess("init_valid_permissions_empty.json");
237 237
238 // We allow unknown API permissions, so this will be valid until we better 238 // We allow unknown API permissions, so this will be valid until we better
239 // distinguish between API and host permissions. 239 // distinguish between API and host permissions.
240 LoadAndExpectSuccess("init_valid_permissions_unknown.json"); 240 LoadAndExpectSuccess("init_valid_permissions_unknown.json");
241 } 241 }
242 242
243 TEST_F(ExtensionManifestTest, PlatformApps) {
244 // A minimal platform app.
245 LoadAndExpectSuccess("init_valid_platform_app.json");
246 }
247
243 TEST_F(ExtensionManifestTest, InitFromValueValidNameInRTL) { 248 TEST_F(ExtensionManifestTest, InitFromValueValidNameInRTL) {
244 #if defined(TOOLKIT_GTK) 249 #if defined(TOOLKIT_GTK)
245 GtkTextDirection gtk_dir = gtk_widget_get_default_direction(); 250 GtkTextDirection gtk_dir = gtk_widget_get_default_direction();
246 gtk_widget_set_default_direction(GTK_TEXT_DIR_RTL); 251 gtk_widget_set_default_direction(GTK_TEXT_DIR_RTL);
247 #else 252 #else
248 std::string locale = l10n_util::GetApplicationLocale(""); 253 std::string locale = l10n_util::GetApplicationLocale("");
249 base::i18n::SetICUDefaultLocale("he"); 254 base::i18n::SetICUDefaultLocale("he");
250 #endif 255 #endif
251 256
252 // No strong RTL characters in name. 257 // No strong RTL characters in name.
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 extension = LoadAndExpectSuccess("launch_width.json"); 390 extension = LoadAndExpectSuccess("launch_width.json");
386 EXPECT_EQ(640, extension->launch_width()); 391 EXPECT_EQ(640, extension->launch_width());
387 392
388 extension = LoadAndExpectSuccess("launch_height.json"); 393 extension = LoadAndExpectSuccess("launch_height.json");
389 EXPECT_EQ(480, extension->launch_height()); 394 EXPECT_EQ(480, extension->launch_height());
390 395
391 LoadAndExpectError("launch_window.json", 396 LoadAndExpectError("launch_window.json",
392 errors::kInvalidLaunchContainer); 397 errors::kInvalidLaunchContainer);
393 LoadAndExpectError("launch_container_invalid_type.json", 398 LoadAndExpectError("launch_container_invalid_type.json",
394 errors::kInvalidLaunchContainer); 399 errors::kInvalidLaunchContainer);
400 {
401 ScopedCommandLineOverride override(switches::kEnablePlatformApps);
402 LoadAndExpectError("launch_container_invalid_type_for_platform.json",
403 errors::kInvalidLaunchContainerForPlatform);
404 }
395 LoadAndExpectError("launch_container_invalid_value.json", 405 LoadAndExpectError("launch_container_invalid_value.json",
396 errors::kInvalidLaunchContainer); 406 errors::kInvalidLaunchContainer);
397 LoadAndExpectError("launch_container_without_launch_url.json", 407 LoadAndExpectError("launch_container_without_launch_url.json",
398 errors::kLaunchURLRequired); 408 errors::kLaunchURLRequired);
399 LoadAndExpectError("launch_width_invalid.json", 409 LoadAndExpectError("launch_width_invalid.json",
400 errors::kInvalidLaunchWidthContainer); 410 errors::kInvalidLaunchWidthContainer);
401 LoadAndExpectError("launch_width_negative.json", 411 LoadAndExpectError("launch_width_negative.json",
402 errors::kInvalidLaunchWidth); 412 errors::kInvalidLaunchWidth);
403 LoadAndExpectError("launch_height_invalid.json", 413 LoadAndExpectError("launch_height_invalid.json",
404 errors::kInvalidLaunchHeightContainer); 414 errors::kInvalidLaunchHeightContainer);
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
519 "Invalid value for " 529 "Invalid value for "
520 "'content_scripts[0].exclude_matches[0]': " 530 "'content_scripts[0].exclude_matches[0]': "
521 "Invalid host wildcard."); 531 "Invalid host wildcard.");
522 } 532 }
523 533
524 TEST_F(ExtensionManifestTest, ExperimentalPermission) { 534 TEST_F(ExtensionManifestTest, ExperimentalPermission) {
525 LoadAndExpectError("experimental.json", errors::kExperimentalFlagRequired); 535 LoadAndExpectError("experimental.json", errors::kExperimentalFlagRequired);
526 LoadAndExpectSuccess("experimental.json", Extension::COMPONENT); 536 LoadAndExpectSuccess("experimental.json", Extension::COMPONENT);
527 LoadAndExpectSuccess("experimental.json", Extension::INTERNAL, 537 LoadAndExpectSuccess("experimental.json", Extension::INTERNAL,
528 Extension::FROM_WEBSTORE); 538 Extension::FROM_WEBSTORE);
529 CommandLine old_command_line = *CommandLine::ForCurrentProcess(); 539 ScopedCommandLineOverride override(
530 CommandLine::ForCurrentProcess()->AppendSwitch(
531 switches::kEnableExperimentalExtensionApis); 540 switches::kEnableExperimentalExtensionApis);
532 LoadAndExpectSuccess("experimental.json"); 541 LoadAndExpectSuccess("experimental.json");
533 *CommandLine::ForCurrentProcess() = old_command_line;
534 } 542 }
535 543
536 TEST_F(ExtensionManifestTest, DevToolsExtensions) { 544 TEST_F(ExtensionManifestTest, DevToolsExtensions) {
537 LoadAndExpectError("devtools_extension_no_permissions.json", 545 LoadAndExpectError("devtools_extension_no_permissions.json",
538 errors::kDevToolsExperimental); 546 errors::kDevToolsExperimental);
539 LoadAndExpectError("devtools_extension_url_invalid_type.json", 547 LoadAndExpectError("devtools_extension_url_invalid_type.json",
540 errors::kInvalidDevToolsPage); 548 errors::kInvalidDevToolsPage);
541 549
542 CommandLine old_command_line = *CommandLine::ForCurrentProcess(); 550 ScopedCommandLineOverride override(
543 CommandLine::ForCurrentProcess()->AppendSwitch(
544 switches::kEnableExperimentalExtensionApis); 551 switches::kEnableExperimentalExtensionApis);
545
546 scoped_refptr<Extension> extension; 552 scoped_refptr<Extension> extension;
547 extension = LoadAndExpectSuccess("devtools_extension.json"); 553 extension = LoadAndExpectSuccess("devtools_extension.json");
548 EXPECT_EQ(extension->url().spec() + "devtools.html", 554 EXPECT_EQ(extension->url().spec() + "devtools.html",
549 extension->devtools_url().spec()); 555 extension->devtools_url().spec());
550 EXPECT_TRUE(extension->HasEffectiveAccessToAllHosts()); 556 EXPECT_TRUE(extension->HasEffectiveAccessToAllHosts());
551
552 *CommandLine::ForCurrentProcess() = old_command_line;
553 } 557 }
554 558
555 TEST_F(ExtensionManifestTest, Sidebar) { 559 TEST_F(ExtensionManifestTest, Sidebar) {
556 LoadAndExpectError("sidebar.json", 560 LoadAndExpectError("sidebar.json",
557 errors::kExperimentalFlagRequired); 561 errors::kExperimentalFlagRequired);
558 562
559 CommandLine old_command_line = *CommandLine::ForCurrentProcess(); 563 ScopedCommandLineOverride override(
560 CommandLine::ForCurrentProcess()->AppendSwitch(
561 switches::kEnableExperimentalExtensionApis); 564 switches::kEnableExperimentalExtensionApis);
562 565
563 LoadAndExpectError("sidebar_no_permissions.json", 566 LoadAndExpectError("sidebar_no_permissions.json",
564 errors::kSidebarExperimental); 567 errors::kSidebarExperimental);
565 568
566 LoadAndExpectError("sidebar_icon_empty.json", 569 LoadAndExpectError("sidebar_icon_empty.json",
567 errors::kInvalidSidebarDefaultIconPath); 570 errors::kInvalidSidebarDefaultIconPath);
568 LoadAndExpectError("sidebar_icon_invalid_type.json", 571 LoadAndExpectError("sidebar_icon_invalid_type.json",
569 errors::kInvalidSidebarDefaultIconPath); 572 errors::kInvalidSidebarDefaultIconPath);
570 LoadAndExpectError("sidebar_page_empty.json", 573 LoadAndExpectError("sidebar_page_empty.json",
571 errors::kInvalidSidebarDefaultPage); 574 errors::kInvalidSidebarDefaultPage);
572 LoadAndExpectError("sidebar_page_invalid_type.json", 575 LoadAndExpectError("sidebar_page_invalid_type.json",
573 errors::kInvalidSidebarDefaultPage); 576 errors::kInvalidSidebarDefaultPage);
574 LoadAndExpectError("sidebar_title_invalid_type.json", 577 LoadAndExpectError("sidebar_title_invalid_type.json",
575 errors::kInvalidSidebarDefaultTitle); 578 errors::kInvalidSidebarDefaultTitle);
576 579
577 scoped_refptr<Extension> extension(LoadAndExpectSuccess("sidebar.json")); 580 scoped_refptr<Extension> extension(LoadAndExpectSuccess("sidebar.json"));
578 ASSERT_TRUE(extension->sidebar_defaults() != NULL); 581 ASSERT_TRUE(extension->sidebar_defaults() != NULL);
579 EXPECT_EQ(extension->sidebar_defaults()->default_title(), 582 EXPECT_EQ(extension->sidebar_defaults()->default_title(),
580 ASCIIToUTF16("Default title")); 583 ASCIIToUTF16("Default title"));
581 EXPECT_EQ(extension->sidebar_defaults()->default_icon_path(), 584 EXPECT_EQ(extension->sidebar_defaults()->default_icon_path(),
582 "icon.png"); 585 "icon.png");
583 EXPECT_EQ(extension->url().spec() + "sidebar.html", 586 EXPECT_EQ(extension->url().spec() + "sidebar.html",
584 extension->sidebar_defaults()->default_page().spec()); 587 extension->sidebar_defaults()->default_page().spec());
585
586 *CommandLine::ForCurrentProcess() = old_command_line;
587 } 588 }
588 589
589 TEST_F(ExtensionManifestTest, DisallowHybridApps) { 590 TEST_F(ExtensionManifestTest, DisallowHybridApps) {
590 LoadAndExpectError("disallow_hybrid_1.json", 591 LoadAndExpectError("disallow_hybrid_1.json",
591 ExtensionErrorUtils::FormatErrorMessage( 592 ExtensionErrorUtils::FormatErrorMessage(
592 errors::kHostedAppsCannotIncludeExtensionFeatures, 593 errors::kHostedAppsCannotIncludeExtensionFeatures,
593 keys::kBrowserAction)); 594 keys::kBrowserAction));
594 LoadAndExpectError("disallow_hybrid_2.json", 595 LoadAndExpectError("disallow_hybrid_2.json",
595 errors::kBackgroundPermissionNeeded); 596 errors::kBackgroundPermissionNeeded);
596 } 597 }
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 LoadAndExpectSuccess("tts_engine_valid.json")); 810 LoadAndExpectSuccess("tts_engine_valid.json"));
810 811
811 ASSERT_EQ(1u, extension->tts_voices().size()); 812 ASSERT_EQ(1u, extension->tts_voices().size());
812 EXPECT_EQ("name", extension->tts_voices()[0].voice_name); 813 EXPECT_EQ("name", extension->tts_voices()[0].voice_name);
813 EXPECT_EQ("en-US", extension->tts_voices()[0].lang); 814 EXPECT_EQ("en-US", extension->tts_voices()[0].lang);
814 EXPECT_EQ("female", extension->tts_voices()[0].gender); 815 EXPECT_EQ("female", extension->tts_voices()[0].gender);
815 EXPECT_EQ(3U, extension->tts_voices()[0].event_types.size()); 816 EXPECT_EQ(3U, extension->tts_voices()[0].event_types.size());
816 } 817 }
817 818
818 TEST_F(ExtensionManifestTest, WebIntents) { 819 TEST_F(ExtensionManifestTest, WebIntents) {
819 CommandLine::ForCurrentProcess()->AppendSwitch("--enable-web-intents"); 820 ScopedCommandLineOverride override("--enable-web-intents");
820 821
821 LoadAndExpectError("intent_invalid_1.json", 822 LoadAndExpectError("intent_invalid_1.json",
822 extension_manifest_errors::kInvalidIntents); 823 extension_manifest_errors::kInvalidIntents);
823 LoadAndExpectError("intent_invalid_2.json", 824 LoadAndExpectError("intent_invalid_2.json",
824 extension_manifest_errors::kInvalidIntent); 825 extension_manifest_errors::kInvalidIntent);
825 LoadAndExpectError("intent_invalid_3.json", 826 LoadAndExpectError("intent_invalid_3.json",
826 extension_manifest_errors::kInvalidIntentPath); 827 extension_manifest_errors::kInvalidIntentPath);
827 LoadAndExpectError("intent_invalid_4.json", 828 LoadAndExpectError("intent_invalid_4.json",
828 extension_manifest_errors::kInvalidIntentDisposition); 829 extension_manifest_errors::kInvalidIntentDisposition);
829 LoadAndExpectError("intent_invalid_5.json", 830 LoadAndExpectError("intent_invalid_5.json",
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
872 // to flag this case. 873 // to flag this case.
873 LoadAndExpectSuccess("forbid_ports_in_permissions.json", 874 LoadAndExpectSuccess("forbid_ports_in_permissions.json",
874 Extension::INTERNAL, Extension::STRICT_ERROR_CHECKS); 875 Extension::INTERNAL, Extension::STRICT_ERROR_CHECKS);
875 } 876 }
876 877
877 TEST_F(ExtensionManifestTest, IsolatedApps) { 878 TEST_F(ExtensionManifestTest, IsolatedApps) {
878 // Requires --enable-experimental-extension-apis 879 // Requires --enable-experimental-extension-apis
879 LoadAndExpectError("isolated_app_valid.json", 880 LoadAndExpectError("isolated_app_valid.json",
880 errors::kExperimentalFlagRequired); 881 errors::kExperimentalFlagRequired);
881 882
882 CommandLine old_command_line = *CommandLine::ForCurrentProcess(); 883 ScopedCommandLineOverride override(
883 CommandLine::ForCurrentProcess()->AppendSwitch(
884 switches::kEnableExperimentalExtensionApis); 884 switches::kEnableExperimentalExtensionApis);
885 scoped_refptr<Extension> extension2( 885 scoped_refptr<Extension> extension2(
886 LoadAndExpectSuccess("isolated_app_valid.json")); 886 LoadAndExpectSuccess("isolated_app_valid.json"));
887 EXPECT_TRUE(extension2->is_storage_isolated()); 887 EXPECT_TRUE(extension2->is_storage_isolated());
888 *CommandLine::ForCurrentProcess() = old_command_line;
889 } 888 }
890 889
891 890
892 TEST_F(ExtensionManifestTest, FileBrowserHandlers) { 891 TEST_F(ExtensionManifestTest, FileBrowserHandlers) {
893 LoadAndExpectError("filebrowser_invalid_actions_1.json", 892 LoadAndExpectError("filebrowser_invalid_actions_1.json",
894 errors::kInvalidFileBrowserHandler); 893 errors::kInvalidFileBrowserHandler);
895 LoadAndExpectError("filebrowser_invalid_actions_2.json", 894 LoadAndExpectError("filebrowser_invalid_actions_2.json",
896 errors::kInvalidFileBrowserHandler); 895 errors::kInvalidFileBrowserHandler);
897 LoadAndExpectError("filebrowser_invalid_action_id.json", 896 LoadAndExpectError("filebrowser_invalid_action_id.json",
898 errors::kInvalidPageActionId); 897 errors::kInvalidPageActionId);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
955 scoped_refptr<Extension> extension_2( 954 scoped_refptr<Extension> extension_2(
956 LoadAndExpectSuccess("offline_disabled_packaged_app.json")); 955 LoadAndExpectSuccess("offline_disabled_packaged_app.json"));
957 EXPECT_FALSE(extension_2->offline_enabled()); 956 EXPECT_FALSE(extension_2->offline_enabled());
958 scoped_refptr<Extension> extension_3( 957 scoped_refptr<Extension> extension_3(
959 LoadAndExpectSuccess("offline_default_packaged_app.json")); 958 LoadAndExpectSuccess("offline_default_packaged_app.json"));
960 EXPECT_FALSE(extension_3->offline_enabled()); 959 EXPECT_FALSE(extension_3->offline_enabled());
961 scoped_refptr<Extension> extension_4( 960 scoped_refptr<Extension> extension_4(
962 LoadAndExpectSuccess("offline_enabled_hosted_app.json")); 961 LoadAndExpectSuccess("offline_enabled_hosted_app.json"));
963 EXPECT_TRUE(extension_4->offline_enabled()); 962 EXPECT_TRUE(extension_4->offline_enabled());
964 } 963 }
OLDNEW
« no previous file with comments | « chrome/common/extensions/extension_constants.cc ('k') | chrome/test/base/scoped_command_line_override.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698