Update To 11.40.268.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 blink {
11
12 class DescendantInvalidationSet;
13 class Document;
14 class Element;
15
16 class StyleInvalidator {
17     DISALLOW_ALLOCATION();
18 public:
19     StyleInvalidator();
20     ~StyleInvalidator();
21     void invalidate(Document&);
22     void scheduleInvalidation(PassRefPtrWillBeRawPtr<DescendantInvalidationSet>, Element&);
23
24     // Clears all style invalidation state for the passed node.
25     void clearInvalidation(Node&);
26
27     void clearPendingInvalidations();
28
29     void trace(Visitor*);
30
31 private:
32     struct RecursionData {
33         RecursionData()
34             : m_invalidateCustomPseudo(false)
35             , m_wholeSubtreeInvalid(false)
36             , m_treeBoundaryCrossing(false)
37             , m_insertionPointCrossing(false)
38         { }
39
40         void pushInvalidationSet(const DescendantInvalidationSet&);
41         bool matchesCurrentInvalidationSets(Element&);
42         bool hasInvalidationSets() const { return !wholeSubtreeInvalid() && m_invalidationSets.size(); }
43
44         bool wholeSubtreeInvalid() const { return m_wholeSubtreeInvalid; }
45         void setWholeSubtreeInvalid() { m_wholeSubtreeInvalid = true; }
46
47         bool treeBoundaryCrossing() const { return m_treeBoundaryCrossing; }
48         bool insertionPointCrossing() const { return m_insertionPointCrossing; }
49
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;
56     };
57
58     bool invalidate(Element&, RecursionData&);
59     bool invalidateChildren(Element&, RecursionData&);
60     bool checkInvalidationSetsAgainstElement(Element&, RecursionData&);
61
62     class RecursionCheckpoint {
63     public:
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)
70             , m_data(data)
71         { }
72         ~RecursionCheckpoint()
73         {
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;
79         }
80
81     private:
82         int m_prevInvalidationSetsSize;
83         bool m_prevInvalidateCustomPseudo;
84         bool m_prevWholeSubtreeInvalid;
85         bool m_treeBoundaryCrossing;
86         bool m_insertionPointCrossing;
87         RecursionData* m_data;
88     };
89
90     typedef WillBeHeapVector<RefPtrWillBeMember<DescendantInvalidationSet> > InvalidationList;
91     typedef WillBeHeapHashMap<RawPtrWillBeMember<Element>, OwnPtrWillBeMember<InvalidationList> > PendingInvalidationMap;
92
93     InvalidationList& ensurePendingInvalidationList(Element&);
94
95     PendingInvalidationMap m_pendingInvalidationMap;
96 };
97
98 } // namespace blink
99
100 #endif // StyleInvalidator_h