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 23 matching lines...) Expand all Loading... |
34 #include "core/css/CSSSelectorList.h" | 34 #include "core/css/CSSSelectorList.h" |
35 #include "core/css/RuleSet.h" | 35 #include "core/css/RuleSet.h" |
36 #include "core/css/StyleRule.h" | 36 #include "core/css/StyleRule.h" |
37 #include "core/css/invalidation/DescendantInvalidationSet.h" | 37 #include "core/css/invalidation/DescendantInvalidationSet.h" |
38 #include "core/dom/Element.h" | 38 #include "core/dom/Element.h" |
39 #include "core/dom/Node.h" | 39 #include "core/dom/Node.h" |
40 #include "wtf/BitVector.h" | 40 #include "wtf/BitVector.h" |
41 | 41 |
42 namespace blink { | 42 namespace blink { |
43 | 43 |
44 static bool isSkippableComponentForInvalidation(const CSSSelector& selector) | 44 #if ENABLE(ASSERT) |
| 45 |
| 46 static bool supportsInvalidation(CSSSelector::Match match) |
45 { | 47 { |
46 if (selector.match() == CSSSelector::Tag) { | 48 switch (match) { |
47 ASSERT(selector.tagQName().localName() == starAtom); | 49 case CSSSelector::Tag: |
| 50 case CSSSelector::Id: |
| 51 case CSSSelector::Class: |
| 52 case CSSSelector::AttributeExact: |
| 53 case CSSSelector::AttributeSet: |
| 54 case CSSSelector::AttributeHyphen: |
| 55 case CSSSelector::AttributeList: |
| 56 case CSSSelector::AttributeContain: |
| 57 case CSSSelector::AttributeBegin: |
| 58 case CSSSelector::AttributeEnd: |
48 return true; | 59 return true; |
| 60 case CSSSelector::Unknown: |
| 61 case CSSSelector::PagePseudoClass: |
| 62 // These should not appear in StyleRule selectors. |
| 63 ASSERT_NOT_REACHED(); |
| 64 return false; |
| 65 default: |
| 66 // New match type added. Figure out if it needs a subtree invalidation o
r not. |
| 67 ASSERT_NOT_REACHED(); |
| 68 return false; |
49 } | 69 } |
50 if (selector.match() == CSSSelector::PseudoElement) { | 70 } |
51 switch (selector.pseudoType()) { | 71 |
52 case CSSSelector::PseudoBefore: | 72 static bool supportsInvalidation(CSSSelector::PseudoType type) |
53 case CSSSelector::PseudoAfter: | 73 { |
54 case CSSSelector::PseudoBackdrop: | 74 switch (type) { |
55 case CSSSelector::PseudoShadow: | |
56 return true; | |
57 default: | |
58 ASSERT(!selector.isCustomPseudoElement()); | |
59 return false; | |
60 } | |
61 } | |
62 if (selector.match() != CSSSelector::PseudoClass) | |
63 return false; | |
64 switch (selector.pseudoType()) { | |
65 case CSSSelector::PseudoEmpty: | 75 case CSSSelector::PseudoEmpty: |
66 case CSSSelector::PseudoFirstChild: | 76 case CSSSelector::PseudoFirstChild: |
67 case CSSSelector::PseudoFirstOfType: | 77 case CSSSelector::PseudoFirstOfType: |
68 case CSSSelector::PseudoLastChild: | 78 case CSSSelector::PseudoLastChild: |
69 case CSSSelector::PseudoLastOfType: | 79 case CSSSelector::PseudoLastOfType: |
70 case CSSSelector::PseudoOnlyChild: | 80 case CSSSelector::PseudoOnlyChild: |
71 case CSSSelector::PseudoOnlyOfType: | 81 case CSSSelector::PseudoOnlyOfType: |
72 case CSSSelector::PseudoNthChild: | 82 case CSSSelector::PseudoNthChild: |
73 case CSSSelector::PseudoNthOfType: | 83 case CSSSelector::PseudoNthOfType: |
74 case CSSSelector::PseudoNthLastChild: | 84 case CSSSelector::PseudoNthLastChild: |
75 case CSSSelector::PseudoNthLastOfType: | 85 case CSSSelector::PseudoNthLastOfType: |
76 case CSSSelector::PseudoLink: | 86 case CSSSelector::PseudoLink: |
77 case CSSSelector::PseudoVisited: | 87 case CSSSelector::PseudoVisited: |
| 88 case CSSSelector::PseudoAny: |
78 case CSSSelector::PseudoAnyLink: | 89 case CSSSelector::PseudoAnyLink: |
79 case CSSSelector::PseudoHover: | 90 case CSSSelector::PseudoHover: |
80 case CSSSelector::PseudoDrag: | 91 case CSSSelector::PseudoDrag: |
81 case CSSSelector::PseudoFocus: | 92 case CSSSelector::PseudoFocus: |
82 case CSSSelector::PseudoActive: | 93 case CSSSelector::PseudoActive: |
83 case CSSSelector::PseudoChecked: | 94 case CSSSelector::PseudoChecked: |
84 case CSSSelector::PseudoEnabled: | 95 case CSSSelector::PseudoEnabled: |
85 case CSSSelector::PseudoDefault: | 96 case CSSSelector::PseudoDefault: |
86 case CSSSelector::PseudoDisabled: | 97 case CSSSelector::PseudoDisabled: |
87 case CSSSelector::PseudoOptional: | 98 case CSSSelector::PseudoOptional: |
88 case CSSSelector::PseudoRequired: | 99 case CSSSelector::PseudoRequired: |
89 case CSSSelector::PseudoReadOnly: | 100 case CSSSelector::PseudoReadOnly: |
90 case CSSSelector::PseudoReadWrite: | 101 case CSSSelector::PseudoReadWrite: |
91 case CSSSelector::PseudoValid: | 102 case CSSSelector::PseudoValid: |
92 case CSSSelector::PseudoInvalid: | 103 case CSSSelector::PseudoInvalid: |
93 case CSSSelector::PseudoIndeterminate: | 104 case CSSSelector::PseudoIndeterminate: |
94 case CSSSelector::PseudoTarget: | 105 case CSSSelector::PseudoTarget: |
| 106 case CSSSelector::PseudoBefore: |
| 107 case CSSSelector::PseudoAfter: |
| 108 case CSSSelector::PseudoBackdrop: |
95 case CSSSelector::PseudoLang: | 109 case CSSSelector::PseudoLang: |
| 110 case CSSSelector::PseudoNot: |
96 case CSSSelector::PseudoRoot: | 111 case CSSSelector::PseudoRoot: |
97 case CSSSelector::PseudoScope: | 112 case CSSSelector::PseudoScope: |
98 case CSSSelector::PseudoInRange: | 113 case CSSSelector::PseudoInRange: |
99 case CSSSelector::PseudoOutOfRange: | 114 case CSSSelector::PseudoOutOfRange: |
100 case CSSSelector::PseudoUnresolved: | 115 case CSSSelector::PseudoUnresolved: |
| 116 case CSSSelector::PseudoHost: |
| 117 case CSSSelector::PseudoShadow: |
101 case CSSSelector::PseudoListBox: | 118 case CSSSelector::PseudoListBox: |
102 return true; | 119 return true; |
| 120 case CSSSelector::PseudoNotParsed: |
| 121 case CSSSelector::PseudoUnknown: |
| 122 case CSSSelector::PseudoLeftPage: |
| 123 case CSSSelector::PseudoRightPage: |
| 124 case CSSSelector::PseudoFirstPage: |
| 125 // These should not appear in StyleRule selectors. |
| 126 ASSERT_NOT_REACHED(); |
| 127 return false; |
103 default: | 128 default: |
| 129 // New pseudo type added. Figure out if it needs a subtree invalidation
or not. |
| 130 ASSERT_NOT_REACHED(); |
104 return false; | 131 return false; |
105 } | 132 } |
106 } | 133 } |
| 134 |
| 135 #endif // ENABLE(ASSERT) |
| 136 |
| 137 static bool requiresSubtreeInvalidation(const CSSSelector& selector) |
| 138 { |
| 139 if (!selector.matchesPseudoElement() && selector.match() != CSSSelector::Pse
udoClass) { |
| 140 ASSERT(supportsInvalidation(selector.match())); |
| 141 return false; |
| 142 } |
| 143 |
| 144 switch (selector.pseudoType()) { |
| 145 case CSSSelector::PseudoFirstLine: |
| 146 case CSSSelector::PseudoFirstLetter: |
| 147 case CSSSelector::PseudoAutofill: |
| 148 case CSSSelector::PseudoFullPageMedia: |
| 149 case CSSSelector::PseudoResizer: |
| 150 case CSSSelector::PseudoScrollbar: |
| 151 case CSSSelector::PseudoScrollbarBack: |
| 152 case CSSSelector::PseudoScrollbarButton: |
| 153 case CSSSelector::PseudoScrollbarCorner: |
| 154 case CSSSelector::PseudoScrollbarForward: |
| 155 case CSSSelector::PseudoScrollbarThumb: |
| 156 case CSSSelector::PseudoScrollbarTrack: |
| 157 case CSSSelector::PseudoScrollbarTrackPiece: |
| 158 case CSSSelector::PseudoWindowInactive: |
| 159 case CSSSelector::PseudoCornerPresent: |
| 160 case CSSSelector::PseudoDecrement: |
| 161 case CSSSelector::PseudoIncrement: |
| 162 case CSSSelector::PseudoHorizontal: |
| 163 case CSSSelector::PseudoVertical: |
| 164 case CSSSelector::PseudoStart: |
| 165 case CSSSelector::PseudoEnd: |
| 166 case CSSSelector::PseudoDoubleButton: |
| 167 case CSSSelector::PseudoSingleButton: |
| 168 case CSSSelector::PseudoNoButton: |
| 169 case CSSSelector::PseudoSelection: |
| 170 case CSSSelector::PseudoFullScreen: |
| 171 case CSSSelector::PseudoFullScreenDocument: |
| 172 case CSSSelector::PseudoFullScreenAncestor: |
| 173 case CSSSelector::PseudoUserAgentCustomElement: |
| 174 case CSSSelector::PseudoWebKitCustomElement: |
| 175 case CSSSelector::PseudoCue: |
| 176 case CSSSelector::PseudoFutureCue: |
| 177 case CSSSelector::PseudoPastCue: |
| 178 case CSSSelector::PseudoContent: |
| 179 case CSSSelector::PseudoSpatialNavigationFocus: |
| 180 // FIXME: Most pseudo classes/elements above can be supported and moved |
| 181 // to assertSupportedPseudo(). Move on a case-by-case basis. If they |
| 182 // require subtree invalidation, document why. |
| 183 case CSSSelector::PseudoHostContext: |
| 184 // :host-context matches a shadow host, yet the simple selectors inside |
| 185 // :host-context matches an ancestor of the shadow host. |
| 186 return true; |
| 187 default: |
| 188 ASSERT(supportsInvalidation(selector.pseudoType())); |
| 189 return false; |
| 190 } |
| 191 } |
107 | 192 |
108 RuleFeature::RuleFeature(StyleRule* rule, unsigned selectorIndex, bool hasDocume
ntSecurityOrigin) | 193 RuleFeature::RuleFeature(StyleRule* rule, unsigned selectorIndex, bool hasDocume
ntSecurityOrigin) |
109 : rule(rule) | 194 : rule(rule) |
110 , selectorIndex(selectorIndex) | 195 , selectorIndex(selectorIndex) |
111 , hasDocumentSecurityOrigin(hasDocumentSecurityOrigin) | 196 , hasDocumentSecurityOrigin(hasDocumentSecurityOrigin) |
112 { | 197 { |
113 } | 198 } |
114 | 199 |
115 void RuleFeature::trace(Visitor* visitor) | 200 void RuleFeature::trace(Visitor* visitor) |
116 { | 201 { |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 // invalidation set is concerned. | 248 // invalidation set is concerned. |
164 if (subSelectorMode == UseLocalStyleChange) | 249 if (subSelectorMode == UseLocalStyleChange) |
165 foundUniversal = true; | 250 foundUniversal = true; |
166 } | 251 } |
167 if (!foundUniversal && !foundCombinator) { | 252 if (!foundUniversal && !foundCombinator) { |
168 // All sub-selectors contained invalidation set features and | 253 // All sub-selectors contained invalidation set features and |
169 // we are in the rightmost compound selector. | 254 // we are in the rightmost compound selector. |
170 foundIdent = true; | 255 foundIdent = true; |
171 } | 256 } |
172 } | 257 } |
173 } else if (!isSkippableComponentForInvalidation(*component)) { | 258 } else if (requiresSubtreeInvalidation(*component)) { |
174 return foundCombinator ? UseLocalStyleChange : UseSubtreeStyleChange
; | 259 return foundCombinator ? UseLocalStyleChange : UseSubtreeStyleChange
; |
175 } | 260 } |
176 if (component->relation() != CSSSelector::SubSelector) | 261 if (component->relation() != CSSSelector::SubSelector) |
177 foundCombinator = true; | 262 foundCombinator = true; |
178 } | 263 } |
179 return foundIdent ? AddFeatures : UseLocalStyleChange; | 264 return foundIdent ? AddFeatures : UseLocalStyleChange; |
180 } | 265 } |
181 | 266 |
182 void RuleFeatureSet::extractInvalidationSetFeature(const CSSSelector& selector,
InvalidationSetFeatures& features) | 267 void RuleFeatureSet::extractInvalidationSetFeature(const CSSSelector& selector,
InvalidationSetFeatures& features) |
183 { | 268 { |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
551 visitor->trace(uncommonAttributeRules); | 636 visitor->trace(uncommonAttributeRules); |
552 visitor->trace(m_classInvalidationSets); | 637 visitor->trace(m_classInvalidationSets); |
553 visitor->trace(m_attributeInvalidationSets); | 638 visitor->trace(m_attributeInvalidationSets); |
554 visitor->trace(m_idInvalidationSets); | 639 visitor->trace(m_idInvalidationSets); |
555 visitor->trace(m_pseudoInvalidationSets); | 640 visitor->trace(m_pseudoInvalidationSets); |
556 visitor->trace(m_styleInvalidator); | 641 visitor->trace(m_styleInvalidator); |
557 #endif | 642 #endif |
558 } | 643 } |
559 | 644 |
560 } // namespace blink | 645 } // namespace blink |
OLD | NEW |