| 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 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 // Note that we may get invoked for some random elements in some wacky cases
during style resolve. | 379 // Note that we may get invoked for some random elements in some wacky cases
during style resolve. |
| 380 // Pause maintaining the stack in this case. | 380 // Pause maintaining the stack in this case. |
| 381 if (m_selectorFilter.parentStackIsConsistent(&parent)) | 381 if (m_selectorFilter.parentStackIsConsistent(&parent)) |
| 382 m_selectorFilter.popParent(); | 382 m_selectorFilter.popParent(); |
| 383 } | 383 } |
| 384 | 384 |
| 385 StyleResolver::~StyleResolver() | 385 StyleResolver::~StyleResolver() |
| 386 { | 386 { |
| 387 } | 387 } |
| 388 | 388 |
| 389 void StyleResolver::matchAuthorRulesForShadowHost(Element* element, ElementRuleC
ollector& collector, bool includeEmptyRules, WillBeHeapVector<RawPtrWillBeMember
<ScopedStyleResolver>, 8>& resolvers, WillBeHeapVector<RawPtrWillBeMember<Scoped
StyleResolver>, 8>& resolversInShadowTree) | 389 static inline ScopedStyleResolver* scopedResolverFor(const Element* element) |
| 390 { | 390 { |
| 391 collector.clearMatchedRules(); | 391 // Ideally, returning element->treeScope().scopedStyleResolver() should be |
| 392 collector.matchedResult().ranges.lastAuthorRule = collector.matchedResult().
matchedProperties.size() - 1; | 392 // enough, but ::cue and custom pseudo elements like ::-webkit-meter-bar pie
rce |
| 393 // through a shadow dom boundary, yet they are not part of m_treeBoundaryCro
ssingRules. |
| 394 // The assumption here is that these rules only pierce through one boundary
and |
| 395 // that the scope of these elements do not have a style resolver due to the
fact |
| 396 // that VTT scopes and UA shadow trees don't have <style> elements. This is |
| 397 // backed up by the ASSERTs below. |
| 398 // |
| 399 // FIXME: Make ::cue and custom pseudo elements part of boundary crossing ru
les |
| 400 // when moving those rules to ScopedStyleResolver as part of issue 401359. |
| 393 | 401 |
| 394 CascadeScope cascadeScope = 0; | 402 TreeScope* treeScope = &element->treeScope(); |
| 403 if (ScopedStyleResolver* resolver = treeScope->scopedStyleResolver()) { |
| 404 ASSERT(element->shadowPseudoId().isEmpty()); |
| 405 ASSERT(!element->isVTTElement()); |
| 406 return resolver; |
| 407 } |
| 408 |
| 409 treeScope = treeScope->parentTreeScope(); |
| 410 if (!treeScope) |
| 411 return nullptr; |
| 412 if (element->shadowPseudoId().isEmpty() && !element->isVTTElement()) |
| 413 return nullptr; |
| 414 return treeScope->scopedStyleResolver(); |
| 415 } |
| 416 |
| 417 void StyleResolver::matchAuthorRulesForShadowHost(Element* element, ElementRuleC
ollector& collector, bool includeEmptyRules, WillBeHeapVector<RawPtrWillBeMember
<ScopedStyleResolver>, 8>& resolversInShadowTree) |
| 418 { |
| 395 CascadeOrder cascadeOrder = 0; | 419 CascadeOrder cascadeOrder = 0; |
| 420 for (int j = resolversInShadowTree.size() - 1; j >= 0; --j) |
| 421 resolversInShadowTree.at(j)->collectMatchingShadowHostRules(collector, i
ncludeEmptyRules, cascadeOrder++); |
| 396 | 422 |
| 397 for (int j = resolversInShadowTree.size() - 1; j >= 0; --j) | 423 if (ScopedStyleResolver* resolver = scopedResolverFor(element)) |
| 398 resolversInShadowTree.at(j)->collectMatchingShadowHostRules(collector, i
ncludeEmptyRules, cascadeScope, cascadeOrder++); | 424 resolver->collectMatchingAuthorRules(collector, includeEmptyRules, casca
deOrder); |
| 399 | |
| 400 if (resolvers.isEmpty() || resolvers.first()->treeScope() != element->treeSc
ope()) | |
| 401 ++cascadeScope; | |
| 402 cascadeOrder += resolvers.size(); | |
| 403 for (unsigned i = 0; i < resolvers.size(); ++i) | |
| 404 resolvers.at(i)->collectMatchingAuthorRules(collector, includeEmptyRules
, cascadeScope++, --cascadeOrder); | |
| 405 | |
| 406 m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, collec
tor, includeEmptyRules); | |
| 407 collector.sortAndTransferMatchedRules(); | |
| 408 } | 425 } |
| 409 | 426 |
| 410 void StyleResolver::matchAuthorRules(Element* element, ElementRuleCollector& col
lector, bool includeEmptyRules) | 427 void StyleResolver::matchAuthorRules(Element* element, ElementRuleCollector& col
lector, bool includeEmptyRules) |
| 411 { | 428 { |
| 412 collector.clearMatchedRules(); | 429 collector.clearMatchedRules(); |
| 413 collector.matchedResult().ranges.lastAuthorRule = collector.matchedResult().
matchedProperties.size() - 1; | 430 collector.matchedResult().ranges.lastAuthorRule = collector.matchedResult().
matchedProperties.size() - 1; |
| 414 | 431 |
| 415 if (document().styleEngine()->onlyDocumentHasStyles()) { | 432 if (document().styleEngine()->onlyDocumentHasStyles()) { |
| 416 ScopedStyleResolver* resolver = document().scopedStyleResolver(); | 433 ScopedStyleResolver* resolver = document().scopedStyleResolver(); |
| 434 // If we have no resolver for a document, the document has no styles. |
| 435 // We don't need to see any rules (including treeboundary crossing ones)
. |
| 417 if (!resolver) | 436 if (!resolver) |
| 418 return; | 437 return; |
| 419 // If we have no resolver for a document, the document has no styles. | 438 resolver->collectMatchingAuthorRules(collector, includeEmptyRules); |
| 420 // We don't need to see any rules (including treeboundary crossing ones)
. | |
| 421 resolver->collectMatchingAuthorRules(collector, includeEmptyRules, ignor
eCascadeScope); | |
| 422 m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, co
llector, includeEmptyRules); | 439 m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, co
llector, includeEmptyRules); |
| 423 collector.sortAndTransferMatchedRules(); | 440 collector.sortAndTransferMatchedRules(); |
| 424 return; | 441 return; |
| 425 } | 442 } |
| 426 | 443 |
| 427 WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8> resolvers; | |
| 428 resolveScopedStyles(element, resolvers); | |
| 429 | |
| 430 WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8> resolversInShad
owTree; | 444 WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8> resolversInShad
owTree; |
| 431 collectScopedResolversForHostedShadowTrees(element, resolversInShadowTree); | 445 collectScopedResolversForHostedShadowTrees(element, resolversInShadowTree); |
| 432 if (!resolversInShadowTree.isEmpty()) { | 446 if (!resolversInShadowTree.isEmpty()) |
| 433 matchAuthorRulesForShadowHost(element, collector, includeEmptyRules, res
olvers, resolversInShadowTree); | 447 matchAuthorRulesForShadowHost(element, collector, includeEmptyRules, res
olversInShadowTree); |
| 434 return; | 448 else if (ScopedStyleResolver* resolver = scopedResolverFor(element)) |
| 435 } | 449 resolver->collectMatchingAuthorRules(collector, includeEmptyRules, resol
ver->treeScope().rootNode().isShadowRoot() ? 0 : 1); |
| 436 | |
| 437 if (!resolvers.isEmpty()) { | |
| 438 CascadeScope cascadeScope = 0; | |
| 439 CascadeOrder cascadeOrder = resolvers.size(); | |
| 440 for (unsigned i = 0; i < resolvers.size(); ++i, --cascadeOrder) { | |
| 441 ScopedStyleResolver* resolver = resolvers.at(i); | |
| 442 // FIXME: Need to clarify how to treat style scoped. | |
| 443 resolver->collectMatchingAuthorRules(collector, includeEmptyRules, c
ascadeScope++, resolver->treeScope() == element->treeScope() && resolver->treeSc
ope().rootNode().isShadowRoot() ? 0 : cascadeOrder); | |
| 444 } | |
| 445 } | |
| 446 | 450 |
| 447 m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, collec
tor, includeEmptyRules); | 451 m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, collec
tor, includeEmptyRules); |
| 448 collector.sortAndTransferMatchedRules(); | 452 collector.sortAndTransferMatchedRules(); |
| 449 } | 453 } |
| 450 | 454 |
| 451 void StyleResolver::matchUARules(ElementRuleCollector& collector) | 455 void StyleResolver::matchUARules(ElementRuleCollector& collector) |
| 452 { | 456 { |
| 453 collector.setMatchingUARules(true); | 457 collector.setMatchingUARules(true); |
| 454 | 458 |
| 455 CSSDefaultStyleSheets& defaultStyleSheets = CSSDefaultStyleSheets::instance(
); | 459 CSSDefaultStyleSheets& defaultStyleSheets = CSSDefaultStyleSheets::instance(
); |
| (...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1016 applyAnimatedProperties<LowPriorityProperties>(state, activeInterpolationsFo
rTransitions); | 1020 applyAnimatedProperties<LowPriorityProperties>(state, activeInterpolationsFo
rTransitions); |
| 1017 | 1021 |
| 1018 // Start loading resources used by animations. | 1022 // Start loading resources used by animations. |
| 1019 loadPendingResources(state); | 1023 loadPendingResources(state); |
| 1020 | 1024 |
| 1021 ASSERT(!state.fontBuilder().fontDirty()); | 1025 ASSERT(!state.fontBuilder().fontDirty()); |
| 1022 | 1026 |
| 1023 return true; | 1027 return true; |
| 1024 } | 1028 } |
| 1025 | 1029 |
| 1026 static inline ScopedStyleResolver* scopedResolverFor(const Element* element) | |
| 1027 { | |
| 1028 for (TreeScope* treeScope = &element->treeScope(); treeScope; treeScope = tr
eeScope->parentTreeScope()) { | |
| 1029 if (ScopedStyleResolver* scopedStyleResolver = treeScope->scopedStyleRes
olver()) | |
| 1030 return scopedStyleResolver; | |
| 1031 } | |
| 1032 return 0; | |
| 1033 } | |
| 1034 | |
| 1035 void StyleResolver::resolveScopedStyles(const Element* element, WillBeHeapVector
<RawPtrWillBeMember<ScopedStyleResolver>, 8>& resolvers) | |
| 1036 { | |
| 1037 for (ScopedStyleResolver* scopedResolver = scopedResolverFor(element); scope
dResolver; scopedResolver = scopedResolver->parent()) | |
| 1038 resolvers.append(scopedResolver); | |
| 1039 } | |
| 1040 | |
| 1041 const StyleRuleKeyframes* StyleResolver::findKeyframesRule(const Element* elemen
t, const AtomicString& animationName) | 1030 const StyleRuleKeyframes* StyleResolver::findKeyframesRule(const Element* elemen
t, const AtomicString& animationName) |
| 1042 { | 1031 { |
| 1043 WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8> resolvers; | 1032 WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8> resolvers; |
| 1044 collectScopedResolversForHostedShadowTrees(element, resolvers); | 1033 collectScopedResolversForHostedShadowTrees(element, resolvers); |
| 1045 if (ScopedStyleResolver* scopedResolver = element->treeScope().scopedStyleRe
solver()) | 1034 if (ScopedStyleResolver* scopedResolver = element->treeScope().scopedStyleRe
solver()) |
| 1046 resolvers.append(scopedResolver); | 1035 resolvers.append(scopedResolver); |
| 1047 | 1036 |
| 1048 for (size_t i = 0; i < resolvers.size(); ++i) { | 1037 for (size_t i = 0; i < resolvers.size(); ++i) { |
| 1049 if (const StyleRuleKeyframes* keyframesRule = resolvers[i]->keyframeStyl
esForAnimation(animationName.impl())) | 1038 if (const StyleRuleKeyframes* keyframesRule = resolvers[i]->keyframeStyl
esForAnimation(animationName.impl())) |
| 1050 return keyframesRule; | 1039 return keyframesRule; |
| (...skipping 553 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1604 visitor->trace(m_uncommonAttributeRuleSet); | 1593 visitor->trace(m_uncommonAttributeRuleSet); |
| 1605 visitor->trace(m_watchedSelectorsRules); | 1594 visitor->trace(m_watchedSelectorsRules); |
| 1606 visitor->trace(m_treeBoundaryCrossingRules); | 1595 visitor->trace(m_treeBoundaryCrossingRules); |
| 1607 visitor->trace(m_styleSharingLists); | 1596 visitor->trace(m_styleSharingLists); |
| 1608 visitor->trace(m_pendingStyleSheets); | 1597 visitor->trace(m_pendingStyleSheets); |
| 1609 visitor->trace(m_document); | 1598 visitor->trace(m_document); |
| 1610 #endif | 1599 #endif |
| 1611 } | 1600 } |
| 1612 | 1601 |
| 1613 } // namespace blink | 1602 } // namespace blink |
| OLD | NEW |