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

Side by Side Diff: Source/core/css/RuleFeatureSetTest.cpp

Issue 1317533002: Sibling invalidation sets (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: sibling-inserted Created 5 years, 3 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
(Empty)
1
2 #include "config.h"
3 #include "core/css/RuleFeature.h"
4
5 #include "core/css/CSSSelectorList.h"
6 #include "core/css/RuleSet.h"
7 #include "core/css/StylePropertySet.h"
8 #include "core/css/StyleRule.h"
9 #include "core/css/parser/CSSParser.h"
10 #include "core/dom/ElementTraversal.h"
11 #include "core/html/HTMLBodyElement.h"
12 #include "core/html/HTMLDocument.h"
13 #include "core/html/HTMLElement.h"
14 #include "core/html/HTMLHtmlElement.h"
15 #include <gtest/gtest.h>
16
17 namespace blink {
18
19 class RuleFeatureSetTest : public ::testing::Test {
20 public:
21 RuleFeatureSetTest()
22 {
23 }
24
25 void SetUp()
26 {
27 m_document = HTMLDocument::create();
28 RefPtrWillBeRawPtr<HTMLHtmlElement> html = HTMLHtmlElement::create(*m_do cument);
29 html->appendChild(HTMLBodyElement::create(*m_document));
30 m_document->appendChild(html.release());
31
32 m_document->body()->setInnerHTML("<b><i></i></b>", ASSERT_NO_EXCEPTION);
33 }
34
35 void updateInvalidationSets(const String& selectorText)
36 {
37 CSSSelectorList selectorList;
38 CSSParser::parseSelector(strictCSSParserContext(), selectorText, selecto rList);
39
40 RefPtrWillBeRawPtr<StyleRule> styleRule = StyleRule::create(selectorList , MutableStylePropertySet::create(HTMLStandardMode));
41 RuleData ruleData(styleRule.get(), 0, 0, RuleHasNoSpecialState);
42 m_ruleFeatureSet.updateInvalidationSets(ruleData);
43 }
44
45 void collectInvalidationSetsForClass(InvalidationSetVector& descendant, Inva lidationSetVector& sibling, const AtomicString& className) const
46 {
47 Element* element = Traversal<HTMLElement>::firstChild(*Traversal<HTMLEle ment>::firstChild(*m_document->body()));
48 m_ruleFeatureSet.collectInvalidationSetsForClass(descendant, sibling, *e lement, className);
49 }
50
51 WillBeHeapHashSet<AtomicString>& ensureClassSet(DescendantInvalidationSet& i nvalidationSet)
52 {
53 return invalidationSet.ensureClassSet();
54 }
55
56 void expectNoInvalidation(InvalidationSetVector& invalidationSets)
57 {
58 EXPECT_EQ(0u, invalidationSets.size());
59 }
60
61 void expectSelfInvalidation(InvalidationSetVector& invalidationSets)
62 {
63 EXPECT_EQ(1u, invalidationSets.size());
64 EXPECT_TRUE(invalidationSets[0]->isEmpty());
65 }
66
67 void expectClassInvalidation(const AtomicString& className, InvalidationSetV ector& invalidationSets)
68 {
69 EXPECT_EQ(1u, invalidationSets.size());
70 WillBeHeapHashSet<AtomicString> classes = ensureClassSet(*invalidationSe ts[0]);
71 EXPECT_EQ(1u, classes.size());
72 EXPECT_TRUE(classes.contains(className));
73 }
74
75 void expectSiblingInvalidation(unsigned maxDirectAdjacentSelectors, const At omicString& siblingName, InvalidationSetVector& invalidationSets)
76 {
77 EXPECT_EQ(1u, invalidationSets.size());
78 WillBeHeapHashSet<AtomicString> classes = ensureClassSet(*invalidationSe ts[0]);
79 EXPECT_EQ(1u, classes.size());
80 EXPECT_TRUE(classes.contains(siblingName));
81 EXPECT_EQ(maxDirectAdjacentSelectors, invalidationSets[0]->maxDirectAdja centSelectors());
82 EXPECT_TRUE(invalidationSets[0]->siblingInvalid());
83 EXPECT_EQ(nullptr, invalidationSets[0]->descendants());
84 }
85
86 void expectSiblingDescendantInvalidation(unsigned maxDirectAdjacentSelectors , const AtomicString& siblingName, const AtomicString& descendantName, Invalidat ionSetVector& invalidationSets)
87 {
88 EXPECT_EQ(1u, invalidationSets.size());
89 WillBeHeapHashSet<AtomicString> classes = ensureClassSet(*invalidationSe ts[0]);
90 EXPECT_EQ(1u, classes.size());
91 EXPECT_TRUE(classes.contains(siblingName));
92 EXPECT_EQ(maxDirectAdjacentSelectors, invalidationSets[0]->maxDirectAdja centSelectors());
93 EXPECT_FALSE(invalidationSets[0]->siblingInvalid());
94
95 WillBeHeapHashSet<AtomicString> descendantClasses = ensureClassSet(inval idationSets[0]->ensureDescendantInvalidationSet());
96 EXPECT_EQ(1u, descendantClasses.size());
97 EXPECT_TRUE(descendantClasses.contains(descendantName));
98 }
99
100 void expectClassesInvalidation(const AtomicString& firstClassName, const Ato micString& secondClassName, InvalidationSetVector& invalidationSets)
101 {
102 EXPECT_EQ(1u, invalidationSets.size());
103 WillBeHeapHashSet<AtomicString> classes = ensureClassSet(*invalidationSe ts[0]);
104 EXPECT_EQ(2u, classes.size());
105 EXPECT_TRUE(classes.contains(firstClassName));
106 EXPECT_TRUE(classes.contains(secondClassName));
107 }
108
109 DEFINE_INLINE_TRACE()
110 {
111 #if ENABLE(OILPAN)
112 visitor->trace(m_ruleFeatureSet);
113 visitor->trace(m_document);
114 #endif
115 }
116
117 private:
118 RuleFeatureSet m_ruleFeatureSet;
119 RefPtrWillBePersistent<Document> m_document;
120 };
121
122 TEST_F(RuleFeatureSetTest, interleavedDescendantSibling)
123 {
124 updateInvalidationSets(".k > .l ~ .m + .n .o + .p");
125 {
126 InvalidationSetVector descendant;
127 InvalidationSetVector sibling;
128 collectInvalidationSetsForClass(descendant, sibling, "k");
129 expectClassInvalidation("p", descendant);
130 expectNoInvalidation(sibling);
131 }
132 {
133 InvalidationSetVector descendant;
134 InvalidationSetVector sibling;
135 collectInvalidationSetsForClass(descendant, sibling, "l");
136 expectNoInvalidation(descendant);
137 expectSiblingDescendantInvalidation(std::numeric_limits<unsigned>::max() , "n", "p", sibling);
138 }
139 {
140 InvalidationSetVector descendant;
141 InvalidationSetVector sibling;
142 collectInvalidationSetsForClass(descendant, sibling, "m");
143 expectNoInvalidation(descendant);
144 expectSiblingDescendantInvalidation(1, "n", "p", sibling);
145 }
146 {
147 InvalidationSetVector descendant;
148 InvalidationSetVector sibling;
149 collectInvalidationSetsForClass(descendant, sibling, "n");
150 expectClassInvalidation("p", descendant);
151 expectNoInvalidation(sibling);
152 }
153 {
154 InvalidationSetVector descendant;
155 InvalidationSetVector sibling;
156 collectInvalidationSetsForClass(descendant, sibling, "o");
157 expectNoInvalidation(descendant);
158 expectSiblingInvalidation(1, "p", sibling);
159 }
160 {
161 InvalidationSetVector descendant;
162 InvalidationSetVector sibling;
163 collectInvalidationSetsForClass(descendant, sibling, "p");
164 expectSelfInvalidation(descendant);
165 expectNoInvalidation(sibling);
166 }
167 }
168
169 TEST_F(RuleFeatureSetTest, anySibling)
170 {
171 updateInvalidationSets(":-webkit-any(.q, .r) ~ .s .t");
172 {
173 InvalidationSetVector descendant;
174 InvalidationSetVector sibling;
175 collectInvalidationSetsForClass(descendant, sibling, "q");
176 expectNoInvalidation(descendant);
177 expectSiblingDescendantInvalidation(std::numeric_limits<unsigned>::max() , "s", "t", sibling);
178 }
179 {
180 InvalidationSetVector descendant;
181 InvalidationSetVector sibling;
182 collectInvalidationSetsForClass(descendant, sibling, "r");
183 expectNoInvalidation(descendant);
184 expectSiblingDescendantInvalidation(std::numeric_limits<unsigned>::max() , "s", "t", sibling);
185 }
186 {
187 InvalidationSetVector descendant;
188 InvalidationSetVector sibling;
189 collectInvalidationSetsForClass(descendant, sibling, "s");
190 expectClassInvalidation("t", descendant);
191 expectNoInvalidation(sibling);
192 }
193 {
194 InvalidationSetVector descendant;
195 InvalidationSetVector sibling;
196 collectInvalidationSetsForClass(descendant, sibling, "t");
197 expectSelfInvalidation(descendant);
198 expectNoInvalidation(sibling);
199 }
200 }
201
202 TEST_F(RuleFeatureSetTest, siblingAny)
203 {
204 updateInvalidationSets(".u .v ~ :-webkit-any(.w, .x)");
205 {
206 InvalidationSetVector descendant;
207 InvalidationSetVector sibling;
208 collectInvalidationSetsForClass(descendant, sibling, "u");
209 expectClassesInvalidation("w", "x", descendant);
210 expectNoInvalidation(sibling);
211 }
212 {
213 InvalidationSetVector descendant;
214 InvalidationSetVector sibling;
215 collectInvalidationSetsForClass(descendant, sibling, "v");
216 expectNoInvalidation(descendant);
217 expectClassesInvalidation("w", "x", sibling);
218 }
219 {
220 InvalidationSetVector descendant;
221 InvalidationSetVector sibling;
222 collectInvalidationSetsForClass(descendant, sibling, "w");
223 expectSelfInvalidation(descendant);
224 expectNoInvalidation(sibling);
225 }
226 {
227 InvalidationSetVector descendant;
228 InvalidationSetVector sibling;
229 collectInvalidationSetsForClass(descendant, sibling, "x");
230 expectSelfInvalidation(descendant);
231 expectNoInvalidation(sibling);
232 }
233 }
234
235 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698