Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 136 , m_styleSharingDepth(0) | 136 , m_styleSharingDepth(0) |
| 137 , m_styleResolverStatsSequence(0) | 137 , m_styleResolverStatsSequence(0) |
| 138 , m_accessCount(0) | 138 , m_accessCount(0) |
| 139 { | 139 { |
| 140 FrameView* view = document.view(); | 140 FrameView* view = document.view(); |
| 141 if (view) | 141 if (view) |
| 142 m_medium = adoptPtr(new MediaQueryEvaluator(&view->frame())); | 142 m_medium = adoptPtr(new MediaQueryEvaluator(&view->frame())); |
| 143 else | 143 else |
| 144 m_medium = adoptPtr(new MediaQueryEvaluator("all")); | 144 m_medium = adoptPtr(new MediaQueryEvaluator("all")); |
| 145 | 145 |
| 146 m_styleTree.ensureScopedStyleResolver(document); | 146 m_scopedStyleResolvers.add(&document.ensureScopedStyleResolver()); |
| 147 | 147 |
| 148 initWatchedSelectorRules(CSSSelectorWatch::from(document).watchedCallbackSel ectors()); | 148 initWatchedSelectorRules(CSSSelectorWatch::from(document).watchedCallbackSel ectors()); |
| 149 | 149 |
| 150 #if ENABLE(SVG_FONTS) | 150 #if ENABLE(SVG_FONTS) |
| 151 if (document.svgExtensions()) { | 151 if (document.svgExtensions()) { |
| 152 const WillBeHeapHashSet<RawPtrWillBeMember<SVGFontFaceElement> >& svgFon tFaceElements = document.svgExtensions()->svgFontFaceElements(); | 152 const WillBeHeapHashSet<RawPtrWillBeMember<SVGFontFaceElement> >& svgFon tFaceElements = document.svgExtensions()->svgFontFaceElements(); |
| 153 WillBeHeapHashSet<RawPtrWillBeMember<SVGFontFaceElement> >::const_iterat or end = svgFontFaceElements.end(); | 153 WillBeHeapHashSet<RawPtrWillBeMember<SVGFontFaceElement> >::const_iterat or end = svgFontFaceElements.end(); |
| 154 for (WillBeHeapHashSet<RawPtrWillBeMember<SVGFontFaceElement> >::const_i terator it = svgFontFaceElements.begin(); it != end; ++it) | 154 for (WillBeHeapHashSet<RawPtrWillBeMember<SVGFontFaceElement> >::const_i terator it = svgFontFaceElements.begin(); it != end; ++it) |
| 155 addFontFaceRule(&document, document.styleEngine()->fontSelector(), ( *it)->fontFaceRule()); | 155 addFontFaceRule(&document, document.styleEngine()->fontSelector(), ( *it)->fontFaceRule()); |
| 156 } | 156 } |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 183 { | 183 { |
| 184 ASSERT(cssSheet); | 184 ASSERT(cssSheet); |
| 185 ASSERT(!cssSheet->disabled()); | 185 ASSERT(!cssSheet->disabled()); |
| 186 if (cssSheet->mediaQueries() && !m_medium->eval(cssSheet->mediaQueries(), &m _viewportDependentMediaQueryResults)) | 186 if (cssSheet->mediaQueries() && !m_medium->eval(cssSheet->mediaQueries(), &m _viewportDependentMediaQueryResults)) |
| 187 return; | 187 return; |
| 188 | 188 |
| 189 ContainerNode* scopingNode = ScopedStyleResolver::scopingNodeFor(document(), cssSheet); | 189 ContainerNode* scopingNode = ScopedStyleResolver::scopingNodeFor(document(), cssSheet); |
| 190 if (!scopingNode) | 190 if (!scopingNode) |
| 191 return; | 191 return; |
| 192 | 192 |
| 193 ScopedStyleResolver* resolver = m_styleTree.ensureScopedStyleResolver(*scopi ngNode); | 193 ScopedStyleResolver* resolver = &scopingNode->treeScope().ensureScopedStyleR esolver(); |
| 194 m_scopedStyleResolvers.add(resolver); | |
| 194 ASSERT(resolver); | 195 ASSERT(resolver); |
| 195 resolver->addRulesFromSheet(cssSheet, *m_medium, this); | 196 resolver->addRulesFromSheet(cssSheet, *m_medium, this); |
| 196 } | 197 } |
| 197 | 198 |
| 198 void StyleResolver::appendPendingAuthorStyleSheets() | 199 void StyleResolver::appendPendingAuthorStyleSheets() |
| 199 { | 200 { |
| 200 for (WillBeHeapListHashSet<RawPtrWillBeMember<CSSStyleSheet>, 16>::iterator it = m_pendingStyleSheets.begin(); it != m_pendingStyleSheets.end(); ++it) | 201 for (WillBeHeapListHashSet<RawPtrWillBeMember<CSSStyleSheet>, 16>::iterator it = m_pendingStyleSheets.begin(); it != m_pendingStyleSheets.end(); ++it) |
| 201 appendCSSStyleSheet(*it); | 202 appendCSSStyleSheet(*it); |
| 202 | 203 |
| 203 m_pendingStyleSheets.clear(); | 204 m_pendingStyleSheets.clear(); |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 230 // Need to recreate RuleFeatureSet. | 231 // Need to recreate RuleFeatureSet. |
| 231 m_features.clear(); | 232 m_features.clear(); |
| 232 m_siblingRuleSet.clear(); | 233 m_siblingRuleSet.clear(); |
| 233 m_uncommonAttributeRuleSet.clear(); | 234 m_uncommonAttributeRuleSet.clear(); |
| 234 m_needCollectFeatures = true; | 235 m_needCollectFeatures = true; |
| 235 } | 236 } |
| 236 | 237 |
| 237 void StyleResolver::processScopedRules(const RuleSet& authorRules, CSSStyleSheet * parentStyleSheet, ContainerNode& scope) | 238 void StyleResolver::processScopedRules(const RuleSet& authorRules, CSSStyleSheet * parentStyleSheet, ContainerNode& scope) |
| 238 { | 239 { |
| 239 const WillBeHeapVector<RawPtrWillBeMember<StyleRuleKeyframes> > keyframesRul es = authorRules.keyframesRules(); | 240 const WillBeHeapVector<RawPtrWillBeMember<StyleRuleKeyframes> > keyframesRul es = authorRules.keyframesRules(); |
| 241 ScopedStyleResolver* resolver = &scope.treeScope().ensureScopedStyleResolver (); | |
| 242 m_scopedStyleResolvers.add(resolver); | |
| 240 for (unsigned i = 0; i < keyframesRules.size(); ++i) | 243 for (unsigned i = 0; i < keyframesRules.size(); ++i) |
| 241 m_styleTree.ensureScopedStyleResolver(scope)->addKeyframeStyle(keyframes Rules[i]); | 244 resolver->addKeyframeStyle(keyframesRules[i]); |
| 242 | 245 |
| 243 m_treeBoundaryCrossingRules.addTreeBoundaryCrossingRules(authorRules, scope, parentStyleSheet); | 246 m_treeBoundaryCrossingRules.addTreeBoundaryCrossingRules(authorRules, scope, parentStyleSheet); |
| 244 | 247 |
| 245 // FIXME(BUG 72461): We don't add @font-face rules of scoped style sheets fo r the moment. | 248 // FIXME(BUG 72461): We don't add @font-face rules of scoped style sheets fo r the moment. |
| 246 if (scope.isDocumentNode()) { | 249 if (scope.isDocumentNode()) { |
| 247 const WillBeHeapVector<RawPtrWillBeMember<StyleRuleFontFace> > fontFaceR ules = authorRules.fontFaceRules(); | 250 const WillBeHeapVector<RawPtrWillBeMember<StyleRuleFontFace> > fontFaceR ules = authorRules.fontFaceRules(); |
| 248 for (unsigned i = 0; i < fontFaceRules.size(); ++i) | 251 for (unsigned i = 0; i < fontFaceRules.size(); ++i) |
| 249 addFontFaceRule(&m_document, document().styleEngine()->fontSelector( ), fontFaceRules[i]); | 252 addFontFaceRule(&m_document, document().styleEngine()->fontSelector( ), fontFaceRules[i]); |
| 250 if (fontFaceRules.size()) | 253 if (fontFaceRules.size()) |
| 251 invalidateMatchedPropertiesCache(); | 254 invalidateMatchedPropertiesCache(); |
| 252 } | 255 } |
| 253 } | 256 } |
| 254 | 257 |
| 255 void StyleResolver::resetAuthorStyle(const ContainerNode* scopingNode) | 258 void StyleResolver::resetAuthorStyle(TreeScope& treeScope) |
| 256 { | 259 { |
| 257 ScopedStyleResolver* resolver = scopingNode ? scopingNode->treeScope().scope dStyleResolver() : m_document.scopedStyleResolver(); | 260 ScopedStyleResolver* resolver = treeScope.scopedStyleResolver(); |
| 258 if (!resolver) | 261 if (!resolver) |
| 259 return; | 262 return; |
| 260 | 263 |
| 261 m_treeBoundaryCrossingRules.reset(scopingNode); | 264 m_treeBoundaryCrossingRules.reset(&treeScope.rootNode()); |
| 262 | 265 |
| 263 resolver->resetAuthorStyle(); | 266 resolver->resetAuthorStyle(); |
| 264 resetRuleFeatures(); | 267 resetRuleFeatures(); |
| 265 if (!scopingNode) | 268 if (treeScope.rootNode().isDocumentNode()) |
| 266 return; | 269 return; |
| 267 | 270 |
| 268 m_styleTree.remove(scopingNode); | 271 // resolver is going to be freed below. |
| 272 m_scopedStyleResolvers.remove(resolver); | |
| 273 treeScope.clearScopedStyleResolver(); | |
| 269 } | 274 } |
| 270 | 275 |
| 271 static PassOwnPtrWillBeRawPtr<RuleSet> makeRuleSet(const WillBeHeapVector<RuleFe ature>& rules) | 276 static PassOwnPtrWillBeRawPtr<RuleSet> makeRuleSet(const WillBeHeapVector<RuleFe ature>& rules) |
| 272 { | 277 { |
| 273 size_t size = rules.size(); | 278 size_t size = rules.size(); |
| 274 if (!size) | 279 if (!size) |
| 275 return nullptr; | 280 return nullptr; |
| 276 OwnPtrWillBeRawPtr<RuleSet> ruleSet = RuleSet::create(); | 281 OwnPtrWillBeRawPtr<RuleSet> ruleSet = RuleSet::create(); |
| 277 for (size_t i = 0; i < size; ++i) | 282 for (size_t i = 0; i < size; ++i) |
| 278 ruleSet->addRule(rules[i].rule, rules[i].selectorIndex, rules[i].hasDocu mentSecurityOrigin ? RuleHasDocumentSecurityOrigin : RuleHasNoSpecialState); | 283 ruleSet->addRule(rules[i].rule, rules[i].selectorIndex, rules[i].hasDocu mentSecurityOrigin ? RuleHasDocumentSecurityOrigin : RuleHasNoSpecialState); |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 293 m_features.add(defaultStyleSheets.defaultViewSourceStyle()->features()); | 298 m_features.add(defaultStyleSheets.defaultViewSourceStyle()->features()); |
| 294 | 299 |
| 295 if (document().isTransitionDocument()) | 300 if (document().isTransitionDocument()) |
| 296 m_features.add(defaultStyleSheets.defaultTransitionStyle()->features()); | 301 m_features.add(defaultStyleSheets.defaultTransitionStyle()->features()); |
| 297 | 302 |
| 298 if (m_watchedSelectorsRules) | 303 if (m_watchedSelectorsRules) |
| 299 m_features.add(m_watchedSelectorsRules->features()); | 304 m_features.add(m_watchedSelectorsRules->features()); |
| 300 | 305 |
| 301 m_treeBoundaryCrossingRules.collectFeaturesTo(m_features); | 306 m_treeBoundaryCrossingRules.collectFeaturesTo(m_features); |
| 302 | 307 |
| 303 m_styleTree.collectFeaturesTo(m_features); | 308 HashSet<const StyleSheetContents*> visitedSharedStyleSheetContents; |
| 309 for (WillBeHeapHashSet<RawPtrWillBeMember<const ScopedStyleResolver> >::iter ator it = m_scopedStyleResolvers.begin(); it != m_scopedStyleResolvers.end(); ++ it) | |
| 310 (*it)->collectFeaturesTo(m_features, visitedSharedStyleSheetContents); | |
| 304 | 311 |
| 305 m_siblingRuleSet = makeRuleSet(m_features.siblingRules); | 312 m_siblingRuleSet = makeRuleSet(m_features.siblingRules); |
| 306 m_uncommonAttributeRuleSet = makeRuleSet(m_features.uncommonAttributeRules); | 313 m_uncommonAttributeRuleSet = makeRuleSet(m_features.uncommonAttributeRules); |
| 307 m_needCollectFeatures = false; | 314 m_needCollectFeatures = false; |
| 308 } | 315 } |
| 309 | 316 |
| 310 bool StyleResolver::hasRulesForId(const AtomicString& id) const | 317 bool StyleResolver::hasRulesForId(const AtomicString& id) const |
| 311 { | 318 { |
| 312 return m_features.hasSelectorForId(id); | 319 return m_features.hasSelectorForId(id); |
| 313 } | 320 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 348 const ContainerNode* parentsParent = parent.parentOrShadowHostElement(); | 355 const ContainerNode* parentsParent = parent.parentOrShadowHostElement(); |
| 349 | 356 |
| 350 // We are not always invoked consistently. For example, script execution can cause us to enter | 357 // We are not always invoked consistently. For example, script execution can cause us to enter |
| 351 // style recalc in the middle of tree building. We may also be invoked from somewhere within the tree. | 358 // style recalc in the middle of tree building. We may also be invoked from somewhere within the tree. |
| 352 // Reset the stack in this case, or if we see a new root element. | 359 // Reset the stack in this case, or if we see a new root element. |
| 353 // Otherwise just push the new parent. | 360 // Otherwise just push the new parent. |
| 354 if (!parentsParent || m_selectorFilter.parentStackIsEmpty()) | 361 if (!parentsParent || m_selectorFilter.parentStackIsEmpty()) |
| 355 m_selectorFilter.setupParentStack(parent); | 362 m_selectorFilter.setupParentStack(parent); |
| 356 else | 363 else |
| 357 m_selectorFilter.pushParent(parent); | 364 m_selectorFilter.pushParent(parent); |
| 358 | |
| 359 // Note: We mustn't skip ShadowRoot nodes for the scope stack. | |
| 360 m_styleTree.pushStyleCache(parent, parent.parentOrShadowHostNode()); | |
| 361 } | 365 } |
| 362 | 366 |
| 363 void StyleResolver::popParentElement(Element& parent) | 367 void StyleResolver::popParentElement(Element& parent) |
| 364 { | 368 { |
| 365 // Note that we may get invoked for some random elements in some wacky cases during style resolve. | 369 // Note that we may get invoked for some random elements in some wacky cases during style resolve. |
| 366 // Pause maintaining the stack in this case. | 370 // Pause maintaining the stack in this case. |
| 367 if (m_selectorFilter.parentStackIsConsistent(&parent)) | 371 if (m_selectorFilter.parentStackIsConsistent(&parent)) |
| 368 m_selectorFilter.popParent(); | 372 m_selectorFilter.popParent(); |
| 369 | |
| 370 m_styleTree.popStyleCache(parent); | |
| 371 } | |
| 372 | |
| 373 void StyleResolver::pushParentShadowRoot(const ShadowRoot& shadowRoot) | |
| 374 { | |
| 375 ASSERT(shadowRoot.host()); | |
| 376 m_styleTree.pushStyleCache(shadowRoot, shadowRoot.host()); | |
| 377 } | |
| 378 | |
| 379 void StyleResolver::popParentShadowRoot(const ShadowRoot& shadowRoot) | |
| 380 { | |
| 381 ASSERT(shadowRoot.host()); | |
| 382 m_styleTree.popStyleCache(shadowRoot); | |
| 383 } | 373 } |
| 384 | 374 |
| 385 StyleResolver::~StyleResolver() | 375 StyleResolver::~StyleResolver() |
| 386 { | 376 { |
| 377 #if !ENABLE(OILPAN) | |
| 378 for (WillBeHeapHashSet<RawPtrWillBeMember<const ScopedStyleResolver> >::iter ator it = m_scopedStyleResolvers.begin(); it != m_scopedStyleResolvers.end(); ++ it) | |
| 379 const_cast<TreeScope&>((*it)->treeScope()).clearScopedStyleResolver(); | |
|
esprehn
2014/07/25 05:00:59
This needs to be done for Oilpan builds too, other
tasak
2014/07/25 06:02:15
I chatted with kochi-san. I think, this clean-up
| |
| 380 #endif | |
| 387 } | 381 } |
| 388 | 382 |
| 389 static inline bool applyAuthorStylesOf(const Element* element) | 383 static inline bool applyAuthorStylesOf(const Element* element) |
| 390 { | 384 { |
| 391 return element->treeScope().applyAuthorStyles(); | 385 return element->treeScope().applyAuthorStyles(); |
| 392 } | 386 } |
| 393 | 387 |
| 394 void StyleResolver::matchAuthorRulesForShadowHost(Element* element, ElementRuleC ollector& collector, bool includeEmptyRules, WillBeHeapVector<RawPtrWillBeMember <ScopedStyleResolver>, 8>& resolvers, WillBeHeapVector<RawPtrWillBeMember<Scoped StyleResolver>, 8>& resolversInShadowTree) | 388 void StyleResolver::matchAuthorRulesForShadowHost(Element* element, ElementRuleC ollector& collector, bool includeEmptyRules, WillBeHeapVector<RawPtrWillBeMember <ScopedStyleResolver>, 8>& resolvers, WillBeHeapVector<RawPtrWillBeMember<Scoped StyleResolver>, 8>& resolversInShadowTree) |
| 395 { | 389 { |
| 396 collector.clearMatchedRules(); | 390 collector.clearMatchedRules(); |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 412 m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, collec tor, includeEmptyRules); | 406 m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, collec tor, includeEmptyRules); |
| 413 collector.sortAndTransferMatchedRules(); | 407 collector.sortAndTransferMatchedRules(); |
| 414 } | 408 } |
| 415 | 409 |
| 416 void StyleResolver::matchAuthorRules(Element* element, ElementRuleCollector& col lector, bool includeEmptyRules) | 410 void StyleResolver::matchAuthorRules(Element* element, ElementRuleCollector& col lector, bool includeEmptyRules) |
| 417 { | 411 { |
| 418 collector.clearMatchedRules(); | 412 collector.clearMatchedRules(); |
| 419 collector.matchedResult().ranges.lastAuthorRule = collector.matchedResult(). matchedProperties.size() - 1; | 413 collector.matchedResult().ranges.lastAuthorRule = collector.matchedResult(). matchedProperties.size() - 1; |
| 420 | 414 |
| 421 bool applyAuthorStyles = applyAuthorStylesOf(element); | 415 bool applyAuthorStyles = applyAuthorStylesOf(element); |
| 422 if (m_styleTree.hasOnlyScopedResolverForDocument()) { | 416 if (m_scopedStyleResolvers.size() == 1) { |
| 423 m_document.scopedStyleResolver()->collectMatchingAuthorRules(collector, includeEmptyRules, applyAuthorStyles, ignoreCascadeScope); | 417 m_document.scopedStyleResolver()->collectMatchingAuthorRules(collector, includeEmptyRules, applyAuthorStyles, ignoreCascadeScope); |
| 424 m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, co llector, includeEmptyRules); | 418 m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, co llector, includeEmptyRules); |
| 425 collector.sortAndTransferMatchedRules(); | 419 collector.sortAndTransferMatchedRules(); |
| 426 return; | 420 return; |
| 427 } | 421 } |
| 428 | 422 |
| 429 WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8> resolvers; | 423 WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8> resolvers; |
| 430 m_styleTree.resolveScopedStyles(element, resolvers); | 424 m_styleTree.resolveScopedStyles(element, resolvers); |
| 431 | 425 |
| 432 WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8> resolversInShad owTree; | 426 WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8> resolversInShad owTree; |
| (...skipping 1133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1566 visitor->trace(m_matchedPropertiesCache); | 1560 visitor->trace(m_matchedPropertiesCache); |
| 1567 visitor->trace(m_viewportDependentMediaQueryResults); | 1561 visitor->trace(m_viewportDependentMediaQueryResults); |
| 1568 visitor->trace(m_viewportStyleResolver); | 1562 visitor->trace(m_viewportStyleResolver); |
| 1569 visitor->trace(m_features); | 1563 visitor->trace(m_features); |
| 1570 visitor->trace(m_siblingRuleSet); | 1564 visitor->trace(m_siblingRuleSet); |
| 1571 visitor->trace(m_uncommonAttributeRuleSet); | 1565 visitor->trace(m_uncommonAttributeRuleSet); |
| 1572 visitor->trace(m_watchedSelectorsRules); | 1566 visitor->trace(m_watchedSelectorsRules); |
| 1573 visitor->trace(m_treeBoundaryCrossingRules); | 1567 visitor->trace(m_treeBoundaryCrossingRules); |
| 1574 visitor->trace(m_pendingStyleSheets); | 1568 visitor->trace(m_pendingStyleSheets); |
| 1575 visitor->trace(m_styleTree); | 1569 visitor->trace(m_styleTree); |
| 1570 visitor->trace(m_scopedStyleResolvers); | |
| 1576 #endif | 1571 #endif |
| 1577 } | 1572 } |
| 1578 | 1573 |
| 1579 } // namespace blink | 1574 } // namespace blink |
| OLD | NEW |