Rename SVGProperty to SVGLegacyProperty and rename SVGAnimatedProperty to SVGLegacyAn...
[WebKit-https.git] / Source / WebCore / svg / SVGLength.h
1 /*
2  * Copyright (C) 2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "SVGLengthValue.h"
29 #include "SVGPropertyTearOff.h"
30
31 namespace WebCore {
32
33 class SVGLength : public SVGPropertyTearOff<SVGLengthValue> {
34 public:
35     // Forward declare these enums in the w3c naming scheme, for IDL generation
36     enum {
37         SVG_LENGTHTYPE_UNKNOWN = LengthTypeUnknown,
38         SVG_LENGTHTYPE_NUMBER = LengthTypeNumber,
39         SVG_LENGTHTYPE_PERCENTAGE = LengthTypePercentage,
40         SVG_LENGTHTYPE_EMS = LengthTypeEMS,
41         SVG_LENGTHTYPE_EXS = LengthTypeEXS,
42         SVG_LENGTHTYPE_PX = LengthTypePX,
43         SVG_LENGTHTYPE_CM = LengthTypeCM,
44         SVG_LENGTHTYPE_MM = LengthTypeMM,
45         SVG_LENGTHTYPE_IN = LengthTypeIN,
46         SVG_LENGTHTYPE_PT = LengthTypePT,
47         SVG_LENGTHTYPE_PC = LengthTypePC
48     };
49
50     static Ref<SVGLength> create(SVGLegacyAnimatedProperty& animatedProperty, SVGPropertyRole role, SVGLengthValue& value)
51     {
52         return adoptRef(*new SVGLength(animatedProperty, role, value));
53     }
54
55     static Ref<SVGLength> create(const SVGLengthValue& initialValue = { })
56     {
57         return adoptRef(*new SVGLength(initialValue));
58     }
59
60     template<typename T> static ExceptionOr<Ref<SVGLength>> create(ExceptionOr<T>&& initialValue)
61     {
62         if (initialValue.hasException())
63             return initialValue.releaseException();
64         return create(initialValue.releaseReturnValue());
65     }
66
67     unsigned short unitType()
68     {
69         return propertyReference().unitType();
70     }
71
72     ExceptionOr<float> valueForBindings()
73     {
74         return propertyReference().valueForBindings(SVGLengthContext { contextElement() });
75     }
76
77     ExceptionOr<void> setValueForBindings(float value)
78     {
79         if (isReadOnly())
80             return Exception { NoModificationAllowedError };
81
82         auto result = propertyReference().setValue(value, SVGLengthContext { contextElement() });
83         if (result.hasException())
84             return result;
85         
86         commitChange();
87         return result;
88     }
89     
90     float valueInSpecifiedUnits()
91     {
92         return propertyReference().valueInSpecifiedUnits();
93     }
94
95     ExceptionOr<void> setValueInSpecifiedUnits(float valueInSpecifiedUnits)
96     {
97         if (isReadOnly())
98             return Exception { NoModificationAllowedError };
99
100         propertyReference().setValueInSpecifiedUnits(valueInSpecifiedUnits);
101         commitChange();
102         
103         return { };
104     }
105     
106     String valueAsString()
107     {
108         return propertyReference().valueAsString();
109     }
110
111     ExceptionOr<void> setValueAsString(const String& value)
112     {
113         if (isReadOnly())
114             return Exception { NoModificationAllowedError };
115
116         auto result = propertyReference().setValueAsString(value);
117         if (result.hasException())
118             return result;
119         
120         commitChange();
121         return result;
122     }
123
124     ExceptionOr<void> newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits)
125     {
126         if (isReadOnly())
127             return Exception { NoModificationAllowedError };
128
129         auto result = propertyReference().newValueSpecifiedUnits(unitType, valueInSpecifiedUnits);
130         if (result.hasException())
131             return result;
132         
133         commitChange();
134         return result;
135     }
136     
137     ExceptionOr<void> convertToSpecifiedUnits(unsigned short unitType)
138     {
139         if (isReadOnly())
140             return Exception { NoModificationAllowedError };
141
142         auto result = propertyReference().convertToSpecifiedUnits(unitType, SVGLengthContext { contextElement() });
143         if (result.hasException())
144             return result;
145         
146         commitChange();
147         return result;
148     }
149
150 private:
151     SVGLength(SVGLegacyAnimatedProperty& animatedProperty, SVGPropertyRole role, SVGLengthValue& value)
152         : SVGPropertyTearOff<SVGLengthValue>(&animatedProperty, role, value)
153     {
154     }
155
156     explicit SVGLength(const SVGLengthValue& initialValue)
157         : SVGPropertyTearOff<SVGLengthValue>(initialValue)
158     {
159     }
160 };
161
162 } // namespace WebCore