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 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 | 86 |
87 // Since StyleResolver creates RuleSets according to styles' document | 87 // Since StyleResolver creates RuleSets according to styles' document |
88 // order, a parent of the given ScopedRuleData has been already | 88 // order, a parent of the given ScopedRuleData has been already |
89 // prepared. | 89 // prepared. |
90 const ContainerNode* e = target->scope()->parentOrShadowHostNode(); | 90 const ContainerNode* e = target->scope()->parentOrShadowHostNode(); |
91 for (; e; e = e->parentOrShadowHostNode()) { | 91 for (; e; e = e->parentOrShadowHostNode()) { |
92 if (ScopedStyleResolver* scopeResolver = scopedStyleResolverFor(e)) { | 92 if (ScopedStyleResolver* scopeResolver = scopedStyleResolverFor(e)) { |
93 target->setParent(scopeResolver); | 93 target->setParent(scopeResolver); |
94 break; | 94 break; |
95 } | 95 } |
96 if (e->isShadowRoot() || e->isDocumentNode()) { | 96 if (e->isDocumentNode()) { |
97 bool dummy; | 97 bool dummy; |
98 ScopedStyleResolver* scopeResolver = addScopedStyleResolver(e, dummy
); | 98 ScopedStyleResolver* scopeResolver = addScopedStyleResolver(e, dummy
); |
99 target->setParent(scopeResolver); | 99 target->setParent(scopeResolver); |
100 setupScopeStylesTree(scopeResolver); | 100 setupScopeStylesTree(scopeResolver); |
101 break; | 101 break; |
102 } | 102 } |
103 } | 103 } |
104 } | 104 } |
105 | 105 |
106 void ScopedStyleTree::clear() | 106 void ScopedStyleTree::clear() |
107 { | 107 { |
108 m_authorStyles.clear(); | 108 m_authorStyles.clear(); |
109 m_scopeResolverForDocument = 0; | 109 m_scopeResolverForDocument = 0; |
110 m_cache.clear(); | 110 m_cache.clear(); |
111 } | 111 } |
112 | 112 |
113 void ScopedStyleTree::resolveScopeStyles(const Element* element, Vector<std::pai
r<ScopedStyleResolver*, bool>, 8>& resolvers) | 113 void ScopedStyleTree::resolveScopeStyles(const Element* element, Vector<ScopedSt
yleResolver*, 8>& resolvers) |
114 { | 114 { |
115 ScopedStyleResolver* scopeResolver = scopedResolverFor(element); | 115 for (ScopedStyleResolver* scopeResolver = scopedResolverFor(element); scopeR
esolver; scopeResolver = scopeResolver->parent()) |
116 if (!scopeResolver) | 116 resolvers.append(scopeResolver); |
117 return; | |
118 | |
119 bool applyAuthorStylesOfElementTreeScope = element->treeScope()->applyAuthor
Styles(); | |
120 bool applyAuthorStyles = m_cache.authorStyleBoundsIndex == m_cache.scopeReso
lverBoundsIndex ? applyAuthorStylesOfElementTreeScope : false; | |
121 | |
122 for ( ; scopeResolver; scopeResolver = scopeResolver->parent()) { | |
123 resolvers.append(std::pair<ScopedStyleResolver*, bool>(scopeResolver, ap
plyAuthorStyles)); | |
124 if (scopeResolver->scope()->isShadowRoot()) { | |
125 if (scopeResolver->parent()->scope()->isInShadowTree()) | |
126 applyAuthorStyles = applyAuthorStyles && toShadowRoot(scopeResol
ver->scope())->applyAuthorStyles(); | |
127 else | |
128 applyAuthorStyles = applyAuthorStylesOfElementTreeScope; | |
129 } | |
130 } | |
131 } | 117 } |
132 | 118 |
133 inline ScopedStyleResolver* ScopedStyleTree::enclosingScopedStyleResolverFor(con
st ContainerNode* scope, int& authorStyleBoundsIndex) | 119 inline ScopedStyleResolver* ScopedStyleTree::enclosingScopedStyleResolverFor(con
st ContainerNode* scope) |
134 { | 120 { |
135 for (; scope; scope = scope->parentOrShadowHostNode()) { | 121 for (; scope; scope = scope->parentOrShadowHostNode()) |
136 if (ScopedStyleResolver* scopeStyleResolver = scopedStyleResolverFor(sco
pe)) | 122 if (ScopedStyleResolver* scopeStyleResolver = scopedStyleResolverFor(sco
pe)) |
137 return scopeStyleResolver; | 123 return scopeStyleResolver; |
138 if (scope->isShadowRoot() && !toShadowRoot(scope)->applyAuthorStyles()) | |
139 --authorStyleBoundsIndex; | |
140 } | |
141 return 0; | 124 return 0; |
142 } | 125 } |
143 | 126 |
144 void ScopedStyleTree::resolveStyleCache(const ContainerNode* scope) | 127 void ScopedStyleTree::resolveStyleCache(const ContainerNode* scope) |
145 { | 128 { |
146 int authorStyleBoundsIndex = 0; | 129 m_cache.scopeResolver = enclosingScopedStyleResolverFor(scope); |
147 m_cache.scopeResolver = enclosingScopedStyleResolverFor(scope, authorStyleBo
undsIndex); | |
148 m_cache.scopeResolverBoundsIndex = authorStyleBoundsIndex; | |
149 m_cache.nodeForScopeStyles = scope; | 130 m_cache.nodeForScopeStyles = scope; |
150 m_cache.authorStyleBoundsIndex = 0; | |
151 } | 131 } |
152 | 132 |
153 void ScopedStyleTree::pushStyleCache(const ContainerNode* scope, const Container
Node* parent) | 133 void ScopedStyleTree::pushStyleCache(const ContainerNode* scope, const Container
Node* parent) |
154 { | 134 { |
155 if (m_authorStyles.isEmpty()) | 135 if (m_authorStyles.isEmpty()) |
156 return; | 136 return; |
157 | 137 |
158 if (!cacheIsValid(parent)) { | 138 if (!cacheIsValid(parent)) { |
159 resolveStyleCache(scope); | 139 resolveStyleCache(scope); |
160 return; | 140 return; |
161 } | 141 } |
162 | 142 |
163 if (scope->isShadowRoot() && !toShadowRoot(scope)->applyAuthorStyles()) | |
164 ++m_cache.authorStyleBoundsIndex; | |
165 | |
166 ScopedStyleResolver* scopeResolver = scopedStyleResolverFor(scope); | 143 ScopedStyleResolver* scopeResolver = scopedStyleResolverFor(scope); |
167 if (scopeResolver) { | 144 if (scopeResolver) |
168 m_cache.scopeResolver = scopeResolver; | 145 m_cache.scopeResolver = scopeResolver; |
169 m_cache.scopeResolverBoundsIndex = m_cache.authorStyleBoundsIndex; | |
170 } | |
171 m_cache.nodeForScopeStyles = scope; | 146 m_cache.nodeForScopeStyles = scope; |
172 } | 147 } |
173 | 148 |
174 void ScopedStyleTree::popStyleCache(const ContainerNode* scope) | 149 void ScopedStyleTree::popStyleCache(const ContainerNode* scope) |
175 { | 150 { |
176 if (cacheIsValid(scope)) { | 151 if (!cacheIsValid(scope)) |
177 bool needUpdateBoundsIndex = scope->isShadowRoot() && !toShadowRoot(scop
e)->applyAuthorStyles(); | 152 return; |
178 | 153 |
179 if (m_cache.scopeResolver && m_cache.scopeResolver->scope() == scope) { | 154 if (m_cache.scopeResolver && m_cache.scopeResolver->scope() == scope) |
180 m_cache.scopeResolver = m_cache.scopeResolver->parent(); | 155 m_cache.scopeResolver = m_cache.scopeResolver->parent(); |
181 if (needUpdateBoundsIndex) | 156 m_cache.nodeForScopeStyles = scope->parentOrShadowHostNode(); |
182 --m_cache.scopeResolverBoundsIndex; | |
183 } | |
184 if (needUpdateBoundsIndex) | |
185 --m_cache.authorStyleBoundsIndex; | |
186 m_cache.nodeForScopeStyles = scope->parentOrShadowHostNode(); | |
187 } | |
188 } | 157 } |
189 | 158 |
190 void ScopedStyleTree::collectFeaturesTo(RuleFeatureSet& features) | 159 void ScopedStyleTree::collectFeaturesTo(RuleFeatureSet& features) |
191 { | 160 { |
192 for (HashMap<const ContainerNode*, OwnPtr<ScopedStyleResolver> >::iterator i
t = m_authorStyles.begin(); it != m_authorStyles.end(); ++it) | 161 for (HashMap<const ContainerNode*, OwnPtr<ScopedStyleResolver> >::iterator i
t = m_authorStyles.begin(); it != m_authorStyles.end(); ++it) |
193 it->value->collectFeaturesTo(features); | 162 it->value->collectFeaturesTo(features); |
194 } | 163 } |
195 | 164 |
196 void ScopedStyleTree::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) cons
t | 165 void ScopedStyleTree::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) cons
t |
197 { | 166 { |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 } | 322 } |
354 | 323 |
355 void ScopedStyleResolver::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo)
const | 324 void ScopedStyleResolver::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo)
const |
356 { | 325 { |
357 MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CSS); | 326 MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CSS); |
358 info.addMember(m_authorStyle, "authorStyle"); | 327 info.addMember(m_authorStyle, "authorStyle"); |
359 info.addMember(m_atHostRules, "atHostRules"); | 328 info.addMember(m_atHostRules, "atHostRules"); |
360 } | 329 } |
361 | 330 |
362 } // namespace WebCore | 331 } // namespace WebCore |
OLD | NEW |