Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(647)

Side by Side Diff: third_party/WebKit/Source/core/svg/SVGAnimateElement.cpp

Issue 2746013007: Rework SMIL animation target invalidation (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 98
99 } // unnamed namespace 99 } // unnamed namespace
100 100
101 SVGAnimateElement::SVGAnimateElement(const QualifiedName& tagName, 101 SVGAnimateElement::SVGAnimateElement(const QualifiedName& tagName,
102 Document& document) 102 Document& document)
103 : SVGAnimationElement(tagName, document), 103 : SVGAnimationElement(tagName, document),
104 m_type(AnimatedUnknown), 104 m_type(AnimatedUnknown),
105 m_cssPropertyId(CSSPropertyInvalid), 105 m_cssPropertyId(CSSPropertyInvalid),
106 m_fromPropertyValueType(RegularPropertyValue), 106 m_fromPropertyValueType(RegularPropertyValue),
107 m_toPropertyValueType(RegularPropertyValue), 107 m_toPropertyValueType(RegularPropertyValue),
108 m_attributeType(AttributeTypeAuto), 108 m_attributeType(AttributeTypeAuto) {}
109 m_hasInvalidCSSAttributeType(false) {}
110 109
111 SVGAnimateElement* SVGAnimateElement::create(Document& document) { 110 SVGAnimateElement* SVGAnimateElement::create(Document& document) {
112 return new SVGAnimateElement(SVGNames::animateTag, document); 111 return new SVGAnimateElement(SVGNames::animateTag, document);
113 } 112 }
114 113
115 SVGAnimateElement::~SVGAnimateElement() {} 114 SVGAnimateElement::~SVGAnimateElement() {}
116 115
117 bool SVGAnimateElement::isSVGAnimationAttributeSettingJavaScriptURL( 116 bool SVGAnimateElement::isSVGAnimationAttributeSettingJavaScriptURL(
118 const Attribute& attribute) const { 117 const Attribute& attribute) const {
119 if ((attribute.name() == SVGNames::fromAttr || 118 if ((attribute.name() == SVGNames::fromAttr ||
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 AnimatedPropertyType SVGAnimateElement::animatedPropertyType() { 206 AnimatedPropertyType SVGAnimateElement::animatedPropertyType() {
208 if (!targetElement()) 207 if (!targetElement())
209 return AnimatedUnknown; 208 return AnimatedUnknown;
210 resolveTargetProperty(); 209 resolveTargetProperty();
211 return m_type; 210 return m_type;
212 } 211 }
213 212
214 bool SVGAnimateElement::hasValidTarget() { 213 bool SVGAnimateElement::hasValidTarget() {
215 if (!SVGAnimationElement::hasValidTarget()) 214 if (!SVGAnimationElement::hasValidTarget())
216 return false; 215 return false;
217 if (!hasValidAttributeName()) 216 if (attributeName() == anyQName())
218 return false; 217 return false;
219 resolveTargetProperty(); 218 resolveTargetProperty();
220 return m_type != AnimatedUnknown && !m_hasInvalidCSSAttributeType; 219 if (m_type == AnimatedUnknown)
221 } 220 return false;
222 221 // Always animate CSS properties using the ApplyCSSAnimation code path,
223 bool SVGAnimateElement::hasValidAttributeName() const { 222 // regardless of the attributeType value.
224 return attributeName() != anyQName(); 223 // If attributeType="CSS" and attributeName doesn't point to a CSS property,
224 // ignore the animation.
225 return isTargetAttributeCSSProperty(*targetElement(), attributeName()) ||
226 getAttributeType() != AttributeTypeCSS;
225 } 227 }
226 228
227 bool SVGAnimateElement::shouldApplyAnimation( 229 bool SVGAnimateElement::shouldApplyAnimation(
228 const SVGElement& targetElement, 230 const SVGElement& targetElement,
229 const QualifiedName& attributeName) { 231 const QualifiedName& attributeName) {
230 if (!hasValidTarget() || !targetElement.parentNode()) 232 return targetElement.parentNode() && hasValidTarget();
231 return false;
232
233 // Always animate CSS properties using the ApplyCSSAnimation code path,
234 // regardless of the attributeType value.
235 if (isTargetAttributeCSSProperty(targetElement, attributeName))
236 return true;
237
238 // If attributeType="CSS" and attributeName doesn't point to a CSS property,
239 // ignore the animation.
240 return getAttributeType() != AttributeTypeCSS;
241 } 233 }
242 234
243 SVGPropertyBase* SVGAnimateElement::createPropertyForAttributeAnimation( 235 SVGPropertyBase* SVGAnimateElement::createPropertyForAttributeAnimation(
244 const String& value) const { 236 const String& value) const {
245 // SVG DOM animVal animation code-path. 237 // SVG DOM animVal animation code-path.
246 // TransformList must be animated via <animateTransform>, and its 238 // TransformList must be animated via <animateTransform>, and its
247 // {from,by,to} attribute values needs to be parsed w.r.t. its "type" 239 // {from,by,to} attribute values needs to be parsed w.r.t. its "type"
248 // attribute. Spec: 240 // attribute. Spec:
249 // http://www.w3.org/TR/SVG/single-page.html#animate-AnimateTransformElement 241 // http://www.w3.org/TR/SVG/single-page.html#animate-AnimateTransformElement
250 DCHECK_NE(m_type, AnimatedTransformList); 242 DCHECK_NE(m_type, AnimatedTransformList);
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after
550 float SVGAnimateElement::calculateDistance(const String& fromString, 542 float SVGAnimateElement::calculateDistance(const String& fromString,
551 const String& toString) { 543 const String& toString) {
552 DCHECK(targetElement()); 544 DCHECK(targetElement());
553 // FIXME: A return value of float is not enough to support paced animations on 545 // FIXME: A return value of float is not enough to support paced animations on
554 // lists. 546 // lists.
555 SVGPropertyBase* fromValue = createPropertyForAnimation(fromString); 547 SVGPropertyBase* fromValue = createPropertyForAnimation(fromString);
556 SVGPropertyBase* toValue = createPropertyForAnimation(toString); 548 SVGPropertyBase* toValue = createPropertyForAnimation(toString);
557 return fromValue->calculateDistance(toValue, targetElement()); 549 return fromValue->calculateDistance(toValue, targetElement());
558 } 550 }
559 551
560 void SVGAnimateElement::setTargetElement(SVGElement* target) { 552 void SVGAnimateElement::willChangeAnimationTarget() {
561 SVGAnimationElement::setTargetElement(target); 553 SVGAnimationElement::willChangeAnimationTarget();
562 checkInvalidCSSAttributeType(); 554 if (targetElement())
555 clearAnimatedType();
556 }
557
558 void SVGAnimateElement::didChangeAnimationTarget() {
559 SVGAnimationElement::didChangeAnimationTarget();
563 resetAnimatedPropertyType(); 560 resetAnimatedPropertyType();
564 } 561 }
565 562
566 void SVGAnimateElement::setAttributeName(const QualifiedName& attributeName) { 563 void SVGAnimateElement::setAttributeName(const QualifiedName& attributeName) {
567 unscheduleIfScheduled(); 564 willChangeAnimationTarget();
568 if (targetElement())
569 clearAnimatedType();
570 m_attributeName = attributeName; 565 m_attributeName = attributeName;
571 schedule(); 566 didChangeAnimationTarget();
572 checkInvalidCSSAttributeType();
573 resetAnimatedPropertyType();
574 } 567 }
575 568
576 void SVGAnimateElement::setAttributeType(const AtomicString& attributeType) { 569 void SVGAnimateElement::setAttributeType(const AtomicString& attributeType) {
570 willChangeAnimationTarget();
577 if (attributeType == "CSS") 571 if (attributeType == "CSS")
578 m_attributeType = AttributeTypeCSS; 572 m_attributeType = AttributeTypeCSS;
579 else if (attributeType == "XML") 573 else if (attributeType == "XML")
580 m_attributeType = AttributeTypeXML; 574 m_attributeType = AttributeTypeXML;
581 else 575 else
582 m_attributeType = AttributeTypeAuto; 576 m_attributeType = AttributeTypeAuto;
583 checkInvalidCSSAttributeType(); 577 didChangeAnimationTarget();
584 }
585
586 void SVGAnimateElement::checkInvalidCSSAttributeType() {
587 bool hasInvalidCSSAttributeType =
588 targetElement() && hasValidAttributeName() &&
589 getAttributeType() == AttributeTypeCSS &&
590 !isTargetAttributeCSSProperty(*targetElement(), attributeName());
591
592 if (hasInvalidCSSAttributeType != m_hasInvalidCSSAttributeType) {
593 if (hasInvalidCSSAttributeType)
594 unscheduleIfScheduled();
595
596 m_hasInvalidCSSAttributeType = hasInvalidCSSAttributeType;
597
598 if (!hasInvalidCSSAttributeType)
599 schedule();
600 }
601
602 // Clear values that may depend on the previous target.
603 if (targetElement())
604 clearAnimatedType();
605 } 578 }
606 579
607 void SVGAnimateElement::resetAnimatedPropertyType() { 580 void SVGAnimateElement::resetAnimatedPropertyType() {
608 DCHECK(!m_animatedValue); 581 DCHECK(!m_animatedValue);
609 m_fromProperty.clear(); 582 m_fromProperty.clear();
610 m_toProperty.clear(); 583 m_toProperty.clear();
611 m_toAtEndOfDurationProperty.clear(); 584 m_toAtEndOfDurationProperty.clear();
612 clearTargetProperty(); 585 clearTargetProperty();
613 } 586 }
614 587
615 DEFINE_TRACE(SVGAnimateElement) { 588 DEFINE_TRACE(SVGAnimateElement) {
616 visitor->trace(m_fromProperty); 589 visitor->trace(m_fromProperty);
617 visitor->trace(m_toProperty); 590 visitor->trace(m_toProperty);
618 visitor->trace(m_toAtEndOfDurationProperty); 591 visitor->trace(m_toAtEndOfDurationProperty);
619 visitor->trace(m_animatedValue); 592 visitor->trace(m_animatedValue);
620 visitor->trace(m_targetProperty); 593 visitor->trace(m_targetProperty);
621 SVGAnimationElement::trace(visitor); 594 SVGAnimationElement::trace(visitor);
622 } 595 }
623 596
624 } // namespace blink 597 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/svg/SVGAnimateElement.h ('k') | third_party/WebKit/Source/core/svg/animation/SVGSMILElement.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698