Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "core/css/RuleFeature.h" | 5 #include "core/css/RuleFeature.h" |
| 6 | 6 |
| 7 #include "core/css/CSSSelectorList.h" | 7 #include "core/css/CSSSelectorList.h" |
| 8 #include "core/css/RuleSet.h" | 8 #include "core/css/RuleSet.h" |
| 9 #include "core/css/StylePropertySet.h" | 9 #include "core/css/StylePropertySet.h" |
| 10 #include "core/css/StyleRule.h" | 10 #include "core/css/StyleRule.h" |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 78 | 78 |
| 79 RuleFeatureSet::SelectorPreMatch collectFeatures(const String& selectorText) | 79 RuleFeatureSet::SelectorPreMatch collectFeatures(const String& selectorText) |
| 80 { | 80 { |
| 81 CSSSelectorList selectorList = CSSParser::parseSelector(strictCSSParserC ontext(), nullptr, selectorText); | 81 CSSSelectorList selectorList = CSSParser::parseSelector(strictCSSParserC ontext(), nullptr, selectorText); |
| 82 | 82 |
| 83 StyleRule* styleRule = StyleRule::create(std::move(selectorList), Mutabl eStylePropertySet::create(HTMLStandardMode)); | 83 StyleRule* styleRule = StyleRule::create(std::move(selectorList), Mutabl eStylePropertySet::create(HTMLStandardMode)); |
| 84 RuleData ruleData(styleRule, 0, 0, RuleHasNoSpecialState); | 84 RuleData ruleData(styleRule, 0, 0, RuleHasNoSpecialState); |
| 85 return m_ruleFeatureSet->collectFeaturesFromRuleData(ruleData); | 85 return m_ruleFeatureSet->collectFeaturesFromRuleData(ruleData); |
| 86 } | 86 } |
| 87 | 87 |
| 88 void clearFeatures() | |
| 89 { | |
| 90 m_ruleFeatureSet->clear(); | |
| 91 } | |
| 92 | |
| 88 void collectInvalidationSetsForClass(InvalidationLists& invalidationLists, c onst AtomicString& className) const | 93 void collectInvalidationSetsForClass(InvalidationLists& invalidationLists, c onst AtomicString& className) const |
| 89 { | 94 { |
| 90 Element* element = Traversal<HTMLElement>::firstChild(*Traversal<HTMLEle ment>::firstChild(*m_document->body())); | 95 Element* element = Traversal<HTMLElement>::firstChild(*Traversal<HTMLEle ment>::firstChild(*m_document->body())); |
| 91 m_ruleFeatureSet->collectInvalidationSetsForClass(invalidationLists, *el ement, className); | 96 m_ruleFeatureSet->collectInvalidationSetsForClass(invalidationLists, *el ement, className); |
| 92 } | 97 } |
| 93 | 98 |
| 94 void collectInvalidationSetsForId(InvalidationLists& invalidationLists, cons t AtomicString& id) const | 99 void collectInvalidationSetsForId(InvalidationLists& invalidationLists, cons t AtomicString& id) const |
| 95 { | 100 { |
| 96 Element* element = Traversal<HTMLElement>::firstChild(*Traversal<HTMLEle ment>::firstChild(*m_document->body())); | 101 Element* element = Traversal<HTMLElement>::firstChild(*Traversal<HTMLEle ment>::firstChild(*m_document->body())); |
| 97 m_ruleFeatureSet->collectInvalidationSetsForId(invalidationLists, *eleme nt, id); | 102 m_ruleFeatureSet->collectInvalidationSetsForId(invalidationLists, *eleme nt, id); |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 248 void expectSiblingRuleCount(unsigned count) | 253 void expectSiblingRuleCount(unsigned count) |
| 249 { | 254 { |
| 250 EXPECT_EQ(count, m_ruleFeatureSet->siblingRules.size()); | 255 EXPECT_EQ(count, m_ruleFeatureSet->siblingRules.size()); |
| 251 } | 256 } |
| 252 | 257 |
| 253 void expectUncommonAttributeRuleCount(unsigned count) | 258 void expectUncommonAttributeRuleCount(unsigned count) |
| 254 { | 259 { |
| 255 EXPECT_EQ(count, m_ruleFeatureSet->uncommonAttributeRules.size()); | 260 EXPECT_EQ(count, m_ruleFeatureSet->uncommonAttributeRules.size()); |
| 256 } | 261 } |
| 257 | 262 |
| 263 void expectFullRecalcForRuleSetInvalidation(bool expected) | |
| 264 { | |
| 265 EXPECT_EQ(expected, m_ruleFeatureSet->needsFullRecalcForRuleSetInvalidat ion()); | |
| 266 } | |
| 267 | |
| 258 private: | 268 private: |
| 259 PersistentPartObject<RuleFeatureSet> m_ruleFeatureSet; | 269 PersistentPartObject<RuleFeatureSet> m_ruleFeatureSet; |
| 260 Persistent<Document> m_document; | 270 Persistent<Document> m_document; |
| 261 }; | 271 }; |
| 262 | 272 |
| 263 TEST_F(RuleFeatureSetTest, interleavedDescendantSibling1) | 273 TEST_F(RuleFeatureSetTest, interleavedDescendantSibling1) |
| 264 { | 274 { |
| 265 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(".p")); | 275 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(".p")); |
| 266 | 276 |
| 267 InvalidationLists invalidationLists; | 277 InvalidationLists invalidationLists; |
| (...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 898 { | 908 { |
| 899 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(".blah:-webkit-a ny(#nomatch, :nth-child(2n)) .a")); | 909 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(".blah:-webkit-a ny(#nomatch, :nth-child(2n)) .a")); |
| 900 | 910 |
| 901 InvalidationLists invalidationLists; | 911 InvalidationLists invalidationLists; |
| 902 collectNthInvalidationSet(invalidationLists); | 912 collectNthInvalidationSet(invalidationLists); |
| 903 | 913 |
| 904 expectNoSelfInvalidation(invalidationLists.descendants); | 914 expectNoSelfInvalidation(invalidationLists.descendants); |
| 905 expectClassInvalidation("a", invalidationLists.descendants); | 915 expectClassInvalidation("a", invalidationLists.descendants); |
| 906 } | 916 } |
| 907 | 917 |
| 918 TEST_F(RuleFeatureSetTest, RuleSetInvalidationTypeSelector) | |
| 919 { | |
| 920 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures("div")); | |
| 921 expectFullRecalcForRuleSetInvalidation(false); | |
| 922 clearFeatures(); | |
| 923 | |
| 924 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures("* div")); | |
| 925 expectFullRecalcForRuleSetInvalidation(false); | |
| 926 clearFeatures(); | |
| 927 | |
| 928 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures("body *")); | |
| 929 expectFullRecalcForRuleSetInvalidation(true); | |
| 930 } | |
| 931 | |
| 932 TEST_F(RuleFeatureSetTest, RuleSetInvalidationClassIdAttr) | |
| 933 { | |
| 934 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(".c")); | |
| 935 expectFullRecalcForRuleSetInvalidation(false); | |
| 936 clearFeatures(); | |
| 937 | |
| 938 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(".c *")); | |
| 939 expectFullRecalcForRuleSetInvalidation(false); | |
| 940 clearFeatures(); | |
| 941 | |
| 942 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures("#i")); | |
| 943 expectFullRecalcForRuleSetInvalidation(false); | |
| 944 clearFeatures(); | |
| 945 | |
| 946 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures("#i *")); | |
| 947 expectFullRecalcForRuleSetInvalidation(false); | |
| 948 clearFeatures(); | |
| 949 | |
| 950 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures("[attr]")); | |
| 951 expectFullRecalcForRuleSetInvalidation(false); | |
| 952 clearFeatures(); | |
| 953 | |
| 954 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures("[attr] *")); | |
| 955 expectFullRecalcForRuleSetInvalidation(false); | |
| 956 } | |
| 957 | |
| 958 TEST_F(RuleFeatureSetTest, RuleSetInvalidationHoverActiveFocus) | |
| 959 { | |
| 960 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(":hover:active:f ocus")); | |
| 961 expectFullRecalcForRuleSetInvalidation(true); | |
| 962 } | |
| 963 | |
| 964 TEST_F(RuleFeatureSetTest, RuleSetInvalidationHostContext) | |
| 965 { | |
| 966 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(":host-context(. x)")); | |
| 967 expectFullRecalcForRuleSetInvalidation(true); | |
| 968 clearFeatures(); | |
| 969 | |
| 970 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(":host-context(. x) .y")); | |
| 971 expectFullRecalcForRuleSetInvalidation(false); | |
| 972 } | |
| 973 | |
| 974 TEST_F(RuleFeatureSetTest, RuleSetInvalidationHost) | |
| 975 { | |
| 976 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(":host(.x)")); | |
| 977 expectFullRecalcForRuleSetInvalidation(false); | |
| 978 clearFeatures(); | |
| 979 | |
| 980 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(":host(*) .y")); | |
| 981 expectFullRecalcForRuleSetInvalidation(false); | |
| 982 clearFeatures(); | |
| 983 | |
| 984 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(":host(.x) .y")) ; | |
| 985 expectFullRecalcForRuleSetInvalidation(false); | |
| 986 } | |
| 987 | |
| 988 TEST_F(RuleFeatureSetTest, RuleSetInvalidationNot) | |
| 989 { | |
| 990 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(":not(.x)")); | |
| 991 expectFullRecalcForRuleSetInvalidation(true); | |
| 992 clearFeatures(); | |
| 993 | |
| 994 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(":not(.x) :hover ")); | |
| 995 expectFullRecalcForRuleSetInvalidation(true); | |
| 996 clearFeatures(); | |
| 997 | |
| 998 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(":not(.x) .y")); | |
| 999 expectFullRecalcForRuleSetInvalidation(false); | |
| 1000 clearFeatures(); | |
| 1001 | |
| 1002 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(":not(.x) + .y") ); | |
| 1003 expectFullRecalcForRuleSetInvalidation(false); | |
| 1004 } | |
| 1005 | |
| 1006 TEST_F(RuleFeatureSetTest, RuleSetInvalidationCustomPseudo) | |
| 1007 { | |
| 1008 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures("::-webkit-slide r-thumb")); | |
| 1009 expectFullRecalcForRuleSetInvalidation(true); | |
| 1010 clearFeatures(); | |
| 1011 | |
| 1012 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(".x::-webkit-sli der-thumb")); | |
| 1013 expectFullRecalcForRuleSetInvalidation(false); | |
| 1014 clearFeatures(); | |
| 1015 | |
| 1016 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(".x + ::-webkit- slider-thumb")); | |
| 1017 expectFullRecalcForRuleSetInvalidation(false); | |
| 1018 } | |
| 1019 | |
| 1020 TEST_F(RuleFeatureSetTest, RuleSetInvalidationDeep) | |
| 1021 { | |
| 1022 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures("* /deep/ .x")); | |
| 1023 expectFullRecalcForRuleSetInvalidation(true); | |
| 1024 clearFeatures(); | |
| 1025 | |
| 1026 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures("body /deep/ .x" )); | |
| 1027 expectFullRecalcForRuleSetInvalidation(true); | |
| 1028 clearFeatures(); | |
| 1029 | |
| 1030 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures("#x /deep/ .y")) ; | |
| 1031 expectFullRecalcForRuleSetInvalidation(false); | |
| 1032 clearFeatures(); | |
| 1033 | |
| 1034 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures("#x /deep/ *")); | |
| 1035 expectFullRecalcForRuleSetInvalidation(false); | |
| 1036 } | |
| 1037 | |
| 1038 TEST_F(RuleFeatureSetTest, RuleSetInvalidationShadow) | |
| 1039 { | |
| 1040 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures("*::shadow .x")) ; | |
| 1041 expectFullRecalcForRuleSetInvalidation(true); | |
| 1042 clearFeatures(); | |
| 1043 | |
| 1044 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(".x::shadow *")) ; | |
| 1045 expectFullRecalcForRuleSetInvalidation(false); | |
| 1046 clearFeatures(); | |
| 1047 | |
| 1048 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures("[x] ::shadow .y ")); | |
| 1049 expectFullRecalcForRuleSetInvalidation(false); | |
| 1050 } | |
| 1051 | |
| 1052 TEST_F(RuleFeatureSetTest, RuleSetInvalidationContent) | |
| 1053 { | |
| 1054 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures("*::content .x") ); | |
| 1055 expectFullRecalcForRuleSetInvalidation(true); | |
| 1056 clearFeatures(); | |
| 1057 | |
| 1058 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(".x::content *") ); | |
| 1059 expectFullRecalcForRuleSetInvalidation(false); | |
| 1060 clearFeatures(); | |
| 1061 | |
| 1062 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures("[x] ::content . y")); | |
| 1063 expectFullRecalcForRuleSetInvalidation(false); | |
|
rune
2016/09/14 07:47:31
This is not going to work since we're collecting f
| |
| 1064 } | |
| 1065 | |
| 1066 TEST_F(RuleFeatureSetTest, RuleSetInvalidationSlotted) | |
| 1067 { | |
| 1068 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures("::slotted(*)")) ; | |
| 1069 expectFullRecalcForRuleSetInvalidation(true); | |
| 1070 clearFeatures(); | |
| 1071 | |
| 1072 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures("::slotted(.y)") ); | |
| 1073 expectFullRecalcForRuleSetInvalidation(false); | |
| 1074 clearFeatures(); | |
| 1075 | |
| 1076 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(".x::slotted(.y) ")); | |
| 1077 expectFullRecalcForRuleSetInvalidation(false); | |
| 1078 clearFeatures(); | |
| 1079 | |
| 1080 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures("[x] ::slotted(. y)")); | |
| 1081 expectFullRecalcForRuleSetInvalidation(false); | |
| 1082 } | |
| 1083 | |
| 1084 TEST_F(RuleFeatureSetTest, RuleSetInvalidationAnyPseudo) | |
| 1085 { | |
| 1086 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(":-webkit-any(*, #x)")); | |
| 1087 expectFullRecalcForRuleSetInvalidation(true); | |
| 1088 clearFeatures(); | |
| 1089 | |
| 1090 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(".x:-webkit-any( *, #y)")); | |
| 1091 expectFullRecalcForRuleSetInvalidation(false); | |
| 1092 clearFeatures(); | |
| 1093 | |
| 1094 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(":-webkit-any(:- webkit-any(.a, .b), #x)")); | |
| 1095 expectFullRecalcForRuleSetInvalidation(false); | |
| 1096 clearFeatures(); | |
| 1097 | |
| 1098 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(":-webkit-any(:- webkit-any(.a, *), #x)")); | |
| 1099 expectFullRecalcForRuleSetInvalidation(true); | |
| 1100 clearFeatures(); | |
| 1101 | |
| 1102 EXPECT_EQ(RuleFeatureSet::SelectorMayMatch, collectFeatures(":-webkit-any(*, .a) *")); | |
| 1103 expectFullRecalcForRuleSetInvalidation(true); | |
| 1104 } | |
| 1105 | |
| 908 } // namespace blink | 1106 } // namespace blink |
| OLD | NEW |