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 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 // Stores value=propertySet.getPropertyCSSValue(id).get(). | 165 // Stores value=propertySet.getPropertyCSSValue(id).get(). |
166 CSSPropertyValue(CSSPropertyID, const StylePropertySet&); | 166 CSSPropertyValue(CSSPropertyID, const StylePropertySet&); |
167 CSSPropertyID property; | 167 CSSPropertyID property; |
168 CSSValue* value; | 168 CSSValue* value; |
169 }; | 169 }; |
170 | 170 |
171 // This class selects a RenderStyle for a given element based on a collection of
stylesheets. | 171 // This class selects a RenderStyle for a given element based on a collection of
stylesheets. |
172 class StyleResolver { | 172 class StyleResolver { |
173 WTF_MAKE_NONCOPYABLE(StyleResolver); WTF_MAKE_FAST_ALLOCATED; | 173 WTF_MAKE_NONCOPYABLE(StyleResolver); WTF_MAKE_FAST_ALLOCATED; |
174 public: | 174 public: |
175 StyleResolver(Document*, bool matchAuthorAndUserStyles); | 175 StyleResolver(Document&, bool matchAuthorAndUserStyles); |
176 ~StyleResolver(); | 176 ~StyleResolver(); |
177 | 177 |
178 // FIXME: StyleResolver should not be keeping tree-walk state. | 178 // FIXME: StyleResolver should not be keeping tree-walk state. |
179 // These should move to some global tree-walk state, or should be contained
in a | 179 // These should move to some global tree-walk state, or should be contained
in a |
180 // TreeWalkContext or similar which is passed in to StyleResolver methods wh
en available. | 180 // TreeWalkContext or similar which is passed in to StyleResolver methods wh
en available. |
181 // Using these during tree walk will allow style selector to optimize child
and descendant selector lookups. | 181 // Using these during tree walk will allow style selector to optimize child
and descendant selector lookups. |
182 void pushParentElement(Element*); | 182 void pushParentElement(Element*); |
183 void popParentElement(Element*); | 183 void popParentElement(Element*); |
184 void pushParentShadowRoot(const ShadowRoot*); | 184 void pushParentShadowRoot(const ShadowRoot*); |
185 void popParentShadowRoot(const ShadowRoot*); | 185 void popParentShadowRoot(const ShadowRoot*); |
186 | 186 |
187 PassRefPtr<RenderStyle> styleForElement(Element*, RenderStyle* parentStyle =
0, StyleSharingBehavior = AllowStyleSharing, | 187 PassRefPtr<RenderStyle> styleForElement(Element*, RenderStyle* parentStyle =
0, StyleSharingBehavior = AllowStyleSharing, |
188 RuleMatchingBehavior = MatchAllRules, RenderRegion* regionForStyling = 0
); | 188 RuleMatchingBehavior = MatchAllRules, RenderRegion* regionForStyling = 0
); |
189 | 189 |
190 // FIXME: The following logic related to animations and keyframes should be
factored out of StyleResolver | 190 // FIXME: The following logic related to animations and keyframes should be
factored out of StyleResolver |
191 // The body of calculateCSSAnimationUpdate can move to CSSAnimations.cpp and
take just const element, const style, | 191 // The body of calculateCSSAnimationUpdate can move to CSSAnimations.cpp and
take just const element, const style, |
192 // and const ScopedStyleTree | 192 // and const ScopedStyleTree |
193 void calculateCSSAnimationUpdate(StyleResolverState&); | 193 void calculateCSSAnimationUpdate(StyleResolverState&); |
194 void resolveKeyframes(const Element*, const RenderStyle*, const StringImpl*
animationName, KeyframeAnimationEffect::KeyframeVector&); | 194 void resolveKeyframes(const Element*, const RenderStyle*, const StringImpl*
animationName, KeyframeAnimationEffect::KeyframeVector&); |
195 void keyframeStylesForAnimation(Element*, const RenderStyle*, KeyframeList&)
; | 195 void keyframeStylesForAnimation(Element*, const RenderStyle*, KeyframeList&)
; |
196 const StyleRuleKeyframes* matchScopedKeyframesRule(const Element*, const Str
ingImpl* animationName); | 196 const StyleRuleKeyframes* matchScopedKeyframesRule(const Element*, const Str
ingImpl* animationName); |
197 PassRefPtr<RenderStyle> styleForKeyframe(Element*, const RenderStyle*, const
StyleKeyframe*); | 197 PassRefPtr<RenderStyle> styleForKeyframe(Element*, const RenderStyle*, const
StyleKeyframe*); |
198 | 198 |
199 PassRefPtr<RenderStyle> pseudoStyleForElement(Element*, const PseudoStyleReq
uest&, RenderStyle* parentStyle); | 199 PassRefPtr<RenderStyle> pseudoStyleForElement(Element*, const PseudoStyleReq
uest&, RenderStyle* parentStyle); |
200 | 200 |
201 PassRefPtr<RenderStyle> styleForPage(int pageIndex); | 201 PassRefPtr<RenderStyle> styleForPage(int pageIndex); |
202 PassRefPtr<RenderStyle> defaultStyleForElement(); | 202 PassRefPtr<RenderStyle> defaultStyleForElement(); |
203 PassRefPtr<RenderStyle> styleForText(Text*); | 203 PassRefPtr<RenderStyle> styleForText(Text*); |
204 | 204 |
205 static PassRefPtr<RenderStyle> styleForDocument(const Document*, CSSFontSele
ctor* = 0); | 205 static PassRefPtr<RenderStyle> styleForDocument(const Document&, CSSFontSele
ctor* = 0); |
206 | 206 |
207 // FIXME: This only has 5 callers and should be removed. Callers should be e
xplicit about | 207 // FIXME: This only has 5 callers and should be removed. Callers should be e
xplicit about |
208 // their dependency on Document* instead of grabbing one through StyleResolv
er. | 208 // their dependency on Document* instead of grabbing one through StyleResolv
er. |
209 Document* document() { return m_document; } | 209 Document& document() { return m_document; } |
210 | 210 |
211 // FIXME: It could be better to call m_ruleSets.appendAuthorStyleSheets() di
rectly after we factor StyleRsolver further. | 211 // FIXME: It could be better to call m_ruleSets.appendAuthorStyleSheets() di
rectly after we factor StyleRsolver further. |
212 // https://bugs.webkit.org/show_bug.cgi?id=108890 | 212 // https://bugs.webkit.org/show_bug.cgi?id=108890 |
213 void appendAuthorStyleSheets(unsigned firstNew, const Vector<RefPtr<CSSStyle
Sheet> >&); | 213 void appendAuthorStyleSheets(unsigned firstNew, const Vector<RefPtr<CSSStyle
Sheet> >&); |
214 void resetAuthorStyle(const ContainerNode*); | 214 void resetAuthorStyle(const ContainerNode*); |
215 void resetAtHostRules(const ContainerNode*); | 215 void resetAtHostRules(const ContainerNode*); |
216 void finishAppendAuthorStyleSheets(); | 216 void finishAppendAuthorStyleSheets(); |
217 | 217 |
218 DocumentRuleSets& ruleSets() { return m_ruleSets; } | 218 DocumentRuleSets& ruleSets() { return m_ruleSets; } |
219 const DocumentRuleSets& ruleSets() const { return m_ruleSets; } | 219 const DocumentRuleSets& ruleSets() const { return m_ruleSets; } |
220 SelectorFilter& selectorFilter() { return m_selectorFilter; } | 220 SelectorFilter& selectorFilter() { return m_selectorFilter; } |
221 | 221 |
222 void setBuildScopedStyleTreeInDocumentOrder(bool enabled) { m_styleTree.setB
uildInDocumentOrder(enabled); } | 222 void setBuildScopedStyleTreeInDocumentOrder(bool enabled) { m_styleTree.setB
uildInDocumentOrder(enabled); } |
223 bool buildScopedStyleTreeInDocumentOrder() const { return m_styleTree.buildI
nDocumentOrder(); } | 223 bool buildScopedStyleTreeInDocumentOrder() const { return m_styleTree.buildI
nDocumentOrder(); } |
224 | 224 |
225 ScopedStyleResolver* ensureScopedStyleResolver(const ContainerNode* scope) | 225 ScopedStyleResolver* ensureScopedStyleResolver(const ContainerNode* scope) |
226 { | 226 { |
227 return m_styleTree.ensureScopedStyleResolver(scope ? scope : document())
; | 227 return m_styleTree.ensureScopedStyleResolver(scope ? scope : &document()
); |
228 } | 228 } |
229 | 229 |
230 // FIXME: Used by SharingStyleFinder, but should be removed. | 230 // FIXME: Used by SharingStyleFinder, but should be removed. |
231 bool styleSharingCandidateMatchesRuleSet(const ElementResolveContext&, Rende
rStyle*, RuleSet*); | 231 bool styleSharingCandidateMatchesRuleSet(const ElementResolveContext&, Rende
rStyle*, RuleSet*); |
232 | 232 |
233 // These methods will give back the set of rules that matched for a given el
ement (or a pseudo-element). | 233 // These methods will give back the set of rules that matched for a given el
ement (or a pseudo-element). |
234 enum CSSRuleFilter { | 234 enum CSSRuleFilter { |
235 UAAndUserCSSRules = 1 << 1, | 235 UAAndUserCSSRules = 1 << 1, |
236 AuthorCSSRules = 1 << 2, | 236 AuthorCSSRules = 1 << 2, |
237 EmptyCSSRules = 1 << 3, | 237 EmptyCSSRules = 1 << 3, |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 static inline bool isPropertyForPass(CSSPropertyID); | 303 static inline bool isPropertyForPass(CSSPropertyID); |
304 template <StyleApplicationPass pass> | 304 template <StyleApplicationPass pass> |
305 void applyMatchedProperties(StyleResolverState&, const MatchResult&, bool im
portant, int startIndex, int endIndex, bool inheritedOnly); | 305 void applyMatchedProperties(StyleResolverState&, const MatchResult&, bool im
portant, int startIndex, int endIndex, bool inheritedOnly); |
306 template <StyleApplicationPass pass> | 306 template <StyleApplicationPass pass> |
307 void applyProperties(StyleResolverState&, const StylePropertySet* properties
, StyleRule*, bool isImportant, bool inheritedOnly, PropertyWhitelistType = Prop
ertyWhitelistNone); | 307 void applyProperties(StyleResolverState&, const StylePropertySet* properties
, StyleRule*, bool isImportant, bool inheritedOnly, PropertyWhitelistType = Prop
ertyWhitelistNone); |
308 template <StyleApplicationPass pass> | 308 template <StyleApplicationPass pass> |
309 bool applyAnimatedProperties(StyleResolverState&, const DocumentTimeline*); | 309 bool applyAnimatedProperties(StyleResolverState&, const DocumentTimeline*); |
310 void matchPageRules(MatchResult&, RuleSet*, bool isLeftPage, bool isFirstPag
e, const String& pageName); | 310 void matchPageRules(MatchResult&, RuleSet*, bool isLeftPage, bool isFirstPag
e, const String& pageName); |
311 void matchPageRulesForList(Vector<StyleRulePage*>& matchedRules, const Vecto
r<StyleRulePage*>&, bool isLeftPage, bool isFirstPage, const String& pageName); | 311 void matchPageRulesForList(Vector<StyleRulePage*>& matchedRules, const Vecto
r<StyleRulePage*>&, bool isLeftPage, bool isFirstPage, const String& pageName); |
312 void collectViewportRules(); | 312 void collectViewportRules(); |
313 Settings* documentSettings() { return m_document->settings(); } | 313 Settings* documentSettings() { return m_document.settings(); } |
314 | 314 |
315 bool isLeftPage(int pageIndex) const; | 315 bool isLeftPage(int pageIndex) const; |
316 bool isRightPage(int pageIndex) const { return !isLeftPage(pageIndex); } | 316 bool isRightPage(int pageIndex) const { return !isLeftPage(pageIndex); } |
317 bool isFirstPage(int pageIndex) const; | 317 bool isFirstPage(int pageIndex) const; |
318 String pageName(int pageIndex) const; | 318 String pageName(int pageIndex) const; |
319 | 319 |
320 DocumentRuleSets m_ruleSets; | 320 DocumentRuleSets m_ruleSets; |
321 | 321 |
322 // FIXME: This likely belongs on RuleSet. | 322 // FIXME: This likely belongs on RuleSet. |
323 typedef HashMap<StringImpl*, RefPtr<StyleRuleKeyframes> > KeyframesRuleMap; | 323 typedef HashMap<StringImpl*, RefPtr<StyleRuleKeyframes> > KeyframesRuleMap; |
324 KeyframesRuleMap m_keyframesRuleMap; | 324 KeyframesRuleMap m_keyframesRuleMap; |
325 | 325 |
326 static RenderStyle* s_styleNotYetAvailable; | 326 static RenderStyle* s_styleNotYetAvailable; |
327 | 327 |
328 void cacheBorderAndBackground(); | 328 void cacheBorderAndBackground(); |
329 | 329 |
330 MatchedPropertiesCache m_matchedPropertiesCache; | 330 MatchedPropertiesCache m_matchedPropertiesCache; |
331 | 331 |
332 OwnPtr<MediaQueryEvaluator> m_medium; | 332 OwnPtr<MediaQueryEvaluator> m_medium; |
333 RefPtr<RenderStyle> m_rootDefaultStyle; | 333 RefPtr<RenderStyle> m_rootDefaultStyle; |
334 | 334 |
335 Document* m_document; | 335 Document& m_document; |
336 SelectorFilter m_selectorFilter; | 336 SelectorFilter m_selectorFilter; |
337 | 337 |
338 bool m_matchAuthorAndUserStyles; | 338 bool m_matchAuthorAndUserStyles; |
339 | 339 |
340 RefPtr<CSSFontSelector> m_fontSelector; | 340 RefPtr<CSSFontSelector> m_fontSelector; |
341 Vector<OwnPtr<MediaQueryResult> > m_viewportDependentMediaQueryResults; | 341 Vector<OwnPtr<MediaQueryResult> > m_viewportDependentMediaQueryResults; |
342 | 342 |
343 RefPtr<ViewportStyleResolver> m_viewportStyleResolver; | 343 RefPtr<ViewportStyleResolver> m_viewportStyleResolver; |
344 | 344 |
345 ScopedStyleTree m_styleTree; | 345 ScopedStyleTree m_styleTree; |
(...skipping 24 matching lines...) Expand all Loading... |
370 PseudoId ignoreDynamicPseudo = NOPSEUDO; | 370 PseudoId ignoreDynamicPseudo = NOPSEUDO; |
371 if (selectorChecker.match(selectorCheckingContext, ignoreDynamicPseudo,
DOMSiblingTraversalStrategy()) == SelectorChecker::SelectorMatches) | 371 if (selectorChecker.match(selectorCheckingContext, ignoreDynamicPseudo,
DOMSiblingTraversalStrategy()) == SelectorChecker::SelectorMatches) |
372 return true; | 372 return true; |
373 } | 373 } |
374 return false; | 374 return false; |
375 } | 375 } |
376 | 376 |
377 } // namespace WebCore | 377 } // namespace WebCore |
378 | 378 |
379 #endif // StyleResolver_h | 379 #endif // StyleResolver_h |
OLD | NEW |