| 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 "chrome/common/extensions/extension.h" | 5 #include "chrome/common/extensions/extension.h" |
| 6 | 6 |
| 7 #include "base/format_macros.h" | 7 #include "base/format_macros.h" |
| 8 #include "base/file_path.h" | 8 #include "base/file_path.h" |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/json/json_file_value_serializer.h" | 10 #include "base/json/json_file_value_serializer.h" |
| (...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 608 #endif | 608 #endif |
| 609 } | 609 } |
| 610 | 610 |
| 611 TEST(ExtensionTest, WantsFileAccess) { | 611 TEST(ExtensionTest, WantsFileAccess) { |
| 612 scoped_refptr<Extension> extension; | 612 scoped_refptr<Extension> extension; |
| 613 GURL file_url("file:///etc/passwd"); | 613 GURL file_url("file:///etc/passwd"); |
| 614 | 614 |
| 615 // <all_urls> permission | 615 // <all_urls> permission |
| 616 extension = LoadManifest("permissions", "permissions_all_urls.json"); | 616 extension = LoadManifest("permissions", "permissions_all_urls.json"); |
| 617 EXPECT_TRUE(extension->wants_file_access()); | 617 EXPECT_TRUE(extension->wants_file_access()); |
| 618 EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, NULL, NULL)); | 618 EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, -1, NULL, NULL)); |
| 619 extension = LoadManifest( | 619 extension = LoadManifest( |
| 620 "permissions", "permissions_all_urls.json", Extension::ALLOW_FILE_ACCESS); | 620 "permissions", "permissions_all_urls.json", Extension::ALLOW_FILE_ACCESS); |
| 621 EXPECT_TRUE(extension->wants_file_access()); | 621 EXPECT_TRUE(extension->wants_file_access()); |
| 622 EXPECT_TRUE(extension->CanExecuteScriptOnPage(file_url, NULL, NULL)); | 622 EXPECT_TRUE(extension->CanExecuteScriptOnPage(file_url, -1, NULL, NULL)); |
| 623 | 623 |
| 624 // file:///* permission | 624 // file:///* permission |
| 625 extension = LoadManifest("permissions", "permissions_file_scheme.json"); | 625 extension = LoadManifest("permissions", "permissions_file_scheme.json"); |
| 626 EXPECT_TRUE(extension->wants_file_access()); | 626 EXPECT_TRUE(extension->wants_file_access()); |
| 627 EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, NULL, NULL)); | 627 EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, -1, NULL, NULL)); |
| 628 extension = LoadManifest("permissions", "permissions_file_scheme.json", | 628 extension = LoadManifest("permissions", "permissions_file_scheme.json", |
| 629 Extension::ALLOW_FILE_ACCESS); | 629 Extension::ALLOW_FILE_ACCESS); |
| 630 EXPECT_TRUE(extension->wants_file_access()); | 630 EXPECT_TRUE(extension->wants_file_access()); |
| 631 EXPECT_TRUE(extension->CanExecuteScriptOnPage(file_url, NULL, NULL)); | 631 EXPECT_TRUE(extension->CanExecuteScriptOnPage(file_url, -1, NULL, NULL)); |
| 632 | 632 |
| 633 // http://* permission | 633 // http://* permission |
| 634 extension = LoadManifest("permissions", "permissions_http_scheme.json"); | 634 extension = LoadManifest("permissions", "permissions_http_scheme.json"); |
| 635 EXPECT_FALSE(extension->wants_file_access()); | 635 EXPECT_FALSE(extension->wants_file_access()); |
| 636 EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, NULL, NULL)); | 636 EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, -1, NULL, NULL)); |
| 637 extension = LoadManifest("permissions", "permissions_http_scheme.json", | 637 extension = LoadManifest("permissions", "permissions_http_scheme.json", |
| 638 Extension::ALLOW_FILE_ACCESS); | 638 Extension::ALLOW_FILE_ACCESS); |
| 639 EXPECT_FALSE(extension->wants_file_access()); | 639 EXPECT_FALSE(extension->wants_file_access()); |
| 640 EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, NULL, NULL)); | 640 EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, -1, NULL, NULL)); |
| 641 | 641 |
| 642 // <all_urls> content script match | 642 // <all_urls> content script match |
| 643 extension = LoadManifest("permissions", "content_script_all_urls.json"); | 643 extension = LoadManifest("permissions", "content_script_all_urls.json"); |
| 644 EXPECT_TRUE(extension->wants_file_access()); | 644 EXPECT_TRUE(extension->wants_file_access()); |
| 645 EXPECT_FALSE(extension->CanExecuteScriptOnPage( | 645 EXPECT_FALSE(extension->CanExecuteScriptOnPage( |
| 646 file_url, &extension->content_scripts()[0], NULL)); | 646 file_url, -1, &extension->content_scripts()[0], NULL)); |
| 647 extension = LoadManifest("permissions", "content_script_all_urls.json", | 647 extension = LoadManifest("permissions", "content_script_all_urls.json", |
| 648 Extension::ALLOW_FILE_ACCESS); | 648 Extension::ALLOW_FILE_ACCESS); |
| 649 EXPECT_TRUE(extension->wants_file_access()); | 649 EXPECT_TRUE(extension->wants_file_access()); |
| 650 EXPECT_TRUE(extension->CanExecuteScriptOnPage( | 650 EXPECT_TRUE(extension->CanExecuteScriptOnPage( |
| 651 file_url, &extension->content_scripts()[0], NULL)); | 651 file_url, -1, &extension->content_scripts()[0], NULL)); |
| 652 | 652 |
| 653 // file:///* content script match | 653 // file:///* content script match |
| 654 extension = LoadManifest("permissions", "content_script_file_scheme.json"); | 654 extension = LoadManifest("permissions", "content_script_file_scheme.json"); |
| 655 EXPECT_TRUE(extension->wants_file_access()); | 655 EXPECT_TRUE(extension->wants_file_access()); |
| 656 EXPECT_FALSE(extension->CanExecuteScriptOnPage( | 656 EXPECT_FALSE(extension->CanExecuteScriptOnPage( |
| 657 file_url, &extension->content_scripts()[0], NULL)); | 657 file_url, -1, &extension->content_scripts()[0], NULL)); |
| 658 extension = LoadManifest("permissions", "content_script_file_scheme.json", | 658 extension = LoadManifest("permissions", "content_script_file_scheme.json", |
| 659 Extension::ALLOW_FILE_ACCESS); | 659 Extension::ALLOW_FILE_ACCESS); |
| 660 EXPECT_TRUE(extension->wants_file_access()); | 660 EXPECT_TRUE(extension->wants_file_access()); |
| 661 EXPECT_TRUE(extension->CanExecuteScriptOnPage( | 661 EXPECT_TRUE(extension->CanExecuteScriptOnPage( |
| 662 file_url, &extension->content_scripts()[0], NULL)); | 662 file_url, -1, &extension->content_scripts()[0], NULL)); |
| 663 | 663 |
| 664 // http://* content script match | 664 // http://* content script match |
| 665 extension = LoadManifest("permissions", "content_script_http_scheme.json"); | 665 extension = LoadManifest("permissions", "content_script_http_scheme.json"); |
| 666 EXPECT_FALSE(extension->wants_file_access()); | 666 EXPECT_FALSE(extension->wants_file_access()); |
| 667 EXPECT_FALSE(extension->CanExecuteScriptOnPage( | 667 EXPECT_FALSE(extension->CanExecuteScriptOnPage( |
| 668 file_url, &extension->content_scripts()[0], NULL)); | 668 file_url, -1, &extension->content_scripts()[0], NULL)); |
| 669 extension = LoadManifest("permissions", "content_script_http_scheme.json", | 669 extension = LoadManifest("permissions", "content_script_http_scheme.json", |
| 670 Extension::ALLOW_FILE_ACCESS); | 670 Extension::ALLOW_FILE_ACCESS); |
| 671 EXPECT_FALSE(extension->wants_file_access()); | 671 EXPECT_FALSE(extension->wants_file_access()); |
| 672 EXPECT_FALSE(extension->CanExecuteScriptOnPage( | 672 EXPECT_FALSE(extension->CanExecuteScriptOnPage( |
| 673 file_url, &extension->content_scripts()[0], NULL)); | 673 file_url, -1, &extension->content_scripts()[0], NULL)); |
| 674 } | 674 } |
| 675 | 675 |
| 676 TEST(ExtensionTest, ExtraFlags) { | 676 TEST(ExtensionTest, ExtraFlags) { |
| 677 scoped_refptr<Extension> extension; | 677 scoped_refptr<Extension> extension; |
| 678 extension = LoadManifest("app", "manifest.json", Extension::FROM_WEBSTORE); | 678 extension = LoadManifest("app", "manifest.json", Extension::FROM_WEBSTORE); |
| 679 EXPECT_TRUE(extension->from_webstore()); | 679 EXPECT_TRUE(extension->from_webstore()); |
| 680 | 680 |
| 681 extension = LoadManifest("app", "manifest.json", Extension::FROM_BOOKMARK); | 681 extension = LoadManifest("app", "manifest.json", Extension::FROM_BOOKMARK); |
| 682 EXPECT_TRUE(extension->from_bookmark()); | 682 EXPECT_TRUE(extension->from_bookmark()); |
| 683 | 683 |
| 684 extension = LoadManifest("app", "manifest.json", Extension::NO_FLAGS); | 684 extension = LoadManifest("app", "manifest.json", Extension::NO_FLAGS); |
| 685 EXPECT_FALSE(extension->from_bookmark()); | 685 EXPECT_FALSE(extension->from_bookmark()); |
| 686 EXPECT_FALSE(extension->from_webstore()); | 686 EXPECT_FALSE(extension->from_webstore()); |
| 687 } | 687 } |
| 688 | 688 |
| 689 // Base class for testing the CanExecuteScriptOnPage and CanCaptureVisiblePage | 689 // Base class for testing the CanExecuteScriptOnPage and CanCaptureVisiblePage |
| 690 // methods of Extension for extensions with various permissions. | 690 // methods of Extension for extensions with various permissions. |
| 691 class ExtensionScriptAndCaptureVisibleTest : public testing::Test { | 691 class ExtensionScriptAndCaptureVisibleTest : public testing::Test { |
| 692 public: | 692 public: |
| 693 ExtensionScriptAndCaptureVisibleTest() { | 693 ExtensionScriptAndCaptureVisibleTest() { |
| 694 PathService::Get(chrome::DIR_TEST_DATA, &dirpath_); | 694 PathService::Get(chrome::DIR_TEST_DATA, &dirpath_); |
| 695 } | 695 } |
| 696 | 696 |
| 697 bool Allowed(const Extension* extension, const GURL& url) { | 697 bool Allowed(const Extension* extension, const GURL& url) { |
| 698 return (extension->CanExecuteScriptOnPage(url, NULL, NULL) && | 698 return Allowed(extension, url, -1); |
| 699 extension->CanCaptureVisiblePage(url, NULL)); | 699 } |
| 700 |
| 701 bool Allowed(const Extension* extension, const GURL& url, int tab_id) { |
| 702 return (extension->CanExecuteScriptOnPage(url, tab_id, NULL, NULL) && |
| 703 extension->CanCaptureVisiblePage(url, tab_id, NULL)); |
| 700 } | 704 } |
| 701 | 705 |
| 702 bool CaptureOnly(const Extension* extension, const GURL& url) { | 706 bool CaptureOnly(const Extension* extension, const GURL& url) { |
| 703 return !extension->CanExecuteScriptOnPage(url, NULL, NULL) && | 707 return CaptureOnly(extension, url, -1); |
| 704 extension->CanCaptureVisiblePage(url, NULL); | 708 } |
| 709 |
| 710 bool CaptureOnly(const Extension* extension, const GURL& url, int tab_id) { |
| 711 return !extension->CanExecuteScriptOnPage(url, tab_id, NULL, NULL) && |
| 712 extension->CanCaptureVisiblePage(url, tab_id, NULL); |
| 705 } | 713 } |
| 706 | 714 |
| 707 bool Blocked(const Extension* extension, const GURL& url) { | 715 bool Blocked(const Extension* extension, const GURL& url) { |
| 708 return !(extension->CanExecuteScriptOnPage(url, NULL, NULL) || | 716 return Blocked(extension, url, -1); |
| 709 extension->CanCaptureVisiblePage(url, NULL)); | 717 } |
| 718 |
| 719 bool Blocked(const Extension* extension, const GURL& url, int tab_id) { |
| 720 return !(extension->CanExecuteScriptOnPage(url, tab_id, NULL, NULL) || |
| 721 extension->CanCaptureVisiblePage(url, tab_id, NULL)); |
| 710 } | 722 } |
| 711 | 723 |
| 712 protected: | 724 protected: |
| 713 FilePath dirpath_; | 725 FilePath dirpath_; |
| 714 }; | 726 }; |
| 715 | 727 |
| 716 TEST_F(ExtensionScriptAndCaptureVisibleTest, Permissions) { | 728 TEST_F(ExtensionScriptAndCaptureVisibleTest, Permissions) { |
| 717 scoped_refptr<Extension> extension; | 729 scoped_refptr<Extension> extension; |
| 718 // URLs that are "safe" to provide scripting and capture visible tab access | 730 // URLs that are "safe" to provide scripting and capture visible tab access |
| 719 // to if the permissions allow it. | 731 // to if the permissions allow it. |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 803 EXPECT_TRUE(Allowed(extension, http_url)); | 815 EXPECT_TRUE(Allowed(extension, http_url)); |
| 804 EXPECT_TRUE(Blocked(extension, https_url)); | 816 EXPECT_TRUE(Blocked(extension, https_url)); |
| 805 EXPECT_TRUE(Blocked(extension, file_url)); | 817 EXPECT_TRUE(Blocked(extension, file_url)); |
| 806 EXPECT_TRUE(Blocked(extension, settings_url)); | 818 EXPECT_TRUE(Blocked(extension, settings_url)); |
| 807 EXPECT_TRUE(Blocked(extension, favicon_url)); | 819 EXPECT_TRUE(Blocked(extension, favicon_url)); |
| 808 EXPECT_TRUE(Blocked(extension, about_url)); | 820 EXPECT_TRUE(Blocked(extension, about_url)); |
| 809 EXPECT_TRUE(Blocked(extension, extension_url)); | 821 EXPECT_TRUE(Blocked(extension, extension_url)); |
| 810 EXPECT_FALSE(extension->HasHostPermission(settings_url)); | 822 EXPECT_FALSE(extension->HasHostPermission(settings_url)); |
| 811 } | 823 } |
| 812 | 824 |
| 825 TEST_F(ExtensionScriptAndCaptureVisibleTest, TabSpecific) { |
| 826 // TODO: these tests in progress. hastily assembled late at night. |
| 827 scoped_refptr<Extension> extension = |
| 828 LoadManifestStrict("script_and_capture", "tab_specific.json"); |
| 829 |
| 830 GURL http_url("http://www.google.com"); |
| 831 GURL https_url("https://www.google.com"); |
| 832 GURL file_url("file:///foo/bar"); |
| 833 GURL favicon_url("chrome://favicon/http://www.google.com"); |
| 834 GURL extension_url("chrome-extension://monkey"); |
| 835 GURL settings_url("chrome://settings"); |
| 836 GURL about_url("about:flags"); |
| 837 |
| 838 const GURL urls[] = { |
| 839 http_url, https_url, file_url, favicon_url, |
| 840 extension_url, settings_url, about_url, |
| 841 }; |
| 842 |
| 843 // Shouldn't have access to any URLs on any tabs. |
| 844 for (size_t i = 0; i < arraysize(urls); ++i) { |
| 845 GURL url = urls[i]; |
| 846 EXPECT_TRUE(Blocked(extension, url, 0)); |
| 847 EXPECT_TRUE(Blocked(extension, url, 1)); |
| 848 EXPECT_TRUE(Blocked(extension, url, 2)); |
| 849 } |
| 850 |
| 851 // TODO: GetEffectiveHostPermissions? |
| 852 |
| 853 // Grant access to http_url on tab 0. |
| 854 { |
| 855 URLPatternSet hosts; |
| 856 hosts.AddPattern(URLPattern(URLPattern::SCHEME_ALL, http_url.spec())); |
| 857 |
| 858 extension->SetTabSpecificHostPermissions(0, hosts); |
| 859 for (size_t i = 0; i < arraysize(urls); ++i) { |
| 860 GURL url = urls[i]; |
| 861 if (url == http_url) |
| 862 EXPECT_TRUE(Allowed(extension, url, 0)); |
| 863 else |
| 864 EXPECT_TRUE(Blocked(extension, url, 0)); |
| 865 EXPECT_TRUE(Blocked(extension, url, 1)); |
| 866 EXPECT_TRUE(Blocked(extension, url, 2)); |
| 867 } |
| 868 |
| 869 extension->ClearTabSpecificHostPermissions(0); |
| 870 for (size_t i = 0; i < arraysize(urls); ++i) { |
| 871 GURL url = urls[i]; |
| 872 EXPECT_TRUE(Blocked(extension, url, 0)); |
| 873 EXPECT_TRUE(Blocked(extension, url, 1)); |
| 874 EXPECT_TRUE(Blocked(extension, url, 2)); |
| 875 } |
| 876 |
| 877 extension->SetTabSpecificHostPermissions(0, hosts); |
| 878 extension->SetTabSpecificHostPermissions(1, hosts); |
| 879 for (size_t i = 0; i < arraysize(urls); ++i) { |
| 880 GURL url = urls[i]; |
| 881 if (url == http_url) { |
| 882 EXPECT_TRUE(Allowed(extension, url, 0)); |
| 883 EXPECT_TRUE(Allowed(extension, url, 1)); |
| 884 } else { |
| 885 EXPECT_TRUE(Blocked(extension, url, 0)); |
| 886 EXPECT_TRUE(Blocked(extension, url, 1)); |
| 887 } |
| 888 EXPECT_TRUE(Blocked(extension, url, 2)); |
| 889 } |
| 890 |
| 891 extension->ClearTabSpecificHostPermissions(0); |
| 892 for (size_t i = 0; i < arraysize(urls); ++i) { |
| 893 GURL url = urls[i]; |
| 894 EXPECT_TRUE(Blocked(extension, url, 0)); |
| 895 if (url == http_url) |
| 896 EXPECT_TRUE(Allowed(extension, url, 1)); |
| 897 else |
| 898 EXPECT_TRUE(Blocked(extension, url, 1)); |
| 899 EXPECT_TRUE(Blocked(extension, url, 2)); |
| 900 } |
| 901 |
| 902 extension->ClearTabSpecificHostPermissions(1); |
| 903 for (size_t i = 0; i < arraysize(urls); ++i) { |
| 904 GURL url = urls[i]; |
| 905 EXPECT_TRUE(Blocked(extension, url, 0)); |
| 906 EXPECT_TRUE(Blocked(extension, url, 1)); |
| 907 EXPECT_TRUE(Blocked(extension, url, 2)); |
| 908 } |
| 909 } |
| 910 } |
| 911 |
| 813 TEST(ExtensionTest, GenerateId) { | 912 TEST(ExtensionTest, GenerateId) { |
| 814 std::string result; | 913 std::string result; |
| 815 EXPECT_TRUE(Extension::GenerateId("", &result)); | 914 EXPECT_TRUE(Extension::GenerateId("", &result)); |
| 816 | 915 |
| 817 EXPECT_TRUE(Extension::GenerateId("test", &result)); | 916 EXPECT_TRUE(Extension::GenerateId("test", &result)); |
| 818 EXPECT_EQ(result, "jpignaibiiemhngfjkcpokkamffknabf"); | 917 EXPECT_EQ(result, "jpignaibiiemhngfjkcpokkamffknabf"); |
| 819 | 918 |
| 820 EXPECT_TRUE(Extension::GenerateId("_", &result)); | 919 EXPECT_TRUE(Extension::GenerateId("_", &result)); |
| 821 EXPECT_EQ(result, "ncocknphbhhlhkikpnnlmbcnbgdempcd"); | 920 EXPECT_EQ(result, "ncocknphbhhlhkikpnnlmbcnbgdempcd"); |
| 822 | 921 |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 968 } | 1067 } |
| 969 | 1068 |
| 970 TEST(ExtensionTest, GetSyncTypeExtensionWithTwoPlugins) { | 1069 TEST(ExtensionTest, GetSyncTypeExtensionWithTwoPlugins) { |
| 971 scoped_refptr<Extension> extension( | 1070 scoped_refptr<Extension> extension( |
| 972 MakeSyncTestExtension(EXTENSION, GURL(), GURL(), | 1071 MakeSyncTestExtension(EXTENSION, GURL(), GURL(), |
| 973 Extension::INTERNAL, 2, FilePath())); | 1072 Extension::INTERNAL, 2, FilePath())); |
| 974 if (extension) | 1073 if (extension) |
| 975 EXPECT_EQ(extension->GetSyncType(), Extension::SYNC_TYPE_NONE); | 1074 EXPECT_EQ(extension->GetSyncType(), Extension::SYNC_TYPE_NONE); |
| 976 } | 1075 } |
| 977 #endif // !defined(OS_CHROMEOS) | 1076 #endif // !defined(OS_CHROMEOS) |
| OLD | NEW |