| Index: Source/core/css/RuleSet.h
|
| diff --git a/Source/core/css/RuleSet.h b/Source/core/css/RuleSet.h
|
| index 0d9e99958167f05e461cc717be2cfd6428cb7217..c41f8ceafbc003165bb8186ba61513baabc2a8a7 100644
|
| --- a/Source/core/css/RuleSet.h
|
| +++ b/Source/core/css/RuleSet.h
|
| @@ -24,10 +24,11 @@
|
|
|
| #include "core/css/RuleFeature.h"
|
| #include "core/css/StyleRule.h"
|
| -#include <wtf/Forward.h>
|
| -#include <wtf/HashMap.h>
|
| -#include <wtf/HashSet.h>
|
| -#include <wtf/text/AtomicString.h>
|
| +#include "wtf/Forward.h"
|
| +#include "wtf/HashMap.h"
|
| +#include "wtf/HashSet.h"
|
| +#include "wtf/LinkedStack.h"
|
| +#include "wtf/text/AtomicString.h"
|
|
|
| namespace WebCore {
|
|
|
| @@ -112,23 +113,23 @@ public:
|
|
|
| const RuleFeatureSet& features() const { return m_features; }
|
|
|
| - const Vector<RuleData>* idRules(AtomicStringImpl* key) const { ASSERT(!m_hasDirtyRules); return m_idRules.get(key); }
|
| - const Vector<RuleData>* classRules(AtomicStringImpl* key) const { ASSERT(!m_hasDirtyRules); return m_classRules.get(key); }
|
| - const Vector<RuleData>* tagRules(AtomicStringImpl* key) const { ASSERT(!m_hasDirtyRules); return m_tagRules.get(key); }
|
| - const Vector<RuleData>* shadowPseudoElementRules(AtomicStringImpl* key) const { ASSERT(!m_hasDirtyRules); return m_shadowPseudoElementRules.get(key); }
|
| - const Vector<RuleData>* linkPseudoClassRules() const { ASSERT(!m_hasDirtyRules); return &m_linkPseudoClassRules; }
|
| - const Vector<RuleData>* cuePseudoRules() const { ASSERT(!m_hasDirtyRules); return &m_cuePseudoRules; }
|
| - const Vector<RuleData>* focusPseudoClassRules() const { ASSERT(!m_hasDirtyRules); return &m_focusPseudoClassRules; }
|
| - const Vector<RuleData>* universalRules() const { ASSERT(!m_hasDirtyRules); return &m_universalRules; }
|
| - const Vector<StyleRulePage*>& pageRules() const { ASSERT(!m_hasDirtyRules); return m_pageRules; }
|
| + const Vector<RuleData>* idRules(AtomicStringImpl* key) const { ASSERT(!m_pendingRules); return m_idRules.get(key); }
|
| + const Vector<RuleData>* classRules(AtomicStringImpl* key) const { ASSERT(!m_pendingRules); return m_classRules.get(key); }
|
| + const Vector<RuleData>* tagRules(AtomicStringImpl* key) const { ASSERT(!m_pendingRules); return m_tagRules.get(key); }
|
| + const Vector<RuleData>* shadowPseudoElementRules(AtomicStringImpl* key) const { ASSERT(!m_pendingRules); return m_shadowPseudoElementRules.get(key); }
|
| + const Vector<RuleData>* linkPseudoClassRules() const { ASSERT(!m_pendingRules); return &m_linkPseudoClassRules; }
|
| + const Vector<RuleData>* cuePseudoRules() const { ASSERT(!m_pendingRules); return &m_cuePseudoRules; }
|
| + const Vector<RuleData>* focusPseudoClassRules() const { ASSERT(!m_pendingRules); return &m_focusPseudoClassRules; }
|
| + const Vector<RuleData>* universalRules() const { ASSERT(!m_pendingRules); return &m_universalRules; }
|
| + const Vector<StyleRulePage*>& pageRules() const { ASSERT(!m_pendingRules); return m_pageRules; }
|
|
|
| unsigned ruleCount() const { return m_ruleCount; }
|
|
|
| void compactRulesIfNeeded()
|
| {
|
| - if (!m_hasDirtyRules)
|
| + if (!m_pendingRules)
|
| return;
|
| - shrinkToFit();
|
| + compactRules();
|
| }
|
|
|
| void reportMemoryUsage(MemoryObjectInfo*) const;
|
| @@ -145,28 +146,42 @@ public:
|
| Vector<RuleSetSelectorPair> m_regionSelectorsAndRuleSets;
|
|
|
| private:
|
| - typedef HashMap<AtomicStringImpl*, OwnPtr<Vector<RuleData> > > AtomRuleMap;
|
| + typedef HashMap<AtomicStringImpl*, OwnPtr<LinkedStack<RuleData> > > PendingRuleMap;
|
| + typedef HashMap<AtomicStringImpl*, OwnPtr<Vector<RuleData> > > CompactRuleMap;
|
|
|
| RuleSet()
|
| : m_ruleCount(0)
|
| - , m_hasDirtyRules(false)
|
| {
|
| }
|
|
|
| - void addToRuleSet(AtomicStringImpl* key, AtomRuleMap&, const RuleData&);
|
| + void addToRuleSet(AtomicStringImpl* key, PendingRuleMap&, const RuleData&);
|
| void addPageRule(StyleRulePage*);
|
| void addRegionRule(StyleRuleRegion*, bool hasDocumentSecurityOrigin);
|
|
|
| void addChildRules(const Vector<RefPtr<StyleRuleBase> >&, const MediaQueryEvaluator& medium, StyleResolver*, const ContainerNode* scope, bool hasDocumentSecurityOrigin, AddRuleFlags);
|
| bool findBestRuleSetAndAdd(const CSSSelector*, RuleData&);
|
|
|
| - void shrinkToFit();
|
| - static inline void shrinkMapVectorsToFit(AtomRuleMap&);
|
| + void compactRules();
|
| + static void compactPendingRules(PendingRuleMap&, CompactRuleMap&);
|
|
|
| - AtomRuleMap m_idRules;
|
| - AtomRuleMap m_classRules;
|
| - AtomRuleMap m_tagRules;
|
| - AtomRuleMap m_shadowPseudoElementRules;
|
| + struct PendingRuleMaps {
|
| + PendingRuleMap idRules;
|
| + PendingRuleMap classRules;
|
| + PendingRuleMap tagRules;
|
| + PendingRuleMap shadowPseudoElementRules;
|
| + };
|
| +
|
| + PendingRuleMaps* ensurePendingRules()
|
| + {
|
| + if (!m_pendingRules)
|
| + m_pendingRules = adoptPtr(new PendingRuleMaps);
|
| + return m_pendingRules.get();
|
| + }
|
| +
|
| + CompactRuleMap m_idRules;
|
| + CompactRuleMap m_classRules;
|
| + CompactRuleMap m_tagRules;
|
| + CompactRuleMap m_shadowPseudoElementRules;
|
| Vector<RuleData> m_linkPseudoClassRules;
|
| Vector<RuleData> m_cuePseudoRules;
|
| Vector<RuleData> m_focusPseudoClassRules;
|
| @@ -175,7 +190,7 @@ private:
|
| Vector<StyleRulePage*> m_pageRules;
|
|
|
| unsigned m_ruleCount;
|
| - bool m_hasDirtyRules;
|
| + OwnPtr<PendingRuleMaps> m_pendingRules;
|
| };
|
|
|
| } // namespace WebCore
|
|
|