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

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: CORE_EXPORT 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 expectClassesInvalidation(const AtomicString& firstClassName, const Ato micString& secondClassName, InvalidationSetVector& invalidationSets)
76 {
77 EXPECT_EQ(1u, invalidationSets.size());
78 WillBeHeapHashSet<AtomicString> classes = ensureClassSet(*invalidationSe ts[0]);
79 EXPECT_EQ(2u, classes.size());
80 EXPECT_TRUE(classes.contains(firstClassName));
81 EXPECT_TRUE(classes.contains(secondClassName));
82 }
83
84 DEFINE_INLINE_TRACE()
85 {
86 #if ENABLE(OILPAN)
87 visitor->trace(m_ruleFeatureSet);
88 visitor->trace(m_document);
89 #endif
90 }
91
92 private:
93 RuleFeatureSet m_ruleFeatureSet;
94 RefPtrWillBeRawPtr<Document> m_document;
95 };
96
97 TEST_F(RuleFeatureSetTest, interleavedDescendantSibling)
98 {
99 updateInvalidationSets(".k > .l + .m ~ .n .o + .p");
100 {
101 InvalidationSetVector descendant;
102 InvalidationSetVector sibling;
103 collectInvalidationSetsForClass(descendant, sibling, "k");
104 expectClassInvalidation("p", descendant);
105 expectNoInvalidation(sibling);
106 }
107 {
108 InvalidationSetVector descendant;
109 InvalidationSetVector sibling;
110 collectInvalidationSetsForClass(descendant, sibling, "l");
111 expectNoInvalidation(descendant);
112 expectClassInvalidation("n", sibling);
113 }
114 {
115 InvalidationSetVector descendant;
116 InvalidationSetVector sibling;
117 collectInvalidationSetsForClass(descendant, sibling, "m");
118 expectNoInvalidation(descendant);
119 expectClassInvalidation("n", sibling);
120 }
121 {
122 InvalidationSetVector descendant;
123 InvalidationSetVector sibling;
124 collectInvalidationSetsForClass(descendant, sibling, "n");
125 expectClassInvalidation("p", descendant);
126 expectNoInvalidation(sibling);
127 }
128 {
129 InvalidationSetVector descendant;
130 InvalidationSetVector sibling;
131 collectInvalidationSetsForClass(descendant, sibling, "o");
132 expectNoInvalidation(descendant);
133 expectClassInvalidation("p", sibling);
134 }
135 {
136 InvalidationSetVector descendant;
137 InvalidationSetVector sibling;
138 collectInvalidationSetsForClass(descendant, sibling, "p");
139 expectSelfInvalidation(descendant);
140 expectNoInvalidation(sibling);
141 }
142 }
143
144 TEST_F(RuleFeatureSetTest, anySibling)
145 {
146 updateInvalidationSets(":-webkit-any(.q, .r) ~ .s .t");
147 {
148 InvalidationSetVector descendant;
149 InvalidationSetVector sibling;
150 collectInvalidationSetsForClass(descendant, sibling, "q");
151 expectNoInvalidation(descendant);
152 expectClassInvalidation("s", sibling);
153 }
154 {
155 InvalidationSetVector descendant;
156 InvalidationSetVector sibling;
157 collectInvalidationSetsForClass(descendant, sibling, "r");
158 expectNoInvalidation(descendant);
159 expectClassInvalidation("s", sibling);
160 }
161 {
162 InvalidationSetVector descendant;
163 InvalidationSetVector sibling;
164 collectInvalidationSetsForClass(descendant, sibling, "s");
165 expectClassInvalidation("t", descendant);
166 expectNoInvalidation(sibling);
167 }
168 {
169 InvalidationSetVector descendant;
170 InvalidationSetVector sibling;
171 collectInvalidationSetsForClass(descendant, sibling, "t");
172 expectSelfInvalidation(descendant);
173 expectNoInvalidation(sibling);
174 }
175 }
176
177 TEST_F(RuleFeatureSetTest, siblingAny)
178 {
179 updateInvalidationSets(".u .v ~ :-webkit-any(.w, .x)");
180 {
181 InvalidationSetVector descendant;
182 InvalidationSetVector sibling;
183 collectInvalidationSetsForClass(descendant, sibling, "u");
184 expectClassesInvalidation("w", "x", descendant);
185 expectNoInvalidation(sibling);
186 }
187 {
188 InvalidationSetVector descendant;
189 InvalidationSetVector sibling;
190 collectInvalidationSetsForClass(descendant, sibling, "v");
191 expectNoInvalidation(descendant);
192 expectClassesInvalidation("w", "x", sibling);
193 }
194 {
195 InvalidationSetVector descendant;
196 InvalidationSetVector sibling;
197 collectInvalidationSetsForClass(descendant, sibling, "w");
198 expectSelfInvalidation(descendant);
199 expectNoInvalidation(sibling);
200 }
201 {
202 InvalidationSetVector descendant;
203 InvalidationSetVector sibling;
204 collectInvalidationSetsForClass(descendant, sibling, "x");
205 expectSelfInvalidation(descendant);
206 expectNoInvalidation(sibling);
207 }
208 }
209
210 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698