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)
37 , m_insertionPointCrossing(false)
40 void pushInvalidationSet(const DescendantInvalidationSet&);
41 bool matchesCurrentInvalidationSets(Element&);
42 bool hasInvalidationSets() const { return !wholeSubtreeInvalid() && m_invalidationSets.size(); }
44 bool wholeSubtreeInvalid() const { return m_wholeSubtreeInvalid; }
45 void setWholeSubtreeInvalid() { m_wholeSubtreeInvalid = true; }
47 bool treeBoundaryCrossing() const { return m_treeBoundaryCrossing; }
48 bool insertionPointCrossing() const { return m_insertionPointCrossing; }
50 typedef Vector<const DescendantInvalidationSet*, 16> InvalidationSets;
51 InvalidationSets m_invalidationSets;
52 bool m_invalidateCustomPseudo;
53 bool m_wholeSubtreeInvalid;
54 bool m_treeBoundaryCrossing;
55 bool m_insertionPointCrossing;
58 bool invalidate(Element&, RecursionData&);
59 bool invalidateChildren(Element&, RecursionData&);
60 bool checkInvalidationSetsAgainstElement(Element&, RecursionData&);
62 class RecursionCheckpoint {
64 RecursionCheckpoint(RecursionData* data)
65 : m_prevInvalidationSetsSize(data->m_invalidationSets.size())
66 , m_prevInvalidateCustomPseudo(data->m_invalidateCustomPseudo)
67 , m_prevWholeSubtreeInvalid(data->m_wholeSubtreeInvalid)
68 , m_treeBoundaryCrossing(data->m_treeBoundaryCrossing)
69 , m_insertionPointCrossing(data->m_insertionPointCrossing)
72 ~RecursionCheckpoint()
74 m_data->m_invalidationSets.remove(m_prevInvalidationSetsSize, m_data->m_invalidationSets.size() - m_prevInvalidationSetsSize);
75 m_data->m_invalidateCustomPseudo = m_prevInvalidateCustomPseudo;
76 m_data->m_wholeSubtreeInvalid = m_prevWholeSubtreeInvalid;
77 m_data->m_treeBoundaryCrossing = m_treeBoundaryCrossing;
78 m_data->m_insertionPointCrossing = m_insertionPointCrossing;
82 int m_prevInvalidationSetsSize;
83 bool m_prevInvalidateCustomPseudo;
84 bool m_prevWholeSubtreeInvalid;
85 bool m_treeBoundaryCrossing;
86 bool m_insertionPointCrossing;
87 RecursionData* m_data;
90 typedef WillBeHeapVector<RefPtrWillBeMember<DescendantInvalidationSet> > InvalidationList;
91 typedef WillBeHeapHashMap<RawPtrWillBeMember<Element>, OwnPtrWillBeMember<InvalidationList> > PendingInvalidationMap;
93 InvalidationList& ensurePendingInvalidationList(Element&);
95 PendingInvalidationMap m_pendingInvalidationMap;
100 #endif // StyleInvalidator_h