Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "content/common/feature_policy/feature_policy.h" | 5 #include "content/common/feature_policy/feature_policy.h" |
| 6 | 6 |
| 7 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
| 8 #include "url/gurl.h" | 8 #include "url/gurl.h" |
| 9 | 9 |
| 10 namespace content { | 10 namespace content { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 47 FeaturePolicyTest() | 47 FeaturePolicyTest() |
| 48 : feature_list_({{kDefaultOnFeature, &kDefaultOnFeatureDfn}, | 48 : feature_list_({{kDefaultOnFeature, &kDefaultOnFeatureDfn}, |
| 49 {kDefaultSelfFeature, &kDefaultSelfFeatureDfn}, | 49 {kDefaultSelfFeature, &kDefaultSelfFeatureDfn}, |
| 50 {kDefaultOffFeature, &kDefaultOffFeatureDfn}}) {} | 50 {kDefaultOffFeature, &kDefaultOffFeatureDfn}}) {} |
| 51 | 51 |
| 52 ~FeaturePolicyTest() override {} | 52 ~FeaturePolicyTest() override {} |
| 53 | 53 |
| 54 std::unique_ptr<FeaturePolicy> CreateFromParentPolicy( | 54 std::unique_ptr<FeaturePolicy> CreateFromParentPolicy( |
| 55 const FeaturePolicy* parent, | 55 const FeaturePolicy* parent, |
| 56 const url::Origin& origin) { | 56 const url::Origin& origin) { |
| 57 return FeaturePolicy::CreateFromParentPolicy(parent, origin, feature_list_); | 57 return FeaturePolicy::CreateFromParentPolicy(parent, nullptr, origin, |
| 58 feature_list_); | |
| 58 } | 59 } |
| 59 | 60 |
| 61 std::unique_ptr<FeaturePolicy> CreateFromParentWithFramePolicy( | |
| 62 const FeaturePolicy* parent, | |
| 63 const ParsedFeaturePolicyHeader* frame_policy, | |
| 64 const url::Origin& origin) { | |
| 65 return FeaturePolicy::CreateFromParentPolicy(parent, frame_policy, origin, | |
| 66 feature_list_); | |
| 67 } | |
| 60 url::Origin origin_a_ = url::Origin(GURL("https://example.com/")); | 68 url::Origin origin_a_ = url::Origin(GURL("https://example.com/")); |
| 61 url::Origin origin_b_ = url::Origin(GURL("https://example.net/")); | 69 url::Origin origin_b_ = url::Origin(GURL("https://example.net/")); |
| 62 url::Origin origin_c_ = url::Origin(GURL("https://example.org/")); | 70 url::Origin origin_c_ = url::Origin(GURL("https://example.org/")); |
| 63 | 71 |
| 64 private: | 72 private: |
| 65 // Contains the list of controlled features, so that we are guaranteed to | 73 // Contains the list of controlled features, so that we are guaranteed to |
| 66 // have at least one of each kind of default behaviour represented. | 74 // have at least one of each kind of default behaviour represented. |
| 67 FeaturePolicy::FeatureList feature_list_; | 75 FeaturePolicy::FeatureList feature_list_; |
| 68 }; | 76 }; |
| 69 | 77 |
| (...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 634 CreateFromParentPolicy(nullptr, origin_a_); | 642 CreateFromParentPolicy(nullptr, origin_a_); |
| 635 policy1->SetHeaderPolicy({{{"default-off", false, {origin_a_, origin_b_}}}}); | 643 policy1->SetHeaderPolicy({{{"default-off", false, {origin_a_, origin_b_}}}}); |
| 636 EXPECT_TRUE( | 644 EXPECT_TRUE( |
| 637 policy1->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_a_)); | 645 policy1->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_a_)); |
| 638 EXPECT_TRUE( | 646 EXPECT_TRUE( |
| 639 policy1->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_b_)); | 647 policy1->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_b_)); |
| 640 EXPECT_FALSE( | 648 EXPECT_FALSE( |
| 641 policy1->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_c_)); | 649 policy1->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_c_)); |
| 642 } | 650 } |
| 643 | 651 |
| 652 // Test frame policies | |
| 653 | |
| 654 TEST_F(FeaturePolicyTest, TestSimpleFramePolicy) { | |
| 655 // +-------------------------------------------------+ | |
| 656 // |(1)Origin A | | |
| 657 // |No Policy | | |
| 658 // | | | |
| 659 // |<iframe policy='{"default-self": ["Origin B"]}'> | | |
| 660 // | +-------------+ | | |
| 661 // | |(2)Origin B | | | |
| 662 // | |No Policy | | | |
| 663 // | +-------------+ | | |
| 664 // +-------------------------------------------------+ | |
| 665 // Default-self feature should be enabled in cross-origin child frame because | |
| 666 // permission was delegated through frame policy. | |
| 667 // This is the same scenario as when the iframe is declared as | |
| 668 // <iframe allow="default-self"> | |
| 669 std::unique_ptr<FeaturePolicy> policy1 = | |
| 670 CreateFromParentPolicy(nullptr, origin_a_); | |
| 671 ParsedFeaturePolicyHeader frame_policy = { | |
| 672 {{"default-self", false, {origin_b_}}}}; | |
| 673 std::unique_ptr<FeaturePolicy> policy2 = | |
| 674 CreateFromParentWithFramePolicy(policy1.get(), &frame_policy, origin_b_); | |
| 675 EXPECT_TRUE( | |
| 676 policy1->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_a_)); | |
| 677 EXPECT_FALSE( | |
| 678 policy1->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_c_)); | |
| 679 EXPECT_FALSE( | |
| 680 policy1->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_c_)); | |
| 681 EXPECT_FALSE( | |
| 682 policy2->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_a_)); | |
| 683 EXPECT_TRUE( | |
| 684 policy2->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_b_)); | |
| 685 EXPECT_FALSE( | |
| 686 policy2->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_c_)); | |
| 687 } | |
| 688 | |
| 689 TEST_F(FeaturePolicyTest, TestAllOriginFramePolicy) { | |
| 690 // +------------------------------------------+ | |
| 691 // |(1)Origin A | | |
| 692 // |No Policy | | |
| 693 // | | | |
| 694 // |<iframe policy='{"default-self": ["*"]}'> | | |
| 695 // | +-------------+ | | |
| 696 // | |(2)Origin B | | | |
| 697 // | |No Policy | | | |
| 698 // | +-------------+ | | |
| 699 // +------------------------------------------+ | |
| 700 // Default-self feature should be enabled in cross-origin child frame because | |
| 701 // permission was delegated through frame policy. | |
| 702 // This is the same scenario that arises when the iframe is declared as | |
| 703 // <iframe allowfullscreen> | |
| 704 std::unique_ptr<FeaturePolicy> policy1 = | |
| 705 CreateFromParentPolicy(nullptr, origin_a_); | |
| 706 ParsedFeaturePolicyHeader frame_policy = { | |
| 707 {{"default-self", true, std::vector<url::Origin>()}}}; | |
| 708 std::unique_ptr<FeaturePolicy> policy2 = | |
| 709 CreateFromParentWithFramePolicy(policy1.get(), &frame_policy, origin_b_); | |
| 710 EXPECT_TRUE( | |
| 711 policy1->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_a_)); | |
| 712 EXPECT_FALSE( | |
| 713 policy1->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_b_)); | |
| 714 EXPECT_FALSE( | |
| 715 policy1->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_c_)); | |
| 716 EXPECT_FALSE( | |
| 717 policy2->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_a_)); | |
| 718 EXPECT_TRUE( | |
| 719 policy2->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_b_)); | |
| 720 EXPECT_FALSE( | |
| 721 policy2->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_c_)); | |
| 722 } | |
| 723 | |
| 724 TEST_F(FeaturePolicyTest, TestFramePolicyCanBeFurtherDelegated) { | |
| 725 // +-----------------------------------------------------+ | |
| 726 // |(1)Origin A | | |
| 727 // |No Policy | | |
| 728 // | | | |
| 729 // |<iframe policy='{"default-self": ["Origin B"]}'> | | |
| 730 // | +-------------------------------------------------+ | | |
| 731 // | |(2)Origin B | | | |
| 732 // | |No Policy | | | |
| 733 // | | | | | |
| 734 // | |<iframe policy='{"default-self": ["Origin C"]}'> | | | |
| 735 // | | +-------------+ | | | |
| 736 // | | |(3)Origin C | | | | |
| 737 // | | |No Policy | | | | |
| 738 // | | +-------------+ | | | |
| 739 // | | | | | |
| 740 // | |<iframe> (No frame policy) | | | |
| 741 // | | +-------------+ | | | |
| 742 // | | |(4)Origin C | | | | |
| 743 // | | |No Policy | | | | |
| 744 // | | +-------------+ | | | |
| 745 // | +-------------------------------------------------+ | | |
| 746 // +-----------------------------------------------------+ | |
| 747 // Default-self feature should be enabled in cross-origin child frames 2 and | |
| 748 // 3. Feature should be disabled in frame 4 because it was not further | |
| 749 // delegated through frame policy. | |
| 750 std::unique_ptr<FeaturePolicy> policy1 = | |
| 751 CreateFromParentPolicy(nullptr, origin_a_); | |
| 752 ParsedFeaturePolicyHeader frame_policy1 = { | |
| 753 {{"default-self", false, {origin_b_}}}}; | |
|
raymes
2017/02/20 02:20:17
nit: We may want to have 2 functions to create the
iclelland
2017/02/21 19:51:05
That's not a bad idea. I'll follow up with that in
| |
| 754 std::unique_ptr<FeaturePolicy> policy2 = | |
| 755 CreateFromParentWithFramePolicy(policy1.get(), &frame_policy1, origin_b_); | |
| 756 ParsedFeaturePolicyHeader frame_policy2 = { | |
| 757 {{"default-self", false, {origin_c_}}}}; | |
| 758 std::unique_ptr<FeaturePolicy> policy3 = | |
| 759 CreateFromParentWithFramePolicy(policy2.get(), &frame_policy2, origin_c_); | |
| 760 std::unique_ptr<FeaturePolicy> policy4 = | |
| 761 CreateFromParentWithFramePolicy(policy2.get(), nullptr, origin_c_); | |
| 762 EXPECT_FALSE( | |
| 763 policy3->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_a_)); | |
| 764 EXPECT_FALSE( | |
| 765 policy3->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_b_)); | |
| 766 EXPECT_TRUE( | |
| 767 policy3->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_c_)); | |
| 768 EXPECT_FALSE( | |
| 769 policy4->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_a_)); | |
| 770 EXPECT_FALSE( | |
| 771 policy4->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_b_)); | |
| 772 EXPECT_FALSE( | |
| 773 policy4->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_c_)); | |
| 774 } | |
| 775 | |
| 776 TEST_F(FeaturePolicyTest, TestDefaultOnCanBeDisabledByFramePolicy) { | |
| 777 // +-------------------------------------+ | |
| 778 // |(1)Origin A | | |
| 779 // |No Policy | | |
| 780 // | | | |
| 781 // |<iframe policy='{"default-on": []}'> | | |
| 782 // | +-------------+ | | |
| 783 // | |(2)Origin A | | | |
| 784 // | |No Policy | | | |
| 785 // | +-------------+ | | |
| 786 // | | | |
| 787 // |<iframe policy='{"default-on": []}'> | | |
| 788 // | +-------------+ | | |
| 789 // | |(3)Origin B | | | |
| 790 // | |No Policy | | | |
| 791 // | +-------------+ | | |
| 792 // +-------------------------------------+ | |
| 793 // Default-on feature should be disabled in both same-origin and cross-origin | |
| 794 // child frames because permission was removed through frame policy. | |
| 795 std::unique_ptr<FeaturePolicy> policy1 = | |
| 796 CreateFromParentPolicy(nullptr, origin_a_); | |
| 797 ParsedFeaturePolicyHeader frame_policy1 = { | |
| 798 {{"default-on", false, std::vector<url::Origin>()}}}; | |
| 799 std::unique_ptr<FeaturePolicy> policy2 = | |
| 800 CreateFromParentWithFramePolicy(policy1.get(), &frame_policy1, origin_a_); | |
| 801 ParsedFeaturePolicyHeader frame_policy2 = { | |
| 802 {{"default-on", false, std::vector<url::Origin>()}}}; | |
| 803 std::unique_ptr<FeaturePolicy> policy3 = | |
| 804 CreateFromParentWithFramePolicy(policy1.get(), &frame_policy2, origin_b_); | |
| 805 EXPECT_TRUE(policy1->IsFeatureEnabledForOrigin(kDefaultOnFeature, origin_a_)); | |
| 806 EXPECT_TRUE(policy1->IsFeatureEnabledForOrigin(kDefaultOnFeature, origin_b_)); | |
| 807 EXPECT_TRUE(policy1->IsFeatureEnabledForOrigin(kDefaultOnFeature, origin_c_)); | |
| 808 EXPECT_FALSE( | |
| 809 policy2->IsFeatureEnabledForOrigin(kDefaultOnFeature, origin_a_)); | |
| 810 EXPECT_FALSE( | |
| 811 policy2->IsFeatureEnabledForOrigin(kDefaultOnFeature, origin_b_)); | |
| 812 EXPECT_FALSE( | |
| 813 policy2->IsFeatureEnabledForOrigin(kDefaultOnFeature, origin_c_)); | |
| 814 EXPECT_FALSE( | |
| 815 policy3->IsFeatureEnabledForOrigin(kDefaultOnFeature, origin_a_)); | |
| 816 EXPECT_FALSE( | |
| 817 policy3->IsFeatureEnabledForOrigin(kDefaultOnFeature, origin_b_)); | |
| 818 EXPECT_FALSE( | |
| 819 policy3->IsFeatureEnabledForOrigin(kDefaultOnFeature, origin_c_)); | |
| 820 } | |
| 821 | |
| 822 TEST_F(FeaturePolicyTest, TestDefaultOffMustBeEnabledByChildFrame) { | |
| 823 // +------------------------------------------------+ | |
| 824 // |(1)Origin A | | |
| 825 // |Policy: {"default-off": ["self"]} | | |
| 826 // | | | |
| 827 // |<iframe policy='{"default-off": ["Origin A"]}'> | | |
| 828 // | +-------------+ | | |
| 829 // | |(2)Origin A | | | |
| 830 // | |No Policy | | | |
| 831 // | +-------------+ | | |
| 832 // | | | |
| 833 // |<iframe policy='{"default-off": ["Origin B"]}'> | | |
| 834 // | +-------------+ | | |
| 835 // | |(3)Origin B | | | |
| 836 // | |No Policy | | | |
| 837 // | +-------------+ | | |
| 838 // +------------------------------------------------+ | |
| 839 // Default-off feature should be disabled in both same-origin and cross-origin | |
| 840 // child frames because they did not declare their own policy to enable it. | |
| 841 std::unique_ptr<FeaturePolicy> policy1 = | |
| 842 CreateFromParentPolicy(nullptr, origin_a_); | |
| 843 policy1->SetHeaderPolicy({{{"default-off", false, {origin_a_}}}}); | |
| 844 ParsedFeaturePolicyHeader frame_policy1 = { | |
| 845 {{"default-off", false, {origin_a_}}}}; | |
| 846 std::unique_ptr<FeaturePolicy> policy2 = | |
| 847 CreateFromParentWithFramePolicy(policy1.get(), &frame_policy1, origin_a_); | |
| 848 ParsedFeaturePolicyHeader frame_policy2 = { | |
| 849 {{"default-off", false, {origin_b_}}}}; | |
| 850 std::unique_ptr<FeaturePolicy> policy3 = | |
| 851 CreateFromParentWithFramePolicy(policy1.get(), &frame_policy2, origin_b_); | |
| 852 EXPECT_TRUE( | |
| 853 policy1->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_a_)); | |
| 854 EXPECT_FALSE( | |
| 855 policy1->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_b_)); | |
| 856 EXPECT_FALSE( | |
| 857 policy1->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_c_)); | |
| 858 EXPECT_FALSE( | |
| 859 policy2->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_a_)); | |
| 860 EXPECT_FALSE( | |
| 861 policy2->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_b_)); | |
| 862 EXPECT_FALSE( | |
| 863 policy2->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_c_)); | |
| 864 EXPECT_FALSE( | |
| 865 policy3->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_a_)); | |
| 866 EXPECT_FALSE( | |
| 867 policy3->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_b_)); | |
| 868 EXPECT_FALSE( | |
| 869 policy3->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_c_)); | |
| 870 } | |
| 871 | |
| 872 TEST_F(FeaturePolicyTest, TestDefaultOffCanBeEnabledByChildFrame) { | |
| 873 // +------------------------------------------------+ | |
| 874 // |(1)Origin A | | |
| 875 // |Policy: {"default-off": ["self"]} | | |
| 876 // | | | |
| 877 // |<iframe policy='{"default-off": ["Origin A"]}'> | | |
| 878 // | +--------------------------------------------+ | | |
| 879 // | |(2)Origin A | | | |
| 880 // | |Policy: {"default-off": ["self"]} | | | |
| 881 // | +--------------------------------------------+ | | |
| 882 // | | | |
| 883 // |<iframe policy='{"default-off": ["Origin B"]}'> | | |
| 884 // | +--------------------------------------------+ | | |
| 885 // | |(3)Origin B | | | |
| 886 // | |Policy: {"default-off": ["self"]} | | | |
| 887 // | +--------------------------------------------+ | | |
| 888 // +------------------------------------------------+ | |
| 889 // Default-off feature should be enabled in both same-origin and cross-origin | |
| 890 // child frames because it is delegated through the parent's frame policy, and | |
| 891 // they declare their own policy to enable it. | |
| 892 std::unique_ptr<FeaturePolicy> policy1 = | |
| 893 CreateFromParentPolicy(nullptr, origin_a_); | |
| 894 policy1->SetHeaderPolicy({{{"default-off", false, {origin_a_}}}}); | |
| 895 ParsedFeaturePolicyHeader frame_policy1 = { | |
| 896 {{"default-off", false, {origin_a_}}}}; | |
| 897 std::unique_ptr<FeaturePolicy> policy2 = | |
| 898 CreateFromParentWithFramePolicy(policy1.get(), &frame_policy1, origin_a_); | |
| 899 policy2->SetHeaderPolicy({{{"default-off", false, {origin_a_}}}}); | |
| 900 ParsedFeaturePolicyHeader frame_policy2 = { | |
| 901 {{"default-off", false, {origin_b_}}}}; | |
| 902 std::unique_ptr<FeaturePolicy> policy3 = | |
| 903 CreateFromParentWithFramePolicy(policy1.get(), &frame_policy2, origin_b_); | |
| 904 policy3->SetHeaderPolicy({{{"default-off", false, {origin_b_}}}}); | |
| 905 EXPECT_TRUE( | |
| 906 policy1->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_a_)); | |
| 907 EXPECT_FALSE( | |
| 908 policy1->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_b_)); | |
| 909 EXPECT_FALSE( | |
| 910 policy1->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_c_)); | |
| 911 EXPECT_TRUE( | |
| 912 policy2->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_a_)); | |
| 913 EXPECT_FALSE( | |
| 914 policy2->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_b_)); | |
| 915 EXPECT_FALSE( | |
| 916 policy2->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_c_)); | |
| 917 EXPECT_FALSE( | |
| 918 policy3->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_a_)); | |
| 919 EXPECT_TRUE( | |
| 920 policy3->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_b_)); | |
| 921 EXPECT_FALSE( | |
| 922 policy3->IsFeatureEnabledForOrigin(kDefaultOffFeature, origin_c_)); | |
| 923 } | |
| 924 | |
| 925 TEST_F(FeaturePolicyTest, TestFramePolicyModifiesHeaderPolicy) { | |
| 926 // +-----------------------------------------------+ | |
| 927 // |(1)Origin A | | |
| 928 // |Policy: {"default-self": ["self", "Origin B"]} | | |
| 929 // | | | |
| 930 // |<iframe policy='{"default-self": []}'> | | |
| 931 // | +-------------------------------------------+ | | |
| 932 // | |(2)Origin B | | | |
| 933 // | |No Policy | | | |
| 934 // | +-------------------------------------------+ | | |
| 935 // | | | |
| 936 // |<iframe policy='{"default-self": []}'> | | |
| 937 // | +-------------------------------------------+ | | |
| 938 // | |(3)Origin B | | | |
| 939 // | |Policy: {"default-self": ["self"]} | | | |
| 940 // | +-------------------------------------------+ | | |
| 941 // +-----------------------------------------------+ | |
| 942 // Default-self feature should be disabled in both cross-origin child frames | |
| 943 // by frame policy, even though the parent frame's header policy would | |
| 944 // otherwise enable it. This is true regardless of the child frame's header | |
| 945 // policy. | |
| 946 std::unique_ptr<FeaturePolicy> policy1 = | |
| 947 CreateFromParentPolicy(nullptr, origin_a_); | |
| 948 policy1->SetHeaderPolicy({{{"default-self", false, {origin_a_, origin_b_}}}}); | |
| 949 ParsedFeaturePolicyHeader frame_policy1 = { | |
| 950 {{"default-self", false, std::vector<url::Origin>()}}}; | |
| 951 std::unique_ptr<FeaturePolicy> policy2 = | |
| 952 CreateFromParentWithFramePolicy(policy1.get(), &frame_policy1, origin_b_); | |
| 953 ParsedFeaturePolicyHeader frame_policy2 = { | |
| 954 {{"default-self", false, std::vector<url::Origin>()}}}; | |
| 955 std::unique_ptr<FeaturePolicy> policy3 = | |
| 956 CreateFromParentWithFramePolicy(policy1.get(), &frame_policy2, origin_b_); | |
| 957 policy3->SetHeaderPolicy({{{"default-self", false, {origin_b_}}}}); | |
| 958 EXPECT_FALSE( | |
| 959 policy2->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_b_)); | |
| 960 EXPECT_FALSE( | |
| 961 policy3->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_b_)); | |
| 962 } | |
| 963 | |
| 964 TEST_F(FeaturePolicyTest, TestCombineFrameAndHeaderPolicies) { | |
| 965 // +-------------------------------------------------+ | |
| 966 // |(1)Origin A | | |
| 967 // |No Policy | | |
| 968 // | | | |
| 969 // |<iframe policy='{"default-self": ["Origin B"]}'> | | |
| 970 // | +---------------------------------------------+ | | |
| 971 // | |(2)Origin B | | | |
| 972 // | |Policy: {"default-self": ["*"]} | | | |
| 973 // | | | | | |
| 974 // | |<iframe policy='{"default-self": []}'> | | | |
| 975 // | | +-------------+ | | | |
| 976 // | | |(3)Origin C | | | | |
| 977 // | | |No Policy | | | | |
| 978 // | | +-------------+ | | | |
| 979 // | | | | | |
| 980 // | |<iframe> (No frame policy) | | | |
| 981 // | | +-------------+ | | | |
| 982 // | | |(4)Origin C | | | | |
| 983 // | | |No Policy | | | | |
| 984 // | | +-------------+ | | | |
| 985 // | +---------------------------------------------+ | | |
| 986 // +-------------------------------------------------+ | |
| 987 // Default-self feature should be enabled in cross-origin child frames 2 and | |
| 988 // 4. Feature should be disabled in frame 3 by frame policy. | |
| 989 std::unique_ptr<FeaturePolicy> policy1 = | |
| 990 CreateFromParentPolicy(nullptr, origin_a_); | |
| 991 ParsedFeaturePolicyHeader frame_policy1 = { | |
| 992 {{"default-self", false, {origin_b_}}}}; | |
| 993 std::unique_ptr<FeaturePolicy> policy2 = | |
| 994 CreateFromParentWithFramePolicy(policy1.get(), &frame_policy1, origin_b_); | |
| 995 policy2->SetHeaderPolicy( | |
| 996 {{{"default-self", true, std::vector<url::Origin>()}}}); | |
| 997 ParsedFeaturePolicyHeader frame_policy2 = { | |
| 998 {{"default-self", false, std::vector<url::Origin>()}}}; | |
| 999 std::unique_ptr<FeaturePolicy> policy3 = | |
| 1000 CreateFromParentWithFramePolicy(policy2.get(), &frame_policy2, origin_c_); | |
| 1001 std::unique_ptr<FeaturePolicy> policy4 = | |
| 1002 CreateFromParentWithFramePolicy(policy2.get(), nullptr, origin_c_); | |
| 1003 EXPECT_TRUE( | |
| 1004 policy1->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_a_)); | |
| 1005 EXPECT_TRUE( | |
| 1006 policy2->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_b_)); | |
| 1007 EXPECT_FALSE( | |
| 1008 policy3->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_c_)); | |
| 1009 EXPECT_TRUE( | |
| 1010 policy4->IsFeatureEnabledForOrigin(kDefaultSelfFeature, origin_c_)); | |
| 1011 } | |
| 644 } // namespace content | 1012 } // namespace content |
| OLD | NEW |