Replace WTF::move with WTFMove
[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 "AttributeDOMTokenList.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 = WTFMove(shadowRoot); }
88
89     NamedNodeMap* attributeMap() const { return m_attributeMap.get(); }
90     void setAttributeMap(std::unique_ptr<NamedNodeMap> attributeMap) { m_attributeMap = WTFMove(attributeMap); }
91
92     RenderStyle* computedStyle() const { return m_computedStyle.get(); }
93     void setComputedStyle(Ref<RenderStyle>&& computedStyle) { m_computedStyle = WTFMove(computedStyle); }
94
95     AttributeDOMTokenList* classList() const { return m_classList.get(); }
96     void setClassList(std::unique_ptr<AttributeDOMTokenList> classList) { m_classList = WTFMove(classList); }
97
98     DatasetDOMStringMap* dataset() const { return m_dataset.get(); }
99     void setDataset(std::unique_ptr<DatasetDOMStringMap> dataset) { m_dataset = WTFMove(dataset); }
100
101     LayoutSize minimumSizeForResizing() const { return m_minimumSizeForResizing; }
102     void setMinimumSizeForResizing(LayoutSize size) { m_minimumSizeForResizing = size; }
103
104     IntPoint savedLayerScrollPosition() const { return m_savedLayerScrollPosition; }
105     void setSavedLayerScrollPosition(IntPoint position) { m_savedLayerScrollPosition = position; }
106
107     bool hasPendingResources() const { return m_hasPendingResources; }
108     void setHasPendingResources(bool has) { m_hasPendingResources = has; }
109
110 private:
111     short m_tabIndex;
112     unsigned short m_childIndex;
113     unsigned m_tabIndexWasSetExplicitly : 1;
114     unsigned m_needsFocusAppearanceUpdateSoonAfterAttach : 1;
115     unsigned m_styleAffectedByEmpty : 1;
116 #if ENABLE(FULLSCREEN_API)
117     unsigned m_containsFullScreenElement : 1;
118 #endif
119     unsigned m_hasPendingResources : 1;
120     unsigned m_childrenAffectedByHover : 1;
121     unsigned m_childrenAffectedByActive : 1;
122     unsigned m_childrenAffectedByDrag : 1;
123     // Bits for dynamic child matching.
124     // We optimize for :first-child and :last-child. The other positional child selectors like nth-child or
125     // *-child-of-type, we will just give up and re-evaluate whenever children change at all.
126     unsigned m_childrenAffectedByLastChildRules : 1;
127     unsigned m_childrenAffectedByBackwardPositionalRules : 1;
128     unsigned m_childrenAffectedByPropertyBasedBackwardPositionalRules : 1;
129
130     RegionOversetState m_regionOversetState;
131
132     LayoutSize m_minimumSizeForResizing;
133     IntPoint m_savedLayerScrollPosition;
134     RefPtr<RenderStyle> m_computedStyle;
135
136     std::unique_ptr<DatasetDOMStringMap> m_dataset;
137     std::unique_ptr<AttributeDOMTokenList> m_classList;
138     RefPtr<ShadowRoot> m_shadowRoot;
139     std::unique_ptr<NamedNodeMap> m_attributeMap;
140
141     RefPtr<PseudoElement> m_beforePseudoElement;
142     RefPtr<PseudoElement> m_afterPseudoElement;
143
144     void releasePseudoElement(PseudoElement*);
145 };
146
147 inline IntSize defaultMinimumSizeForResizing()
148 {
149     return IntSize(LayoutUnit::max(), LayoutUnit::max());
150 }
151
152 inline ElementRareData::ElementRareData(RenderElement* renderer)
153     : NodeRareData(renderer)
154     , m_tabIndex(0)
155     , m_childIndex(0)
156     , m_tabIndexWasSetExplicitly(false)
157     , m_needsFocusAppearanceUpdateSoonAfterAttach(false)
158     , m_styleAffectedByEmpty(false)
159 #if ENABLE(FULLSCREEN_API)
160     , m_containsFullScreenElement(false)
161 #endif
162     , m_hasPendingResources(false)
163     , m_childrenAffectedByHover(false)
164     , m_childrenAffectedByActive(false)
165     , m_childrenAffectedByDrag(false)
166     , m_childrenAffectedByLastChildRules(false)
167     , m_childrenAffectedByBackwardPositionalRules(false)
168     , m_childrenAffectedByPropertyBasedBackwardPositionalRules(false)
169     , m_regionOversetState(RegionUndefined)
170     , m_minimumSizeForResizing(defaultMinimumSizeForResizing())
171 {
172 }
173
174 inline ElementRareData::~ElementRareData()
175 {
176     ASSERT(!m_shadowRoot);
177     ASSERT(!m_beforePseudoElement);
178     ASSERT(!m_afterPseudoElement);
179 }
180
181 inline void ElementRareData::setBeforePseudoElement(RefPtr<PseudoElement>&& pseudoElement)
182 {
183     ASSERT(!m_beforePseudoElement || !pseudoElement);
184     m_beforePseudoElement = WTFMove(pseudoElement);
185 }
186
187 inline void ElementRareData::setAfterPseudoElement(RefPtr<PseudoElement>&& pseudoElement)
188 {
189     ASSERT(!m_afterPseudoElement || !pseudoElement);
190     m_afterPseudoElement = WTFMove(pseudoElement);
191 }
192
193 inline void ElementRareData::resetComputedStyle()
194 {
195     m_computedStyle = nullptr;
196     setStyleAffectedByEmpty(false);
197     setChildIndex(0);
198 }
199
200 inline void ElementRareData::resetDynamicRestyleObservations()
201 {
202     setChildrenAffectedByActive(false);
203     setChildrenAffectedByDrag(false);
204     setChildrenAffectedByLastChildRules(false);
205     setChildrenAffectedByBackwardPositionalRules(false);
206     setChildrenAffectedByPropertyBasedBackwardPositionalRules(false);
207 }
208
209 } // namespace
210
211 #endif // ElementRareData_h