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