15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef RuleSet_h 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define RuleSet_h 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/css/CSSKeyframesRule.h" 2651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/css/MediaQueryEvaluator.h" 2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/RuleFeature.h" 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StyleRule.h" 2951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/css/resolver/MediaQueryResult.h" 30a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "platform/heap/HeapLinkedStack.h" 31a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "platform/heap/HeapTerminatedArray.h" 32591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Forward.h" 33591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/HashMap.h" 34591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/LinkedStack.h" 35d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "wtf/TerminatedArray.h" 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum AddRuleFlags { 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RuleHasNoSpecialState = 0, 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RuleHasDocumentSecurityOrigin = 1, 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RuleCanUseFastCheckSelector = 1 << 1, 43926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}; 4402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)enum PropertyWhitelistType { 46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) PropertyWhitelistNone = 0, 47323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) PropertyWhitelistCue, 48323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) PropertyWhitelistFirstLetter, 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CSSSelector; 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class MediaQueryEvaluator; 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class StyleSheetContents; 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class MinimalRuleData { 56d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ALLOW_ONLY_INLINE_ALLOCATION(); 57d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)public: 5851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) MinimalRuleData(StyleRule* rule, unsigned selectorIndex, AddRuleFlags flags) 5951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) : m_rule(rule) 6051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_selectorIndex(selectorIndex) 6151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_flags(flags) 6251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) { 6351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 6451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 65d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) void trace(Visitor*); 66d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 67d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) RawPtrWillBeMember<StyleRule> m_rule; 6851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) unsigned m_selectorIndex; 6951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) AddRuleFlags m_flags; 7051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}; 7151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RuleData { 73d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ALLOW_ONLY_INLINE_ALLOCATION(); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RuleData(StyleRule*, unsigned selectorIndex, unsigned position, AddRuleFlags); 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned position() const { return m_position; } 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StyleRule* rule() const { return m_rule; } 7909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) const CSSSelector& selector() const { return m_rule->selectorList().selectorAt(m_selectorIndex); } 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned selectorIndex() const { return m_selectorIndex; } 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 82591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch bool isLastInArray() const { return m_isLastInArray; } 83591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch void setLastInArray(bool flag) { m_isLastInArray = flag; } 84591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool hasMultipartSelector() const { return m_hasMultipartSelector; } 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool hasRightmostSelectorMatchingHTMLBasedOnRuleHash() const { return m_hasRightmostSelectorMatchingHTMLBasedOnRuleHash; } 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool containsUncommonAttributeSelector() const { return m_containsUncommonAttributeSelector; } 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned specificity() const { return m_specificity; } 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned linkMatchType() const { return m_linkMatchType; } 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool hasDocumentSecurityOrigin() const { return m_hasDocumentSecurityOrigin; } 91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) PropertyWhitelistType propertyWhitelistType(bool isMatchingUARules = false) const { return isMatchingUARules ? PropertyWhitelistNone : static_cast<PropertyWhitelistType>(m_propertyWhitelistType); } 9223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch // Try to balance between memory usage (there can be lots of RuleData objects) and good filtering performance. 9323e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch static const unsigned maximumIdentifierCount = 4; 9423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch const unsigned* descendantSelectorIdentifierHashes() const { return m_descendantSelectorIdentifierHashes; } 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 96d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) void trace(Visitor*); 97d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 99d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) RawPtrWillBeMember<StyleRule> m_rule; 100591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch unsigned m_selectorIndex : 12; 101591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch unsigned m_isLastInArray : 1; // We store an array of RuleData objects in a primitive array. 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This number was picked fairly arbitrarily. We can probably lower it if we need to. 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Some simple testing showed <100,000 RuleData's on large sites. 104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) unsigned m_position : 18; 105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) unsigned m_specificity : 24; 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned m_hasMultipartSelector : 1; 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned m_hasRightmostSelectorMatchingHTMLBasedOnRuleHash : 1; 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned m_containsUncommonAttributeSelector : 1; 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned m_linkMatchType : 2; // SelectorChecker::LinkMatchMask 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned m_hasDocumentSecurityOrigin : 1; 111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) unsigned m_propertyWhitelistType : 2; 11223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch // Use plain array instead of a Vector to minimize memory overhead. 11323e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch unsigned m_descendantSelectorIdentifierHashes[maximumIdentifierCount]; 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 11502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct SameSizeAsRuleData { 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void* a; 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned b; 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned c; 12023e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch unsigned d[4]; 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT(sizeof(RuleData) == sizeof(SameSizeAsRuleData), RuleData_should_stay_small); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 125d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class RuleSet : public NoBaseWillBeGarbageCollectedFinalized<RuleSet> { 126d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(RuleSet); 127d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED; 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 129d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) static PassOwnPtrWillBeRawPtr<RuleSet> create() { return adoptPtrWillBeNoop(new RuleSet); } 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) void addRulesFromSheet(StyleSheetContents*, const MediaQueryEvaluator&, AddRuleFlags = RuleHasNoSpecialState); 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void addStyleRule(StyleRule*, AddRuleFlags); 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void addRule(StyleRule*, unsigned selectorIndex, AddRuleFlags); 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const RuleFeatureSet& features() const { return m_features; } 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 137d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const WillBeHeapTerminatedArray<RuleData>* idRules(const AtomicString& key) const { ASSERT(!m_pendingRules); return m_idRules.get(key); } 138d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const WillBeHeapTerminatedArray<RuleData>* classRules(const AtomicString& key) const { ASSERT(!m_pendingRules); return m_classRules.get(key); } 139d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const WillBeHeapTerminatedArray<RuleData>* tagRules(const AtomicString& key) const { ASSERT(!m_pendingRules); return m_tagRules.get(key); } 140d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const WillBeHeapTerminatedArray<RuleData>* shadowPseudoElementRules(const AtomicString& key) const { ASSERT(!m_pendingRules); return m_shadowPseudoElementRules.get(key); } 141d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const WillBeHeapVector<RuleData>* linkPseudoClassRules() const { ASSERT(!m_pendingRules); return &m_linkPseudoClassRules; } 142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const WillBeHeapVector<RuleData>* cuePseudoRules() const { ASSERT(!m_pendingRules); return &m_cuePseudoRules; } 143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const WillBeHeapVector<RuleData>* focusPseudoClassRules() const { ASSERT(!m_pendingRules); return &m_focusPseudoClassRules; } 144d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const WillBeHeapVector<RuleData>* universalRules() const { ASSERT(!m_pendingRules); return &m_universalRules; } 145d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const WillBeHeapVector<RawPtrWillBeMember<StyleRulePage> >& pageRules() const { ASSERT(!m_pendingRules); return m_pageRules; } 146d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const WillBeHeapVector<RawPtrWillBeMember<StyleRuleViewport> >& viewportRules() const { ASSERT(!m_pendingRules); return m_viewportRules; } 147d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const WillBeHeapVector<RawPtrWillBeMember<StyleRuleFontFace> >& fontFaceRules() const { return m_fontFaceRules; } 148d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const WillBeHeapVector<RawPtrWillBeMember<StyleRuleKeyframes> >& keyframesRules() const { return m_keyframesRules; } 149d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const WillBeHeapVector<MinimalRuleData>& treeBoundaryCrossingRules() const { return m_treeBoundaryCrossingRules; } 150d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const WillBeHeapVector<MinimalRuleData>& shadowDistributedRules() const { return m_shadowDistributedRules; } 15151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) const MediaQueryResultList& viewportDependentMediaQueryResults() const { return m_viewportDependentMediaQueryResults; } 152591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 153591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch unsigned ruleCount() const { return m_ruleCount; } 154591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 155591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch void compactRulesIfNeeded() 156591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch { 157591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (!m_pendingRules) 158591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return; 159591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch compactRules(); 160591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#ifndef NDEBUG 16309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) void show(); 16409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#endif 16509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 166d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) void trace(Visitor*); 167591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private: 169d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) typedef WillBeHeapHashMap<AtomicString, OwnPtrWillBeMember<WillBeHeapLinkedStack<RuleData> > > PendingRuleMap; 170d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) typedef WillBeHeapHashMap<AtomicString, OwnPtrWillBeMember<WillBeHeapTerminatedArray<RuleData> > > CompactRuleMap; 171591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 172591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch RuleSet() 173591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch : m_ruleCount(0) 174591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch { 175591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 176591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 17709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) void addToRuleSet(const AtomicString& key, PendingRuleMap&, const RuleData&); 178591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch void addPageRule(StyleRulePage*); 1790019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch void addViewportRule(StyleRuleViewport*); 18051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) void addFontFaceRule(StyleRuleFontFace*); 18151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) void addKeyframesRule(StyleRuleKeyframes*); 182591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 183d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) void addChildRules(const WillBeHeapVector<RefPtrWillBeMember<StyleRuleBase> >&, const MediaQueryEvaluator& medium, AddRuleFlags); 18409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool findBestRuleSetAndAdd(const CSSSelector&, RuleData&); 185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 186591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch void compactRules(); 187591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch static void compactPendingRules(PendingRuleMap&, CompactRuleMap&); 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 189d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) class PendingRuleMaps : public NoBaseWillBeGarbageCollected<PendingRuleMaps> { 190d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) public: 191d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) static PassOwnPtrWillBeRawPtr<PendingRuleMaps> create() { return adoptPtrWillBeNoop(new PendingRuleMaps); } 192d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 193591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch PendingRuleMap idRules; 194591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch PendingRuleMap classRules; 195591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch PendingRuleMap tagRules; 196591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch PendingRuleMap shadowPseudoElementRules; 197d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 198d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) void trace(Visitor*); 199d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 200d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) private: 201d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) PendingRuleMaps() { } 202591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch }; 203591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 204591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch PendingRuleMaps* ensurePendingRules() 205591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch { 206591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (!m_pendingRules) 207d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_pendingRules = PendingRuleMaps::create(); 208591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return m_pendingRules.get(); 209591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 210591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 211591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch CompactRuleMap m_idRules; 212591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch CompactRuleMap m_classRules; 213591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch CompactRuleMap m_tagRules; 214591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch CompactRuleMap m_shadowPseudoElementRules; 215d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) WillBeHeapVector<RuleData> m_linkPseudoClassRules; 216d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) WillBeHeapVector<RuleData> m_cuePseudoRules; 217d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) WillBeHeapVector<RuleData> m_focusPseudoClassRules; 218d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) WillBeHeapVector<RuleData> m_universalRules; 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RuleFeatureSet m_features; 220d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) WillBeHeapVector<RawPtrWillBeMember<StyleRulePage> > m_pageRules; 221d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) WillBeHeapVector<RawPtrWillBeMember<StyleRuleViewport> > m_viewportRules; 222d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) WillBeHeapVector<RawPtrWillBeMember<StyleRuleFontFace> > m_fontFaceRules; 223d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) WillBeHeapVector<RawPtrWillBeMember<StyleRuleKeyframes> > m_keyframesRules; 224d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) WillBeHeapVector<MinimalRuleData> m_treeBoundaryCrossingRules; 225d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) WillBeHeapVector<MinimalRuleData> m_shadowDistributedRules; 22651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 22751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) MediaQueryResultList m_viewportDependentMediaQueryResults; 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 229591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch unsigned m_ruleCount; 230d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) OwnPtrWillBeMember<PendingRuleMaps> m_pendingRules; 23109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 23209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#ifndef NDEBUG 233d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) WillBeHeapVector<RuleData> m_allRules; 23409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#endif 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 237c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 239c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::RuleData); 240c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::MinimalRuleData); 241d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // RuleSet_h 243