05d00dcb2e562cac3a970c1b621d1ba09c996ad0
[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/OwnPtr.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 = std::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 #define CONTENT_DATA_TYPE_CASTS(ToClassName, FromClassName, ContentDataName) \
82     TYPE_CASTS_BASE(ToClassName, FromClassName, resource, resource->is##ContentDataName(), resource.is##ContentDataName())
83
84 class ImageContentData final : public ContentData {
85 public:
86     explicit ImageContentData(PassRefPtr<StyleImage> image)
87         : ContentData(ImageDataType)
88         , m_image(image)
89     {
90         ASSERT(m_image);
91     }
92
93     const StyleImage& image() const { return *m_image; }
94     void setImage(PassRefPtr<StyleImage> image)
95     {
96         ASSERT(image);
97         m_image = image;
98     }
99
100     virtual RenderPtr<RenderObject> createContentRenderer(Document&, const RenderStyle&) const override;
101
102 private:
103     virtual std::unique_ptr<ContentData> cloneInternal() const override
104     {
105         return std::make_unique<ImageContentData>(m_image.get());
106     }
107
108     RefPtr<StyleImage> m_image;
109 };
110
111 CONTENT_DATA_TYPE_CASTS(ImageContentData, ContentData, Image)
112
113 inline bool operator==(const ImageContentData& a, const ImageContentData& b)
114 {
115     return a.image() == b.image();
116 }
117
118 inline bool operator!=(const ImageContentData& a, const ImageContentData& b)
119 {
120     return !(a == b);
121 }
122
123 class TextContentData final : public ContentData {
124 public:
125     explicit TextContentData(const String& text)
126         : ContentData(TextDataType)
127         , m_text(text)
128     {
129     }
130
131     const String& text() const { return m_text; }
132     void setText(const String& text) { m_text = text; }
133
134     virtual RenderPtr<RenderObject> createContentRenderer(Document&, const RenderStyle&) const override;
135
136 private:
137     virtual std::unique_ptr<ContentData> cloneInternal() const override { return std::make_unique<TextContentData>(text()); }
138
139     String m_text;
140 };
141
142 CONTENT_DATA_TYPE_CASTS(TextContentData, ContentData, Text)
143
144 inline bool operator==(const TextContentData& a, const TextContentData& b)
145 {
146     return a.text() == b.text();
147 }
148
149 inline bool operator!=(const TextContentData& a, const TextContentData& b)
150 {
151     return !(a == b);
152 }
153
154 class CounterContentData final : public ContentData {
155 public:
156     explicit CounterContentData(std::unique_ptr<CounterContent> counter)
157         : ContentData(CounterDataType)
158         , m_counter(std::move(counter))
159     {
160         ASSERT(m_counter);
161     }
162
163     const CounterContent& counter() const { return *m_counter; }
164     void setCounter(std::unique_ptr<CounterContent> counter)
165     {
166         ASSERT(counter);
167         m_counter = std::move(counter);
168     }
169
170     virtual RenderPtr<RenderObject> createContentRenderer(Document&, const RenderStyle&) const override;
171
172 private:
173     virtual std::unique_ptr<ContentData> cloneInternal() const override
174     {
175         auto counterData = std::make_unique<CounterContent>(counter());
176         return std::make_unique<CounterContentData>(std::move(counterData));
177     }
178
179     std::unique_ptr<CounterContent> m_counter;
180 };
181
182 CONTENT_DATA_TYPE_CASTS(CounterContentData, ContentData, Counter)
183
184 inline bool operator==(const CounterContentData& a, const CounterContentData& b)
185 {
186     return a.counter() == b.counter();
187 }
188
189 inline bool operator!=(const CounterContentData& a, const CounterContentData& b)
190 {
191     return !(a == b);
192 }
193
194 class QuoteContentData final : public ContentData {
195 public:
196     explicit QuoteContentData(QuoteType quote)
197         : ContentData(QuoteDataType)
198         , m_quote(quote)
199     {
200     }
201
202     QuoteType quote() const { return m_quote; }
203     void setQuote(QuoteType quote) { m_quote = quote; }
204
205     virtual RenderPtr<RenderObject> createContentRenderer(Document&, const RenderStyle&) const override;
206
207 private:
208     virtual std::unique_ptr<ContentData> cloneInternal() const override { return std::make_unique<QuoteContentData>(quote()); }
209
210     QuoteType m_quote;
211 };
212
213 CONTENT_DATA_TYPE_CASTS(QuoteContentData, ContentData, Quote)
214
215 inline bool operator==(const QuoteContentData& a, const QuoteContentData& b)
216 {
217     return a.quote() == b.quote();
218 }
219
220 inline bool operator!=(const QuoteContentData& a, const QuoteContentData& b)
221 {
222     return !(a == b);
223 }
224
225 inline bool operator==(const ContentData& a, const ContentData& b)
226 {
227     if (a.type() != b.type())
228         return false;
229
230     switch (a.type()) {
231     case ContentData::CounterDataType:
232         return toCounterContentData(a) == toCounterContentData(b);
233     case ContentData::ImageDataType:
234         return toImageContentData(a) == toImageContentData(b);
235     case ContentData::QuoteDataType:
236         return toQuoteContentData(a) == toQuoteContentData(b);
237     case ContentData::TextDataType:
238         return toTextContentData(a) == toTextContentData(b);
239     }
240
241     ASSERT_NOT_REACHED();
242     return false;
243 }
244
245 inline bool operator!=(const ContentData& a, const ContentData& b)
246 {
247     return !(a == b);
248 }
249
250 } // namespace WebCore
251
252 #endif // ContentData_h