[JSC] Int52Rep(DoubleRepAnyIntUse) should not call operation function
[WebKit-https.git] / Source / WebCore / css / SVGCSSComputedStyleDeclaration.cpp
1 /*
2     Copyright (C) 2007 Eric Seidel <eric@webkit.org>
3     Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
4     Copyright (C) 2019 Apple Inc. All rights reserved.
5
6     This library is free software; you can redistribute it and/or
7     modify it under the terms of the GNU Library General Public
8     License as published by the Free Software Foundation; either
9     version 2 of the License, or (at your option) any later version.
10
11     This library is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14     Library General Public License for more details.
15
16     You should have received a copy of the GNU Library General Public License
17     along with this library; see the file COPYING.LIB.  If not, write to
18     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19     Boston, MA 02110-1301, USA.
20  */
21
22 #include "config.h"
23 #include "CSSComputedStyleDeclaration.h"
24
25 #include "CSSPrimitiveValueMappings.h"
26 #include "CSSPropertyNames.h"
27 #include "CSSValueList.h"
28 #include "Document.h"
29 #include "Element.h"
30 #include "RenderStyle.h"
31
32 namespace WebCore {
33
34 static RefPtr<CSSPrimitiveValue> glyphOrientationToCSSPrimitiveValue(GlyphOrientation orientation)
35 {
36     switch (orientation) {
37     case GlyphOrientation::Degrees0:
38         return CSSPrimitiveValue::create(0.0f, CSSPrimitiveValue::CSS_DEG);
39     case GlyphOrientation::Degrees90:
40         return CSSPrimitiveValue::create(90.0f, CSSPrimitiveValue::CSS_DEG);
41     case GlyphOrientation::Degrees180:
42         return CSSPrimitiveValue::create(180.0f, CSSPrimitiveValue::CSS_DEG);
43     case GlyphOrientation::Degrees270:
44         return CSSPrimitiveValue::create(270.0f, CSSPrimitiveValue::CSS_DEG);
45     case GlyphOrientation::Auto:
46         return nullptr;
47     }
48
49     RELEASE_ASSERT_NOT_REACHED();
50 }
51
52 static Ref<CSSValue> strokeDashArrayToCSSValueList(const Vector<SVGLengthValue>& dashes)
53 {
54     if (dashes.isEmpty())
55         return CSSPrimitiveValue::createIdentifier(CSSValueNone);
56
57     auto list = CSSValueList::createCommaSeparated();
58     for (auto& length : dashes)
59         list->append(SVGLengthValue::toCSSPrimitiveValue(length));
60
61     return list;
62 }
63
64 Ref<CSSValue> ComputedStyleExtractor::adjustSVGPaintForCurrentColor(SVGPaintType paintType, const String& url, const Color& color, const Color& currentColor) const
65 {
66     if (paintType >= SVGPaintType::URINone) {
67         auto values = CSSValueList::createSpaceSeparated();
68         values->append(CSSPrimitiveValue::create(url, CSSPrimitiveValue::UnitType::CSS_URI));
69         if (paintType == SVGPaintType::URINone)
70             values->append(CSSPrimitiveValue::createIdentifier(CSSValueNone));
71         else if (paintType == SVGPaintType::URICurrentColor)
72             values->append(CSSPrimitiveValue::create(currentColor));
73         else if (paintType == SVGPaintType::URIRGBColor)
74             values->append(CSSPrimitiveValue::create(color));
75         return values;
76     }
77     if (paintType == SVGPaintType::None)
78         return CSSPrimitiveValue::createIdentifier(CSSValueNone);
79     if (paintType == SVGPaintType::CurrentColor)
80         return CSSPrimitiveValue::create(currentColor);
81     
82     return CSSPrimitiveValue::create(color);
83 }
84
85 RefPtr<CSSValue> ComputedStyleExtractor::svgPropertyValue(CSSPropertyID propertyID)
86 {
87     if (!m_element)
88         return nullptr;
89
90     auto* style = m_element->computedStyle();
91     if (!style)
92         return nullptr;
93
94     const SVGRenderStyle& svgStyle = style->svgStyle();
95
96     switch (propertyID) {
97     case CSSPropertyClipRule:
98         return CSSPrimitiveValue::create(svgStyle.clipRule());
99     case CSSPropertyFloodOpacity:
100         return CSSPrimitiveValue::create(svgStyle.floodOpacity(), CSSPrimitiveValue::CSS_NUMBER);
101     case CSSPropertyStopOpacity:
102         return CSSPrimitiveValue::create(svgStyle.stopOpacity(), CSSPrimitiveValue::CSS_NUMBER);
103     case CSSPropertyColorInterpolation:
104         return CSSPrimitiveValue::create(svgStyle.colorInterpolation());
105     case CSSPropertyColorInterpolationFilters:
106         return CSSPrimitiveValue::create(svgStyle.colorInterpolationFilters());
107     case CSSPropertyFillOpacity:
108         return CSSPrimitiveValue::create(svgStyle.fillOpacity(), CSSPrimitiveValue::CSS_NUMBER);
109     case CSSPropertyFillRule:
110         return CSSPrimitiveValue::create(svgStyle.fillRule());
111     case CSSPropertyColorRendering:
112         return CSSPrimitiveValue::create(svgStyle.colorRendering());
113     case CSSPropertyShapeRendering:
114         return CSSPrimitiveValue::create(svgStyle.shapeRendering());
115     case CSSPropertyStrokeOpacity:
116         return CSSPrimitiveValue::create(svgStyle.strokeOpacity(), CSSPrimitiveValue::CSS_NUMBER);
117     case CSSPropertyAlignmentBaseline:
118         return CSSPrimitiveValue::create(svgStyle.alignmentBaseline());
119     case CSSPropertyDominantBaseline:
120         return CSSPrimitiveValue::create(svgStyle.dominantBaseline());
121     case CSSPropertyTextAnchor:
122         return CSSPrimitiveValue::create(svgStyle.textAnchor());
123     case CSSPropertyClipPath:
124         if (!svgStyle.clipperResource().isEmpty())
125             return CSSPrimitiveValue::create(svgStyle.clipperResource(), CSSPrimitiveValue::CSS_URI);
126         return CSSPrimitiveValue::createIdentifier(CSSValueNone);
127     case CSSPropertyMask:
128         if (!svgStyle.maskerResource().isEmpty())
129             return CSSPrimitiveValue::create(svgStyle.maskerResource(), CSSPrimitiveValue::CSS_URI);
130         return CSSPrimitiveValue::createIdentifier(CSSValueNone);
131     case CSSPropertyFloodColor:
132         return currentColorOrValidColor(style, svgStyle.floodColor());
133     case CSSPropertyLightingColor:
134         return currentColorOrValidColor(style, svgStyle.lightingColor());
135     case CSSPropertyStopColor:
136         return currentColorOrValidColor(style, svgStyle.stopColor());
137     case CSSPropertyFill:
138         return adjustSVGPaintForCurrentColor(svgStyle.fillPaintType(), svgStyle.fillPaintUri(), svgStyle.fillPaintColor(), style->color());
139     case CSSPropertyKerning:
140         return SVGLengthValue::toCSSPrimitiveValue(svgStyle.kerning());
141     case CSSPropertyMarkerEnd:
142         if (!svgStyle.markerEndResource().isEmpty())
143             return CSSPrimitiveValue::create(svgStyle.markerEndResource(), CSSPrimitiveValue::CSS_URI);
144         return CSSPrimitiveValue::createIdentifier(CSSValueNone);
145     case CSSPropertyMarkerMid:
146         if (!svgStyle.markerMidResource().isEmpty())
147             return CSSPrimitiveValue::create(svgStyle.markerMidResource(), CSSPrimitiveValue::CSS_URI);
148         return CSSPrimitiveValue::createIdentifier(CSSValueNone);
149     case CSSPropertyMarkerStart:
150         if (!svgStyle.markerStartResource().isEmpty())
151             return CSSPrimitiveValue::create(svgStyle.markerStartResource(), CSSPrimitiveValue::CSS_URI);
152         return CSSPrimitiveValue::createIdentifier(CSSValueNone);
153     case CSSPropertyStroke:
154         return adjustSVGPaintForCurrentColor(svgStyle.strokePaintType(), svgStyle.strokePaintUri(), svgStyle.strokePaintColor(), style->color());
155     case CSSPropertyStrokeDasharray:
156         return strokeDashArrayToCSSValueList(svgStyle.strokeDashArray());
157     case CSSPropertyBaselineShift: {
158         switch (svgStyle.baselineShift()) {
159         case BaselineShift::Baseline:
160             return CSSPrimitiveValue::createIdentifier(CSSValueBaseline);
161         case BaselineShift::Super:
162             return CSSPrimitiveValue::createIdentifier(CSSValueSuper);
163         case BaselineShift::Sub:
164             return CSSPrimitiveValue::createIdentifier(CSSValueSub);
165         case BaselineShift::Length:
166             return SVGLengthValue::toCSSPrimitiveValue(svgStyle.baselineShiftValue());
167         }
168         ASSERT_NOT_REACHED();
169         return nullptr;
170     }
171     case CSSPropertyBufferedRendering:
172         return CSSPrimitiveValue::create(svgStyle.bufferedRendering());
173     case CSSPropertyGlyphOrientationHorizontal:
174         return glyphOrientationToCSSPrimitiveValue(svgStyle.glyphOrientationHorizontal());
175     case CSSPropertyGlyphOrientationVertical: {
176         if (RefPtr<CSSPrimitiveValue> value = glyphOrientationToCSSPrimitiveValue(svgStyle.glyphOrientationVertical()))
177             return value;
178
179         if (svgStyle.glyphOrientationVertical() == GlyphOrientation::Auto)
180             return CSSPrimitiveValue::createIdentifier(CSSValueAuto);
181
182         return nullptr;
183     }
184     case CSSPropertyVectorEffect:
185         return CSSPrimitiveValue::create(svgStyle.vectorEffect());
186     case CSSPropertyMaskType:
187         return CSSPrimitiveValue::create(svgStyle.maskType());
188     case CSSPropertyMarker:
189     case CSSPropertyEnableBackground:
190     case CSSPropertyColorProfile:
191         // the above properties are not yet implemented in the engine
192         break;
193     default:
194         // If you crash here, it's because you added a css property and are not handling it
195         // in either this switch statement or the one in CSSComputedStyleDelcaration::getPropertyCSSValue
196         ASSERT_WITH_MESSAGE(0, "unimplemented propertyID: %d", propertyID);
197     }
198     LOG_ERROR("unimplemented propertyID: %d", propertyID);
199     return nullptr;
200 }
201
202 }