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