OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc.
All rights reserved. | 3 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc.
All rights reserved. |
4 * | 4 * |
5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
9 * | 9 * |
10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 unsigned c; | 128 unsigned c; |
129 unsigned d[4]; | 129 unsigned d[4]; |
130 }; | 130 }; |
131 | 131 |
132 static_assert(sizeof(RuleData) == sizeof(SameSizeAsRuleData), "RuleData should s
tay small"); | 132 static_assert(sizeof(RuleData) == sizeof(SameSizeAsRuleData), "RuleData should s
tay small"); |
133 | 133 |
134 class CORE_EXPORT RuleSet : public GarbageCollectedFinalized<RuleSet> { | 134 class CORE_EXPORT RuleSet : public GarbageCollectedFinalized<RuleSet> { |
135 WTF_MAKE_NONCOPYABLE(RuleSet); | 135 WTF_MAKE_NONCOPYABLE(RuleSet); |
136 public: | 136 public: |
137 static RuleSet* create() { return new RuleSet; } | 137 static RuleSet* create() { return new RuleSet; } |
| 138 static RuleSet* emptyRuleSet(); |
138 | 139 |
139 void addRulesFromSheet(StyleSheetContents*, const MediaQueryEvaluator&, AddR
uleFlags = RuleHasNoSpecialState); | 140 void addRulesFromSheet(StyleSheetContents*, const MediaQueryEvaluator&, AddR
uleFlags = RuleHasNoSpecialState); |
140 void addStyleRule(StyleRule*, AddRuleFlags); | 141 void addStyleRule(StyleRule*, AddRuleFlags); |
141 void addRule(StyleRule*, unsigned selectorIndex, AddRuleFlags); | 142 void addRule(StyleRule*, unsigned selectorIndex, AddRuleFlags); |
142 | 143 |
143 const RuleFeatureSet& features() const { return m_features; } | 144 const RuleFeatureSet& features() const { return m_features; } |
144 | 145 |
145 const HeapTerminatedArray<RuleData>* idRules(const AtomicString& key) const
{ ASSERT(!m_pendingRules); return m_idRules.get(key); } | 146 const HeapTerminatedArray<RuleData>* idRules(const AtomicString& key) const
{ ASSERT(!m_pendingRules); return m_idRules.get(key); } |
146 const HeapTerminatedArray<RuleData>* classRules(const AtomicString& key) con
st { ASSERT(!m_pendingRules); return m_classRules.get(key); } | 147 const HeapTerminatedArray<RuleData>* classRules(const AtomicString& key) con
st { ASSERT(!m_pendingRules); return m_classRules.get(key); } |
147 const HeapTerminatedArray<RuleData>* tagRules(const AtomicString& key) const
{ ASSERT(!m_pendingRules); return m_tagRules.get(key); } | 148 const HeapTerminatedArray<RuleData>* tagRules(const AtomicString& key) const
{ ASSERT(!m_pendingRules); return m_tagRules.get(key); } |
148 const HeapTerminatedArray<RuleData>* shadowPseudoElementRules(const AtomicSt
ring& key) const { ASSERT(!m_pendingRules); return m_shadowPseudoElementRules.ge
t(key); } | 149 const HeapTerminatedArray<RuleData>* shadowPseudoElementRules(const AtomicSt
ring& key) const { ASSERT(!m_pendingRules); return m_shadowPseudoElementRules.ge
t(key); } |
149 const HeapVector<RuleData>* linkPseudoClassRules() const { ASSERT(!m_pending
Rules); return &m_linkPseudoClassRules; } | 150 const HeapVector<RuleData>* linkPseudoClassRules() const { ASSERT(!m_pending
Rules); return &m_linkPseudoClassRules; } |
150 const HeapVector<RuleData>* cuePseudoRules() const { ASSERT(!m_pendingRules)
; return &m_cuePseudoRules; } | 151 const HeapVector<RuleData>* cuePseudoRules() const { ASSERT(!m_pendingRules)
; return &m_cuePseudoRules; } |
151 const HeapVector<RuleData>* focusPseudoClassRules() const { ASSERT(!m_pendin
gRules); return &m_focusPseudoClassRules; } | 152 const HeapVector<RuleData>* focusPseudoClassRules() const { ASSERT(!m_pendin
gRules); return &m_focusPseudoClassRules; } |
152 const HeapVector<RuleData>* universalRules() const { ASSERT(!m_pendingRules)
; return &m_universalRules; } | 153 const HeapVector<RuleData>* universalRules() const { ASSERT(!m_pendingRules)
; return &m_universalRules; } |
153 const HeapVector<RuleData>* shadowHostRules() const { ASSERT(!m_pendingRules
); return &m_shadowHostRules; } | 154 const HeapVector<RuleData>* shadowHostRules() const { ASSERT(!m_pendingRules
); return &m_shadowHostRules; } |
154 const HeapVector<Member<StyleRulePage>>& pageRules() const { ASSERT(!m_pendi
ngRules); return m_pageRules; } | 155 const HeapVector<Member<StyleRulePage>>& pageRules() const { ASSERT(!m_pendi
ngRules); return m_pageRules; } |
155 const HeapVector<Member<StyleRuleViewport>>& viewportRules() const { ASSERT(
!m_pendingRules); return m_viewportRules; } | |
156 const HeapVector<Member<StyleRuleFontFace>>& fontFaceRules() const { return
m_fontFaceRules; } | 156 const HeapVector<Member<StyleRuleFontFace>>& fontFaceRules() const { return
m_fontFaceRules; } |
157 const HeapVector<Member<StyleRuleKeyframes>>& keyframesRules() const { retur
n m_keyframesRules; } | 157 const HeapVector<Member<StyleRuleKeyframes>>& keyframesRules() const { retur
n m_keyframesRules; } |
158 const HeapVector<MinimalRuleData>& deepCombinatorOrShadowPseudoRules() const
{ return m_deepCombinatorOrShadowPseudoRules; } | 158 const HeapVector<MinimalRuleData>& deepCombinatorOrShadowPseudoRules() const
{ return m_deepCombinatorOrShadowPseudoRules; } |
159 const HeapVector<MinimalRuleData>& contentPseudoElementRules() const { retur
n m_contentPseudoElementRules; } | 159 const HeapVector<MinimalRuleData>& contentPseudoElementRules() const { retur
n m_contentPseudoElementRules; } |
160 const HeapVector<MinimalRuleData>& slottedPseudoElementRules() const { retur
n m_slottedPseudoElementRules; } | 160 const HeapVector<MinimalRuleData>& slottedPseudoElementRules() const { retur
n m_slottedPseudoElementRules; } |
161 const MediaQueryResultList& viewportDependentMediaQueryResults() const { ret
urn m_viewportDependentMediaQueryResults; } | |
162 const MediaQueryResultList& deviceDependentMediaQueryResults() const { retur
n m_deviceDependentMediaQueryResults; } | |
163 | 161 |
164 unsigned ruleCount() const { return m_ruleCount; } | 162 unsigned ruleCount() const { return m_ruleCount; } |
165 | 163 |
166 void compactRulesIfNeeded() | 164 void compactRulesIfNeeded() |
167 { | 165 { |
168 if (!m_pendingRules) | 166 if (!m_pendingRules) |
169 return; | 167 return; |
170 compactRules(); | 168 compactRules(); |
171 } | 169 } |
172 | 170 |
173 #ifndef NDEBUG | 171 #ifndef NDEBUG |
174 void show() const; | 172 void show() const; |
175 #endif | 173 #endif |
176 | 174 |
177 DECLARE_TRACE(); | 175 DECLARE_TRACE(); |
178 | 176 |
179 private: | 177 private: |
180 using PendingRuleMap = HeapHashMap<AtomicString, Member<HeapLinkedStack<Rule
Data>>>; | 178 using PendingRuleMap = HeapHashMap<AtomicString, Member<HeapLinkedStack<Rule
Data>>>; |
181 using CompactRuleMap = HeapHashMap<AtomicString, Member<HeapTerminatedArray<
RuleData>>>; | 179 using CompactRuleMap = HeapHashMap<AtomicString, Member<HeapTerminatedArray<
RuleData>>>; |
182 | 180 |
183 RuleSet() | 181 RuleSet() |
184 : m_ruleCount(0) | 182 : m_ruleCount(0) |
185 { | 183 { |
186 } | 184 } |
187 | 185 |
188 void addToRuleSet(const AtomicString& key, PendingRuleMap&, const RuleData&)
; | 186 void addToRuleSet(const AtomicString& key, PendingRuleMap&, const RuleData&)
; |
189 void addPageRule(StyleRulePage*); | 187 void addPageRule(StyleRulePage*); |
190 void addViewportRule(StyleRuleViewport*); | |
191 void addFontFaceRule(StyleRuleFontFace*); | 188 void addFontFaceRule(StyleRuleFontFace*); |
192 void addKeyframesRule(StyleRuleKeyframes*); | 189 void addKeyframesRule(StyleRuleKeyframes*); |
193 | 190 |
194 void addChildRules(const HeapVector<Member<StyleRuleBase>>&, const MediaQuer
yEvaluator& medium, AddRuleFlags); | 191 void addChildRules(const HeapVector<Member<StyleRuleBase>>&, const MediaQuer
yEvaluator& medium, AddRuleFlags); |
195 bool findBestRuleSetAndAdd(const CSSSelector&, RuleData&); | 192 bool findBestRuleSetAndAdd(const CSSSelector&, RuleData&); |
196 | 193 |
197 void compactRules(); | 194 void compactRules(); |
198 static void compactPendingRules(PendingRuleMap&, CompactRuleMap&); | 195 static void compactPendingRules(PendingRuleMap&, CompactRuleMap&); |
199 | 196 |
200 class PendingRuleMaps : public GarbageCollected<PendingRuleMaps> { | 197 class PendingRuleMaps : public GarbageCollected<PendingRuleMaps> { |
(...skipping 22 matching lines...) Expand all Loading... |
223 CompactRuleMap m_classRules; | 220 CompactRuleMap m_classRules; |
224 CompactRuleMap m_tagRules; | 221 CompactRuleMap m_tagRules; |
225 CompactRuleMap m_shadowPseudoElementRules; | 222 CompactRuleMap m_shadowPseudoElementRules; |
226 HeapVector<RuleData> m_linkPseudoClassRules; | 223 HeapVector<RuleData> m_linkPseudoClassRules; |
227 HeapVector<RuleData> m_cuePseudoRules; | 224 HeapVector<RuleData> m_cuePseudoRules; |
228 HeapVector<RuleData> m_focusPseudoClassRules; | 225 HeapVector<RuleData> m_focusPseudoClassRules; |
229 HeapVector<RuleData> m_universalRules; | 226 HeapVector<RuleData> m_universalRules; |
230 HeapVector<RuleData> m_shadowHostRules; | 227 HeapVector<RuleData> m_shadowHostRules; |
231 RuleFeatureSet m_features; | 228 RuleFeatureSet m_features; |
232 HeapVector<Member<StyleRulePage>> m_pageRules; | 229 HeapVector<Member<StyleRulePage>> m_pageRules; |
233 HeapVector<Member<StyleRuleViewport>> m_viewportRules; | |
234 HeapVector<Member<StyleRuleFontFace>> m_fontFaceRules; | 230 HeapVector<Member<StyleRuleFontFace>> m_fontFaceRules; |
235 HeapVector<Member<StyleRuleKeyframes>> m_keyframesRules; | 231 HeapVector<Member<StyleRuleKeyframes>> m_keyframesRules; |
236 HeapVector<MinimalRuleData> m_deepCombinatorOrShadowPseudoRules; | 232 HeapVector<MinimalRuleData> m_deepCombinatorOrShadowPseudoRules; |
237 HeapVector<MinimalRuleData> m_contentPseudoElementRules; | 233 HeapVector<MinimalRuleData> m_contentPseudoElementRules; |
238 HeapVector<MinimalRuleData> m_slottedPseudoElementRules; | 234 HeapVector<MinimalRuleData> m_slottedPseudoElementRules; |
239 | 235 |
240 MediaQueryResultList m_viewportDependentMediaQueryResults; | |
241 MediaQueryResultList m_deviceDependentMediaQueryResults; | |
242 | |
243 unsigned m_ruleCount; | 236 unsigned m_ruleCount; |
244 Member<PendingRuleMaps> m_pendingRules; | 237 Member<PendingRuleMaps> m_pendingRules; |
245 | 238 |
246 #ifndef NDEBUG | 239 #ifndef NDEBUG |
247 HeapVector<RuleData> m_allRules; | 240 HeapVector<RuleData> m_allRules; |
248 #endif | 241 #endif |
249 }; | 242 }; |
250 | 243 |
251 } // namespace blink | 244 } // namespace blink |
252 | 245 |
253 #endif // RuleSet_h | 246 #endif // RuleSet_h |
OLD | NEW |