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

Side by Side Diff: Source/core/css/resolver/StyleResolver.cpp

Issue 23567016: Have ScopedStyleResolver deal with ContainerNode references, not pointers (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/css/resolver/StyleResolver.h ('k') | Source/core/dom/Element.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com)
4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com)
5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved. 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved.
6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> 6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> 7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org>
8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/)
9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. 9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. 10 * Copyright (C) Research In Motion Limited 2011. All rights reserved.
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 177
178 if (document().renderer() && document().renderer()->style()) 178 if (document().renderer() && document().renderer()->style())
179 document().renderer()->style()->font().update(fontSelector()); 179 document().renderer()->style()->font().update(fontSelector());
180 180
181 if (RuntimeEnabledFeatures::cssViewportEnabled()) 181 if (RuntimeEnabledFeatures::cssViewportEnabled())
182 collectViewportRules(); 182 collectViewportRules();
183 } 183 }
184 184
185 void StyleResolver::resetAuthorStyle(const ContainerNode* scopingNode) 185 void StyleResolver::resetAuthorStyle(const ContainerNode* scopingNode)
186 { 186 {
187 ScopedStyleResolver* resolver = scopingNode ? m_styleTree.scopedStyleResolve rFor(scopingNode) : m_styleTree.scopedStyleResolverForDocument(); 187 ScopedStyleResolver* resolver = scopingNode ? m_styleTree.scopedStyleResolve rFor(*scopingNode) : m_styleTree.scopedStyleResolverForDocument();
188 if (!resolver) 188 if (!resolver)
189 return; 189 return;
190 190
191 m_ruleSets.shadowDistributedRules().reset(scopingNode); 191 m_ruleSets.shadowDistributedRules().reset(scopingNode);
192 192
193 resolver->resetAuthorStyle(); 193 resolver->resetAuthorStyle();
194 if (!scopingNode) 194 if (!scopingNode)
195 return; 195 return;
196 196
197 if (scopingNode->isShadowRoot()) 197 if (scopingNode->isShadowRoot())
198 resetAtHostRules(scopingNode); 198 resetAtHostRules(scopingNode);
199 199
200 if (!resolver->hasOnlyEmptyRuleSets()) 200 if (!resolver->hasOnlyEmptyRuleSets())
201 return; 201 return;
202 202
203 m_styleTree.remove(scopingNode); 203 m_styleTree.remove(scopingNode);
204 } 204 }
205 205
206 void StyleResolver::resetAtHostRules(const ContainerNode* scopingNode) 206 void StyleResolver::resetAtHostRules(const ContainerNode* scopingNode)
207 { 207 {
208 ASSERT(scopingNode); 208 ASSERT(scopingNode);
209 ASSERT(scopingNode->isShadowRoot()); 209 ASSERT(scopingNode->isShadowRoot());
210 210
211 const ShadowRoot* shadowRoot = toShadowRoot(scopingNode); 211 const ShadowRoot* shadowRoot = toShadowRoot(scopingNode);
212 const ContainerNode* shadowHost = shadowRoot->shadowHost(); 212 const ContainerNode* shadowHost = shadowRoot->shadowHost();
213 ScopedStyleResolver* resolver = m_styleTree.scopedStyleResolverFor(shadowHos t); 213 ASSERT(shadowHost);
214 ScopedStyleResolver* resolver = m_styleTree.scopedStyleResolverFor(*shadowHo st);
214 if (!resolver) 215 if (!resolver)
215 return; 216 return;
216 217
217 resolver->resetAtHostRules(shadowRoot); 218 resolver->resetAtHostRules(shadowRoot);
218 if (!resolver->hasOnlyEmptyRuleSets()) 219 if (!resolver->hasOnlyEmptyRuleSets())
219 return; 220 return;
220 221
221 m_styleTree.remove(shadowHost); 222 m_styleTree.remove(shadowHost);
222 } 223 }
223 224
(...skipping 13 matching lines...) Expand all
237 m_features.clear(); 238 m_features.clear();
238 m_ruleSets.collectFeaturesTo(m_features, document().isViewSource()); 239 m_ruleSets.collectFeaturesTo(m_features, document().isViewSource());
239 m_styleTree.collectFeaturesTo(m_features); 240 m_styleTree.collectFeaturesTo(m_features);
240 241
241 m_siblingRuleSet = makeRuleSet(m_features.siblingRules); 242 m_siblingRuleSet = makeRuleSet(m_features.siblingRules);
242 m_uncommonAttributeRuleSet = makeRuleSet(m_features.uncommonAttributeRules); 243 m_uncommonAttributeRuleSet = makeRuleSet(m_features.uncommonAttributeRules);
243 } 244 }
244 245
245 void StyleResolver::pushParentElement(Element* parent) 246 void StyleResolver::pushParentElement(Element* parent)
246 { 247 {
248 ASSERT(parent);
247 const ContainerNode* parentsParent = parent->parentOrShadowHostElement(); 249 const ContainerNode* parentsParent = parent->parentOrShadowHostElement();
248 250
249 // We are not always invoked consistently. For example, script execution can cause us to enter 251 // We are not always invoked consistently. For example, script execution can cause us to enter
250 // style recalc in the middle of tree building. We may also be invoked from somewhere within the tree. 252 // style recalc in the middle of tree building. We may also be invoked from somewhere within the tree.
251 // Reset the stack in this case, or if we see a new root element. 253 // Reset the stack in this case, or if we see a new root element.
252 // Otherwise just push the new parent. 254 // Otherwise just push the new parent.
253 if (!parentsParent || m_selectorFilter.parentStackIsEmpty()) 255 if (!parentsParent || m_selectorFilter.parentStackIsEmpty())
254 m_selectorFilter.setupParentStack(parent); 256 m_selectorFilter.setupParentStack(parent);
255 else 257 else
256 m_selectorFilter.pushParent(parent); 258 m_selectorFilter.pushParent(parent);
257 259
258 // Note: We mustn't skip ShadowRoot nodes for the scope stack. 260 // Note: We mustn't skip ShadowRoot nodes for the scope stack.
259 m_styleTree.pushStyleCache(parent, parent->parentOrShadowHostNode()); 261 m_styleTree.pushStyleCache(*parent, parent->parentOrShadowHostNode());
260 } 262 }
261 263
262 void StyleResolver::popParentElement(Element* parent) 264 void StyleResolver::popParentElement(Element* parent)
263 { 265 {
266 ASSERT(parent);
264 // Note that we may get invoked for some random elements in some wacky cases during style resolve. 267 // Note that we may get invoked for some random elements in some wacky cases during style resolve.
265 // Pause maintaining the stack in this case. 268 // Pause maintaining the stack in this case.
266 if (m_selectorFilter.parentStackIsConsistent(parent)) 269 if (m_selectorFilter.parentStackIsConsistent(parent))
267 m_selectorFilter.popParent(); 270 m_selectorFilter.popParent();
268 271
269 m_styleTree.popStyleCache(parent); 272 m_styleTree.popStyleCache(*parent);
270 } 273 }
271 274
272 void StyleResolver::pushParentShadowRoot(const ShadowRoot* shadowRoot) 275 void StyleResolver::pushParentShadowRoot(const ShadowRoot& shadowRoot)
273 { 276 {
274 ASSERT(shadowRoot->host()); 277 ASSERT(shadowRoot.host());
275 m_styleTree.pushStyleCache(shadowRoot, shadowRoot->host()); 278 m_styleTree.pushStyleCache(shadowRoot, shadowRoot.host());
276 } 279 }
277 280
278 void StyleResolver::popParentShadowRoot(const ShadowRoot* shadowRoot) 281 void StyleResolver::popParentShadowRoot(const ShadowRoot& shadowRoot)
279 { 282 {
280 ASSERT(shadowRoot->host()); 283 ASSERT(shadowRoot.host());
281 m_styleTree.popStyleCache(shadowRoot); 284 m_styleTree.popStyleCache(shadowRoot);
282 } 285 }
283 286
284 StyleResolver::~StyleResolver() 287 StyleResolver::~StyleResolver()
285 { 288 {
286 m_fontSelector->clearDocument(); 289 m_fontSelector->clearDocument();
287 m_viewportStyleResolver->clearDocument(); 290 m_viewportStyleResolver->clearDocument();
288 } 291 }
289 292
290 inline void StyleResolver::matchShadowDistributedRules(ElementRuleCollector& col lector, bool includeEmptyRules) 293 inline void StyleResolver::matchShadowDistributedRules(ElementRuleCollector& col lector, bool includeEmptyRules)
(...skipping 18 matching lines...) Expand all
309 for (size_t i = 0; i < matchRequests.size(); ++i) 312 for (size_t i = 0; i < matchRequests.size(); ++i)
310 collector.collectMatchingRules(matchRequests[i], ruleRange, cascadeScope ); 313 collector.collectMatchingRules(matchRequests[i], ruleRange, cascadeScope );
311 collector.sortAndTransferMatchedRules(); 314 collector.sortAndTransferMatchedRules();
312 315
313 collector.setBehaviorAtBoundary(previousBoundary); 316 collector.setBehaviorAtBoundary(previousBoundary);
314 collector.setCanUseFastReject(previousCanUseFastReject); 317 collector.setCanUseFastReject(previousCanUseFastReject);
315 } 318 }
316 319
317 void StyleResolver::matchHostRules(Element* element, ScopedStyleResolver* resolv er, ElementRuleCollector& collector, bool includeEmptyRules) 320 void StyleResolver::matchHostRules(Element* element, ScopedStyleResolver* resolv er, ElementRuleCollector& collector, bool includeEmptyRules)
318 { 321 {
319 if (element != resolver->scopingNode()) 322 if (element != &resolver->scopingNode())
320 return; 323 return;
321 resolver->matchHostRules(collector, includeEmptyRules); 324 resolver->matchHostRules(collector, includeEmptyRules);
322 } 325 }
323 326
324 static inline bool applyAuthorStylesOf(const Element* element) 327 static inline bool applyAuthorStylesOf(const Element* element)
325 { 328 {
326 return element->treeScope()->applyAuthorStyles() || (element->shadow() && el ement->shadow()->applyAuthorStyles()); 329 return element->treeScope()->applyAuthorStyles() || (element->shadow() && el ement->shadow()->applyAuthorStyles());
327 } 330 }
328 331
329 void StyleResolver::matchScopedAuthorRulesForShadowHost(Element* element, Elemen tRuleCollector& collector, bool includeEmptyRules, Vector<ScopedStyleResolver*, 8>& resolvers, Vector<ScopedStyleResolver*, 8>& resolversInShadowTree) 332 void StyleResolver::matchScopedAuthorRulesForShadowHost(Element* element, Elemen tRuleCollector& collector, bool includeEmptyRules, Vector<ScopedStyleResolver*, 8>& resolvers, Vector<ScopedStyleResolver*, 8>& resolversInShadowTree)
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 375
373 bool applyAuthorStyles = applyAuthorStylesOf(element); 376 bool applyAuthorStyles = applyAuthorStylesOf(element);
374 CascadeScope cascadeScope = 0; 377 CascadeScope cascadeScope = 0;
375 CascadeOrder cascadeOrder = resolvers.size(); 378 CascadeOrder cascadeOrder = resolvers.size();
376 collector.clearMatchedRules(); 379 collector.clearMatchedRules();
377 collector.matchedResult().ranges.lastAuthorRule = collector.matchedResult(). matchedProperties.size() - 1; 380 collector.matchedResult().ranges.lastAuthorRule = collector.matchedResult(). matchedProperties.size() - 1;
378 381
379 for (unsigned i = 0; i < resolvers.size(); ++i, --cascadeOrder) { 382 for (unsigned i = 0; i < resolvers.size(); ++i, --cascadeOrder) {
380 ScopedStyleResolver* resolver = resolvers.at(i); 383 ScopedStyleResolver* resolver = resolvers.at(i);
381 // FIXME: Need to clarify how to treat style scoped. 384 // FIXME: Need to clarify how to treat style scoped.
382 resolver->collectMatchingAuthorRules(collector, includeEmptyRules, apply AuthorStyles, cascadeScope++, resolver->treeScope() == element->treeScope() && r esolver->scopingNode()->isShadowRoot() ? 0 : cascadeOrder); 385 resolver->collectMatchingAuthorRules(collector, includeEmptyRules, apply AuthorStyles, cascadeScope++, resolver->treeScope() == element->treeScope() && r esolver->scopingNode().isShadowRoot() ? 0 : cascadeOrder);
383 } 386 }
384 387
385 collector.sortAndTransferMatchedRules(); 388 collector.sortAndTransferMatchedRules();
386 389
387 matchHostRules(element, resolvers.first(), collector, includeEmptyRules); 390 matchHostRules(element, resolvers.first(), collector, includeEmptyRules);
388 } 391 }
389 392
390 void StyleResolver::matchAuthorRules(Element* element, ElementRuleCollector& col lector, bool includeEmptyRules) 393 void StyleResolver::matchAuthorRules(Element* element, ElementRuleCollector& col lector, bool includeEmptyRules)
391 { 394 {
392 matchScopedAuthorRules(element, collector, includeEmptyRules); 395 matchScopedAuthorRules(element, collector, includeEmptyRules);
(...skipping 1157 matching lines...) Expand 10 before | Expand all | Expand 10 after
1550 m_matchedPropertiesSearches, m_matchedPropertiesHit, m_matchedProperties SharedInheritedHit, m_matchedPropertiesToCache, m_matchedPropertiesEnteredIntoCa che); 1553 m_matchedPropertiesSearches, m_matchedPropertiesHit, m_matchedProperties SharedInheritedHit, m_matchedPropertiesToCache, m_matchedPropertiesEnteredIntoCa che);
1551 1554
1552 fprintf(stderr, "Total:\n"); 1555 fprintf(stderr, "Total:\n");
1553 printStyleStats(m_totalSearches, m_totalElementsEligibleForSharing, m_totalS tylesShared, m_totalSearchFoundSiblingForSharing, m_totalSearchesMissedSharing, 1556 printStyleStats(m_totalSearches, m_totalElementsEligibleForSharing, m_totalS tylesShared, m_totalSearchFoundSiblingForSharing, m_totalSearchesMissedSharing,
1554 m_totalMatchedPropertiesSearches, m_totalMatchedPropertiesHit, m_totalMa tchedPropertiesSharedInheritedHit, m_totalMatchedPropertiesToCache, m_totalMatch edPropertiesEnteredIntoCache); 1557 m_totalMatchedPropertiesSearches, m_totalMatchedPropertiesHit, m_totalMa tchedPropertiesSharedInheritedHit, m_totalMatchedPropertiesToCache, m_totalMatch edPropertiesEnteredIntoCache);
1555 fprintf(stderr, "----------------------------------------------------------- ---------------------\n"); 1558 fprintf(stderr, "----------------------------------------------------------- ---------------------\n");
1556 } 1559 }
1557 #endif 1560 #endif
1558 1561
1559 } // namespace WebCore 1562 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/css/resolver/StyleResolver.h ('k') | Source/core/dom/Element.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698