Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(126)

Side by Side Diff: third_party/WebKit/Source/core/css/RuleFeature.cpp

Issue 1703893002: Don't add rule feature data for rules which may never match. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@uncommon-attr-20160216
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/css/RuleFeature.h ('k') | third_party/WebKit/Source/core/css/RuleFeatureSetTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698