e07561533d14af251e94175727f1125d9ab02815
[WebKit-https.git] / Source / WebCore / css / CSSStyleApplyProperty.cpp
1 /*
2  * Copyright (C) 2011 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1.  Redistributions of source code must retain the above copyright
8  *     notice, this list of conditions and the following disclaimer.
9  * 2.  Redistributions in binary form must reproduce the above copyright
10  *     notice, this list of conditions and the following disclaimer in the
11  *     documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24
25 #include "config.h"
26 #include "CSSStyleApplyProperty.h"
27
28 #include "CSSPrimitiveValueMappings.h"
29 #include "CSSStyleSelector.h"
30 #include "RenderStyle.h"
31 #include <wtf/StdLibExtras.h>
32 #include <wtf/UnusedParam.h>
33
34 using namespace std;
35
36 namespace WebCore {
37
38 class ApplyPropertyNull : public ApplyPropertyBase {
39 public:
40     virtual void inherit(CSSStyleSelector*) const {}
41     virtual void initial(CSSStyleSelector*) const {}
42     virtual void value(CSSStyleSelector*, CSSValue*) const {}
43 };
44
45 template <typename T>
46 class ApplyPropertyDefault : public ApplyPropertyBase {
47 public:
48     ApplyPropertyDefault(T (RenderStyle::*getter)() const, void (RenderStyle::*setter)(T), T (*initial)())
49         : m_getter(getter)
50         , m_setter(setter)
51         , m_initial(initial)
52     {
53     }
54
55     virtual void inherit(CSSStyleSelector* selector) const
56     {
57         (selector->style()->*m_setter)((selector->parentStyle()->*m_getter)());
58     }
59
60     virtual void initial(CSSStyleSelector* selector) const
61     {
62         (selector->style()->*m_setter)((*m_initial)());
63     }
64
65     virtual void value(CSSStyleSelector* selector, CSSValue* value) const
66     {
67         if (value->isPrimitiveValue())
68             (selector->style()->*m_setter)(*(static_cast<CSSPrimitiveValue*>(value)));
69     }
70
71 protected:
72     T (RenderStyle::*m_getter)() const;
73     void (RenderStyle::*m_setter)(T);
74     T (*m_initial)();
75 };
76
77 // CSSPropertyColor
78 class ApplyPropertyColorBase : public ApplyPropertyBase {
79 public:
80     ApplyPropertyColorBase(const Color& (RenderStyle::*getter)() const, const Color& (RenderStyle::*defaultValue)() const, void (RenderStyle::*setter)(const Color&))
81         : m_getter(getter)
82         , m_defaultValue(defaultValue)
83         , m_setter(setter)
84     {
85     }
86     virtual void inherit(CSSStyleSelector* selector) const
87     {
88         const Color& color = (selector->parentStyle()->*m_getter)();
89         if (m_defaultValue && !color.isValid())
90             (selector->style()->*m_setter)((selector->parentStyle()->*m_defaultValue)());
91         else
92             (selector->style()->*m_setter)(color);
93     }
94     virtual void initial(CSSStyleSelector* selector) const
95     {
96         Color color;
97         (selector->style()->*m_setter)(color);
98     }
99     virtual void value(CSSStyleSelector* selector, CSSValue* value) const
100     {
101         if (value->isPrimitiveValue())
102             (selector->style()->*m_setter)(selector->getColorFromPrimitiveValue(static_cast<CSSPrimitiveValue*>(value)));
103     }
104 protected:
105     const Color& (RenderStyle::*m_getter)() const;
106     const Color& (RenderStyle::*m_defaultValue)() const;
107     void (RenderStyle::*m_setter)(const Color&);
108 };
109
110 class ApplyPropertyColor : public ApplyPropertyColorBase {
111 public:
112     ApplyPropertyColor(const Color& (RenderStyle::*getter)() const, void (RenderStyle::*setter)(const Color&), Color (*initialValue)())
113         : ApplyPropertyColorBase(getter, 0, setter)
114         , m_initialValue(initialValue)
115     {
116     }
117
118     virtual void initial(CSSStyleSelector* selector) const
119     {
120         (selector->style()->*m_setter)(m_initialValue());
121     }
122
123     virtual void value(CSSStyleSelector* selector, CSSValue* value) const
124     {
125         if (!value->isPrimitiveValue())
126             return;
127
128         if ((static_cast<CSSPrimitiveValue*>(value))->getIdent() == CSSValueCurrentcolor)
129             inherit(selector);
130         else
131             ApplyPropertyColorBase::value(selector, value);
132     }
133 protected:
134     Color (*m_initialValue)();
135 };
136
137 const CSSStyleApplyProperty& CSSStyleApplyProperty::sharedCSSStyleApplyProperty()
138 {
139     DEFINE_STATIC_LOCAL(CSSStyleApplyProperty, cssStyleApplyPropertyInstance, ());
140     return cssStyleApplyPropertyInstance;
141 }
142
143
144 CSSStyleApplyProperty::CSSStyleApplyProperty()
145 {
146     for (int i = 0; i < numCSSProperties; ++i)
147        m_propertyMap[i] = 0;
148
149     setPropertyValue(CSSPropertyColor, new ApplyPropertyColor(&RenderStyle::color, &RenderStyle::setColor, RenderStyle::initialColor));
150     setPropertyValue(CSSPropertyBackgroundColor, new ApplyPropertyColorBase(&RenderStyle::backgroundColor, 0, &RenderStyle::setBackgroundColor));
151     setPropertyValue(CSSPropertyBorderBottomColor, new ApplyPropertyColorBase(&RenderStyle::borderBottomColor, &RenderStyle::color, &RenderStyle::setBorderBottomColor));
152     setPropertyValue(CSSPropertyBorderLeftColor, new ApplyPropertyColorBase(&RenderStyle::borderLeftColor, &RenderStyle::color, &RenderStyle::setBorderLeftColor));
153     setPropertyValue(CSSPropertyBorderRightColor, new ApplyPropertyColorBase(&RenderStyle::borderRightColor, &RenderStyle::color, &RenderStyle::setBorderRightColor));
154     setPropertyValue(CSSPropertyBorderTopColor, new ApplyPropertyColorBase(&RenderStyle::borderTopColor, &RenderStyle::color, &RenderStyle::setBorderTopColor));
155     setPropertyValue(CSSPropertyOutlineColor, new ApplyPropertyColorBase(&RenderStyle::outlineColor, &RenderStyle::color, &RenderStyle::setOutlineColor));
156     setPropertyValue(CSSPropertyWebkitColumnRuleColor, new ApplyPropertyColorBase(&RenderStyle::columnRuleColor, &RenderStyle::color, &RenderStyle::setColumnRuleColor));
157     setPropertyValue(CSSPropertyWebkitTextEmphasisColor, new ApplyPropertyColorBase(&RenderStyle::textEmphasisColor, &RenderStyle::color, &RenderStyle::setTextEmphasisColor));
158     setPropertyValue(CSSPropertyWebkitTextFillColor, new ApplyPropertyColorBase(&RenderStyle::textFillColor, &RenderStyle::color, &RenderStyle::setTextFillColor));
159     setPropertyValue(CSSPropertyWebkitTextStrokeColor, new ApplyPropertyColorBase(&RenderStyle::textStrokeColor, &RenderStyle::color, &RenderStyle::setTextStrokeColor));
160 }
161
162
163 }