Keep the already-parsed list of terms in custom property values so that we don't...
[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     String customPropertyText(const String& propertyName) const;
54     RefPtr<CSSValue> customPropertyValue(const String& propertyName) const;
55
56     // Helper methods for HTML editing.
57     Ref<MutableStyleProperties> copyPropertiesInSet(const CSSPropertyID* set, unsigned length) const;
58     Ref<MutableStyleProperties> copyProperties() const;
59     RefPtr<CSSPrimitiveValue> getFontSizeCSSValuePreferringKeyword() const;
60     bool useFixedFontDefaultSize() const;
61     bool propertyMatches(CSSPropertyID, const CSSValue*) const;
62
63     static Ref<CSSValue> valueForFilter(const RenderStyle&, const FilterOperations&, AdjustPixelValuesForComputedStyle = AdjustPixelValues);
64
65 private:
66     // The styled node is either the node passed into computedPropertyValue, or the
67     // PseudoElement for :before and :after if they exist.
68     // FIXME: This should be styledElement since in JS getComputedStyle only works
69     // on Elements, but right now editing creates these for text nodes. We should fix that.
70     Node* styledNode() const;
71
72     RefPtr<CSSValue> svgPropertyValue(CSSPropertyID, EUpdateLayout) const;
73     RefPtr<SVGPaint> adjustSVGPaintForCurrentColor(PassRefPtr<SVGPaint>, RenderStyle*) const;
74
75     static Ref<CSSValue> valueForShadow(const ShadowData*, CSSPropertyID, const RenderStyle&, AdjustPixelValuesForComputedStyle = AdjustPixelValues);
76     RefPtr<CSSPrimitiveValue> currentColorOrValidColor(RenderStyle*, const Color&) const;
77
78     RefPtr<CSSValueList> getCSSPropertyValuesForShorthandProperties(const StylePropertyShorthand&) const;
79     RefPtr<CSSValueList> getCSSPropertyValuesForSidesShorthand(const StylePropertyShorthand&) const;
80     RefPtr<CSSValueList> getBackgroundShorthandValue() const;
81     RefPtr<CSSValueList> getCSSPropertyValuesForGridShorthand(const StylePropertyShorthand&) const;
82
83     RefPtr<Node> m_node;
84     PseudoId m_pseudoElementSpecifier;
85     bool m_allowVisitedStyle;
86 };
87
88 class CSSComputedStyleDeclaration final : public CSSStyleDeclaration {
89 public:
90     static Ref<CSSComputedStyleDeclaration> create(PassRefPtr<Node> node, bool allowVisitedStyle = false, const String& pseudoElementName = String())
91     {
92         return adoptRef(*new CSSComputedStyleDeclaration(node, allowVisitedStyle, pseudoElementName));
93     }
94     virtual ~CSSComputedStyleDeclaration();
95
96     WEBCORE_EXPORT virtual void ref() override;
97     WEBCORE_EXPORT virtual void deref() override;
98
99     String getPropertyValue(CSSPropertyID) const;
100
101 private:
102     WEBCORE_EXPORT CSSComputedStyleDeclaration(PassRefPtr<Node>, bool allowVisitedStyle, const String&);
103
104     // CSSOM functions. Don't make these public.
105     virtual CSSRule* parentRule() const override;
106     virtual unsigned length() const override;
107     virtual String item(unsigned index) const override;
108     virtual RefPtr<CSSValue> getPropertyCSSValue(const String& propertyName) override;
109     virtual String getPropertyValue(const String& propertyName) override;
110     virtual String getPropertyPriority(const String& propertyName) override;
111     virtual String getPropertyShorthand(const String& propertyName) override;
112     virtual bool isPropertyImplicit(const String& propertyName) override;
113     virtual void setProperty(const String& propertyName, const String& value, const String& priority, ExceptionCode&) override;
114     virtual String removeProperty(const String& propertyName, ExceptionCode&) override;
115     virtual String cssText() const override;
116     virtual void setCssText(const String&, ExceptionCode&) override;
117     virtual RefPtr<CSSValue> getPropertyCSSValueInternal(CSSPropertyID) override;
118     virtual String getPropertyValueInternal(CSSPropertyID) override;
119     virtual bool setPropertyInternal(CSSPropertyID, const String& value, bool important, ExceptionCode&) override;
120     virtual Ref<MutableStyleProperties> copyProperties() const override;
121
122     RefPtr<CSSValue> getPropertyCSSValue(CSSPropertyID, EUpdateLayout = UpdateLayout) const;
123
124     RefPtr<Node> m_node;
125     PseudoId m_pseudoElementSpecifier;
126     bool m_allowVisitedStyle;
127     unsigned m_refCount;
128 };
129
130 } // namespace WebCore
131
132 #endif // CSSComputedStyleDeclaration_h