Stop storing raw pointers to Documents
[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 #pragma once
22
23 #include "CSSStyleDeclaration.h"
24 #include "RenderStyleConstants.h"
25 #include "SVGRenderStyleDefs.h"
26 #include "TextFlags.h"
27 #include <wtf/RefPtr.h>
28 #include <wtf/text/WTFString.h>
29
30 namespace WebCore {
31
32 class CSSFontStyleValue;
33 class CSSPrimitiveValue;
34 class CSSValueList;
35 class Color;
36 class Element;
37 class FilterOperations;
38 class FontSelectionValue;
39 class MutableStyleProperties;
40 class Node;
41 class RenderElement;
42 class RenderStyle;
43 class SVGPaint;
44 class ShadowData;
45 class StyleProperties;
46 class StylePropertyShorthand;
47
48 enum EUpdateLayout { DoNotUpdateLayout = false, UpdateLayout = true };
49
50 enum AdjustPixelValuesForComputedStyle { AdjustPixelValues, DoNotAdjustPixelValues };
51
52 class ComputedStyleExtractor {
53     WTF_MAKE_FAST_ALLOCATED;
54 public:
55     ComputedStyleExtractor(Node*, bool allowVisitedStyle = false, PseudoId = PseudoId::None);
56     ComputedStyleExtractor(Element*, bool allowVisitedStyle = false, PseudoId = PseudoId::None);
57
58     RefPtr<CSSValue> propertyValue(CSSPropertyID, EUpdateLayout = UpdateLayout);
59     RefPtr<CSSValue> valueForPropertyinStyle(const RenderStyle&, CSSPropertyID, RenderElement* = nullptr);
60     String customPropertyText(const String& propertyName);
61     RefPtr<CSSValue> customPropertyValue(const String& propertyName);
62
63     // Helper methods for HTML editing.
64     Ref<MutableStyleProperties> copyPropertiesInSet(const CSSPropertyID* set, unsigned length);
65     Ref<MutableStyleProperties> copyProperties();
66     RefPtr<CSSPrimitiveValue> getFontSizeCSSValuePreferringKeyword();
67     bool useFixedFontDefaultSize();
68     bool propertyMatches(CSSPropertyID, const CSSValue*);
69
70     static Ref<CSSValue> valueForFilter(const RenderStyle&, const FilterOperations&, AdjustPixelValuesForComputedStyle = AdjustPixelValues);
71
72     static Ref<CSSPrimitiveValue> fontNonKeywordWeightFromStyleValue(FontSelectionValue);
73     static Ref<CSSPrimitiveValue> fontWeightFromStyleValue(FontSelectionValue);
74     static Ref<CSSPrimitiveValue> fontNonKeywordStretchFromStyleValue(FontSelectionValue);
75     static Ref<CSSPrimitiveValue> fontStretchFromStyleValue(FontSelectionValue);
76     static Ref<CSSFontStyleValue> fontNonKeywordStyleFromStyleValue(FontSelectionValue);
77     static Ref<CSSFontStyleValue> fontStyleFromStyleValue(Optional<FontSelectionValue>, FontStyleAxis);
78
79 private:
80     // The styled element is either the element passed into
81     // computedPropertyValue, or the PseudoElement for :before and :after if
82     // they exist.
83     Element* styledElement() const;
84
85     // The renderer we should use for resolving layout-dependent properties.
86     // Note that it differs from styledElement()->renderer() in the case we have
87     // no pseudo-element.
88     RenderElement* styledRenderer() const;
89
90     RefPtr<CSSValue> svgPropertyValue(CSSPropertyID, EUpdateLayout);
91     Ref<CSSValue> adjustSVGPaintForCurrentColor(SVGPaintType, const String& url, const Color&, const Color& currentColor) const;
92     static Ref<CSSValue> valueForShadow(const ShadowData*, CSSPropertyID, const RenderStyle&, AdjustPixelValuesForComputedStyle = AdjustPixelValues);
93     Ref<CSSPrimitiveValue> currentColorOrValidColor(const RenderStyle*, const Color&) const;
94
95     Ref<CSSValueList> getCSSPropertyValuesForShorthandProperties(const StylePropertyShorthand&);
96     RefPtr<CSSValueList> getCSSPropertyValuesFor2SidesShorthand(const StylePropertyShorthand&);
97     RefPtr<CSSValueList> getCSSPropertyValuesFor4SidesShorthand(const StylePropertyShorthand&);
98     Ref<CSSValueList> getBackgroundShorthandValue();
99     Ref<CSSValueList> getCSSPropertyValuesForGridShorthand(const StylePropertyShorthand&);
100
101     RefPtr<Element> m_element;
102     PseudoId m_pseudoElementSpecifier;
103     bool m_allowVisitedStyle;
104 };
105
106 class CSSComputedStyleDeclaration final : public CSSStyleDeclaration {
107 public:
108     static Ref<CSSComputedStyleDeclaration> create(Element& element, bool allowVisitedStyle = false, const String& pseudoElementName = String())
109     {
110         return adoptRef(*new CSSComputedStyleDeclaration(element, allowVisitedStyle, pseudoElementName));
111     }
112     virtual ~CSSComputedStyleDeclaration();
113
114     WEBCORE_EXPORT void ref() final;
115     WEBCORE_EXPORT void deref() final;
116
117     String getPropertyValue(CSSPropertyID) const;
118
119 private:
120     WEBCORE_EXPORT CSSComputedStyleDeclaration(Element&, bool allowVisitedStyle, const String&);
121
122     // CSSOM functions. Don't make these public.
123     CSSRule* parentRule() const final;
124     unsigned length() const final;
125     String item(unsigned index) const final;
126     RefPtr<DeprecatedCSSOMValue> getPropertyCSSValue(const String& propertyName) final;
127     String getPropertyValue(const String& propertyName) final;
128     String getPropertyPriority(const String& propertyName) final;
129     String getPropertyShorthand(const String& propertyName) final;
130     bool isPropertyImplicit(const String& propertyName) final;
131     ExceptionOr<void> setProperty(const String& propertyName, const String& value, const String& priority) final;
132     ExceptionOr<String> removeProperty(const String& propertyName) final;
133     String cssText() const final;
134     ExceptionOr<void> setCssText(const String&) final;
135     RefPtr<CSSValue> getPropertyCSSValueInternal(CSSPropertyID) final;
136     String getPropertyValueInternal(CSSPropertyID) final;
137     ExceptionOr<bool> setPropertyInternal(CSSPropertyID, const String& value, bool important) final;
138     Ref<MutableStyleProperties> copyProperties() const final;
139
140     RefPtr<CSSValue> getPropertyCSSValue(CSSPropertyID, EUpdateLayout = UpdateLayout) const;
141
142     mutable Ref<Element> m_element;
143     PseudoId m_pseudoElementSpecifier;
144     bool m_allowVisitedStyle;
145     unsigned m_refCount;
146 };
147
148 } // namespace WebCore