Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / css / invalidation / StyleInvalidator.h
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.
4
5 #ifndef StyleInvalidator_h
6 #define StyleInvalidator_h
7
8 #include "platform/heap/Handle.h"
9
10 namespace WebCore {
11
12 class DescendantInvalidationSet;
13 class Document;
14 class Element;
15
16 class StyleInvalidator {
17 public:
18     StyleInvalidator();
19     ~StyleInvalidator();
20     void invalidate(Document&);
21     void scheduleInvalidation(PassRefPtr<DescendantInvalidationSet>, Element&);
22
23     // Clears all style invalidation state for the passed node.
24     void clearInvalidation(Node&);
25
26     void clearPendingInvalidations();
27
28 private:
29     bool invalidate(Element&);
30     bool invalidateChildren(Element&);
31
32     bool checkInvalidationSetsAgainstElement(Element&);
33
34     struct RecursionData {
35         RecursionData()
36             : m_invalidateCustomPseudo(false)
37             , m_wholeSubtreeInvalid(false)
38         { }
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; }
44
45         typedef Vector<const DescendantInvalidationSet*, 16> InvalidationSets;
46         InvalidationSets m_invalidationSets;
47         bool m_invalidateCustomPseudo;
48         bool m_wholeSubtreeInvalid;
49     };
50
51     class RecursionCheckpoint {
52     public:
53         RecursionCheckpoint(RecursionData* data)
54             : m_prevInvalidationSetsSize(data->m_invalidationSets.size())
55             , m_prevInvalidateCustomPseudo(data->m_invalidateCustomPseudo)
56             , m_prevWholeSubtreeInvalid(data->m_wholeSubtreeInvalid)
57             , m_data(data)
58         { }
59         ~RecursionCheckpoint()
60         {
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;
64         }
65
66     private:
67         int m_prevInvalidationSetsSize;
68         bool m_prevInvalidateCustomPseudo;
69         bool m_prevWholeSubtreeInvalid;
70         RecursionData* m_data;
71     };
72
73     typedef Vector<RefPtr<DescendantInvalidationSet> > InvalidationList;
74     typedef HashMap<Element*, OwnPtr<InvalidationList> > PendingInvalidationMap;
75
76     InvalidationList& ensurePendingInvalidationList(Element&);
77
78     PendingInvalidationMap m_pendingInvalidationMap;
79     RecursionData m_recursionData;
80 };
81
82 } // namespace WebCore
83
84 #endif // StyleInvalidator_h