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