OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 G* * Redistributions in binary form must reproduce the above | 10 G* * Redistributions in binary form must reproduce the above |
(...skipping 13 matching lines...) Expand all Loading... |
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 */ | 29 */ |
30 | 30 |
31 #ifndef SVGAnimatedProperty_h | 31 #ifndef SVGAnimatedProperty_h |
32 #define SVGAnimatedProperty_h | 32 #define SVGAnimatedProperty_h |
33 | 33 |
34 #include "bindings/core/v8/ExceptionState.h" | |
35 #include "core/dom/ExceptionCode.h" | |
36 #include "core/svg/SVGParsingError.h" | 34 #include "core/svg/SVGParsingError.h" |
37 #include "core/svg/properties/SVGPropertyInfo.h" | 35 #include "core/svg/properties/SVGPropertyInfo.h" |
38 #include "core/svg/properties/SVGPropertyTearOff.h" | 36 #include "core/svg/properties/SVGPropertyTearOff.h" |
39 #include "platform/heap/Handle.h" | 37 #include "platform/heap/Handle.h" |
40 #include "wtf/Noncopyable.h" | 38 #include "wtf/Noncopyable.h" |
41 | 39 |
42 namespace blink { | 40 namespace blink { |
43 | 41 |
| 42 class ExceptionState; |
44 class SVGElement; | 43 class SVGElement; |
45 | 44 |
46 class SVGAnimatedPropertyBase | 45 class SVGAnimatedPropertyBase |
47 : public GarbageCollectedFinalized<SVGAnimatedPropertyBase> { | 46 : public GarbageCollectedFinalized<SVGAnimatedPropertyBase> { |
48 WTF_MAKE_NONCOPYABLE(SVGAnimatedPropertyBase); | 47 WTF_MAKE_NONCOPYABLE(SVGAnimatedPropertyBase); |
49 | 48 |
50 public: | 49 public: |
51 virtual ~SVGAnimatedPropertyBase(); | 50 virtual ~SVGAnimatedPropertyBase(); |
52 | 51 |
53 virtual SVGPropertyBase* currentValueBase() = 0; | 52 virtual SVGPropertyBase* currentValueBase() = 0; |
(...skipping 17 matching lines...) Expand all Loading... |
71 const QualifiedName& attributeName() const { return m_attributeName; } | 70 const QualifiedName& attributeName() const { return m_attributeName; } |
72 | 71 |
73 CSSPropertyID cssPropertyId() const { | 72 CSSPropertyID cssPropertyId() const { |
74 return static_cast<CSSPropertyID>(m_cssPropertyId); | 73 return static_cast<CSSPropertyID>(m_cssPropertyId); |
75 } | 74 } |
76 | 75 |
77 bool hasPresentationAttributeMapping() const { | 76 bool hasPresentationAttributeMapping() const { |
78 return cssPropertyId() != CSSPropertyInvalid; | 77 return cssPropertyId() != CSSPropertyInvalid; |
79 } | 78 } |
80 | 79 |
81 bool isReadOnly() const { return m_isReadOnly; } | |
82 | |
83 void setReadOnly() { m_isReadOnly = true; } | |
84 | |
85 bool isSpecified() const; | 80 bool isSpecified() const; |
86 | 81 |
87 DEFINE_INLINE_VIRTUAL_TRACE() {} | 82 DEFINE_INLINE_VIRTUAL_TRACE() {} |
88 | 83 |
89 protected: | 84 protected: |
90 SVGAnimatedPropertyBase(AnimatedPropertyType, | 85 SVGAnimatedPropertyBase(AnimatedPropertyType, |
91 SVGElement*, | 86 SVGElement*, |
92 const QualifiedName& attributeName, | 87 const QualifiedName& attributeName, |
93 CSSPropertyID = CSSPropertyInvalid); | 88 CSSPropertyID = CSSPropertyInvalid); |
94 | 89 |
95 private: | 90 private: |
96 static_assert(NumberOfAnimatedPropertyTypes <= (1u << 5), | 91 static_assert(NumberOfAnimatedPropertyTypes <= (1u << 5), |
97 "enough bits for AnimatedPropertyType (m_type)"); | 92 "enough bits for AnimatedPropertyType (m_type)"); |
98 static constexpr int kCssPropertyBits = 9; | 93 static constexpr int kCssPropertyBits = 9; |
99 static_assert((1u << kCssPropertyBits) - 1 >= lastCSSProperty, | 94 static_assert((1u << kCssPropertyBits) - 1 >= lastCSSProperty, |
100 "enough bits for CSS property ids"); | 95 "enough bits for CSS property ids"); |
101 | 96 |
102 const unsigned m_type : 5; | 97 const unsigned m_type : 5; |
103 const unsigned m_cssPropertyId : kCssPropertyBits; | 98 const unsigned m_cssPropertyId : kCssPropertyBits; |
104 unsigned m_isReadOnly : 1; | |
105 | 99 |
106 // This raw pointer is safe since the SVG element is guaranteed to be kept | 100 // This raw pointer is safe since the SVG element is guaranteed to be kept |
107 // alive by a V8 wrapper. | 101 // alive by a V8 wrapper. |
108 // See http://crbug.com/528275 for the detail. | 102 // See http://crbug.com/528275 for the detail. |
109 UntracedMember<SVGElement> m_contextElement; | 103 UntracedMember<SVGElement> m_contextElement; |
110 | 104 |
111 const QualifiedName& m_attributeName; | 105 const QualifiedName& m_attributeName; |
112 }; | 106 }; |
113 | 107 |
114 template <typename Property> | 108 template <typename Property> |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 SVGAnimatedPropertyBase::synchronizeAttribute(); | 184 SVGAnimatedPropertyBase::synchronizeAttribute(); |
191 m_baseValueUpdated = false; | 185 m_baseValueUpdated = false; |
192 } | 186 } |
193 | 187 |
194 // SVGAnimated* DOM Spec implementations: | 188 // SVGAnimated* DOM Spec implementations: |
195 | 189 |
196 // baseVal()/setBaseVal()/animVal() are only to be used from SVG DOM | 190 // baseVal()/setBaseVal()/animVal() are only to be used from SVG DOM |
197 // implementation. Use currentValue() from C++ code. | 191 // implementation. Use currentValue() from C++ code. |
198 PrimitiveType baseVal() { return this->baseValue()->value(); } | 192 PrimitiveType baseVal() { return this->baseValue()->value(); } |
199 | 193 |
200 void setBaseVal(PrimitiveType value, ExceptionState& exceptionState) { | 194 void setBaseVal(PrimitiveType value, ExceptionState&) { |
201 if (this->isReadOnly()) { | |
202 exceptionState.throwDOMException(NoModificationAllowedError, | |
203 "The attribute is read-only."); | |
204 return; | |
205 } | |
206 | |
207 this->baseValue()->setValue(value); | 195 this->baseValue()->setValue(value); |
208 m_baseValueUpdated = true; | 196 m_baseValueUpdated = true; |
209 | 197 |
210 ASSERT(this->attributeName() != QualifiedName::null()); | 198 ASSERT(this->attributeName() != QualifiedName::null()); |
211 this->contextElement()->invalidateSVGAttributes(); | 199 this->contextElement()->invalidateSVGAttributes(); |
212 this->contextElement()->svgAttributeBaseValChanged(this->attributeName()); | 200 this->contextElement()->svgAttributeBaseValChanged(this->attributeName()); |
213 } | 201 } |
214 | 202 |
215 PrimitiveType animVal() { | 203 PrimitiveType animVal() { |
216 this->contextElement()->ensureAttributeAnimValUpdated(); | 204 this->contextElement()->ensureAttributeAnimValUpdated(); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 | 255 |
268 // SVGAnimated* DOM Spec implementations: | 256 // SVGAnimated* DOM Spec implementations: |
269 | 257 |
270 // baseVal()/animVal() are only to be used from SVG DOM implementation. | 258 // baseVal()/animVal() are only to be used from SVG DOM implementation. |
271 // Use currentValue() from C++ code. | 259 // Use currentValue() from C++ code. |
272 virtual TearOffType* baseVal() { | 260 virtual TearOffType* baseVal() { |
273 if (!m_baseValTearOff) { | 261 if (!m_baseValTearOff) { |
274 m_baseValTearOff = | 262 m_baseValTearOff = |
275 TearOffType::create(this->baseValue(), this->contextElement(), | 263 TearOffType::create(this->baseValue(), this->contextElement(), |
276 PropertyIsNotAnimVal, this->attributeName()); | 264 PropertyIsNotAnimVal, this->attributeName()); |
277 if (this->isReadOnly()) | |
278 m_baseValTearOff->setIsReadOnlyProperty(); | |
279 } | 265 } |
280 | 266 return m_baseValTearOff; |
281 return m_baseValTearOff.get(); | |
282 } | 267 } |
283 | 268 |
284 TearOffType* animVal() { | 269 TearOffType* animVal() { |
285 if (!m_animValTearOff) | 270 if (!m_animValTearOff) { |
286 m_animValTearOff = | 271 m_animValTearOff = |
287 TearOffType::create(this->currentValue(), this->contextElement(), | 272 TearOffType::create(this->currentValue(), this->contextElement(), |
288 PropertyIsAnimVal, this->attributeName()); | 273 PropertyIsAnimVal, this->attributeName()); |
289 | 274 } |
290 return m_animValTearOff.get(); | 275 return m_animValTearOff; |
291 } | 276 } |
292 | 277 |
293 DEFINE_INLINE_VIRTUAL_TRACE() { | 278 DEFINE_INLINE_VIRTUAL_TRACE() { |
294 visitor->trace(m_baseValTearOff); | 279 visitor->trace(m_baseValTearOff); |
295 visitor->trace(m_animValTearOff); | 280 visitor->trace(m_animValTearOff); |
296 SVGAnimatedPropertyCommon<Property>::trace(visitor); | 281 SVGAnimatedPropertyCommon<Property>::trace(visitor); |
297 } | 282 } |
298 | 283 |
299 protected: | 284 protected: |
300 SVGAnimatedProperty(SVGElement* contextElement, | 285 SVGAnimatedProperty(SVGElement* contextElement, |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 CSSPropertyID cssPropertyId = CSSPropertyInvalid) | 335 CSSPropertyID cssPropertyId = CSSPropertyInvalid) |
351 : SVGAnimatedPropertyCommon<Property>(contextElement, | 336 : SVGAnimatedPropertyCommon<Property>(contextElement, |
352 attributeName, | 337 attributeName, |
353 initialValue, | 338 initialValue, |
354 cssPropertyId) {} | 339 cssPropertyId) {} |
355 }; | 340 }; |
356 | 341 |
357 } // namespace blink | 342 } // namespace blink |
358 | 343 |
359 #endif // SVGAnimatedProperty_h | 344 #endif // SVGAnimatedProperty_h |
OLD | NEW |