| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org> | 2 * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org> |
| 3 * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org> | 3 * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org> |
| 4 * Copyright (C) 2008 Apple Inc. All rights reserved. | 4 * Copyright (C) 2008 Apple Inc. All rights reserved. |
| 5 * Copyright (C) Research In Motion Limited 2011. All rights reserved. | 5 * Copyright (C) Research In Motion Limited 2011. All rights reserved. |
| 6 * | 6 * |
| 7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 } | 171 } |
| 172 | 172 |
| 173 void SVGAnimateElement::resetAnimatedType() | 173 void SVGAnimateElement::resetAnimatedType() |
| 174 { | 174 { |
| 175 SVGElement* targetElement = this->targetElement(); | 175 SVGElement* targetElement = this->targetElement(); |
| 176 const QualifiedName& attributeName = this->attributeName(); | 176 const QualifiedName& attributeName = this->attributeName(); |
| 177 | 177 |
| 178 m_animator.reset(targetElement); | 178 m_animator.reset(targetElement); |
| 179 | 179 |
| 180 ShouldApplyAnimationType shouldApply = shouldApplyAnimation(targetElement, a
ttributeName); | 180 ShouldApplyAnimationType shouldApply = shouldApplyAnimation(targetElement, a
ttributeName); |
| 181 | |
| 182 if (shouldApply == DontApplyAnimation) | 181 if (shouldApply == DontApplyAnimation) |
| 183 return; | 182 return; |
| 184 if (shouldApply == ApplyXMLAnimation || shouldApply == ApplyXMLandCSSAnimati
on) { | 183 if (shouldApply == ApplyXMLAnimation || shouldApply == ApplyXMLandCSSAnimati
on) { |
| 185 // SVG DOM animVal animation code-path. | 184 // SVG DOM animVal animation code-path. |
| 186 SVGElementInstances animatedElements = findElementInstances(targetElemen
t); | 185 SVGElementInstances animatedElements = findElementInstances(targetElemen
t); |
| 187 ASSERT(!animatedElements.isEmpty()); | 186 ASSERT(!animatedElements.isEmpty()); |
| 188 | 187 |
| 189 for (SVGElement* element : animatedElements) | 188 for (SVGElement* element : animatedElements) |
| 190 addReferenceTo(element); | 189 addReferenceTo(element); |
| 191 | 190 |
| 192 if (!m_animatedProperty) | 191 if (!m_animatedProperty) |
| 193 m_animatedProperty = m_animator.startAnimValAnimation(); | 192 m_animatedProperty = m_animator.startAnimValAnimation(); |
| 194 else | 193 else |
| 195 m_animatedProperty = m_animator.resetAnimValToBaseVal(); | 194 m_animatedProperty = m_animator.resetAnimValToBaseVal(); |
| 196 | 195 |
| 197 return; | 196 return; |
| 198 } | 197 } |
| 199 DCHECK_EQ(shouldApply, ApplyCSSAnimation); | 198 DCHECK_EQ(shouldApply, ApplyCSSAnimation); |
| 200 | 199 |
| 201 // CSS properties animation code-path. | 200 // CSS properties animation code-path. |
| 202 String baseValue; | 201 String baseValue; |
| 203 DCHECK(isTargetAttributeCSSProperty(targetElement, attributeName)); | 202 DCHECK(isTargetAttributeCSSProperty(targetElement, attributeName)); |
| 204 computeCSSPropertyValue(targetElement, cssPropertyID(attributeName.localName
()), baseValue); | 203 computeCSSPropertyValue(targetElement, cssPropertyID(attributeName.localName
()), baseValue); |
| 205 | 204 |
| 206 m_animatedProperty = m_animator.constructFromString(baseValue); | 205 m_animatedProperty = m_animator.constructFromString(baseValue); |
| 207 } | 206 } |
| 208 | 207 |
| 209 static bool targetIsUsable(SVGElement* targetElement, const QualifiedName& attri
bute) | |
| 210 { | |
| 211 return attribute != anyQName() | |
| 212 && targetElement->isConnected() && targetElement->parentNode(); | |
| 213 } | |
| 214 | |
| 215 void SVGAnimateElement::clearAnimatedType() | 208 void SVGAnimateElement::clearAnimatedType() |
| 216 { | 209 { |
| 217 if (!m_animatedProperty) | 210 if (!m_animatedProperty) |
| 218 return; | 211 return; |
| 219 | 212 |
| 220 // The animated property lock is held for the "result animation" (see SMILTi
meContainer::updateAnimations()) | 213 // The animated property lock is held for the "result animation" (see SMILTi
meContainer::updateAnimations()) |
| 221 // while we're processing an animation group. We will very likely crash late
r if we clear the animated type | 214 // while we're processing an animation group. We will very likely crash late
r if we clear the animated type |
| 222 // while the lock is held. See crbug.com/581546. | 215 // while the lock is held. See crbug.com/581546. |
| 223 DCHECK(!animatedTypeIsLocked()); | 216 DCHECK(!animatedTypeIsLocked()); |
| 224 | 217 |
| 225 SVGElement* targetElement = this->targetElement(); | 218 SVGElement* targetElement = this->targetElement(); |
| 226 if (!targetElement) { | 219 if (!targetElement) { |
| 227 m_animatedProperty.clear(); | 220 m_animatedProperty.clear(); |
| 228 return; | 221 return; |
| 229 } | 222 } |
| 230 | 223 |
| 231 ShouldApplyAnimationType shouldApply = shouldApplyAnimation(targetElement, a
ttributeName()); | 224 ShouldApplyAnimationType shouldApply = shouldApplyAnimation(targetElement, a
ttributeName()); |
| 232 if (shouldApply == ApplyXMLandCSSAnimation || m_animator.isAnimatingCSSPrope
rty()) { | 225 if (shouldApply == ApplyXMLandCSSAnimation || m_animator.isAnimatingCSSPrope
rty()) { |
| 233 // CSS properties animation code-path. | 226 // CSS properties animation code-path. |
| 234 if (targetIsUsable(targetElement, attributeName())) { | 227 if (shouldApply != DontApplyAnimation) { |
| 235 CSSPropertyID id = cssPropertyID(attributeName().localName()); | 228 CSSPropertyID id = cssPropertyID(attributeName().localName()); |
| 236 targetElement->ensureAnimatedSMILStyleProperties()->removeProperty(i
d); | 229 targetElement->ensureAnimatedSMILStyleProperties()->removeProperty(i
d); |
| 237 targetElement->setNeedsStyleRecalc(LocalStyleChange, StyleChangeReas
onForTracing::create(StyleChangeReason::Animation)); | 230 targetElement->setNeedsStyleRecalc(LocalStyleChange, StyleChangeReas
onForTracing::create(StyleChangeReason::Animation)); |
| 238 } | 231 } |
| 239 } | 232 } |
| 240 if (shouldApply == ApplyXMLandCSSAnimation || m_animator.isAnimatingSVGDom()
) { | 233 if (shouldApply == ApplyXMLandCSSAnimation || m_animator.isAnimatingSVGDom()
) { |
| 241 // SVG DOM animVal animation code-path. | 234 // SVG DOM animVal animation code-path. |
| 242 m_animator.stopAnimValAnimation(); | 235 m_animator.stopAnimValAnimation(); |
| 243 if (targetIsUsable(targetElement, attributeName())) | 236 if (shouldApply != DontApplyAnimation) |
| 244 targetElement->invalidateAnimatedAttribute(attributeName()); | 237 targetElement->invalidateAnimatedAttribute(attributeName()); |
| 245 } | 238 } |
| 246 | 239 |
| 247 m_animatedProperty.clear(); | 240 m_animatedProperty.clear(); |
| 248 m_animator.clear(); | 241 m_animator.clear(); |
| 249 } | 242 } |
| 250 | 243 |
| 251 void SVGAnimateElement::applyResultsToTarget() | 244 void SVGAnimateElement::applyResultsToTarget() |
| 252 { | 245 { |
| 253 ASSERT(animatedPropertyType() != AnimatedTransformList || isSVGAnimateTransf
ormElement(*this)); | 246 ASSERT(animatedPropertyType() != AnimatedTransformList || isSVGAnimateTransf
ormElement(*this)); |
| 254 ASSERT(animatedPropertyType() != AnimatedUnknown); | 247 ASSERT(animatedPropertyType() != AnimatedUnknown); |
| 255 | 248 |
| 256 // Early exit if our animated type got destructed by a previous endedActiveI
nterval(). | 249 // Early exit if our animated type got destructed by a previous endedActiveI
nterval(). |
| 257 if (!m_animatedProperty) | 250 if (!m_animatedProperty) |
| 258 return; | 251 return; |
| 259 | 252 |
| 260 // We do update the style and the animation property independent of each oth
er. | 253 // We do update the style and the animation property independent of each oth
er. |
| 261 ShouldApplyAnimationType shouldApply = shouldApplyAnimation(targetElement(),
attributeName()); | 254 ShouldApplyAnimationType shouldApply = shouldApplyAnimation(targetElement(),
attributeName()); |
| 262 DCHECK(targetElement()); | 255 if (shouldApply == DontApplyAnimation) |
| 263 if (!targetIsUsable(targetElement(), attributeName())) | |
| 264 return; | 256 return; |
| 265 if (shouldApply == ApplyXMLandCSSAnimation || m_animator.isAnimatingCSSPrope
rty()) { | 257 if (shouldApply == ApplyXMLandCSSAnimation || m_animator.isAnimatingCSSPrope
rty()) { |
| 266 // CSS properties animation code-path. | 258 // CSS properties animation code-path. |
| 267 // Convert the result of the animation to a String and apply it as CSS p
roperty on the target. | 259 // Convert the result of the animation to a String and apply it as CSS p
roperty on the target. |
| 268 CSSPropertyID id = cssPropertyID(attributeName().localName()); | 260 CSSPropertyID id = cssPropertyID(attributeName().localName()); |
| 269 MutableStylePropertySet* propertySet = targetElement()->ensureAnimatedSM
ILStyleProperties(); | 261 MutableStylePropertySet* propertySet = targetElement()->ensureAnimatedSM
ILStyleProperties(); |
| 270 if (propertySet->setProperty(id, m_animatedProperty->valueAsString(), fa
lse, 0)) | 262 if (propertySet->setProperty(id, m_animatedProperty->valueAsString(), fa
lse, 0)) |
| 271 targetElement()->setNeedsStyleRecalc(LocalStyleChange, StyleChangeRe
asonForTracing::create(StyleChangeReason::Animation)); | 263 targetElement()->setNeedsStyleRecalc(LocalStyleChange, StyleChangeRe
asonForTracing::create(StyleChangeReason::Animation)); |
| 272 } | 264 } |
| 273 if (shouldApply == ApplyXMLandCSSAnimation || m_animator.isAnimatingSVGDom()
) { | 265 if (shouldApply == ApplyXMLandCSSAnimation || m_animator.isAnimatingSVGDom()
) { |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 { | 330 { |
| 339 visitor->trace(m_fromProperty); | 331 visitor->trace(m_fromProperty); |
| 340 visitor->trace(m_toProperty); | 332 visitor->trace(m_toProperty); |
| 341 visitor->trace(m_toAtEndOfDurationProperty); | 333 visitor->trace(m_toAtEndOfDurationProperty); |
| 342 visitor->trace(m_animatedProperty); | 334 visitor->trace(m_animatedProperty); |
| 343 visitor->trace(m_animator); | 335 visitor->trace(m_animator); |
| 344 SVGAnimationElement::trace(visitor); | 336 SVGAnimationElement::trace(visitor); |
| 345 } | 337 } |
| 346 | 338 |
| 347 } // namespace blink | 339 } // namespace blink |
| OLD | NEW |