ce8b48e9338ad108b9e70581988abd8edba2e601
[WebKit-https.git] / Source / WebCore / dom / ElementRareData.h
1 /*
2  * Copyright (C) 2008, 2009, 2010, 2014, 2016 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 #pragma once
23
24 #include "CustomElementReactionQueue.h"
25 #include "DOMTokenList.h"
26 #include "DatasetDOMStringMap.h"
27 #include "IntersectionObserver.h"
28 #include "NamedNodeMap.h"
29 #include "NodeRareData.h"
30 #include "PseudoElement.h"
31 #include "RenderElement.h"
32 #include "ResizeObserver.h"
33 #include "ShadowRoot.h"
34 #include "StylePropertyMap.h"
35
36 namespace WebCore {
37
38 inline IntSize defaultMinimumSizeForResizing()
39 {
40     return IntSize(LayoutUnit::max(), LayoutUnit::max());
41 }
42
43 class ElementRareData : public NodeRareData {
44 public:
45     explicit ElementRareData();
46     ~ElementRareData();
47
48     void setBeforePseudoElement(RefPtr<PseudoElement>&&);
49     void setAfterPseudoElement(RefPtr<PseudoElement>&&);
50
51     PseudoElement* beforePseudoElement() const { return m_beforePseudoElement.get(); }
52     PseudoElement* afterPseudoElement() const { return m_afterPseudoElement.get(); }
53
54     void resetComputedStyle();
55     void resetStyleRelations();
56     
57     Optional<int> tabIndex() const { return m_tabIndexWasSetExplicitly ? Optional<int> { m_tabIndex } : WTF::nullopt; }
58     void setTabIndexExplicitly(int index) { m_tabIndex = index; m_tabIndexWasSetExplicitly = true; }
59     bool tabIndexSetExplicitly() const { return m_tabIndexWasSetExplicitly; }
60     void clearTabIndexExplicitly() { m_tabIndex = 0; m_tabIndexWasSetExplicitly = false; }
61
62 #if ENABLE(FULLSCREEN_API)
63     bool containsFullScreenElement() { return m_containsFullScreenElement; }
64     void setContainsFullScreenElement(bool value) { m_containsFullScreenElement = value; }
65 #endif
66
67     unsigned childIndex() const { return m_childIndex; }
68     void setChildIndex(unsigned index) { m_childIndex = index; }
69     static ptrdiff_t childIndexMemoryOffset() { return OBJECT_OFFSETOF(ElementRareData, m_childIndex); }
70
71     void clearShadowRoot() { m_shadowRoot = nullptr; }
72     ShadowRoot* shadowRoot() const { return m_shadowRoot.get(); }
73     void setShadowRoot(RefPtr<ShadowRoot>&& shadowRoot) { m_shadowRoot = WTFMove(shadowRoot); }
74
75     CustomElementReactionQueue* customElementReactionQueue() { return m_customElementReactionQueue.get(); }
76     void setCustomElementReactionQueue(std::unique_ptr<CustomElementReactionQueue>&& queue) { m_customElementReactionQueue = WTFMove(queue); }
77
78     NamedNodeMap* attributeMap() const { return m_attributeMap.get(); }
79     void setAttributeMap(std::unique_ptr<NamedNodeMap> attributeMap) { m_attributeMap = WTFMove(attributeMap); }
80
81     RenderStyle* computedStyle() const { return m_computedStyle.get(); }
82     void setComputedStyle(std::unique_ptr<RenderStyle> computedStyle) { m_computedStyle = WTFMove(computedStyle); }
83
84     DOMTokenList* classList() const { return m_classList.get(); }
85     void setClassList(std::unique_ptr<DOMTokenList> classList) { m_classList = WTFMove(classList); }
86
87     DatasetDOMStringMap* dataset() const { return m_dataset.get(); }
88     void setDataset(std::unique_ptr<DatasetDOMStringMap> dataset) { m_dataset = WTFMove(dataset); }
89
90     LayoutSize minimumSizeForResizing() const { return m_minimumSizeForResizing; }
91     void setMinimumSizeForResizing(LayoutSize size) { m_minimumSizeForResizing = size; }
92
93     IntPoint savedLayerScrollPosition() const { return m_savedLayerScrollPosition; }
94     void setSavedLayerScrollPosition(IntPoint position) { m_savedLayerScrollPosition = position; }
95
96     bool hasPendingResources() const { return m_hasPendingResources; }
97     void setHasPendingResources(bool has) { m_hasPendingResources = has; }
98
99     bool hasCSSAnimation() const { return m_hasCSSAnimation; }
100     void setHasCSSAnimation(bool value) { m_hasCSSAnimation = value; }
101
102     bool hasElementIdentifier() const { return m_hasElementIdentifier; }
103     void setHasElementIdentifier(bool value) { m_hasElementIdentifier = value; }
104
105 #if ENABLE(INTERSECTION_OBSERVER)
106     IntersectionObserverData* intersectionObserverData() { return m_intersectionObserverData.get(); }
107     void setIntersectionObserverData(std::unique_ptr<IntersectionObserverData>&& data) { m_intersectionObserverData = WTFMove(data); }
108 #endif
109
110 #if ENABLE(RESIZE_OBSERVER)
111     ResizeObserverData* resizeObserverData() { return m_resizeObserverData.get(); }
112     void setResizeObserverData(std::unique_ptr<ResizeObserverData>&& data) { m_resizeObserverData = WTFMove(data); }
113 #endif
114
115 #if ENABLE(CSS_TYPED_OM)
116     StylePropertyMap* attributeStyleMap() { return m_attributeStyleMap.get(); }
117     void setAttributeStyleMap(Ref<StylePropertyMap>&& map) { m_attributeStyleMap = WTFMove(map); }
118 #endif
119
120 #if DUMP_NODE_STATISTICS
121     OptionSet<UseType> useTypes() const
122     {
123         auto result = NodeRareData::useTypes();
124         if (m_tabIndexWasSetExplicitly)
125             result.add(UseType::TabIndex);
126         if (m_minimumSizeForResizing != defaultMinimumSizeForResizing())
127             result.add(UseType::MinimumSize);
128         if (!m_savedLayerScrollPosition.isZero())
129             result.add(UseType::ScrollingPosition);
130         if (m_computedStyle)
131             result.add(UseType::ComputedStyle);
132         if (m_dataset)
133             result.add(UseType::Dataset);
134         if (m_classList)
135             result.add(UseType::ClassList);
136         if (m_shadowRoot)
137             result.add(UseType::ShadowRoot);
138         if (m_customElementReactionQueue)
139             result.add(UseType::CustomElementQueue);
140         if (m_attributeMap)
141             result.add(UseType::AttributeMap);
142         if (m_intersectionObserverData)
143             result.add(UseType::InteractionObserver);
144 #if ENABLE(RESIZE_OBSERVER)
145         if (m_resizeObserverData)
146             result.add(UseType::ResizeObserver);
147 #endif
148         if (m_beforePseudoElement || m_afterPseudoElement)
149             result.add(UseType::PseudoElements);
150         return result;
151     }
152 #endif
153
154 private:
155     int m_tabIndex;
156     unsigned short m_childIndex;
157     unsigned m_tabIndexWasSetExplicitly : 1;
158 #if ENABLE(FULLSCREEN_API)
159     unsigned m_containsFullScreenElement : 1;
160 #endif
161     unsigned m_hasPendingResources : 1;
162     unsigned m_hasCSSAnimation : 1;
163     unsigned m_hasElementIdentifier : 1;
164
165     LayoutSize m_minimumSizeForResizing;
166     IntPoint m_savedLayerScrollPosition;
167     std::unique_ptr<RenderStyle> m_computedStyle;
168
169     std::unique_ptr<DatasetDOMStringMap> m_dataset;
170     std::unique_ptr<DOMTokenList> m_classList;
171     RefPtr<ShadowRoot> m_shadowRoot;
172     std::unique_ptr<CustomElementReactionQueue> m_customElementReactionQueue;
173     std::unique_ptr<NamedNodeMap> m_attributeMap;
174 #if ENABLE(INTERSECTION_OBSERVER)
175     std::unique_ptr<IntersectionObserverData> m_intersectionObserverData;
176 #endif
177
178 #if ENABLE(RESIZE_OBSERVER)
179     std::unique_ptr<ResizeObserverData> m_resizeObserverData;
180 #endif
181
182     RefPtr<PseudoElement> m_beforePseudoElement;
183     RefPtr<PseudoElement> m_afterPseudoElement;
184
185 #if ENABLE(CSS_TYPED_OM)
186     RefPtr<StylePropertyMap> m_attributeStyleMap;
187 #endif
188
189     void releasePseudoElement(PseudoElement*);
190 };
191
192 inline ElementRareData::ElementRareData()
193     : NodeRareData(Type::Element)
194     , m_tabIndex(0)
195     , m_childIndex(0)
196     , m_tabIndexWasSetExplicitly(false)
197 #if ENABLE(FULLSCREEN_API)
198     , m_containsFullScreenElement(false)
199 #endif
200     , m_hasPendingResources(false)
201     , m_hasCSSAnimation(false)
202     , m_hasElementIdentifier(false)
203     , m_minimumSizeForResizing(defaultMinimumSizeForResizing())
204 {
205 }
206
207 inline ElementRareData::~ElementRareData()
208 {
209     ASSERT(!m_shadowRoot);
210     ASSERT(!m_beforePseudoElement);
211     ASSERT(!m_afterPseudoElement);
212 }
213
214 inline void ElementRareData::setBeforePseudoElement(RefPtr<PseudoElement>&& pseudoElement)
215 {
216     ASSERT(!m_beforePseudoElement || !pseudoElement);
217     m_beforePseudoElement = WTFMove(pseudoElement);
218 }
219
220 inline void ElementRareData::setAfterPseudoElement(RefPtr<PseudoElement>&& pseudoElement)
221 {
222     ASSERT(!m_afterPseudoElement || !pseudoElement);
223     m_afterPseudoElement = WTFMove(pseudoElement);
224 }
225
226 inline void ElementRareData::resetComputedStyle()
227 {
228     m_computedStyle = nullptr;
229 }
230
231 inline void ElementRareData::resetStyleRelations()
232 {
233     setChildIndex(0);
234 }
235
236 } // namespace WebCore