[CSS Grid Layout] Upgrade align-self and align-items parsing to CSS 3
[WebKit-https.git] / Source / WebCore / rendering / style / ContentData.h
1 /*
2  * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
3  *           (C) 2000 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2000 Dirk Mueller (mueller@kde.org)
5  * Copyright (C) 2003, 2005, 2006, 2007, 2008, 2010 Apple Inc. All rights reserved.
6  * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com)
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public License
19  * along with this library; see the file COPYING.LIB.  If not, write to
20  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21  * Boston, MA 02110-1301, USA.
22  *
23  */
24
25 #ifndef ContentData_h
26 #define ContentData_h
27
28 #include "CounterContent.h"
29 #include "StyleImage.h"
30 #include "RenderPtr.h"
31 #include <wtf/TypeCasts.h>
32
33 namespace WebCore {
34
35 class Document;
36 class RenderObject;
37 class RenderStyle;
38
39 class ContentData {
40     WTF_MAKE_FAST_ALLOCATED;
41 public:
42     enum Type {
43         CounterDataType,
44         ImageDataType,
45         QuoteDataType,
46         TextDataType
47     };
48     virtual ~ContentData() { }
49
50     Type type() const { return m_type; }
51
52     bool isCounter() const { return type() == CounterDataType; }
53     bool isImage() const { return type() == ImageDataType; }
54     bool isQuote() const { return type() == QuoteDataType; }
55     bool isText() const { return type() == TextDataType; }
56
57     virtual RenderPtr<RenderObject> createContentRenderer(Document&, const RenderStyle&) const = 0;
58
59     std::unique_ptr<ContentData> clone() const;
60
61     ContentData* next() const { return m_next.get(); }
62     void setNext(std::unique_ptr<ContentData> next) { m_next = WTF::move(next); }
63
64     void setAltText(const String& alt) { m_altText = alt; }
65     const String& altText() const { return m_altText; }
66
67 protected:
68     explicit ContentData(Type type)
69         : m_type(type)
70     {
71     }
72
73 private:
74     virtual std::unique_ptr<ContentData> cloneInternal() const = 0;
75
76     std::unique_ptr<ContentData> m_next;
77     String m_altText;
78     Type m_type;
79 };
80
81 class ImageContentData final : public ContentData {
82 public:
83     explicit ImageContentData(PassRefPtr<StyleImage> image)
84         : ContentData(ImageDataType)
85         , m_image(image)
86     {
87         ASSERT(m_image);
88     }
89
90     const StyleImage& image() const { return *m_image; }
91     void setImage(PassRefPtr<StyleImage> image)
92     {
93         ASSERT(image);
94         m_image = image;
95     }
96
97     virtual RenderPtr<RenderObject> createContentRenderer(Document&, const RenderStyle&) const override;
98
99 private:
100     virtual std::unique_ptr<ContentData> cloneInternal() const override
101     {
102         std::unique_ptr<ContentData> image = std::make_unique<ImageContentData>(m_image.get());
103         image->setAltText(altText());
104
105         return image;
106     }
107
108     RefPtr<StyleImage> m_image;
109 };
110
111 inline bool operator==(const ImageContentData& a, const ImageContentData& b)
112 {
113     return a.image() == b.image();
114 }
115
116 inline bool operator!=(const ImageContentData& a, const ImageContentData& b)
117 {
118     return !(a == b);
119 }
120
121 class TextContentData final : public ContentData {
122 public:
123     explicit TextContentData(const String& text)
124         : ContentData(TextDataType)
125         , m_text(text)
126     {
127     }
128
129     const String& text() const { return m_text; }
130     void setText(const String& text) { m_text = text; }
131
132     virtual RenderPtr<RenderObject> createContentRenderer(Document&, const RenderStyle&) const override;
133
134 private:
135     virtual std::unique_ptr<ContentData> cloneInternal() const override { return std::make_unique<TextContentData>(text()); }
136
137     String m_text;
138 };
139
140 inline bool operator==(const TextContentData& a, const TextContentData& b)
141 {
142     return a.text() == b.text();
143 }
144
145 inline bool operator!=(const TextContentData& a, const TextContentData& b)
146 {
147     return !(a == b);
148 }
149
150 class CounterContentData final : public ContentData {
151 public:
152     explicit CounterContentData(std::unique_ptr<CounterContent> counter)
153         : ContentData(CounterDataType)
154         , m_counter(WTF::move(counter))
155     {
156         ASSERT(m_counter);
157     }
158
159     const CounterContent& counter() const { return *m_counter; }
160     void setCounter(std::unique_ptr<CounterContent> counter)
161     {
162         ASSERT(counter);
163         m_counter = WTF::move(counter);
164     }
165
166     virtual RenderPtr<RenderObject> createContentRenderer(Document&, const RenderStyle&) const override;
167
168 private:
169     virtual std::unique_ptr<ContentData> cloneInternal() const override
170     {
171         auto counterData = std::make_unique<CounterContent>(counter());
172         return std::make_unique<CounterContentData>(WTF::move(counterData));
173     }
174
175     std::unique_ptr<CounterContent> m_counter;
176 };
177
178 inline bool operator==(const CounterContentData& a, const CounterContentData& b)
179 {
180     return a.counter() == b.counter();
181 }
182
183 inline bool operator!=(const CounterContentData& a, const CounterContentData& b)
184 {
185     return !(a == b);
186 }
187
188 class QuoteContentData final : public ContentData {
189 public:
190     explicit QuoteContentData(QuoteType quote)
191         : ContentData(QuoteDataType)
192         , m_quote(quote)
193     {
194     }
195
196     QuoteType quote() const { return m_quote; }
197     void setQuote(QuoteType quote) { m_quote = quote; }
198
199     virtual RenderPtr<RenderObject> createContentRenderer(Document&, const RenderStyle&) const override;
200
201 private:
202     virtual std::unique_ptr<ContentData> cloneInternal() const override { return std::make_unique<QuoteContentData>(quote()); }
203
204     QuoteType m_quote;
205 };
206
207 inline bool operator==(const QuoteContentData& a, const QuoteContentData& b)
208 {
209     return a.quote() == b.quote();
210 }
211
212 inline bool operator!=(const QuoteContentData& a, const QuoteContentData& b)
213 {
214     return !(a == b);
215 }
216
217 inline bool operator==(const ContentData& a, const ContentData& b)
218 {
219     if (a.type() != b.type())
220         return false;
221
222     switch (a.type()) {
223     case ContentData::CounterDataType:
224         return downcast<CounterContentData>(a) == downcast<CounterContentData>(b);
225     case ContentData::ImageDataType:
226         return downcast<ImageContentData>(a) == downcast<ImageContentData>(b);
227     case ContentData::QuoteDataType:
228         return downcast<QuoteContentData>(a) == downcast<QuoteContentData>(b);
229     case ContentData::TextDataType:
230         return downcast<TextContentData>(a) == downcast<TextContentData>(b);
231     }
232
233     ASSERT_NOT_REACHED();
234     return false;
235 }
236
237 inline bool operator!=(const ContentData& a, const ContentData& b)
238 {
239     return !(a == b);
240 }
241
242 } // namespace WebCore
243
244 #define SPECIALIZE_TYPE_TRAITS_CONTENT_DATA(ToClassName, ContentDataName) \
245 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToClassName) \
246     static bool isType(const WebCore::ContentData& contentData) { return contentData.is##ContentDataName(); } \
247 SPECIALIZE_TYPE_TRAITS_END()
248
249 SPECIALIZE_TYPE_TRAITS_CONTENT_DATA(ImageContentData, Image)
250 SPECIALIZE_TYPE_TRAITS_CONTENT_DATA(TextContentData, Text)
251 SPECIALIZE_TYPE_TRAITS_CONTENT_DATA(CounterContentData, Counter)
252 SPECIALIZE_TYPE_TRAITS_CONTENT_DATA(QuoteContentData, Quote)
253
254 #endif // ContentData_h