| 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 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 } | 549 } |
| 550 | 550 |
| 551 localFeatures = InvalidationSetFeatures(); | 551 localFeatures = InvalidationSetFeatures(); |
| 552 auto result = extractInvalidationSetFeatures(*lastCompoundSelectorInAdja
centChain, localFeatures, Ancestor); | 552 auto result = extractInvalidationSetFeatures(*lastCompoundSelectorInAdja
centChain, localFeatures, Ancestor); |
| 553 ASSERT(result.first); | 553 ASSERT(result.first); |
| 554 localFeatures.forceSubtree = result.second == ForceSubtree; | 554 localFeatures.forceSubtree = result.second == ForceSubtree; |
| 555 siblingFeatures = &localFeatures; | 555 siblingFeatures = &localFeatures; |
| 556 } | 556 } |
| 557 } | 557 } |
| 558 | 558 |
| 559 void RuleFeatureSet::collectFeaturesFromRuleData(const RuleData& ruleData) | 559 RuleFeatureSet::SelectorPreMatch RuleFeatureSet::collectFeaturesFromRuleData(con
st RuleData& ruleData) |
| 560 { | 560 { |
| 561 updateInvalidationSets(ruleData); | 561 FeatureMetadata metadata; |
| 562 if (collectFeaturesFromSelector(ruleData.selector(), metadata) == SelectorNe
verMatches) |
| 563 return SelectorNeverMatches; |
| 562 | 564 |
| 563 FeatureMetadata metadata; | |
| 564 collectFeaturesFromSelector(ruleData.selector(), metadata); | |
| 565 m_metadata.add(metadata); | 565 m_metadata.add(metadata); |
| 566 | 566 |
| 567 if (metadata.foundSiblingSelector) | 567 if (metadata.foundSiblingSelector) |
| 568 siblingRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(
), ruleData.hasDocumentSecurityOrigin())); | 568 siblingRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(
), ruleData.hasDocumentSecurityOrigin())); |
| 569 if (ruleData.containsUncommonAttributeSelector()) | 569 if (ruleData.containsUncommonAttributeSelector()) |
| 570 uncommonAttributeRules.append(RuleFeature(ruleData.rule(), ruleData.sele
ctorIndex(), ruleData.hasDocumentSecurityOrigin())); | 570 uncommonAttributeRules.append(RuleFeature(ruleData.rule(), ruleData.sele
ctorIndex(), ruleData.hasDocumentSecurityOrigin())); |
| 571 |
| 572 updateInvalidationSets(ruleData); |
| 573 return SelectorMayMatch; |
| 571 } | 574 } |
| 572 | 575 |
| 573 void RuleFeatureSet::collectFeaturesFromSelector(const CSSSelector& selector, Ru
leFeatureSet::FeatureMetadata& metadata) | 576 RuleFeatureSet::SelectorPreMatch RuleFeatureSet::collectFeaturesFromSelector(con
st CSSSelector& selector, RuleFeatureSet::FeatureMetadata& metadata) |
| 574 { | 577 { |
| 575 unsigned maxDirectAdjacentSelectors = 0; | 578 unsigned maxDirectAdjacentSelectors = 0; |
| 579 CSSSelector::Relation relation = CSSSelector::Descendant; |
| 580 bool foundHostPseudo = false; |
| 576 | 581 |
| 577 for (const CSSSelector* current = &selector; current; current = current->tag
History()) { | 582 for (const CSSSelector* current = &selector; current; current = current->tag
History()) { |
| 578 if (current->pseudoType() == CSSSelector::PseudoFirstLine) | 583 switch (current->pseudoType()) { |
| 584 case CSSSelector::PseudoFirstLine: |
| 579 metadata.usesFirstLineRules = true; | 585 metadata.usesFirstLineRules = true; |
| 580 if (current->pseudoType() == CSSSelector::PseudoWindowInactive) | 586 break; |
| 587 case CSSSelector::PseudoWindowInactive: |
| 581 metadata.usesWindowInactiveSelector = true; | 588 metadata.usesWindowInactiveSelector = true; |
| 582 if (current->relation() == CSSSelector::DirectAdjacent) { | 589 break; |
| 590 case CSSSelector::PseudoEmpty: |
| 591 case CSSSelector::PseudoFirstChild: |
| 592 case CSSSelector::PseudoFirstOfType: |
| 593 case CSSSelector::PseudoLastChild: |
| 594 case CSSSelector::PseudoLastOfType: |
| 595 case CSSSelector::PseudoOnlyChild: |
| 596 case CSSSelector::PseudoOnlyOfType: |
| 597 case CSSSelector::PseudoNthChild: |
| 598 case CSSSelector::PseudoNthOfType: |
| 599 case CSSSelector::PseudoNthLastChild: |
| 600 case CSSSelector::PseudoNthLastOfType: |
| 601 if (!metadata.foundInsertionPointCrossing) |
| 602 metadata.foundSiblingSelector = true; |
| 603 break; |
| 604 case CSSSelector::PseudoHost: |
| 605 case CSSSelector::PseudoHostContext: |
| 606 if (relation == CSSSelector::SubSelector) |
| 607 return SelectorNeverMatches; |
| 608 if (!current->isLastInTagHistory() && current->tagHistory()->match()
!= CSSSelector::PseudoElement) |
| 609 return SelectorNeverMatches; |
| 610 foundHostPseudo = true; |
| 611 // fall through. |
| 612 default: |
| 613 if (const CSSSelectorList* selectorList = current->selectorList()) { |
| 614 for (const CSSSelector* subSelector = selectorList->first(); sub
Selector; subSelector = CSSSelectorList::next(*subSelector)) |
| 615 collectFeaturesFromSelector(*subSelector, metadata); |
| 616 } |
| 617 break; |
| 618 } |
| 619 |
| 620 if (current->relationIsAffectedByPseudoContent() || current->pseudoType(
) == CSSSelector::PseudoSlotted) |
| 621 metadata.foundInsertionPointCrossing = true; |
| 622 |
| 623 relation = current->relation(); |
| 624 |
| 625 if (foundHostPseudo && relation != CSSSelector::SubSelector) |
| 626 return SelectorNeverMatches; |
| 627 |
| 628 if (relation == CSSSelector::DirectAdjacent) { |
| 583 maxDirectAdjacentSelectors++; | 629 maxDirectAdjacentSelectors++; |
| 584 } else if (maxDirectAdjacentSelectors | 630 } else if (maxDirectAdjacentSelectors |
| 585 && ((current->relation() != CSSSelector::SubSelector) || current->is
LastInTagHistory())) { | 631 && ((relation != CSSSelector::SubSelector) || current->isLastInTagHi
story())) { |
| 586 if (maxDirectAdjacentSelectors > metadata.maxDirectAdjacentSelectors
) | 632 if (maxDirectAdjacentSelectors > metadata.maxDirectAdjacentSelectors
) |
| 587 metadata.maxDirectAdjacentSelectors = maxDirectAdjacentSelectors
; | 633 metadata.maxDirectAdjacentSelectors = maxDirectAdjacentSelectors
; |
| 588 maxDirectAdjacentSelectors = 0; | 634 maxDirectAdjacentSelectors = 0; |
| 589 } | 635 } |
| 590 if (!metadata.foundInsertionPointCrossing && current->isSiblingPseudo()) | |
| 591 metadata.foundSiblingSelector = true; | |
| 592 | 636 |
| 593 if (const CSSSelectorList* selectorList = current->selectorList()) { | |
| 594 for (const CSSSelector* subSelector = selectorList->first(); subSele
ctor; subSelector = CSSSelectorList::next(*subSelector)) | |
| 595 collectFeaturesFromSelector(*subSelector, metadata); | |
| 596 } | |
| 597 if (current->relationIsAffectedByPseudoContent() | |
| 598 || current->pseudoType() == CSSSelector::PseudoHost | |
| 599 || current->pseudoType() == CSSSelector::PseudoHostContext | |
| 600 || current->pseudoType() == CSSSelector::PseudoSlotted) { | |
| 601 metadata.foundInsertionPointCrossing = true; | |
| 602 } | |
| 603 if (!metadata.foundInsertionPointCrossing && current->isAdjacentSelector
()) | 637 if (!metadata.foundInsertionPointCrossing && current->isAdjacentSelector
()) |
| 604 metadata.foundSiblingSelector = true; | 638 metadata.foundSiblingSelector = true; |
| 605 } | 639 } |
| 606 | 640 |
| 607 ASSERT(!maxDirectAdjacentSelectors); | 641 ASSERT(!maxDirectAdjacentSelectors); |
| 642 return SelectorMayMatch; |
| 608 } | 643 } |
| 609 | 644 |
| 610 void RuleFeatureSet::FeatureMetadata::add(const FeatureMetadata& other) | 645 void RuleFeatureSet::FeatureMetadata::add(const FeatureMetadata& other) |
| 611 { | 646 { |
| 612 usesFirstLineRules = usesFirstLineRules || other.usesFirstLineRules; | 647 usesFirstLineRules = usesFirstLineRules || other.usesFirstLineRules; |
| 613 usesWindowInactiveSelector = usesWindowInactiveSelector || other.usesWindowI
nactiveSelector; | 648 usesWindowInactiveSelector = usesWindowInactiveSelector || other.usesWindowI
nactiveSelector; |
| 614 maxDirectAdjacentSelectors = std::max(maxDirectAdjacentSelectors, other.maxD
irectAdjacentSelectors); | 649 maxDirectAdjacentSelectors = std::max(maxDirectAdjacentSelectors, other.maxD
irectAdjacentSelectors); |
| 615 } | 650 } |
| 616 | 651 |
| 617 void RuleFeatureSet::FeatureMetadata::clear() | 652 void RuleFeatureSet::FeatureMetadata::clear() |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 737 | 772 |
| 738 DEFINE_TRACE(RuleFeatureSet) | 773 DEFINE_TRACE(RuleFeatureSet) |
| 739 { | 774 { |
| 740 #if ENABLE(OILPAN) | 775 #if ENABLE(OILPAN) |
| 741 visitor->trace(siblingRules); | 776 visitor->trace(siblingRules); |
| 742 visitor->trace(uncommonAttributeRules); | 777 visitor->trace(uncommonAttributeRules); |
| 743 #endif | 778 #endif |
| 744 } | 779 } |
| 745 | 780 |
| 746 } // namespace blink | 781 } // namespace blink |
| OLD | NEW |