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 { |
387 } | 377 } |
388 | 378 |
389 static inline bool applyAuthorStylesOf(const Element* element) | 379 static inline bool applyAuthorStylesOf(const Element* element) |
390 { | 380 { |
391 return element->treeScope().applyAuthorStyles(); | 381 return element->treeScope().applyAuthorStyles(); |
392 } | 382 } |
(...skipping 19 matching lines...) Expand all Loading... |
412 m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, collec
tor, includeEmptyRules); | 402 m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, collec
tor, includeEmptyRules); |
413 collector.sortAndTransferMatchedRules(); | 403 collector.sortAndTransferMatchedRules(); |
414 } | 404 } |
415 | 405 |
416 void StyleResolver::matchAuthorRules(Element* element, ElementRuleCollector& col
lector, bool includeEmptyRules) | 406 void StyleResolver::matchAuthorRules(Element* element, ElementRuleCollector& col
lector, bool includeEmptyRules) |
417 { | 407 { |
418 collector.clearMatchedRules(); | 408 collector.clearMatchedRules(); |
419 collector.matchedResult().ranges.lastAuthorRule = collector.matchedResult().
matchedProperties.size() - 1; | 409 collector.matchedResult().ranges.lastAuthorRule = collector.matchedResult().
matchedProperties.size() - 1; |
420 | 410 |
421 bool applyAuthorStyles = applyAuthorStylesOf(element); | 411 bool applyAuthorStyles = applyAuthorStylesOf(element); |
422 if (m_styleTree.hasOnlyScopedResolverForDocument()) { | 412 if (m_scopedStyleResolvers.size() == 1) { |
423 m_document.scopedStyleResolver()->collectMatchingAuthorRules(collector,
includeEmptyRules, applyAuthorStyles, ignoreCascadeScope); | 413 m_document.scopedStyleResolver()->collectMatchingAuthorRules(collector,
includeEmptyRules, applyAuthorStyles, ignoreCascadeScope); |
424 m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, co
llector, includeEmptyRules); | 414 m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, co
llector, includeEmptyRules); |
425 collector.sortAndTransferMatchedRules(); | 415 collector.sortAndTransferMatchedRules(); |
426 return; | 416 return; |
427 } | 417 } |
428 | 418 |
429 WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8> resolvers; | 419 WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8> resolvers; |
430 m_styleTree.resolveScopedStyles(element, resolvers); | 420 m_styleTree.resolveScopedStyles(element, resolvers); |
431 | 421 |
432 WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8> resolversInShad
owTree; | 422 WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8> resolversInShad
owTree; |
(...skipping 1133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1566 visitor->trace(m_matchedPropertiesCache); | 1556 visitor->trace(m_matchedPropertiesCache); |
1567 visitor->trace(m_viewportDependentMediaQueryResults); | 1557 visitor->trace(m_viewportDependentMediaQueryResults); |
1568 visitor->trace(m_viewportStyleResolver); | 1558 visitor->trace(m_viewportStyleResolver); |
1569 visitor->trace(m_features); | 1559 visitor->trace(m_features); |
1570 visitor->trace(m_siblingRuleSet); | 1560 visitor->trace(m_siblingRuleSet); |
1571 visitor->trace(m_uncommonAttributeRuleSet); | 1561 visitor->trace(m_uncommonAttributeRuleSet); |
1572 visitor->trace(m_watchedSelectorsRules); | 1562 visitor->trace(m_watchedSelectorsRules); |
1573 visitor->trace(m_treeBoundaryCrossingRules); | 1563 visitor->trace(m_treeBoundaryCrossingRules); |
1574 visitor->trace(m_pendingStyleSheets); | 1564 visitor->trace(m_pendingStyleSheets); |
1575 visitor->trace(m_styleTree); | 1565 visitor->trace(m_styleTree); |
| 1566 visitor->trace(m_scopedStyleResolvers); |
1576 #endif | 1567 #endif |
1577 } | 1568 } |
1578 | 1569 |
1579 } // namespace blink | 1570 } // namespace blink |
OLD | NEW |