31c83de61332259bc7b35a60348fbfb800ea0258
[WebKit-https.git] / Source / WebCore / dom / ElementRareData.h
1 /*
2  * Copyright (C) 2008, 2009, 2010, 2014 Apple Inc. All rights reserved.
3  * Copyright (C) 2008 David Smith <catfish.man@gmail.com>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  *
20  */
21
22 #ifndef ElementRareData_h
23 #define ElementRareData_h
24
25 #include "ClassList.h"
26 #include "DatasetDOMStringMap.h"
27 #include "NamedNodeMap.h"
28 #include "NodeRareData.h"
29 #include "PseudoElement.h"
30 #include "RenderElement.h"
31 #include "ShadowRoot.h"
32 #include "StyleInheritedData.h"
33
34 namespace WebCore {
35
36 class ElementRareData : public NodeRareData {
37 public:
38     explicit ElementRareData(RenderElement*);
39     ~ElementRareData();
40
41     void setBeforePseudoElement(RefPtr<PseudoElement>&&);
42     void setAfterPseudoElement(RefPtr<PseudoElement>&&);
43
44     PseudoElement* beforePseudoElement() const { return m_beforePseudoElement.get(); }
45     PseudoElement* afterPseudoElement() const { return m_afterPseudoElement.get(); }
46
47     void resetComputedStyle();
48     void resetDynamicRestyleObservations();
49     
50     short tabIndex() const { return m_tabIndex; }
51     void setTabIndexExplicitly(short index) { m_tabIndex = index; m_tabIndexWasSetExplicitly = true; }
52     bool tabIndexSetExplicitly() const { return m_tabIndexWasSetExplicitly; }
53     void clearTabIndexExplicitly() { m_tabIndex = 0; m_tabIndexWasSetExplicitly = false; }
54
55     bool needsFocusAppearanceUpdateSoonAfterAttach() const { return m_needsFocusAppearanceUpdateSoonAfterAttach; }
56     void setNeedsFocusAppearanceUpdateSoonAfterAttach(bool needs) { m_needsFocusAppearanceUpdateSoonAfterAttach = needs; }
57
58     bool styleAffectedByEmpty() const { return m_styleAffectedByEmpty; }
59     void setStyleAffectedByEmpty(bool value) { m_styleAffectedByEmpty = value; }
60
61     RegionOversetState regionOversetState() const { return m_regionOversetState; }
62     void setRegionOversetState(RegionOversetState state) { m_regionOversetState = state; }
63
64 #if ENABLE(FULLSCREEN_API)
65     bool containsFullScreenElement() { return m_containsFullScreenElement; }
66     void setContainsFullScreenElement(bool value) { m_containsFullScreenElement = value; }
67 #endif
68
69     bool childrenAffectedByActive() const { return m_childrenAffectedByActive; }
70     void setChildrenAffectedByActive(bool value) { m_childrenAffectedByActive = value; }
71     bool childrenAffectedByDrag() const { return m_childrenAffectedByDrag; }
72     void setChildrenAffectedByDrag(bool value) { m_childrenAffectedByDrag = value; }
73
74     bool childrenAffectedByLastChildRules() const { return m_childrenAffectedByLastChildRules; }
75     void setChildrenAffectedByLastChildRules(bool value) { m_childrenAffectedByLastChildRules = value; }
76     bool childrenAffectedByBackwardPositionalRules() const { return m_childrenAffectedByBackwardPositionalRules; }
77     void setChildrenAffectedByBackwardPositionalRules(bool value) { m_childrenAffectedByBackwardPositionalRules = value; }
78     bool childrenAffectedByPropertyBasedBackwardPositionalRules() const { return m_childrenAffectedByPropertyBasedBackwardPositionalRules; }
79     void setChildrenAffectedByPropertyBasedBackwardPositionalRules(bool value) { m_childrenAffectedByPropertyBasedBackwardPositionalRules = value; }
80
81     unsigned childIndex() const { return m_childIndex; }
82     void setChildIndex(unsigned index) { m_childIndex = index; }
83     static ptrdiff_t childIndexMemoryOffset() { return OBJECT_OFFSETOF(ElementRareData, m_childIndex); }
84
85     void clearShadowRoot() { m_shadowRoot = nullptr; }
86     ShadowRoot* shadowRoot() const { return m_shadowRoot.get(); }
87     void setShadowRoot(RefPtr<ShadowRoot>&& shadowRoot) { m_shadowRoot = WTF::move(shadowRoot); }
88
89     NamedNodeMap* attributeMap() const { return m_attributeMap.get(); }
90     void setAttributeMap(std::unique_ptr<NamedNodeMap> attributeMap) { m_attributeMap = WTF::move(attributeMap); }
91
92     RenderStyle* computedStyle() const { return m_computedStyle.get(); }
93     void setComputedStyle(Ref<RenderStyle>&& computedStyle) { m_computedStyle = WTF::move(computedStyle); }
94
95     ClassList* classList() const { return m_classList.get(); }
96     void setClassList(std::unique_ptr<ClassList> classList) { m_classList = WTF::move(classList); }
97     void clearClassListValueForQuirksMode()
98     {
99         if (!m_classList)
100             return;
101         m_classList->clearValueForQuirksMode();
102     }
103
104     DatasetDOMStringMap* dataset() const { return m_dataset.get(); }
105     void setDataset(std::unique_ptr<DatasetDOMStringMap> dataset) { m_dataset = WTF::move(dataset); }
106
107     LayoutSize minimumSizeForResizing() const { return m_minimumSizeForResizing; }
108     void setMinimumSizeForResizing(LayoutSize size) { m_minimumSizeForResizing = size; }
109
110     IntSize savedLayerScrollOffset() const { return m_savedLayerScrollOffset; }
111     void setSavedLayerScrollOffset(IntSize size) { m_savedLayerScrollOffset = size; }
112
113     bool hasPendingResources() const { return m_hasPendingResources; }
114     void setHasPendingResources(bool has) { m_hasPendingResources = has; }
115
116 private:
117     short m_tabIndex;
118     unsigned short m_childIndex;
119     unsigned m_tabIndexWasSetExplicitly : 1;
120     unsigned m_needsFocusAppearanceUpdateSoonAfterAttach : 1;
121     unsigned m_styleAffectedByEmpty : 1;
122 #if ENABLE(FULLSCREEN_API)
123     unsigned m_containsFullScreenElement : 1;
124 #endif
125     unsigned m_hasPendingResources : 1;
126     unsigned m_childrenAffectedByHover : 1;
127     unsigned m_childrenAffectedByActive : 1;
128     unsigned m_childrenAffectedByDrag : 1;
129     // Bits for dynamic child matching.
130     // We optimize for :first-child and :last-child. The other positional child selectors like nth-child or
131     // *-child-of-type, we will just give up and re-evaluate whenever children change at all.
132     unsigned m_childrenAffectedByLastChildRules : 1;
133     unsigned m_childrenAffectedByBackwardPositionalRules : 1;
134     unsigned m_childrenAffectedByPropertyBasedBackwardPositionalRules : 1;
135
136     RegionOversetState m_regionOversetState;
137
138     LayoutSize m_minimumSizeForResizing;
139     IntSize m_savedLayerScrollOffset;
140     RefPtr<RenderStyle> m_computedStyle;
141
142     std::unique_ptr<DatasetDOMStringMap> m_dataset;
143     std::unique_ptr<ClassList> m_classList;
144     RefPtr<ShadowRoot> m_shadowRoot;
145     std::unique_ptr<NamedNodeMap> m_attributeMap;
146
147     RefPtr<PseudoElement> m_beforePseudoElement;
148     RefPtr<PseudoElement> m_afterPseudoElement;
149
150     void releasePseudoElement(PseudoElement*);
151 };
152
153 inline IntSize defaultMinimumSizeForResizing()
154 {
155     return IntSize(LayoutUnit::max(), LayoutUnit::max());
156 }
157
158 inline ElementRareData::ElementRareData(RenderElement* renderer)
159     : NodeRareData(renderer)
160     , m_tabIndex(0)
161     , m_childIndex(0)
162     , m_tabIndexWasSetExplicitly(false)
163     , m_needsFocusAppearanceUpdateSoonAfterAttach(false)
164     , m_styleAffectedByEmpty(false)
165 #if ENABLE(FULLSCREEN_API)
166     , m_containsFullScreenElement(false)
167 #endif
168     , m_hasPendingResources(false)
169     , m_childrenAffectedByHover(false)
170     , m_childrenAffectedByActive(false)
171     , m_childrenAffectedByDrag(false)
172     , m_childrenAffectedByLastChildRules(false)
173     , m_childrenAffectedByBackwardPositionalRules(false)
174     , m_childrenAffectedByPropertyBasedBackwardPositionalRules(false)
175     , m_regionOversetState(RegionUndefined)
176     , m_minimumSizeForResizing(defaultMinimumSizeForResizing())
177 {
178 }
179
180 inline ElementRareData::~ElementRareData()
181 {
182     ASSERT(!m_shadowRoot);
183     ASSERT(!m_beforePseudoElement);
184     ASSERT(!m_afterPseudoElement);
185 }
186
187 inline void ElementRareData::setBeforePseudoElement(RefPtr<PseudoElement>&& pseudoElement)
188 {
189     ASSERT(!m_beforePseudoElement || !pseudoElement);
190     m_beforePseudoElement = WTF::move(pseudoElement);
191 }
192
193 inline void ElementRareData::setAfterPseudoElement(RefPtr<PseudoElement>&& pseudoElement)
194 {
195     ASSERT(!m_afterPseudoElement || !pseudoElement);
196     m_afterPseudoElement = WTF::move(pseudoElement);
197 }
198
199 inline void ElementRareData::resetComputedStyle()
200 {
201     m_computedStyle = nullptr;
202     setStyleAffectedByEmpty(false);
203     setChildIndex(0);
204 }
205
206 inline void ElementRareData::resetDynamicRestyleObservations()
207 {
208     setChildrenAffectedByActive(false);
209     setChildrenAffectedByDrag(false);
210     setChildrenAffectedByLastChildRules(false);
211     setChildrenAffectedByBackwardPositionalRules(false);
212     setChildrenAffectedByPropertyBasedBackwardPositionalRules(false);
213 }
214
215 } // namespace
216
217 #endif // ElementRareData_h