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 {
20 void invalidate(Document&);
21 void scheduleInvalidation(PassRefPtr<DescendantInvalidationSet>, Element&);
23 // Clears all style invalidation state for the passed node.
24 void clearInvalidation(Node&);
26 void clearPendingInvalidations();
29 bool invalidate(Element&);
30 bool invalidateChildren(Element&);
32 bool checkInvalidationSetsAgainstElement(Element&);
34 struct RecursionData {
36 : m_invalidateCustomPseudo(false)
37 , m_wholeSubtreeInvalid(false)
39 void pushInvalidationSet(const DescendantInvalidationSet&);
40 bool matchesCurrentInvalidationSets(Element&);
41 bool hasInvalidationSets() const { return m_invalidationSets.size(); }
42 bool wholeSubtreeInvalid() const { return m_wholeSubtreeInvalid; }
43 void setWholeSubtreeInvalid() { m_wholeSubtreeInvalid = true; }
45 typedef Vector<const DescendantInvalidationSet*, 16> InvalidationSets;
46 InvalidationSets m_invalidationSets;
47 bool m_invalidateCustomPseudo;
48 bool m_wholeSubtreeInvalid;
51 class RecursionCheckpoint {
53 RecursionCheckpoint(RecursionData* data)
54 : m_prevInvalidationSetsSize(data->m_invalidationSets.size())
55 , m_prevInvalidateCustomPseudo(data->m_invalidateCustomPseudo)
56 , m_prevWholeSubtreeInvalid(data->m_wholeSubtreeInvalid)
59 ~RecursionCheckpoint()
61 m_data->m_invalidationSets.remove(m_prevInvalidationSetsSize, m_data->m_invalidationSets.size() - m_prevInvalidationSetsSize);
62 m_data->m_invalidateCustomPseudo = m_prevInvalidateCustomPseudo;
63 m_data->m_wholeSubtreeInvalid = m_prevWholeSubtreeInvalid;
67 int m_prevInvalidationSetsSize;
68 bool m_prevInvalidateCustomPseudo;
69 bool m_prevWholeSubtreeInvalid;
70 RecursionData* m_data;
73 typedef Vector<RefPtr<DescendantInvalidationSet> > InvalidationList;
74 typedef HashMap<Element*, OwnPtr<InvalidationList> > PendingInvalidationMap;
76 InvalidationList& ensurePendingInvalidationList(Element&);
78 PendingInvalidationMap m_pendingInvalidationMap;
79 RecursionData m_recursionData;
82 } // namespace WebCore
84 #endif // StyleInvalidator_h