Use #pragma once in WebCore
[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 #pragma once
26
27 #include "CounterContent.h"
28 #include "StyleImage.h"
29 #include "RenderPtr.h"
30 #include <wtf/TypeCasts.h>
31
32 namespace WebCore {
33
34 class Document;
35 class RenderObject;
36 class RenderStyle;
37
38 class ContentData {
39     WTF_MAKE_FAST_ALLOCATED;
40 public:
41     enum Type {
42         CounterDataType,
43         ImageDataType,
44         QuoteDataType,
45         TextDataType
46     };
47     virtual ~ContentData() { }
48
49     Type type() const { return m_type; }
50
51     bool isCounter() const { return type() == CounterDataType; }
52     bool isImage() const { return type() == ImageDataType; }
53     bool isQuote() const { return type() == QuoteDataType; }
54     bool isText() const { return type() == TextDataType; }
55
56     virtual RenderPtr<RenderObject> createContentRenderer(Document&, const RenderStyle&) const = 0;
57
58     std::unique_ptr<ContentData> clone() const;
59
60     ContentData* next() const { return m_next.get(); }
61     void setNext(std::unique_ptr<ContentData> next) { m_next = WTFMove(next); }
62
63     void setAltText(const String& alt) { m_altText = alt; }
64     const String& altText() const { return m_altText; }
65
66 protected:
67     explicit ContentData(Type type)
68         : m_type(type)
69     {
70     }
71
72 private:
73     virtual std::unique_ptr<ContentData> cloneInternal() const = 0;
74
75     std::unique_ptr<ContentData> m_next;
76     String m_altText;
77     Type m_type;
78 };
79
80 class ImageContentData final : public ContentData {
81 public:
82     explicit ImageContentData(PassRefPtr<StyleImage> image)
83         : ContentData(ImageDataType)
84         , m_image(image)
85     {
86         ASSERT(m_image);
87     }
88
89     const StyleImage& image() const { return *m_image; }
90     void setImage(PassRefPtr<StyleImage> image)
91     {
92         ASSERT(image);
93         m_image = image;
94     }
95
96     RenderPtr<RenderObject> createContentRenderer(Document&, const RenderStyle&) const override;
97
98 private:
99     std::unique_ptr<ContentData> cloneInternal() const override
100     {
101         std::unique_ptr<ContentData> image = std::make_unique<ImageContentData>(m_image.get());
102         image->setAltText(altText());
103
104         return image;
105     }
106
107     RefPtr<StyleImage> m_image;
108 };
109
110 inline bool operator==(const ImageContentData& a, const ImageContentData& b)
111 {
112     return a.image() == b.image();
113 }
114
115 inline bool operator!=(const ImageContentData& a, const ImageContentData& b)
116 {
117     return !(a == b);
118 }
119
120 class TextContentData final : public ContentData {
121 public:
122     explicit TextContentData(const String& text)
123         : ContentData(TextDataType)
124         , m_text(text)
125     {
126     }
127
128     const String& text() const { return m_text; }
129     void setText(const String& text) { m_text = text; }
130
131     RenderPtr<RenderObject> createContentRenderer(Document&, const RenderStyle&) const override;
132
133 private:
134     std::unique_ptr<ContentData> cloneInternal() const override { return std::make_unique<TextContentData>(text()); }
135
136     String m_text;
137 };
138
139 inline bool operator==(const TextContentData& a, const TextContentData& b)
140 {
141     return a.text() == b.text();
142 }
143
144 inline bool operator!=(const TextContentData& a, const TextContentData& b)
145 {
146     return !(a == b);
147 }
148
149 class CounterContentData final : public ContentData {
150 public:
151     explicit CounterContentData(std::unique_ptr<CounterContent> counter)
152         : ContentData(CounterDataType)
153         , m_counter(WTFMove(counter))
154     {
155         ASSERT(m_counter);
156     }
157
158     const CounterContent& counter() const { return *m_counter; }
159     void setCounter(std::unique_ptr<CounterContent> counter)
160     {
161         ASSERT(counter);
162         m_counter = WTFMove(counter);
163     }
164
165     RenderPtr<RenderObject> createContentRenderer(Document&, const RenderStyle&) const override;
166
167 private:
168     std::unique_ptr<ContentData> cloneInternal() const override
169     {
170         auto counterData = std::make_unique<CounterContent>(counter());
171         return std::make_unique<CounterContentData>(WTFMove(counterData));
172     }
173
174     std::unique_ptr<CounterContent> m_counter;
175 };
176
177 inline bool operator==(const CounterContentData& a, const CounterContentData& b)
178 {
179     return a.counter() == b.counter();
180 }
181
182 inline bool operator!=(const CounterContentData& a, const CounterContentData& b)
183 {
184     return !(a == b);
185 }
186
187 class QuoteContentData final : public ContentData {
188 public:
189     explicit QuoteContentData(QuoteType quote)
190         : ContentData(QuoteDataType)
191         , m_quote(quote)
192     {
193     }
194
195     QuoteType quote() const { return m_quote; }
196     void setQuote(QuoteType quote) { m_quote = quote; }
197
198     RenderPtr<RenderObject> createContentRenderer(Document&, const RenderStyle&) const override;
199
200 private:
201     std::unique_ptr<ContentData> cloneInternal() const override { return std::make_unique<QuoteContentData>(quote()); }
202
203     QuoteType m_quote;
204 };
205
206 inline bool operator==(const QuoteContentData& a, const QuoteContentData& b)
207 {
208     return a.quote() == b.quote();
209 }
210
211 inline bool operator!=(const QuoteContentData& a, const QuoteContentData& b)
212 {
213     return !(a == b);
214 }
215
216 inline bool operator==(const ContentData& a, const ContentData& b)
217 {
218     if (a.type() != b.type())
219         return false;
220
221     switch (a.type()) {
222     case ContentData::CounterDataType:
223         return downcast<CounterContentData>(a) == downcast<CounterContentData>(b);
224     case ContentData::ImageDataType:
225         return downcast<ImageContentData>(a) == downcast<ImageContentData>(b);
226     case ContentData::QuoteDataType:
227         return downcast<QuoteContentData>(a) == downcast<QuoteContentData>(b);
228     case ContentData::TextDataType:
229         return downcast<TextContentData>(a) == downcast<TextContentData>(b);
230     }
231
232     ASSERT_NOT_REACHED();
233     return false;
234 }
235
236 inline bool operator!=(const ContentData& a, const ContentData& b)
237 {
238     return !(a == b);
239 }
240
241 } // namespace WebCore
242
243 #define SPECIALIZE_TYPE_TRAITS_CONTENT_DATA(ToClassName, ContentDataName) \
244 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToClassName) \
245     static bool isType(const WebCore::ContentData& contentData) { return contentData.is##ContentDataName(); } \
246 SPECIALIZE_TYPE_TRAITS_END()
247
248 SPECIALIZE_TYPE_TRAITS_CONTENT_DATA(ImageContentData, Image)
249 SPECIALIZE_TYPE_TRAITS_CONTENT_DATA(TextContentData, Text)
250 SPECIALIZE_TYPE_TRAITS_CONTENT_DATA(CounterContentData, Counter)
251 SPECIALIZE_TYPE_TRAITS_CONTENT_DATA(QuoteContentData, Quote)