Add support for CSS Custom Properties (in preparation for implementing CSS Variables).
[WebKit-https.git] / Source / WebCore / css / CSSComputedStyleDeclaration.h
1 /*
2  * Copyright (C) 2004 Zack Rusin <zack@kde.org>
3  * Copyright (C) 2004, 2005, 2006, 2008, 2012, 2013 Apple Inc. All rights reserved.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18  * 02110-1301  USA
19  */
20
21 #ifndef CSSComputedStyleDeclaration_h
22 #define CSSComputedStyleDeclaration_h
23
24 #include "CSSStyleDeclaration.h"
25 #include "RenderStyleConstants.h"
26 #include <wtf/RefPtr.h>
27 #include <wtf/text/WTFString.h>
28
29 namespace WebCore {
30
31 class CSSPrimitiveValue;
32 class CSSValueList;
33 class Color;
34 class FilterOperations;
35 class MutableStyleProperties;
36 class Node;
37 class RenderObject;
38 class RenderStyle;
39 class SVGPaint;
40 class ShadowData;
41 class StyleProperties;
42 class StylePropertyShorthand;
43
44 enum EUpdateLayout { DoNotUpdateLayout = false, UpdateLayout = true };
45
46 enum AdjustPixelValuesForComputedStyle { AdjustPixelValues, DoNotAdjustPixelValues };
47
48 class ComputedStyleExtractor {
49 public:
50     ComputedStyleExtractor(PassRefPtr<Node>, bool allowVisitedStyle = false, PseudoId = NOPSEUDO);
51
52     RefPtr<CSSValue> propertyValue(CSSPropertyID, EUpdateLayout = UpdateLayout) const;
53     RefPtr<CSSValue> customPropertyValue(const String& propertyName) const;
54
55     // Helper methods for HTML editing.
56     Ref<MutableStyleProperties> copyPropertiesInSet(const CSSPropertyID* set, unsigned length) const;
57     Ref<MutableStyleProperties> copyProperties() const;
58     RefPtr<CSSPrimitiveValue> getFontSizeCSSValuePreferringKeyword() const;
59     bool useFixedFontDefaultSize() const;
60     bool propertyMatches(CSSPropertyID, const CSSValue*) const;
61
62     static Ref<CSSValue> valueForFilter(const RenderStyle&, const FilterOperations&, AdjustPixelValuesForComputedStyle = AdjustPixelValues);
63
64 private:
65     // The styled node is either the node passed into computedPropertyValue, or the
66     // PseudoElement for :before and :after if they exist.
67     // FIXME: This should be styledElement since in JS getComputedStyle only works
68     // on Elements, but right now editing creates these for text nodes. We should fix that.
69     Node* styledNode() const;
70
71     RefPtr<CSSValue> svgPropertyValue(CSSPropertyID, EUpdateLayout) const;
72     RefPtr<SVGPaint> adjustSVGPaintForCurrentColor(PassRefPtr<SVGPaint>, RenderStyle*) const;
73
74     static Ref<CSSValue> valueForShadow(const ShadowData*, CSSPropertyID, const RenderStyle&, AdjustPixelValuesForComputedStyle = AdjustPixelValues);
75     RefPtr<CSSPrimitiveValue> currentColorOrValidColor(RenderStyle*, const Color&) const;
76
77     RefPtr<CSSValueList> getCSSPropertyValuesForShorthandProperties(const StylePropertyShorthand&) const;
78     RefPtr<CSSValueList> getCSSPropertyValuesForSidesShorthand(const StylePropertyShorthand&) const;
79     RefPtr<CSSValueList> getBackgroundShorthandValue() const;
80     RefPtr<CSSValueList> getCSSPropertyValuesForGridShorthand(const StylePropertyShorthand&) const;
81
82     RefPtr<Node> m_node;
83     PseudoId m_pseudoElementSpecifier;
84     bool m_allowVisitedStyle;
85 };
86
87 class CSSComputedStyleDeclaration final : public CSSStyleDeclaration {
88 public:
89     static Ref<CSSComputedStyleDeclaration> create(PassRefPtr<Node> node, bool allowVisitedStyle = false, const String& pseudoElementName = String())
90     {
91         return adoptRef(*new CSSComputedStyleDeclaration(node, allowVisitedStyle, pseudoElementName));
92     }
93     virtual ~CSSComputedStyleDeclaration();
94
95     WEBCORE_EXPORT virtual void ref() override;
96     WEBCORE_EXPORT virtual void deref() override;
97
98     String getPropertyValue(CSSPropertyID) const;
99
100 private:
101     WEBCORE_EXPORT CSSComputedStyleDeclaration(PassRefPtr<Node>, bool allowVisitedStyle, const String&);
102
103     // CSSOM functions. Don't make these public.
104     virtual CSSRule* parentRule() const override;
105     virtual unsigned length() const override;
106     virtual String item(unsigned index) const override;
107     virtual RefPtr<CSSValue> getPropertyCSSValue(const String& propertyName) override;
108     virtual String getPropertyValue(const String& propertyName) override;
109     virtual String getPropertyPriority(const String& propertyName) override;
110     virtual String getPropertyShorthand(const String& propertyName) override;
111     virtual bool isPropertyImplicit(const String& propertyName) override;
112     virtual void setProperty(const String& propertyName, const String& value, const String& priority, ExceptionCode&) override;
113     virtual String removeProperty(const String& propertyName, ExceptionCode&) override;
114     virtual String cssText() const override;
115     virtual void setCssText(const String&, ExceptionCode&) override;
116     virtual RefPtr<CSSValue> getPropertyCSSValueInternal(CSSPropertyID) override;
117     virtual String getPropertyValueInternal(CSSPropertyID) override;
118     virtual bool setPropertyInternal(CSSPropertyID, const String& value, bool important, ExceptionCode&) override;
119     virtual Ref<MutableStyleProperties> copyProperties() const override;
120
121     RefPtr<CSSValue> getPropertyCSSValue(CSSPropertyID, EUpdateLayout = UpdateLayout) const;
122
123     RefPtr<Node> m_node;
124     PseudoId m_pseudoElementSpecifier;
125     bool m_allowVisitedStyle;
126     unsigned m_refCount;
127 };
128
129 } // namespace WebCore
130
131 #endif // CSSComputedStyleDeclaration_h