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

Side by Side Diff: content/common/feature_policy/feature_policy_unittest.cc

Issue 2655023004: Feature policy: Add basic algorithm for supporting frame policies. (Closed)
Patch Set: Add frame policy to content-side code as well Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698