da2910956ccfc4b9ce8bcf993d8c16fdb37b3d8e
[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 #include <wtf/OwnPtr.h>
34
35 namespace WebCore {
36
37 class ElementRareData : public NodeRareData {
38 public:
39     explicit ElementRareData(RenderElement*);
40     ~ElementRareData();
41
42     void setBeforePseudoElement(PassRefPtr<PseudoElement>);
43     void setAfterPseudoElement(PassRefPtr<PseudoElement>);
44
45     PseudoElement* beforePseudoElement() const { return m_beforePseudoElement.get(); }
46     PseudoElement* afterPseudoElement() const { return m_afterPseudoElement.get(); }
47
48     void resetComputedStyle();
49     void resetDynamicRestyleObservations();
50     
51     short tabIndex() const { return m_tabIndex; }
52     void setTabIndexExplicitly(short index) { m_tabIndex = index; m_tabIndexWasSetExplicitly = true; }
53     bool tabIndexSetExplicitly() const { return m_tabIndexWasSetExplicitly; }
54     void clearTabIndexExplicitly() { m_tabIndex = 0; m_tabIndexWasSetExplicitly = false; }
55
56     bool needsFocusAppearanceUpdateSoonAfterAttach() const { return m_needsFocusAppearanceUpdateSoonAfterAttach; }
57     void setNeedsFocusAppearanceUpdateSoonAfterAttach(bool needs) { m_needsFocusAppearanceUpdateSoonAfterAttach = needs; }
58
59     bool styleAffectedByEmpty() const { return m_styleAffectedByEmpty; }
60     void setStyleAffectedByEmpty(bool value) { m_styleAffectedByEmpty = value; }
61
62     RegionOversetState regionOversetState() const { return m_regionOversetState; }
63     void setRegionOversetState(RegionOversetState state) { m_regionOversetState = state; }
64
65 #if ENABLE(FULLSCREEN_API)
66     bool containsFullScreenElement() { return m_containsFullScreenElement; }
67     void setContainsFullScreenElement(bool value) { m_containsFullScreenElement = value; }
68 #endif
69
70     bool childrenAffectedByActive() const { return m_childrenAffectedByActive; }
71     void setChildrenAffectedByActive(bool value) { m_childrenAffectedByActive = value; }
72     bool childrenAffectedByDrag() const { return m_childrenAffectedByDrag; }
73     void setChildrenAffectedByDrag(bool value) { m_childrenAffectedByDrag = value; }
74
75     bool childrenAffectedByLastChildRules() const { return m_childrenAffectedByLastChildRules; }
76     void setChildrenAffectedByLastChildRules(bool value) { m_childrenAffectedByLastChildRules = value; }
77     bool childrenAffectedByBackwardPositionalRules() const { return m_childrenAffectedByBackwardPositionalRules; }
78     void setChildrenAffectedByBackwardPositionalRules(bool value) { m_childrenAffectedByBackwardPositionalRules = value; }
79     bool childrenAffectedByPropertyBasedBackwardPositionalRules() const { return m_childrenAffectedByPropertyBasedBackwardPositionalRules; }
80     void setChildrenAffectedByPropertyBasedBackwardPositionalRules(bool value) { m_childrenAffectedByPropertyBasedBackwardPositionalRules = value; }
81
82     unsigned childIndex() const { return m_childIndex; }
83     void setChildIndex(unsigned index) { m_childIndex = index; }
84     static ptrdiff_t childIndexMemoryOffset() { return OBJECT_OFFSETOF(ElementRareData, m_childIndex); }
85
86     void clearShadowRoot() { m_shadowRoot = nullptr; }
87     ShadowRoot* shadowRoot() const { return m_shadowRoot.get(); }
88     void setShadowRoot(PassRefPtr<ShadowRoot> shadowRoot) { m_shadowRoot = shadowRoot; }
89
90     NamedNodeMap* attributeMap() const { return m_attributeMap.get(); }
91     void setAttributeMap(std::unique_ptr<NamedNodeMap> attributeMap) { m_attributeMap = WTF::move(attributeMap); }
92
93     RenderStyle* computedStyle() const { return m_computedStyle.get(); }
94     void setComputedStyle(PassRef<RenderStyle> computedStyle) { m_computedStyle = WTF::move(computedStyle); }
95
96     ClassList* classList() const { return m_classList.get(); }
97     void setClassList(std::unique_ptr<ClassList> classList) { m_classList = WTF::move(classList); }
98     void clearClassListValueForQuirksMode()
99     {
100         if (!m_classList)
101             return;
102         m_classList->clearValueForQuirksMode();
103     }
104
105     DatasetDOMStringMap* dataset() const { return m_dataset.get(); }
106     void setDataset(std::unique_ptr<DatasetDOMStringMap> dataset) { m_dataset = WTF::move(dataset); }
107
108     LayoutSize minimumSizeForResizing() const { return m_minimumSizeForResizing; }
109     void setMinimumSizeForResizing(LayoutSize size) { m_minimumSizeForResizing = size; }
110
111     IntSize savedLayerScrollOffset() const { return m_savedLayerScrollOffset; }
112     void setSavedLayerScrollOffset(IntSize size) { m_savedLayerScrollOffset = size; }
113
114     bool hasPendingResources() const { return m_hasPendingResources; }
115     void setHasPendingResources(bool has) { m_hasPendingResources = has; }
116
117 private:
118     short m_tabIndex;
119     unsigned short m_childIndex;
120     unsigned m_tabIndexWasSetExplicitly : 1;
121     unsigned m_needsFocusAppearanceUpdateSoonAfterAttach : 1;
122     unsigned m_styleAffectedByEmpty : 1;
123 #if ENABLE(FULLSCREEN_API)
124     unsigned m_containsFullScreenElement : 1;
125 #endif
126     unsigned m_hasPendingResources : 1;
127     unsigned m_childrenAffectedByHover : 1;
128     unsigned m_childrenAffectedByActive : 1;
129     unsigned m_childrenAffectedByDrag : 1;
130     // Bits for dynamic child matching.
131     // We optimize for :first-child and :last-child. The other positional child selectors like nth-child or
132     // *-child-of-type, we will just give up and re-evaluate whenever children change at all.
133     unsigned m_childrenAffectedByLastChildRules : 1;
134     unsigned m_childrenAffectedByBackwardPositionalRules : 1;
135     unsigned m_childrenAffectedByPropertyBasedBackwardPositionalRules : 1;
136
137     RegionOversetState m_regionOversetState;
138
139     LayoutSize m_minimumSizeForResizing;
140     IntSize m_savedLayerScrollOffset;
141     RefPtr<RenderStyle> m_computedStyle;
142
143     std::unique_ptr<DatasetDOMStringMap> m_dataset;
144     std::unique_ptr<ClassList> m_classList;
145     RefPtr<ShadowRoot> m_shadowRoot;
146     std::unique_ptr<NamedNodeMap> m_attributeMap;
147
148     RefPtr<PseudoElement> m_beforePseudoElement;
149     RefPtr<PseudoElement> m_afterPseudoElement;
150
151     void releasePseudoElement(PseudoElement*);
152 };
153
154 inline IntSize defaultMinimumSizeForResizing()
155 {
156     return IntSize(LayoutUnit::max(), LayoutUnit::max());
157 }
158
159 inline ElementRareData::ElementRareData(RenderElement* renderer)
160     : NodeRareData(renderer)
161     , m_tabIndex(0)
162     , m_childIndex(0)
163     , m_tabIndexWasSetExplicitly(false)
164     , m_needsFocusAppearanceUpdateSoonAfterAttach(false)
165     , m_styleAffectedByEmpty(false)
166 #if ENABLE(FULLSCREEN_API)
167     , m_containsFullScreenElement(false)
168 #endif
169     , m_hasPendingResources(false)
170     , m_childrenAffectedByHover(false)
171     , m_childrenAffectedByActive(false)
172     , m_childrenAffectedByDrag(false)
173     , m_childrenAffectedByLastChildRules(false)
174     , m_childrenAffectedByBackwardPositionalRules(false)
175     , m_childrenAffectedByPropertyBasedBackwardPositionalRules(false)
176     , m_regionOversetState(RegionUndefined)
177     , m_minimumSizeForResizing(defaultMinimumSizeForResizing())
178 {
179 }
180
181 inline ElementRareData::~ElementRareData()
182 {
183     ASSERT(!m_shadowRoot);
184     ASSERT(!m_beforePseudoElement);
185     ASSERT(!m_afterPseudoElement);
186 }
187
188 inline void ElementRareData::setBeforePseudoElement(PassRefPtr<PseudoElement> pseudoElement)
189 {
190     ASSERT(!m_beforePseudoElement || !pseudoElement);
191     m_beforePseudoElement = pseudoElement;
192 }
193
194 inline void ElementRareData::setAfterPseudoElement(PassRefPtr<PseudoElement> pseudoElement)
195 {
196     ASSERT(!m_afterPseudoElement || !pseudoElement);
197     m_afterPseudoElement = pseudoElement;
198 }
199
200 inline void ElementRareData::resetComputedStyle()
201 {
202     m_computedStyle = nullptr;
203     setStyleAffectedByEmpty(false);
204     setChildIndex(0);
205 }
206
207 inline void ElementRareData::resetDynamicRestyleObservations()
208 {
209     setChildrenAffectedByActive(false);
210     setChildrenAffectedByDrag(false);
211     setChildrenAffectedByLastChildRules(false);
212     setChildrenAffectedByBackwardPositionalRules(false);
213     setChildrenAffectedByPropertyBasedBackwardPositionalRules(false);
214 }
215
216 } // namespace
217
218 #endif // ElementRareData_h