Chromium Code Reviews

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

Powered by Google App Engine