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 |
| 6 * rights reserved. |
6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> | 7 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> |
7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> | 8 * 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/) | 9 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. |
| 10 * (http://www.torchmobile.com/) |
9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. | 11 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. |
10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. | 12 * Copyright (C) Research In Motion Limited 2011. All rights reserved. |
11 * Copyright (C) 2012 Google Inc. All rights reserved. | 13 * Copyright (C) 2012 Google Inc. All rights reserved. |
12 * | 14 * |
13 * This library is free software; you can redistribute it and/or | 15 * This library is free software; you can redistribute it and/or |
14 * modify it under the terms of the GNU Library General Public | 16 * modify it under the terms of the GNU Library General Public |
15 * License as published by the Free Software Foundation; either | 17 * License as published by the Free Software Foundation; either |
16 * version 2 of the License, or (at your option) any later version. | 18 * version 2 of the License, or (at your option) any later version. |
17 * | 19 * |
18 * This library is distributed in the hope that it will be useful, | 20 * This library is distributed in the hope that it will be useful, |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 case CSSSelector::AttributeContain: | 61 case CSSSelector::AttributeContain: |
60 case CSSSelector::AttributeBegin: | 62 case CSSSelector::AttributeBegin: |
61 case CSSSelector::AttributeEnd: | 63 case CSSSelector::AttributeEnd: |
62 return true; | 64 return true; |
63 case CSSSelector::Unknown: | 65 case CSSSelector::Unknown: |
64 case CSSSelector::PagePseudoClass: | 66 case CSSSelector::PagePseudoClass: |
65 // These should not appear in StyleRule selectors. | 67 // These should not appear in StyleRule selectors. |
66 NOTREACHED(); | 68 NOTREACHED(); |
67 return false; | 69 return false; |
68 default: | 70 default: |
69 // New match type added. Figure out if it needs a subtree invalidation or
not. | 71 // New match type added. Figure out if it needs a subtree invalidation or |
| 72 // not. |
70 NOTREACHED(); | 73 NOTREACHED(); |
71 return false; | 74 return false; |
72 } | 75 } |
73 } | 76 } |
74 | 77 |
75 bool supportsInvalidation(CSSSelector::PseudoType type) { | 78 bool supportsInvalidation(CSSSelector::PseudoType type) { |
76 switch (type) { | 79 switch (type) { |
77 case CSSSelector::PseudoEmpty: | 80 case CSSSelector::PseudoEmpty: |
78 case CSSSelector::PseudoFirstChild: | 81 case CSSSelector::PseudoFirstChild: |
79 case CSSSelector::PseudoFirstOfType: | 82 case CSSSelector::PseudoFirstOfType: |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 case CSSSelector::PseudoSlotted: | 157 case CSSSelector::PseudoSlotted: |
155 return true; | 158 return true; |
156 case CSSSelector::PseudoUnknown: | 159 case CSSSelector::PseudoUnknown: |
157 case CSSSelector::PseudoLeftPage: | 160 case CSSSelector::PseudoLeftPage: |
158 case CSSSelector::PseudoRightPage: | 161 case CSSSelector::PseudoRightPage: |
159 case CSSSelector::PseudoFirstPage: | 162 case CSSSelector::PseudoFirstPage: |
160 // These should not appear in StyleRule selectors. | 163 // These should not appear in StyleRule selectors. |
161 NOTREACHED(); | 164 NOTREACHED(); |
162 return false; | 165 return false; |
163 default: | 166 default: |
164 // New pseudo type added. Figure out if it needs a subtree invalidation or
not. | 167 // New pseudo type added. Figure out if it needs a subtree invalidation or |
| 168 // not. |
165 NOTREACHED(); | 169 NOTREACHED(); |
166 return false; | 170 return false; |
167 } | 171 } |
168 } | 172 } |
169 | 173 |
170 bool supportsInvalidationWithSelectorList(CSSSelector::PseudoType pseudo) { | 174 bool supportsInvalidationWithSelectorList(CSSSelector::PseudoType pseudo) { |
171 return pseudo == CSSSelector::PseudoAny || pseudo == CSSSelector::PseudoCue || | 175 return pseudo == CSSSelector::PseudoAny || pseudo == CSSSelector::PseudoCue || |
172 pseudo == CSSSelector::PseudoHost || | 176 pseudo == CSSSelector::PseudoHost || |
173 pseudo == CSSSelector::PseudoHostContext || | 177 pseudo == CSSSelector::PseudoHostContext || |
174 pseudo == CSSSelector::PseudoNot || | 178 pseudo == CSSSelector::PseudoNot || |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
619 | 623 |
620 if (!simpleSelector->tagHistory() || | 624 if (!simpleSelector->tagHistory() || |
621 simpleSelector->relation() != CSSSelector::SubSelector) { | 625 simpleSelector->relation() != CSSSelector::SubSelector) { |
622 features.hasFeaturesForRuleSetInvalidation = | 626 features.hasFeaturesForRuleSetInvalidation = |
623 features.hasTagIdClassOrAttribute(); | 627 features.hasTagIdClassOrAttribute(); |
624 return simpleSelector; | 628 return simpleSelector; |
625 } | 629 } |
626 } | 630 } |
627 } | 631 } |
628 | 632 |
629 // Add features extracted from the rightmost compound selector to descendant inv
alidation | 633 // Add features extracted from the rightmost compound selector to descendant |
630 // sets for features found in other compound selectors. | 634 // invalidation sets for features found in other compound selectors. |
631 // | 635 // |
632 // We use descendant invalidation for descendants, sibling invalidation for sibl
ings and their subtrees. | 636 // We use descendant invalidation for descendants, sibling invalidation for |
| 637 // siblings and their subtrees. |
633 // | 638 // |
634 // As we encounter a descendant type of combinator, the features only need to be
checked | 639 // As we encounter a descendant type of combinator, the features only need to be |
635 // against descendants in the same subtree only. features.adjacent is set to fal
se, and | 640 // checked against descendants in the same subtree only. features.adjacent is |
636 // we start adding features to the descendant invalidation set. | 641 // set to false, and we start adding features to the descendant invalidation |
| 642 // set. |
637 | 643 |
638 void RuleFeatureSet::addFeaturesToInvalidationSet( | 644 void RuleFeatureSet::addFeaturesToInvalidationSet( |
639 InvalidationSet& invalidationSet, | 645 InvalidationSet& invalidationSet, |
640 const InvalidationSetFeatures& features) { | 646 const InvalidationSetFeatures& features) { |
641 if (features.treeBoundaryCrossing) | 647 if (features.treeBoundaryCrossing) |
642 invalidationSet.setTreeBoundaryCrossing(); | 648 invalidationSet.setTreeBoundaryCrossing(); |
643 if (features.insertionPointCrossing) | 649 if (features.insertionPointCrossing) |
644 invalidationSet.setInsertionPointCrossing(); | 650 invalidationSet.setInsertionPointCrossing(); |
645 if (features.invalidatesSlotted) | 651 if (features.invalidatesSlotted) |
646 invalidationSet.setInvalidatesSlotted(); | 652 invalidationSet.setInvalidatesSlotted(); |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
750 addFeaturesToUniversalSiblingInvalidationSet(*siblingFeatures, | 756 addFeaturesToUniversalSiblingInvalidationSet(*siblingFeatures, |
751 descendantFeatures); | 757 descendantFeatures); |
752 | 758 |
753 return simpleSelector; | 759 return simpleSelector; |
754 } | 760 } |
755 | 761 |
756 void RuleFeatureSet::addFeaturesToInvalidationSets( | 762 void RuleFeatureSet::addFeaturesToInvalidationSets( |
757 const CSSSelector& selector, | 763 const CSSSelector& selector, |
758 InvalidationSetFeatures* siblingFeatures, | 764 InvalidationSetFeatures* siblingFeatures, |
759 InvalidationSetFeatures& descendantFeatures) { | 765 InvalidationSetFeatures& descendantFeatures) { |
760 // selector is the selector immediately to the left of the rightmost combinato
r. | 766 // selector is the selector immediately to the left of the rightmost |
761 // descendantFeatures has the features of the rightmost compound selector. | 767 // combinator. descendantFeatures has the features of the rightmost compound |
| 768 // selector. |
762 | 769 |
763 InvalidationSetFeatures lastCompoundInSiblingChainFeatures; | 770 InvalidationSetFeatures lastCompoundInSiblingChainFeatures; |
764 const CSSSelector* compound = &selector; | 771 const CSSSelector* compound = &selector; |
765 while (compound) { | 772 while (compound) { |
766 const CSSSelector* lastInCompound = | 773 const CSSSelector* lastInCompound = |
767 addFeaturesToInvalidationSetsForCompoundSelector( | 774 addFeaturesToInvalidationSetsForCompoundSelector( |
768 *compound, siblingFeatures, descendantFeatures); | 775 *compound, siblingFeatures, descendantFeatures); |
769 DCHECK(lastInCompound); | 776 DCHECK(lastInCompound); |
770 updateFeaturesFromCombinator(*lastInCompound, compound, | 777 updateFeaturesFromCombinator(*lastInCompound, compound, |
771 lastCompoundInSiblingChainFeatures, | 778 lastCompoundInSiblingChainFeatures, |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1175 return !classes.isEmpty() || !attributes.isEmpty() || !ids.isEmpty() || | 1182 return !classes.isEmpty() || !attributes.isEmpty() || !ids.isEmpty() || |
1176 !tagNames.isEmpty() || customPseudoElement; | 1183 !tagNames.isEmpty() || customPseudoElement; |
1177 } | 1184 } |
1178 | 1185 |
1179 bool RuleFeatureSet::InvalidationSetFeatures::hasTagIdClassOrAttribute() const { | 1186 bool RuleFeatureSet::InvalidationSetFeatures::hasTagIdClassOrAttribute() const { |
1180 return !classes.isEmpty() || !attributes.isEmpty() || !ids.isEmpty() || | 1187 return !classes.isEmpty() || !attributes.isEmpty() || !ids.isEmpty() || |
1181 !tagNames.isEmpty(); | 1188 !tagNames.isEmpty(); |
1182 } | 1189 } |
1183 | 1190 |
1184 } // namespace blink | 1191 } // namespace blink |
OLD | NEW |