| 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 24 matching lines...) Expand all Loading... |
| 35 namespace blink { | 35 namespace blink { |
| 36 | 36 |
| 37 class StyleSheetContents; | 37 class StyleSheetContents; |
| 38 | 38 |
| 39 ScopedStyleTree::ScopedStyleTree() | 39 ScopedStyleTree::ScopedStyleTree() |
| 40 { | 40 { |
| 41 } | 41 } |
| 42 | 42 |
| 43 ScopedStyleTree::~ScopedStyleTree() | 43 ScopedStyleTree::~ScopedStyleTree() |
| 44 { | 44 { |
| 45 for (HashMap<const ContainerNode*, ScopedStyleResolver*>::iterator it = m_au
thorStyles.begin(); it != m_authorStyles.end(); ++it) | 45 #if !ENABLE(OILPAN) |
| 46 for (HashMap<RawPtr<const ContainerNode>, RawPtr<ScopedStyleResolver> >::ite
rator it = m_authorStyles.begin(); it != m_authorStyles.end(); ++it) |
| 46 it->key->treeScope().clearScopedStyleResolver(); | 47 it->key->treeScope().clearScopedStyleResolver(); |
| 48 #endif |
| 47 } | 49 } |
| 48 | 50 |
| 49 ScopedStyleResolver* ScopedStyleTree::ensureScopedStyleResolver(ContainerNode& s
copingNode) | 51 ScopedStyleResolver* ScopedStyleTree::ensureScopedStyleResolver(ContainerNode& s
copingNode) |
| 50 { | 52 { |
| 51 ASSERT(scopingNode.isShadowRoot() || scopingNode.isDocumentNode()); | 53 ASSERT(scopingNode.isShadowRoot() || scopingNode.isDocumentNode()); |
| 52 | 54 |
| 53 m_authorStyles.add(&scopingNode, &scopingNode.treeScope().ensureScopedStyleR
esolver()); | 55 m_authorStyles.add(&scopingNode, &scopingNode.treeScope().ensureScopedStyleR
esolver()); |
| 54 return scopingNode.treeScope().scopedStyleResolver(); | 56 return scopingNode.treeScope().scopedStyleResolver(); |
| 55 } | 57 } |
| 56 | 58 |
| 57 ScopedStyleResolver* ScopedStyleTree::scopedStyleResolverFor(const ContainerNode
& scopingNode) | 59 ScopedStyleResolver* ScopedStyleTree::scopedStyleResolverFor(const ContainerNode
& scopingNode) |
| 58 { | 60 { |
| 59 if (!isShadowHost(&scopingNode) | 61 if (!isShadowHost(&scopingNode) |
| 60 && !scopingNode.isDocumentNode() | 62 && !scopingNode.isDocumentNode() |
| 61 && !scopingNode.isShadowRoot()) | 63 && !scopingNode.isShadowRoot()) |
| 62 return 0; | 64 return 0; |
| 63 return scopingNode.treeScope().scopedStyleResolver(); | 65 return scopingNode.treeScope().scopedStyleResolver(); |
| 64 } | 66 } |
| 65 | 67 |
| 66 void ScopedStyleTree::resolveScopedStyles(const Element* element, Vector<ScopedS
tyleResolver*, 8>& resolvers) | 68 void ScopedStyleTree::resolveScopedStyles(const Element* element, WillBeHeapVect
or<RawPtrWillBeMember<ScopedStyleResolver>, 8>& resolvers) |
| 67 { | 69 { |
| 68 for (ScopedStyleResolver* scopedResolver = scopedResolverFor(element); scope
dResolver; scopedResolver = scopedResolver->parent()) | 70 for (ScopedStyleResolver* scopedResolver = scopedResolverFor(element); scope
dResolver; scopedResolver = scopedResolver->parent()) |
| 69 resolvers.append(scopedResolver); | 71 resolvers.append(scopedResolver); |
| 70 } | 72 } |
| 71 | 73 |
| 72 void ScopedStyleTree::collectScopedResolversForHostedShadowTrees(const Element*
element, Vector<ScopedStyleResolver*, 8>& resolvers) | 74 void ScopedStyleTree::collectScopedResolversForHostedShadowTrees(const Element*
element, WillBeHeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8>& resolvers
) |
| 73 { | 75 { |
| 74 ElementShadow* shadow = element->shadow(); | 76 ElementShadow* shadow = element->shadow(); |
| 75 if (!shadow) | 77 if (!shadow) |
| 76 return; | 78 return; |
| 77 | 79 |
| 78 // Adding scoped resolver for active shadow roots for shadow host styling. | 80 // Adding scoped resolver for active shadow roots for shadow host styling. |
| 79 for (ShadowRoot* shadowRoot = shadow->youngestShadowRoot(); shadowRoot; shad
owRoot = shadowRoot->olderShadowRoot()) { | 81 for (ShadowRoot* shadowRoot = shadow->youngestShadowRoot(); shadowRoot; shad
owRoot = shadowRoot->olderShadowRoot()) { |
| 80 if (shadowRoot->numberOfStyles() > 0) { | 82 if (shadowRoot->numberOfStyles() > 0) { |
| 81 if (ScopedStyleResolver* resolver = scopedStyleResolverFor(*shadowRo
ot)) | 83 if (ScopedStyleResolver* resolver = scopedStyleResolverFor(*shadowRo
ot)) |
| 82 resolvers.append(resolver); | 84 resolvers.append(resolver); |
| 83 } | 85 } |
| 84 } | 86 } |
| 85 } | 87 } |
| 86 | 88 |
| 87 void ScopedStyleTree::resolveScopedKeyframesRules(const Element* element, Vector
<ScopedStyleResolver*, 8>& resolvers) | 89 void ScopedStyleTree::resolveScopedKeyframesRules(const Element* element, WillBe
HeapVector<RawPtrWillBeMember<ScopedStyleResolver>, 8>& resolvers) |
| 88 { | 90 { |
| 89 Document& document = element->document(); | 91 Document& document = element->document(); |
| 90 TreeScope& treeScope = element->treeScope(); | 92 TreeScope& treeScope = element->treeScope(); |
| 91 bool applyAuthorStyles = treeScope.applyAuthorStyles(); | 93 bool applyAuthorStyles = treeScope.applyAuthorStyles(); |
| 92 | 94 |
| 93 // Add resolvers for shadow roots hosted by the given element. | 95 // Add resolvers for shadow roots hosted by the given element. |
| 94 collectScopedResolversForHostedShadowTrees(element, resolvers); | 96 collectScopedResolversForHostedShadowTrees(element, resolvers); |
| 95 | 97 |
| 96 // Add resolvers while walking up DOM tree from the given element. | 98 // Add resolvers while walking up DOM tree from the given element. |
| 97 for (ScopedStyleResolver* scopedResolver = scopedResolverFor(element); scope
dResolver; scopedResolver = scopedResolver->parent()) { | 99 for (ScopedStyleResolver* scopedResolver = scopedResolverFor(element); scope
dResolver; scopedResolver = scopedResolver->parent()) { |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 return; | 139 return; |
| 138 | 140 |
| 139 if (m_cache.scopedResolver && m_cache.scopedResolver->scopingNode() == scopi
ngNode) | 141 if (m_cache.scopedResolver && m_cache.scopedResolver->scopingNode() == scopi
ngNode) |
| 140 m_cache.scopedResolver = m_cache.scopedResolver->parent(); | 142 m_cache.scopedResolver = m_cache.scopedResolver->parent(); |
| 141 m_cache.nodeForScopedStyles = scopingNode.parentOrShadowHostNode(); | 143 m_cache.nodeForScopedStyles = scopingNode.parentOrShadowHostNode(); |
| 142 } | 144 } |
| 143 | 145 |
| 144 void ScopedStyleTree::collectFeaturesTo(RuleFeatureSet& features) | 146 void ScopedStyleTree::collectFeaturesTo(RuleFeatureSet& features) |
| 145 { | 147 { |
| 146 HashSet<const StyleSheetContents*> visitedSharedStyleSheetContents; | 148 HashSet<const StyleSheetContents*> visitedSharedStyleSheetContents; |
| 147 for (HashMap<const ContainerNode*, ScopedStyleResolver*>::iterator it = m_au
thorStyles.begin(); it != m_authorStyles.end(); ++it) | 149 for (WillBeHeapHashMap<RawPtrWillBeMember<const ContainerNode>, RawPtrWillBe
Member<ScopedStyleResolver> >::iterator it = m_authorStyles.begin(); it != m_aut
horStyles.end(); ++it) |
| 148 it->value->collectFeaturesTo(features, visitedSharedStyleSheetContents); | 150 it->value->collectFeaturesTo(features, visitedSharedStyleSheetContents); |
| 149 } | 151 } |
| 150 | 152 |
| 151 void ScopedStyleTree::remove(const ContainerNode* scopingNode) | 153 void ScopedStyleTree::remove(const ContainerNode* scopingNode) |
| 152 { | 154 { |
| 153 if (!scopingNode || scopingNode->isDocumentNode()) | 155 if (!scopingNode || scopingNode->isDocumentNode()) |
| 154 return; | 156 return; |
| 155 | 157 |
| 156 ScopedStyleResolver* resolver = scopingNode->treeScope().scopedStyleResolver
(); | 158 ScopedStyleResolver* resolver = scopingNode->treeScope().scopedStyleResolver
(); |
| 157 if (!resolver) | 159 if (!resolver) |
| 158 return; | 160 return; |
| 159 | 161 |
| 160 if (m_cache.scopedResolver == resolver) | 162 if (m_cache.scopedResolver == resolver) |
| 161 m_cache.clear(); | 163 m_cache.clear(); |
| 162 | 164 |
| 163 // resolver is going to be freed below. | 165 // resolver is going to be freed below. |
| 164 resolver = 0; | 166 resolver = 0; |
| 165 m_authorStyles.remove(scopingNode); | 167 m_authorStyles.remove(scopingNode); |
| 166 scopingNode->treeScope().clearScopedStyleResolver(); | 168 scopingNode->treeScope().clearScopedStyleResolver(); |
| 167 } | 169 } |
| 168 | 170 |
| 171 void ScopedStyleTree::trace(Visitor* visitor) |
| 172 { |
| 173 visitor->trace(m_authorStyles); |
| 174 visitor->trace(m_cache); |
| 175 } |
| 176 |
| 169 } // namespace blink | 177 } // namespace blink |
| OLD | NEW |