| 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 10 matching lines...) Expand all Loading... |
| 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 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 NewSVGAnimatedProperty_h | 31 #ifndef SVGAnimatedProperty_h |
| 32 #define NewSVGAnimatedProperty_h | 32 #define SVGAnimatedProperty_h |
| 33 | 33 |
| 34 #include "bindings/v8/ExceptionStatePlaceholder.h" | 34 #include "bindings/v8/ExceptionStatePlaceholder.h" |
| 35 #include "bindings/v8/ScriptWrappable.h" | 35 #include "bindings/v8/ScriptWrappable.h" |
| 36 #include "core/dom/ExceptionCode.h" | 36 #include "core/dom/ExceptionCode.h" |
| 37 #include "core/svg/SVGParsingError.h" | 37 #include "core/svg/SVGParsingError.h" |
| 38 #include "core/svg/properties/NewSVGPropertyTearOff.h" | |
| 39 #include "core/svg/properties/SVGPropertyInfo.h" | 38 #include "core/svg/properties/SVGPropertyInfo.h" |
| 39 #include "core/svg/properties/SVGPropertyTearOff.h" |
| 40 #include "wtf/Noncopyable.h" | 40 #include "wtf/Noncopyable.h" |
| 41 #include "wtf/PassRefPtr.h" | 41 #include "wtf/PassRefPtr.h" |
| 42 #include "wtf/RefCounted.h" | 42 #include "wtf/RefCounted.h" |
| 43 | 43 |
| 44 namespace WebCore { | 44 namespace WebCore { |
| 45 | 45 |
| 46 class SVGElement; | 46 class SVGElement; |
| 47 | 47 |
| 48 class NewSVGAnimatedPropertyBase : public RefCounted<NewSVGAnimatedPropertyBase>
{ | 48 class SVGAnimatedPropertyBase : public RefCounted<SVGAnimatedPropertyBase> { |
| 49 public: | 49 public: |
| 50 virtual ~NewSVGAnimatedPropertyBase(); | 50 virtual ~SVGAnimatedPropertyBase(); |
| 51 | 51 |
| 52 virtual NewSVGPropertyBase* currentValueBase() = 0; | 52 virtual SVGPropertyBase* currentValueBase() = 0; |
| 53 | 53 |
| 54 virtual void animationStarted(); | 54 virtual void animationStarted(); |
| 55 virtual PassRefPtr<NewSVGPropertyBase> createAnimatedValue() = 0; | 55 virtual PassRefPtr<SVGPropertyBase> createAnimatedValue() = 0; |
| 56 virtual void setAnimatedValue(PassRefPtr<NewSVGPropertyBase>) = 0; | 56 virtual void setAnimatedValue(PassRefPtr<SVGPropertyBase>) = 0; |
| 57 virtual void animationEnded(); | 57 virtual void animationEnded(); |
| 58 | 58 |
| 59 virtual bool needsSynchronizeAttribute() = 0; | 59 virtual bool needsSynchronizeAttribute() = 0; |
| 60 virtual void synchronizeAttribute(); | 60 virtual void synchronizeAttribute(); |
| 61 | 61 |
| 62 AnimatedPropertyType type() const | 62 AnimatedPropertyType type() const |
| 63 { | 63 { |
| 64 return m_type; | 64 return m_type; |
| 65 } | 65 } |
| 66 | 66 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 85 } | 85 } |
| 86 | 86 |
| 87 void setReadOnly() | 87 void setReadOnly() |
| 88 { | 88 { |
| 89 m_isReadOnly = true; | 89 m_isReadOnly = true; |
| 90 } | 90 } |
| 91 | 91 |
| 92 bool isSpecified() const; | 92 bool isSpecified() const; |
| 93 | 93 |
| 94 protected: | 94 protected: |
| 95 NewSVGAnimatedPropertyBase(AnimatedPropertyType, SVGElement*, const Qualifie
dName& attributeName); | 95 SVGAnimatedPropertyBase(AnimatedPropertyType, SVGElement*, const QualifiedNa
me& attributeName); |
| 96 void commitChange(); | 96 void commitChange(); |
| 97 | 97 |
| 98 private: | 98 private: |
| 99 const AnimatedPropertyType m_type; | 99 const AnimatedPropertyType m_type; |
| 100 bool m_isReadOnly; | 100 bool m_isReadOnly; |
| 101 bool m_isAnimating; | 101 bool m_isAnimating; |
| 102 | 102 |
| 103 // This reference is kept alive from V8 wrapper | 103 // This reference is kept alive from V8 wrapper |
| 104 SVGElement* m_contextElement; | 104 SVGElement* m_contextElement; |
| 105 | 105 |
| 106 const QualifiedName& m_attributeName; | 106 const QualifiedName& m_attributeName; |
| 107 | 107 |
| 108 WTF_MAKE_NONCOPYABLE(NewSVGAnimatedPropertyBase); | 108 WTF_MAKE_NONCOPYABLE(SVGAnimatedPropertyBase); |
| 109 }; | 109 }; |
| 110 | 110 |
| 111 template <typename Property> | 111 template <typename Property> |
| 112 class NewSVGAnimatedPropertyCommon : public NewSVGAnimatedPropertyBase { | 112 class SVGAnimatedPropertyCommon : public SVGAnimatedPropertyBase { |
| 113 public: | 113 public: |
| 114 Property* baseValue() | 114 Property* baseValue() |
| 115 { | 115 { |
| 116 return m_baseValue.get(); | 116 return m_baseValue.get(); |
| 117 } | 117 } |
| 118 | 118 |
| 119 Property* currentValue() | 119 Property* currentValue() |
| 120 { | 120 { |
| 121 return m_currentValue ? m_currentValue.get() : m_baseValue.get(); | 121 return m_currentValue ? m_currentValue.get() : m_baseValue.get(); |
| 122 } | 122 } |
| 123 | 123 |
| 124 const Property* currentValue() const | 124 const Property* currentValue() const |
| 125 { | 125 { |
| 126 return const_cast<NewSVGAnimatedPropertyCommon*>(this)->currentValue(); | 126 return const_cast<SVGAnimatedPropertyCommon*>(this)->currentValue(); |
| 127 } | 127 } |
| 128 | 128 |
| 129 virtual NewSVGPropertyBase* currentValueBase() OVERRIDE | 129 virtual SVGPropertyBase* currentValueBase() OVERRIDE |
| 130 { | 130 { |
| 131 return currentValue(); | 131 return currentValue(); |
| 132 } | 132 } |
| 133 | 133 |
| 134 void setBaseValueAsString(const String& value, SVGParsingError& parseError) | 134 void setBaseValueAsString(const String& value, SVGParsingError& parseError) |
| 135 { | 135 { |
| 136 TrackExceptionState es; | 136 TrackExceptionState es; |
| 137 | 137 |
| 138 m_baseValue->setValueAsString(value, es); | 138 m_baseValue->setValueAsString(value, es); |
| 139 | 139 |
| 140 if (es.hadException()) | 140 if (es.hadException()) |
| 141 parseError = ParsingAttributeFailedError; | 141 parseError = ParsingAttributeFailedError; |
| 142 } | 142 } |
| 143 | 143 |
| 144 virtual PassRefPtr<NewSVGPropertyBase> createAnimatedValue() OVERRIDE | 144 virtual PassRefPtr<SVGPropertyBase> createAnimatedValue() OVERRIDE |
| 145 { | 145 { |
| 146 return m_baseValue->clone(); | 146 return m_baseValue->clone(); |
| 147 } | 147 } |
| 148 | 148 |
| 149 virtual void setAnimatedValue(PassRefPtr<NewSVGPropertyBase> passValue) OVER
RIDE | 149 virtual void setAnimatedValue(PassRefPtr<SVGPropertyBase> passValue) OVERRID
E |
| 150 { | 150 { |
| 151 ASSERT(isAnimating()); | 151 ASSERT(isAnimating()); |
| 152 | 152 |
| 153 RefPtr<NewSVGPropertyBase> value = passValue; | 153 RefPtr<SVGPropertyBase> value = passValue; |
| 154 ASSERT(value->type() == Property::classType()); | 154 ASSERT(value->type() == Property::classType()); |
| 155 m_currentValue = static_pointer_cast<Property>(value.release()); | 155 m_currentValue = static_pointer_cast<Property>(value.release()); |
| 156 } | 156 } |
| 157 | 157 |
| 158 virtual void animationEnded() OVERRIDE | 158 virtual void animationEnded() OVERRIDE |
| 159 { | 159 { |
| 160 NewSVGAnimatedPropertyBase::animationEnded(); | 160 SVGAnimatedPropertyBase::animationEnded(); |
| 161 | 161 |
| 162 ASSERT(m_currentValue); | 162 ASSERT(m_currentValue); |
| 163 m_currentValue.clear(); | 163 m_currentValue.clear(); |
| 164 } | 164 } |
| 165 | 165 |
| 166 protected: | 166 protected: |
| 167 NewSVGAnimatedPropertyCommon(SVGElement* contextElement, const QualifiedName
& attributeName, PassRefPtr<Property> initialValue) | 167 SVGAnimatedPropertyCommon(SVGElement* contextElement, const QualifiedName& a
ttributeName, PassRefPtr<Property> initialValue) |
| 168 : NewSVGAnimatedPropertyBase(Property::classType(), contextElement, attr
ibuteName) | 168 : SVGAnimatedPropertyBase(Property::classType(), contextElement, attribu
teName) |
| 169 , m_baseValue(initialValue) | 169 , m_baseValue(initialValue) |
| 170 { | 170 { |
| 171 } | 171 } |
| 172 | 172 |
| 173 private: | 173 private: |
| 174 RefPtr<Property> m_baseValue; | 174 RefPtr<Property> m_baseValue; |
| 175 RefPtr<Property> m_currentValue; | 175 RefPtr<Property> m_currentValue; |
| 176 }; | 176 }; |
| 177 | 177 |
| 178 // Implementation of SVGAnimatedProperty which uses primitive types. | 178 // Implementation of SVGAnimatedProperty which uses primitive types. |
| 179 // This is for classes which return primitive type for its "animVal". | 179 // This is for classes which return primitive type for its "animVal". |
| 180 // Examples are SVGAnimatedBoolean, SVGAnimatedNumber, etc. | 180 // Examples are SVGAnimatedBoolean, SVGAnimatedNumber, etc. |
| 181 template <typename Property, typename TearOffType = typename Property::TearOffTy
pe, typename PrimitiveType = typename Property::PrimitiveType> | 181 template <typename Property, typename TearOffType = typename Property::TearOffTy
pe, typename PrimitiveType = typename Property::PrimitiveType> |
| 182 class NewSVGAnimatedProperty : public NewSVGAnimatedPropertyCommon<Property> { | 182 class SVGAnimatedProperty : public SVGAnimatedPropertyCommon<Property> { |
| 183 public: | 183 public: |
| 184 static PassRefPtr<NewSVGAnimatedProperty<Property> > create(SVGElement* cont
extElement, const QualifiedName& attributeName, PassRefPtr<Property> initialValu
e) | 184 static PassRefPtr<SVGAnimatedProperty<Property> > create(SVGElement* context
Element, const QualifiedName& attributeName, PassRefPtr<Property> initialValue) |
| 185 { | 185 { |
| 186 return adoptRef(new NewSVGAnimatedProperty<Property>(contextElement, att
ributeName, initialValue)); | 186 return adoptRef(new SVGAnimatedProperty<Property>(contextElement, attrib
uteName, initialValue)); |
| 187 } | 187 } |
| 188 | 188 |
| 189 virtual bool needsSynchronizeAttribute() OVERRIDE | 189 virtual bool needsSynchronizeAttribute() OVERRIDE |
| 190 { | 190 { |
| 191 // DOM attribute synchronization is only needed if tear-off is being tou
ched from javascript or the property is being animated. | 191 // DOM attribute synchronization is only needed if tear-off is being tou
ched from javascript or the property is being animated. |
| 192 // This prevents unnecessary attribute creation on target element. | 192 // This prevents unnecessary attribute creation on target element. |
| 193 return m_baseValueUpdated || this->isAnimating(); | 193 return m_baseValueUpdated || this->isAnimating(); |
| 194 } | 194 } |
| 195 | 195 |
| 196 virtual void synchronizeAttribute() OVERRIDE | 196 virtual void synchronizeAttribute() OVERRIDE |
| 197 { | 197 { |
| 198 NewSVGAnimatedPropertyBase::synchronizeAttribute(); | 198 SVGAnimatedPropertyBase::synchronizeAttribute(); |
| 199 m_baseValueUpdated = false; | 199 m_baseValueUpdated = false; |
| 200 } | 200 } |
| 201 | 201 |
| 202 // SVGAnimated* DOM Spec implementations: | 202 // SVGAnimated* DOM Spec implementations: |
| 203 | 203 |
| 204 // baseVal()/setBaseVal()/animVal() are only to be used from SVG DOM impleme
ntation. | 204 // baseVal()/setBaseVal()/animVal() are only to be used from SVG DOM impleme
ntation. |
| 205 // Use currentValue() from C++ code. | 205 // Use currentValue() from C++ code. |
| 206 PrimitiveType baseVal() | 206 PrimitiveType baseVal() |
| 207 { | 207 { |
| 208 return this->baseValue()->value(); | 208 return this->baseValue()->value(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 222 this->contextElement()->invalidateSVGAttributes(); | 222 this->contextElement()->invalidateSVGAttributes(); |
| 223 this->contextElement()->svgAttributeChanged(this->attributeName()); | 223 this->contextElement()->svgAttributeChanged(this->attributeName()); |
| 224 } | 224 } |
| 225 | 225 |
| 226 PrimitiveType animVal() | 226 PrimitiveType animVal() |
| 227 { | 227 { |
| 228 return this->currentValue()->value(); | 228 return this->currentValue()->value(); |
| 229 } | 229 } |
| 230 | 230 |
| 231 protected: | 231 protected: |
| 232 NewSVGAnimatedProperty(SVGElement* contextElement, const QualifiedName& attr
ibuteName, PassRefPtr<Property> initialValue) | 232 SVGAnimatedProperty(SVGElement* contextElement, const QualifiedName& attribu
teName, PassRefPtr<Property> initialValue) |
| 233 : NewSVGAnimatedPropertyCommon<Property>(contextElement, attributeName,
initialValue) | 233 : SVGAnimatedPropertyCommon<Property>(contextElement, attributeName, ini
tialValue) |
| 234 , m_baseValueUpdated(false) | 234 , m_baseValueUpdated(false) |
| 235 { | 235 { |
| 236 } | 236 } |
| 237 | 237 |
| 238 bool m_baseValueUpdated; | 238 bool m_baseValueUpdated; |
| 239 }; | 239 }; |
| 240 | 240 |
| 241 // Implementation of SVGAnimatedProperty which uses tear-off value types. | 241 // Implementation of SVGAnimatedProperty which uses tear-off value types. |
| 242 // These classes has "void" for its PrimitiveType. | 242 // These classes has "void" for its PrimitiveType. |
| 243 // This is for classes which return special type for its "animVal". | 243 // This is for classes which return special type for its "animVal". |
| 244 // Examples are SVGAnimatedLength, SVGAnimatedRect, SVGAnimated*List, etc. | 244 // Examples are SVGAnimatedLength, SVGAnimatedRect, SVGAnimated*List, etc. |
| 245 template <typename Property, typename TearOffType> | 245 template <typename Property, typename TearOffType> |
| 246 class NewSVGAnimatedProperty<Property, TearOffType, void> : public NewSVGAnimate
dPropertyCommon<Property> { | 246 class SVGAnimatedProperty<Property, TearOffType, void> : public SVGAnimatedPrope
rtyCommon<Property> { |
| 247 public: | 247 public: |
| 248 static PassRefPtr<NewSVGAnimatedProperty<Property> > create(SVGElement* cont
extElement, const QualifiedName& attributeName, PassRefPtr<Property> initialValu
e) | 248 static PassRefPtr<SVGAnimatedProperty<Property> > create(SVGElement* context
Element, const QualifiedName& attributeName, PassRefPtr<Property> initialValue) |
| 249 { | 249 { |
| 250 return adoptRef(new NewSVGAnimatedProperty<Property>(contextElement, att
ributeName, initialValue)); | 250 return adoptRef(new SVGAnimatedProperty<Property>(contextElement, attrib
uteName, initialValue)); |
| 251 } | 251 } |
| 252 | 252 |
| 253 virtual void setAnimatedValue(PassRefPtr<NewSVGPropertyBase> value) OVERRIDE | 253 virtual void setAnimatedValue(PassRefPtr<SVGPropertyBase> value) OVERRIDE |
| 254 { | 254 { |
| 255 NewSVGAnimatedPropertyCommon<Property>::setAnimatedValue(value); | 255 SVGAnimatedPropertyCommon<Property>::setAnimatedValue(value); |
| 256 updateAnimValTearOffIfNeeded(); | 256 updateAnimValTearOffIfNeeded(); |
| 257 } | 257 } |
| 258 | 258 |
| 259 virtual void animationEnded() OVERRIDE | 259 virtual void animationEnded() OVERRIDE |
| 260 { | 260 { |
| 261 NewSVGAnimatedPropertyCommon<Property>::animationEnded(); | 261 SVGAnimatedPropertyCommon<Property>::animationEnded(); |
| 262 updateAnimValTearOffIfNeeded(); | 262 updateAnimValTearOffIfNeeded(); |
| 263 } | 263 } |
| 264 | 264 |
| 265 virtual bool needsSynchronizeAttribute() OVERRIDE | 265 virtual bool needsSynchronizeAttribute() OVERRIDE |
| 266 { | 266 { |
| 267 // DOM attribute synchronization is only needed if tear-off is being tou
ched from javascript or the property is being animated. | 267 // DOM attribute synchronization is only needed if tear-off is being tou
ched from javascript or the property is being animated. |
| 268 // This prevents unnecessary attribute creation on target element. | 268 // This prevents unnecessary attribute creation on target element. |
| 269 return m_baseValTearOff || this->isAnimating(); | 269 return m_baseValTearOff || this->isAnimating(); |
| 270 } | 270 } |
| 271 | 271 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 286 | 286 |
| 287 TearOffType* animVal() | 287 TearOffType* animVal() |
| 288 { | 288 { |
| 289 if (!m_animValTearOff) | 289 if (!m_animValTearOff) |
| 290 m_animValTearOff = TearOffType::create(this->currentValue(), this->c
ontextElement(), PropertyIsAnimVal, this->attributeName()); | 290 m_animValTearOff = TearOffType::create(this->currentValue(), this->c
ontextElement(), PropertyIsAnimVal, this->attributeName()); |
| 291 | 291 |
| 292 return m_animValTearOff.get(); | 292 return m_animValTearOff.get(); |
| 293 } | 293 } |
| 294 | 294 |
| 295 protected: | 295 protected: |
| 296 NewSVGAnimatedProperty(SVGElement* contextElement, const QualifiedName& attr
ibuteName, PassRefPtr<Property> initialValue) | 296 SVGAnimatedProperty(SVGElement* contextElement, const QualifiedName& attribu
teName, PassRefPtr<Property> initialValue) |
| 297 : NewSVGAnimatedPropertyCommon<Property>(contextElement, attributeName,
initialValue) | 297 : SVGAnimatedPropertyCommon<Property>(contextElement, attributeName, ini
tialValue) |
| 298 { | 298 { |
| 299 } | 299 } |
| 300 | 300 |
| 301 private: | 301 private: |
| 302 void updateAnimValTearOffIfNeeded() | 302 void updateAnimValTearOffIfNeeded() |
| 303 { | 303 { |
| 304 if (m_animValTearOff) | 304 if (m_animValTearOff) |
| 305 m_animValTearOff->setTarget(this->currentValue()); | 305 m_animValTearOff->setTarget(this->currentValue()); |
| 306 } | 306 } |
| 307 | 307 |
| 308 // When still (not animated): | 308 // When still (not animated): |
| 309 // Both m_animValTearOff and m_baseValTearOff target m_baseValue. | 309 // Both m_animValTearOff and m_baseValTearOff target m_baseValue. |
| 310 // When animated: | 310 // When animated: |
| 311 // m_animValTearOff targets m_currentValue. | 311 // m_animValTearOff targets m_currentValue. |
| 312 // m_baseValTearOff targets m_baseValue. | 312 // m_baseValTearOff targets m_baseValue. |
| 313 RefPtr<TearOffType> m_baseValTearOff; | 313 RefPtr<TearOffType> m_baseValTearOff; |
| 314 RefPtr<TearOffType> m_animValTearOff; | 314 RefPtr<TearOffType> m_animValTearOff; |
| 315 }; | 315 }; |
| 316 | 316 |
| 317 } | 317 } |
| 318 | 318 |
| 319 #endif // NewSVGAnimatedProperty_h | 319 #endif // SVGAnimatedProperty_h |
| OLD | NEW |