| 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 Apple Inc. All rights
reserved. | 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 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 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 void SelectorFilter::pushParent(Element& parent) | 101 void SelectorFilter::pushParent(Element& parent) |
| 102 { | 102 { |
| 103 ASSERT(m_ancestorIdentifierFilter); | 103 ASSERT(m_ancestorIdentifierFilter); |
| 104 // We may get invoked for some random elements in some wacky cases during st
yle resolve. | 104 // We may get invoked for some random elements in some wacky cases during st
yle resolve. |
| 105 // Pause maintaining the stack in this case. | 105 // Pause maintaining the stack in this case. |
| 106 if (m_parentStack.last().element != parent.parentOrShadowHostElement()) | 106 if (m_parentStack.last().element != parent.parentOrShadowHostElement()) |
| 107 return; | 107 return; |
| 108 pushParentStackFrame(parent); | 108 pushParentStackFrame(parent); |
| 109 } | 109 } |
| 110 | 110 |
| 111 static inline void collectDescendantSelectorIdentifierHashes(const CSSSelector*
selector, unsigned*& hash) | 111 static inline void collectDescendantSelectorIdentifierHashes(const CSSSelector&
selector, unsigned*& hash) |
| 112 { | 112 { |
| 113 switch (selector->m_match) { | 113 switch (selector.m_match) { |
| 114 case CSSSelector::Id: | 114 case CSSSelector::Id: |
| 115 if (!selector->value().isEmpty()) | 115 if (!selector.value().isEmpty()) |
| 116 (*hash++) = selector->value().impl()->existingHash() * IdAttributeSa
lt; | 116 (*hash++) = selector.value().impl()->existingHash() * IdAttributeSal
t; |
| 117 break; | 117 break; |
| 118 case CSSSelector::Class: | 118 case CSSSelector::Class: |
| 119 if (!selector->value().isEmpty()) | 119 if (!selector.value().isEmpty()) |
| 120 (*hash++) = selector->value().impl()->existingHash() * ClassAttribut
eSalt; | 120 (*hash++) = selector.value().impl()->existingHash() * ClassAttribute
Salt; |
| 121 break; | 121 break; |
| 122 case CSSSelector::Tag: | 122 case CSSSelector::Tag: |
| 123 if (selector->tagQName().localName() != starAtom) | 123 if (selector.tagQName().localName() != starAtom) |
| 124 (*hash++) = selector->tagQName().localName().impl()->existingHash()
* TagNameSalt; | 124 (*hash++) = selector.tagQName().localName().impl()->existingHash() *
TagNameSalt; |
| 125 break; | 125 break; |
| 126 default: | 126 default: |
| 127 break; | 127 break; |
| 128 } | 128 } |
| 129 } | 129 } |
| 130 | 130 |
| 131 void SelectorFilter::collectIdentifierHashes(const CSSSelector* selector, unsign
ed* identifierHashes, unsigned maximumIdentifierCount) | 131 void SelectorFilter::collectIdentifierHashes(const CSSSelector& selector, unsign
ed* identifierHashes, unsigned maximumIdentifierCount) |
| 132 { | 132 { |
| 133 unsigned* hash = identifierHashes; | 133 unsigned* hash = identifierHashes; |
| 134 unsigned* end = identifierHashes + maximumIdentifierCount; | 134 unsigned* end = identifierHashes + maximumIdentifierCount; |
| 135 CSSSelector::Relation relation = selector->relation(); | 135 CSSSelector::Relation relation = selector.relation(); |
| 136 bool relationIsAffectedByPseudoContent = selector->relationIsAffectedByPseud
oContent(); | 136 bool relationIsAffectedByPseudoContent = selector.relationIsAffectedByPseudo
Content(); |
| 137 | 137 |
| 138 // Skip the topmost selector. It is handled quickly by the rule hashes. | 138 // Skip the topmost selector. It is handled quickly by the rule hashes. |
| 139 bool skipOverSubselectors = true; | 139 bool skipOverSubselectors = true; |
| 140 for (selector = selector->tagHistory(); selector; selector = selector->tagHi
story()) { | 140 for (const CSSSelector* current = selector.tagHistory(); current; current =
current->tagHistory()) { |
| 141 // Only collect identifiers that match ancestors. | 141 // Only collect identifiers that match ancestors. |
| 142 switch (relation) { | 142 switch (relation) { |
| 143 case CSSSelector::SubSelector: | 143 case CSSSelector::SubSelector: |
| 144 if (!skipOverSubselectors) | 144 if (!skipOverSubselectors) |
| 145 collectDescendantSelectorIdentifierHashes(selector, hash); | 145 collectDescendantSelectorIdentifierHashes(*current, hash); |
| 146 break; | 146 break; |
| 147 case CSSSelector::DirectAdjacent: | 147 case CSSSelector::DirectAdjacent: |
| 148 case CSSSelector::IndirectAdjacent: | 148 case CSSSelector::IndirectAdjacent: |
| 149 case CSSSelector::ShadowPseudo: | 149 case CSSSelector::ShadowPseudo: |
| 150 skipOverSubselectors = true; | 150 skipOverSubselectors = true; |
| 151 break; | 151 break; |
| 152 case CSSSelector::Descendant: | 152 case CSSSelector::Descendant: |
| 153 case CSSSelector::Child: | 153 case CSSSelector::Child: |
| 154 if (relationIsAffectedByPseudoContent) { | 154 if (relationIsAffectedByPseudoContent) { |
| 155 // Disable fastRejectSelector. | 155 // Disable fastRejectSelector. |
| 156 *identifierHashes = 0; | 156 *identifierHashes = 0; |
| 157 return; | 157 return; |
| 158 } | 158 } |
| 159 // Fall through. | 159 // Fall through. |
| 160 case CSSSelector::ChildTree: | 160 case CSSSelector::ChildTree: |
| 161 case CSSSelector::DescendantTree: | 161 case CSSSelector::DescendantTree: |
| 162 skipOverSubselectors = false; | 162 skipOverSubselectors = false; |
| 163 collectDescendantSelectorIdentifierHashes(selector, hash); | 163 collectDescendantSelectorIdentifierHashes(*current, hash); |
| 164 break; | 164 break; |
| 165 } | 165 } |
| 166 if (hash == end) | 166 if (hash == end) |
| 167 return; | 167 return; |
| 168 relation = selector->relation(); | 168 relation = current->relation(); |
| 169 relationIsAffectedByPseudoContent = selector->relationIsAffectedByPseudo
Content(); | 169 relationIsAffectedByPseudoContent = current->relationIsAffectedByPseudoC
ontent(); |
| 170 } | 170 } |
| 171 *hash = 0; | 171 *hash = 0; |
| 172 } | 172 } |
| 173 | 173 |
| 174 } | 174 } |
| OLD | NEW |