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 * Copyright (C) 2012 Google Inc. All rights reserved. | 4 * Copyright (C) 2012 Google Inc. All rights reserved. |
5 * | 5 * |
6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 class ElementRuleCollector; | 43 class ElementRuleCollector; |
44 class MediaQueryEvaluator; | 44 class MediaQueryEvaluator; |
45 class PageRuleCollector; | 45 class PageRuleCollector; |
46 class ShadowRoot; | 46 class ShadowRoot; |
47 class StyleSheetContents; | 47 class StyleSheetContents; |
48 | 48 |
49 // This class selects a RenderStyle for a given element based on a collection of
stylesheets. | 49 // This class selects a RenderStyle for a given element based on a collection of
stylesheets. |
50 class ScopedStyleResolver { | 50 class ScopedStyleResolver { |
51 WTF_MAKE_NONCOPYABLE(ScopedStyleResolver); WTF_MAKE_FAST_ALLOCATED; | 51 WTF_MAKE_NONCOPYABLE(ScopedStyleResolver); WTF_MAKE_FAST_ALLOCATED; |
52 public: | 52 public: |
53 static PassOwnPtr<ScopedStyleResolver> create(const ContainerNode* scopingNo
de) { return adoptPtr(new ScopedStyleResolver(scopingNode)); } | 53 static PassOwnPtr<ScopedStyleResolver> create(const ContainerNode& scopingNo
de) { return adoptPtr(new ScopedStyleResolver(scopingNode)); } |
54 | 54 |
55 static const ContainerNode* scopingNodeFor(const CSSStyleSheet*); | 55 static const ContainerNode* scopingNodeFor(const CSSStyleSheet*); |
56 | 56 |
57 const ContainerNode* scopingNode() const { return m_scopingNode; } | 57 const ContainerNode& scopingNode() const { return m_scopingNode; } |
58 const TreeScope* treeScope() const { return m_scopingNode->treeScope(); } | 58 const TreeScope* treeScope() const { return m_scopingNode.treeScope(); } |
59 void prepareEmptyRuleSet() { m_authorStyle = RuleSet::create(); } | 59 void prepareEmptyRuleSet() { m_authorStyle = RuleSet::create(); } |
60 void setParent(ScopedStyleResolver* newParent) { m_parent = newParent; } | 60 void setParent(ScopedStyleResolver* newParent) { m_parent = newParent; } |
61 ScopedStyleResolver* parent() { return m_parent; } | 61 ScopedStyleResolver* parent() { return m_parent; } |
62 | 62 |
63 bool hasOnlyEmptyRuleSets() const { return !m_authorStyle->ruleCount() && m_
atHostRules.isEmpty(); } | 63 bool hasOnlyEmptyRuleSets() const { return !m_authorStyle->ruleCount() && m_
atHostRules.isEmpty(); } |
64 | 64 |
65 public: | 65 public: |
66 bool checkRegionStyle(Element*); | 66 bool checkRegionStyle(Element*); |
67 const StyleRuleKeyframes* keyframeStylesForAnimation(const StringImpl* anima
tionName); | 67 const StyleRuleKeyframes* keyframeStylesForAnimation(const StringImpl* anima
tionName); |
68 void addKeyframeStyle(PassRefPtr<StyleRuleKeyframes>); | 68 void addKeyframeStyle(PassRefPtr<StyleRuleKeyframes>); |
69 | 69 |
70 void matchHostRules(ElementRuleCollector&, bool includeEmptyRules); | 70 void matchHostRules(ElementRuleCollector&, bool includeEmptyRules); |
71 void matchAuthorRules(ElementRuleCollector&, bool includeEmptyRules, bool ap
plyAuthorStyles); | 71 void matchAuthorRules(ElementRuleCollector&, bool includeEmptyRules, bool ap
plyAuthorStyles); |
72 void collectMatchingAuthorRules(ElementRuleCollector&, bool includeEmptyRule
s, bool applyAuthorStyles, CascadeScope, CascadeOrder = ignoreCascadeOrder); | 72 void collectMatchingAuthorRules(ElementRuleCollector&, bool includeEmptyRule
s, bool applyAuthorStyles, CascadeScope, CascadeOrder = ignoreCascadeOrder); |
73 void matchPageRules(PageRuleCollector&); | 73 void matchPageRules(PageRuleCollector&); |
74 void addRulesFromSheet(StyleSheetContents*, const MediaQueryEvaluator&, Styl
eResolver*); | 74 void addRulesFromSheet(StyleSheetContents*, const MediaQueryEvaluator&, Styl
eResolver*); |
75 void addHostRule(StyleRuleHost*, bool hasDocumentSecurityOrigin, const Conta
inerNode* scopingNode); | 75 void addHostRule(StyleRuleHost*, bool hasDocumentSecurityOrigin, const Conta
inerNode* scopingNode); |
76 void collectFeaturesTo(RuleFeatureSet&); | 76 void collectFeaturesTo(RuleFeatureSet&); |
77 void resetAuthorStyle(); | 77 void resetAuthorStyle(); |
78 void resetAtHostRules(const ShadowRoot*); | 78 void resetAtHostRules(const ShadowRoot*); |
79 void collectViewportRulesTo(StyleResolver*) const; | 79 void collectViewportRulesTo(StyleResolver*) const; |
80 | 80 |
81 private: | 81 private: |
82 ScopedStyleResolver() : m_scopingNode(0), m_parent(0) { } | 82 explicit ScopedStyleResolver(const ContainerNode& scopingNode) : m_scopingNo
de(scopingNode), m_parent(0) { } |
83 ScopedStyleResolver(const ContainerNode* scopingNode) : m_scopingNode(scopin
gNode), m_parent(0) { } | |
84 | 83 |
85 RuleSet* ensureAtHostRuleSetFor(const ShadowRoot*); | 84 RuleSet* ensureAtHostRuleSetFor(const ShadowRoot*); |
86 RuleSet* atHostRuleSetFor(const ShadowRoot*) const; | 85 RuleSet* atHostRuleSetFor(const ShadowRoot*) const; |
87 | 86 |
88 const ContainerNode* m_scopingNode; | 87 const ContainerNode& m_scopingNode; |
89 ScopedStyleResolver* m_parent; | 88 ScopedStyleResolver* m_parent; |
90 | 89 |
91 OwnPtr<RuleSet> m_authorStyle; | 90 OwnPtr<RuleSet> m_authorStyle; |
92 HashMap<const ShadowRoot*, OwnPtr<RuleSet> > m_atHostRules; | 91 HashMap<const ShadowRoot*, OwnPtr<RuleSet> > m_atHostRules; |
93 | 92 |
94 typedef HashMap<const StringImpl*, RefPtr<StyleRuleKeyframes> > KeyframesRul
eMap; | 93 typedef HashMap<const StringImpl*, RefPtr<StyleRuleKeyframes> > KeyframesRul
eMap; |
95 KeyframesRuleMap m_keyframesRuleMap; | 94 KeyframesRuleMap m_keyframesRuleMap; |
96 }; | 95 }; |
97 | 96 |
98 class ScopedStyleTree { | 97 class ScopedStyleTree { |
99 WTF_MAKE_NONCOPYABLE(ScopedStyleTree); WTF_MAKE_FAST_ALLOCATED; | 98 WTF_MAKE_NONCOPYABLE(ScopedStyleTree); WTF_MAKE_FAST_ALLOCATED; |
100 public: | 99 public: |
101 ScopedStyleTree() : m_scopedResolverForDocument(0), m_buildInDocumentOrder(t
rue) { } | 100 ScopedStyleTree() : m_scopedResolverForDocument(0), m_buildInDocumentOrder(t
rue) { } |
102 | 101 |
103 ScopedStyleResolver* ensureScopedStyleResolver(const ContainerNode* scopingN
ode); | 102 ScopedStyleResolver* ensureScopedStyleResolver(const ContainerNode& scopingN
ode); |
104 ScopedStyleResolver* scopedStyleResolverFor(const ContainerNode* scopingNode
); | 103 ScopedStyleResolver* scopedStyleResolverFor(const ContainerNode& scopingNode
); |
105 ScopedStyleResolver* addScopedStyleResolver(const ContainerNode* scopingNode
, bool& isNewEntry); | 104 ScopedStyleResolver* addScopedStyleResolver(const ContainerNode& scopingNode
, bool& isNewEntry); |
106 void clear(); | 105 void clear(); |
107 | 106 |
108 // for fast-path. | 107 // for fast-path. |
109 bool hasOnlyScopedResolverForDocument() const { return m_scopedResolverForDo
cument && m_authorStyles.size() == 1; } | 108 bool hasOnlyScopedResolverForDocument() const { return m_scopedResolverForDo
cument && m_authorStyles.size() == 1; } |
110 ScopedStyleResolver* scopedStyleResolverForDocument() { return m_scopedResol
verForDocument; } | 109 ScopedStyleResolver* scopedStyleResolverForDocument() { return m_scopedResol
verForDocument; } |
111 | 110 |
112 void resolveScopedStyles(const Element*, Vector<ScopedStyleResolver*, 8>&); | 111 void resolveScopedStyles(const Element*, Vector<ScopedStyleResolver*, 8>&); |
113 void collectScopedResolversForHostedShadowTrees(const Element*, Vector<Scope
dStyleResolver*, 8>&); | 112 void collectScopedResolversForHostedShadowTrees(const Element*, Vector<Scope
dStyleResolver*, 8>&); |
114 void resolveScopedKeyframesRules(const Element*, Vector<ScopedStyleResolver*
, 8>&); | 113 void resolveScopedKeyframesRules(const Element*, Vector<ScopedStyleResolver*
, 8>&); |
115 ScopedStyleResolver* scopedResolverFor(const Element*); | 114 ScopedStyleResolver* scopedResolverFor(const Element*); |
116 | 115 |
117 void remove(const ContainerNode* scopingNode); | 116 void remove(const ContainerNode* scopingNode); |
118 | 117 |
119 void pushStyleCache(const ContainerNode* scopingNode, const ContainerNode* p
arent); | 118 void pushStyleCache(const ContainerNode& scopingNode, const ContainerNode* p
arent); |
120 void popStyleCache(const ContainerNode* scopingNode); | 119 void popStyleCache(const ContainerNode& scopingNode); |
121 | 120 |
122 void collectFeaturesTo(RuleFeatureSet& features); | 121 void collectFeaturesTo(RuleFeatureSet& features); |
123 void setBuildInDocumentOrder(bool enabled) { m_buildInDocumentOrder = enable
d; } | 122 void setBuildInDocumentOrder(bool enabled) { m_buildInDocumentOrder = enable
d; } |
124 bool buildInDocumentOrder() const { return m_buildInDocumentOrder; } | 123 bool buildInDocumentOrder() const { return m_buildInDocumentOrder; } |
125 | 124 |
126 private: | 125 private: |
127 void setupScopedStylesTree(ScopedStyleResolver* target); | 126 void setupScopedStylesTree(ScopedStyleResolver* target); |
128 | 127 |
129 bool cacheIsValid(const ContainerNode* parent) const { return parent && pare
nt == m_cache.nodeForScopedStyles; } | 128 bool cacheIsValid(const ContainerNode* parent) const { return parent && pare
nt == m_cache.nodeForScopedStyles; } |
130 void resolveStyleCache(const ContainerNode* scopingNode); | 129 void resolveStyleCache(const ContainerNode* scopingNode); |
(...skipping 23 matching lines...) Expand all Loading... |
154 { | 153 { |
155 if (!cacheIsValid(element)) | 154 if (!cacheIsValid(element)) |
156 resolveStyleCache(element); | 155 resolveStyleCache(element); |
157 | 156 |
158 return m_cache.scopedResolver; | 157 return m_cache.scopedResolver; |
159 } | 158 } |
160 | 159 |
161 } // namespace WebCore | 160 } // namespace WebCore |
162 | 161 |
163 #endif // ScopedStyleResolver_h | 162 #endif // ScopedStyleResolver_h |
OLD | NEW |