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 Apple Inc. All r
ights reserved. | 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All r
ights 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 26 matching lines...) Expand all Loading... |
37 #include "core/css/StyleRule.h" | 37 #include "core/css/StyleRule.h" |
38 #include "core/css/invalidation/DescendantInvalidationSet.h" | 38 #include "core/css/invalidation/DescendantInvalidationSet.h" |
39 #include "core/dom/Element.h" | 39 #include "core/dom/Element.h" |
40 #include "core/dom/Node.h" | 40 #include "core/dom/Node.h" |
41 #include "wtf/BitVector.h" | 41 #include "wtf/BitVector.h" |
42 | 42 |
43 namespace WebCore { | 43 namespace WebCore { |
44 | 44 |
45 static bool isSkippableComponentForInvalidation(const CSSSelector& selector) | 45 static bool isSkippableComponentForInvalidation(const CSSSelector& selector) |
46 { | 46 { |
47 if (selector.m_match == CSSSelector::Tag | 47 if (selector.match() == CSSSelector::Tag |
48 || selector.m_match == CSSSelector::Id | 48 || selector.match() == CSSSelector::Id |
49 || selector.isAttributeSelector()) | 49 || selector.isAttributeSelector()) |
50 return true; | 50 return true; |
51 if (selector.m_match == CSSSelector::PseudoElement) { | 51 if (selector.match() == CSSSelector::PseudoElement) { |
52 switch (selector.pseudoType()) { | 52 switch (selector.pseudoType()) { |
53 case CSSSelector::PseudoBefore: | 53 case CSSSelector::PseudoBefore: |
54 case CSSSelector::PseudoAfter: | 54 case CSSSelector::PseudoAfter: |
55 case CSSSelector::PseudoBackdrop: | 55 case CSSSelector::PseudoBackdrop: |
56 case CSSSelector::PseudoShadow: | 56 case CSSSelector::PseudoShadow: |
57 return true; | 57 return true; |
58 default: | 58 default: |
59 return selector.isCustomPseudoElement(); | 59 return selector.isCustomPseudoElement(); |
60 } | 60 } |
61 } | 61 } |
62 if (selector.m_match != CSSSelector::PseudoClass) | 62 if (selector.match() != CSSSelector::PseudoClass) |
63 return false; | 63 return false; |
64 switch (selector.pseudoType()) { | 64 switch (selector.pseudoType()) { |
65 case CSSSelector::PseudoEmpty: | 65 case CSSSelector::PseudoEmpty: |
66 case CSSSelector::PseudoFirstChild: | 66 case CSSSelector::PseudoFirstChild: |
67 case CSSSelector::PseudoFirstOfType: | 67 case CSSSelector::PseudoFirstOfType: |
68 case CSSSelector::PseudoLastChild: | 68 case CSSSelector::PseudoLastChild: |
69 case CSSSelector::PseudoLastOfType: | 69 case CSSSelector::PseudoLastOfType: |
70 case CSSSelector::PseudoOnlyChild: | 70 case CSSSelector::PseudoOnlyChild: |
71 case CSSSelector::PseudoOnlyOfType: | 71 case CSSSelector::PseudoOnlyOfType: |
72 case CSSSelector::PseudoNthChild: | 72 case CSSSelector::PseudoNthChild: |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 visitor->trace(rule); | 116 visitor->trace(rule); |
117 } | 117 } |
118 | 118 |
119 // This method is somewhat conservative in what it accepts. | 119 // This method is somewhat conservative in what it accepts. |
120 RuleFeatureSet::InvalidationSetMode RuleFeatureSet::invalidationSetModeForSelect
or(const CSSSelector& selector) | 120 RuleFeatureSet::InvalidationSetMode RuleFeatureSet::invalidationSetModeForSelect
or(const CSSSelector& selector) |
121 { | 121 { |
122 bool foundDescendantRelation = false; | 122 bool foundDescendantRelation = false; |
123 bool foundIdent = false; | 123 bool foundIdent = false; |
124 for (const CSSSelector* component = &selector; component; component = compon
ent->tagHistory()) { | 124 for (const CSSSelector* component = &selector; component; component = compon
ent->tagHistory()) { |
125 | 125 |
126 if (component->m_match == CSSSelector::Class || component->m_match == CS
SSelector::Id | 126 if (component->match() == CSSSelector::Class || component->match() == CS
SSelector::Id |
127 || (component->m_match == CSSSelector::Tag && component->tagQName().
localName() != starAtom) | 127 || (component->match() == CSSSelector::Tag && component->tagQName().
localName() != starAtom) |
128 || component->isAttributeSelector() || component->isCustomPseudoElem
ent()) { | 128 || component->isAttributeSelector() || component->isCustomPseudoElem
ent()) { |
129 if (!foundDescendantRelation) | 129 if (!foundDescendantRelation) |
130 foundIdent = true; | 130 foundIdent = true; |
131 } else if (component->pseudoType() == CSSSelector::PseudoHost || compone
nt->pseudoType() == CSSSelector::PseudoAny) { | 131 } else if (component->pseudoType() == CSSSelector::PseudoHost || compone
nt->pseudoType() == CSSSelector::PseudoAny) { |
132 if (const CSSSelectorList* selectorList = component->selectorList())
{ | 132 if (const CSSSelectorList* selectorList = component->selectorList())
{ |
133 for (const CSSSelector* selector = selectorList->first(); select
or; selector = CSSSelectorList::next(*selector)) { | 133 for (const CSSSelector* selector = selectorList->first(); select
or; selector = CSSSelectorList::next(*selector)) { |
134 InvalidationSetMode hostMode = invalidationSetModeForSelecto
r(*selector); | 134 InvalidationSetMode hostMode = invalidationSetModeForSelecto
r(*selector); |
135 if (hostMode == UseSubtreeStyleChange) | 135 if (hostMode == UseSubtreeStyleChange) |
136 return foundDescendantRelation ? UseLocalStyleChange : U
seSubtreeStyleChange; | 136 return foundDescendantRelation ? UseLocalStyleChange : U
seSubtreeStyleChange; |
137 if (!foundDescendantRelation && hostMode == AddFeatures) | 137 if (!foundDescendantRelation && hostMode == AddFeatures) |
(...skipping 18 matching lines...) Expand all Loading... |
156 // All combinators should be handled above. | 156 // All combinators should be handled above. |
157 ASSERT_NOT_REACHED(); | 157 ASSERT_NOT_REACHED(); |
158 return UseLocalStyleChange; | 158 return UseLocalStyleChange; |
159 } | 159 } |
160 } | 160 } |
161 return foundIdent ? AddFeatures : UseLocalStyleChange; | 161 return foundIdent ? AddFeatures : UseLocalStyleChange; |
162 } | 162 } |
163 | 163 |
164 void RuleFeatureSet::extractInvalidationSetFeature(const CSSSelector& selector,
InvalidationSetFeatures& features) | 164 void RuleFeatureSet::extractInvalidationSetFeature(const CSSSelector& selector,
InvalidationSetFeatures& features) |
165 { | 165 { |
166 if (selector.m_match == CSSSelector::Tag) | 166 if (selector.match() == CSSSelector::Tag) |
167 features.tagName = selector.tagQName().localName(); | 167 features.tagName = selector.tagQName().localName(); |
168 else if (selector.m_match == CSSSelector::Id) | 168 else if (selector.match() == CSSSelector::Id) |
169 features.id = selector.value(); | 169 features.id = selector.value(); |
170 else if (selector.m_match == CSSSelector::Class) | 170 else if (selector.match() == CSSSelector::Class) |
171 features.classes.append(selector.value()); | 171 features.classes.append(selector.value()); |
172 else if (selector.isAttributeSelector()) | 172 else if (selector.isAttributeSelector()) |
173 features.attributes.append(selector.attribute().localName()); | 173 features.attributes.append(selector.attribute().localName()); |
174 else if (selector.isCustomPseudoElement()) | 174 else if (selector.isCustomPseudoElement()) |
175 features.customPseudoElement = true; | 175 features.customPseudoElement = true; |
176 } | 176 } |
177 | 177 |
178 RuleFeatureSet::RuleFeatureSet() | 178 RuleFeatureSet::RuleFeatureSet() |
179 : m_targetedStyleRecalcEnabled(RuntimeEnabledFeatures::targetedStyleRecalcEn
abled()) | 179 : m_targetedStyleRecalcEnabled(RuntimeEnabledFeatures::targetedStyleRecalcEn
abled()) |
180 { | 180 { |
181 } | 181 } |
182 | 182 |
183 RuleFeatureSet::~RuleFeatureSet() | 183 RuleFeatureSet::~RuleFeatureSet() |
184 { | 184 { |
185 } | 185 } |
186 | 186 |
187 DescendantInvalidationSet* RuleFeatureSet::invalidationSetForSelector(const CSSS
elector& selector) | 187 DescendantInvalidationSet* RuleFeatureSet::invalidationSetForSelector(const CSSS
elector& selector) |
188 { | 188 { |
189 if (selector.m_match == CSSSelector::Class) | 189 if (selector.match() == CSSSelector::Class) |
190 return &ensureClassInvalidationSet(selector.value()); | 190 return &ensureClassInvalidationSet(selector.value()); |
191 if (selector.isAttributeSelector()) | 191 if (selector.isAttributeSelector()) |
192 return &ensureAttributeInvalidationSet(selector.attribute().localName())
; | 192 return &ensureAttributeInvalidationSet(selector.attribute().localName())
; |
193 if (selector.m_match == CSSSelector::Id) | 193 if (selector.match() == CSSSelector::Id) |
194 return &ensureIdInvalidationSet(selector.value()); | 194 return &ensureIdInvalidationSet(selector.value()); |
195 if (selector.m_match == CSSSelector::PseudoClass) { | 195 if (selector.match() == CSSSelector::PseudoClass) { |
196 CSSSelector::PseudoType pseudo = selector.pseudoType(); | 196 CSSSelector::PseudoType pseudo = selector.pseudoType(); |
197 if (pseudo == CSSSelector::PseudoHover || pseudo == CSSSelector::PseudoA
ctive || pseudo == CSSSelector::PseudoFocus) | 197 if (pseudo == CSSSelector::PseudoHover || pseudo == CSSSelector::PseudoA
ctive || pseudo == CSSSelector::PseudoFocus) |
198 return &ensurePseudoInvalidationSet(pseudo); | 198 return &ensurePseudoInvalidationSet(pseudo); |
199 } | 199 } |
200 return 0; | 200 return 0; |
201 } | 201 } |
202 | 202 |
203 RuleFeatureSet::InvalidationSetMode RuleFeatureSet::updateInvalidationSets(const
CSSSelector& selector) | 203 RuleFeatureSet::InvalidationSetMode RuleFeatureSet::updateInvalidationSets(const
CSSSelector& selector) |
204 { | 204 { |
205 InvalidationSetMode mode = invalidationSetModeForSelector(selector); | 205 InvalidationSetMode mode = invalidationSetModeForSelector(selector); |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
520 visitor->trace(siblingRules); | 520 visitor->trace(siblingRules); |
521 visitor->trace(uncommonAttributeRules); | 521 visitor->trace(uncommonAttributeRules); |
522 visitor->trace(m_classInvalidationSets); | 522 visitor->trace(m_classInvalidationSets); |
523 visitor->trace(m_attributeInvalidationSets); | 523 visitor->trace(m_attributeInvalidationSets); |
524 visitor->trace(m_idInvalidationSets); | 524 visitor->trace(m_idInvalidationSets); |
525 visitor->trace(m_pseudoInvalidationSets); | 525 visitor->trace(m_pseudoInvalidationSets); |
526 visitor->trace(m_styleInvalidator); | 526 visitor->trace(m_styleInvalidator); |
527 } | 527 } |
528 | 528 |
529 } // namespace WebCore | 529 } // namespace WebCore |
OLD | NEW |