1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef StyleInvalidator_h
6 #define StyleInvalidator_h
8 #include "platform/heap/Handle.h"
12 class DescendantInvalidationSet;
16 class StyleInvalidator {
17 DISALLOW_ALLOCATION();
21 void invalidate(Document&);
22 void scheduleInvalidation(PassRefPtrWillBeRawPtr<DescendantInvalidationSet>, Element&);
24 // Clears all style invalidation state for the passed node.
25 void clearInvalidation(Node&);
27 void clearPendingInvalidations();
32 struct RecursionData {
34 : m_invalidateCustomPseudo(false)
35 , m_wholeSubtreeInvalid(false)
36 , m_treeBoundaryCrossing(false)
39 void pushInvalidationSet(const DescendantInvalidationSet&);
40 bool matchesCurrentInvalidationSets(Element&);
41 bool hasInvalidationSets() const { return !wholeSubtreeInvalid() && m_invalidationSets.size(); }
43 bool wholeSubtreeInvalid() const { return m_wholeSubtreeInvalid; }
44 void setWholeSubtreeInvalid() { m_wholeSubtreeInvalid = true; }
46 bool treeBoundaryCrossing() const { return m_treeBoundaryCrossing; }
48 typedef Vector<const DescendantInvalidationSet*, 16> InvalidationSets;
49 InvalidationSets m_invalidationSets;
50 bool m_invalidateCustomPseudo;
51 bool m_wholeSubtreeInvalid;
52 bool m_treeBoundaryCrossing;
55 bool invalidate(Element&, RecursionData&);
56 bool invalidateChildren(Element&, RecursionData&);
57 bool checkInvalidationSetsAgainstElement(Element&, RecursionData&);
59 class RecursionCheckpoint {
61 RecursionCheckpoint(RecursionData* data)
62 : m_prevInvalidationSetsSize(data->m_invalidationSets.size())
63 , m_prevInvalidateCustomPseudo(data->m_invalidateCustomPseudo)
64 , m_prevWholeSubtreeInvalid(data->m_wholeSubtreeInvalid)
65 , m_treeBoundaryCrossing(data->m_treeBoundaryCrossing)
68 ~RecursionCheckpoint()
70 m_data->m_invalidationSets.remove(m_prevInvalidationSetsSize, m_data->m_invalidationSets.size() - m_prevInvalidationSetsSize);
71 m_data->m_invalidateCustomPseudo = m_prevInvalidateCustomPseudo;
72 m_data->m_wholeSubtreeInvalid = m_prevWholeSubtreeInvalid;
73 m_data->m_treeBoundaryCrossing = m_treeBoundaryCrossing;
77 int m_prevInvalidationSetsSize;
78 bool m_prevInvalidateCustomPseudo;
79 bool m_prevWholeSubtreeInvalid;
80 bool m_treeBoundaryCrossing;
81 RecursionData* m_data;
84 typedef WillBeHeapVector<RefPtrWillBeMember<DescendantInvalidationSet> > InvalidationList;
85 typedef WillBeHeapHashMap<RawPtrWillBeMember<Element>, OwnPtrWillBeMember<InvalidationList> > PendingInvalidationMap;
87 InvalidationList& ensurePendingInvalidationList(Element&);
89 PendingInvalidationMap m_pendingInvalidationMap;
94 #endif // StyleInvalidator_h