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#ifndef CSSStyleApplyProperty_h
26#define CSSStyleApplyProperty_h
27
28#include "CSSPropertyNames.h"
29#include <wtf/PassRefPtr.h>
30#include <wtf/RefCounted.h>
31
32namespace WebCore {
33
34class CSSStyleSelector;
35class CSSValue;
36class ApplyPropertyBase {
37    WTF_MAKE_NONCOPYABLE(ApplyPropertyBase);
38    WTF_MAKE_FAST_ALLOCATED;
39public:
40    ApplyPropertyBase() { }
41    virtual ~ApplyPropertyBase() { }
42    virtual void applyInheritValue(CSSStyleSelector*) const = 0;
43    virtual void applyInitialValue(CSSStyleSelector*) const = 0;
44    virtual void applyValue(CSSStyleSelector*, CSSValue*) const = 0;
45};
46
47class CSSStyleApplyProperty {
48    WTF_MAKE_NONCOPYABLE(CSSStyleApplyProperty);
49public:
50    static const CSSStyleApplyProperty& sharedCSSStyleApplyProperty();
51
52    void applyInheritValue(CSSPropertyID property, CSSStyleSelector* selector) const
53    {
54        ASSERT(implements(property));
55        propertyValue(property)->applyInheritValue(selector);
56    }
57
58    void applyInitialValue(CSSPropertyID property, CSSStyleSelector* selector) const
59    {
60        ASSERT(implements(property));
61        propertyValue(property)->applyInitialValue(selector);
62    }
63
64    void applyValue(CSSPropertyID property, CSSStyleSelector* selector, CSSValue* value) const
65    {
66        ASSERT(implements(property));
67        propertyValue(property)->applyValue(selector, value);
68    }
69
70    bool implements(CSSPropertyID property) const
71    {
72        return propertyValue(property);
73    }
74
75private:
76    CSSStyleApplyProperty();
77    static int index(CSSPropertyID property)
78    {
79        return property - firstCSSProperty;
80    }
81
82    static bool valid(CSSPropertyID property)
83    {
84        int i = index(property);
85        return i >= 0 && i < numCSSProperties;
86    }
87
88    void setPropertyValue(CSSPropertyID property, ApplyPropertyBase* value)
89    {
90        ASSERT(valid(property));
91        m_propertyMap[index(property)] = value;
92    }
93
94    void setPropertyValue(CSSPropertyID newProperty, CSSPropertyID equivalentProperty)
95    {
96        ASSERT(valid(newProperty));
97        ASSERT(valid(equivalentProperty));
98        m_propertyMap[index(newProperty)] = m_propertyMap[index(equivalentProperty)];
99    }
100
101    ApplyPropertyBase* propertyValue(CSSPropertyID property) const
102    {
103        ASSERT(valid(property));
104        return m_propertyMap[index(property)];
105    }
106
107    ApplyPropertyBase* m_propertyMap[numCSSProperties];
108};
109
110}
111
112#endif // CSSStyleApplyProperty_h
113