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

Unified Diff: third_party/WebKit/Source/core/svg/SVGAnimateElement.cpp

Issue 2496583002: Refactor CSS property mapping for SMIL Animation (Closed)
Patch Set: Created 4 years, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/svg/SVGAnimateElement.cpp
diff --git a/third_party/WebKit/Source/core/svg/SVGAnimateElement.cpp b/third_party/WebKit/Source/core/svg/SVGAnimateElement.cpp
index 36c385f2078736f150b95f586ed2665536de1d53..0da36fda5a0a4bca0fbef254e692da32f32eab33 100644
--- a/third_party/WebKit/Source/core/svg/SVGAnimateElement.cpp
+++ b/third_party/WebKit/Source/core/svg/SVGAnimateElement.cpp
@@ -22,7 +22,6 @@
#include "core/svg/SVGAnimateElement.h"
-#include "core/CSSPropertyNames.h"
#include "core/css/CSSComputedStyleDeclaration.h"
#include "core/css/StylePropertySet.h"
#include "core/dom/Document.h"
@@ -34,7 +33,7 @@ namespace blink {
namespace {
-bool isTargetAttributeCSSProperty(SVGElement& targetElement,
+bool isTargetAttributeCSSProperty(const SVGElement& targetElement,
const QualifiedName& attributeName) {
return SVGElement::isAnimatableCSSProperty(attributeName) ||
targetElement.isPresentationAttribute(attributeName);
@@ -125,7 +124,7 @@ AnimatedPropertyType SVGAnimateElement::animatedPropertyType() {
if (!targetElement())
return AnimatedUnknown;
- m_animator.reset(targetElement());
+ m_animator.reset(*targetElement());
return m_animator.type();
}
@@ -145,26 +144,20 @@ bool SVGAnimateElement::hasValidAttributeType() {
!hasInvalidCSSAttributeType();
}
-SVGAnimateElement::ShouldApplyAnimationType
-SVGAnimateElement::shouldApplyAnimation(SVGElement* targetElement,
- const QualifiedName& attributeName) {
- if (!hasValidTarget() || !targetElement->parentNode())
- return DontApplyAnimation;
+bool SVGAnimateElement::shouldApplyAnimation(
+ const SVGElement& targetElement,
+ const QualifiedName& attributeName) {
+ if (!hasValidTarget() || !targetElement.parentNode())
+ return false;
// Always animate CSS properties using the ApplyCSSAnimation code path,
// regardless of the attributeType value.
- if (isTargetAttributeCSSProperty(*targetElement, attributeName)) {
- if (targetElement->isPresentationAttributeWithSVGDOM(attributeName))
- return ApplyXMLandCSSAnimation;
+ if (isTargetAttributeCSSProperty(targetElement, attributeName))
+ return true;
- return ApplyCSSAnimation;
- }
// If attributeType="CSS" and attributeName doesn't point to a CSS property,
// ignore the animation.
- if (getAttributeType() == AttributeTypeCSS)
- return DontApplyAnimation;
-
- return ApplyXMLAnimation;
+ return getAttributeType() != AttributeTypeCSS;
}
SVGPropertyBase* SVGAnimateElement::adjustForInheritance(
@@ -173,7 +166,7 @@ SVGPropertyBase* SVGAnimateElement::adjustForInheritance(
if (valueType != InheritValue)
return propertyValue;
// TODO(fs): At the moment the computed style gets returned as a String and
- // needs to get parsed again. In the future we might want to work with the
+ // needs to get parsed again. In the future we might want to work with the
// value type directly to avoid the String parsing.
DCHECK(targetElement());
Element* parent = targetElement()->parentElement();
@@ -181,8 +174,7 @@ SVGPropertyBase* SVGAnimateElement::adjustForInheritance(
return propertyValue;
SVGElement* svgParent = toSVGElement(parent);
// Replace 'inherit' by its computed property value.
- String value = computeCSSPropertyValue(
- svgParent, cssPropertyID(attributeName().localName()));
+ String value = computeCSSPropertyValue(svgParent, m_animator.cssProperty());
return m_animator.createPropertyForAnimation(value);
}
@@ -216,7 +208,6 @@ void SVGAnimateElement::calculateAnimatedValue(float percentage,
// Target element might have changed.
SVGElement* targetElement = this->targetElement();
- m_animator.setContextElement(targetElement);
// Values-animation accumulates using the last values entry corresponding to
// the end of duration time.
@@ -282,25 +273,24 @@ void SVGAnimateElement::resetAnimatedType() {
SVGElement* targetElement = this->targetElement();
const QualifiedName& attributeName = this->attributeName();
- m_animator.reset(targetElement);
+ m_animator.reset(*targetElement);
- ShouldApplyAnimationType shouldApply =
- shouldApplyAnimation(targetElement, attributeName);
- if (shouldApply == DontApplyAnimation)
+ if (!shouldApplyAnimation(*targetElement, attributeName))
return;
- if (shouldApply == ApplyXMLAnimation ||
- shouldApply == ApplyXMLandCSSAnimation) {
+ if (m_animator.isAnimatingSVGDom()) {
// SVG DOM animVal animation code-path.
m_animatedProperty = m_animator.createAnimatedValue();
targetElement->setAnimatedAttribute(attributeName, m_animatedProperty);
return;
}
- DCHECK_EQ(shouldApply, ApplyCSSAnimation);
+ DCHECK(m_animator.isAnimatingCSSProperty());
+ // Presentation attributes which has an SVG DOM representation should use the
+ // "SVG DOM" code-path (above.)
+ DCHECK(SVGElement::isAnimatableCSSProperty(attributeName));
// CSS properties animation code-path.
- DCHECK(isTargetAttributeCSSProperty(*targetElement, attributeName));
- String baseValue = computeCSSPropertyValue(
- targetElement, cssPropertyID(attributeName.localName()));
+ String baseValue =
+ computeCSSPropertyValue(targetElement, m_animator.cssProperty());
m_animatedProperty = m_animator.createPropertyForAnimation(baseValue);
}
@@ -320,24 +310,23 @@ void SVGAnimateElement::clearAnimatedType() {
return;
}
- ShouldApplyAnimationType shouldApply =
- shouldApplyAnimation(targetElement, attributeName());
- if (shouldApply == ApplyXMLandCSSAnimation ||
- m_animator.isAnimatingCSSProperty()) {
+ bool shouldApply = shouldApplyAnimation(*targetElement, attributeName());
+ if (m_animator.isAnimatingCSSProperty()) {
// CSS properties animation code-path.
- if (shouldApply != DontApplyAnimation) {
- CSSPropertyID id = cssPropertyID(attributeName().localName());
- targetElement->ensureAnimatedSMILStyleProperties()->removeProperty(id);
- targetElement->setNeedsStyleRecalc(
- LocalStyleChange,
- StyleChangeReasonForTracing::create(StyleChangeReason::Animation));
+ if (shouldApply) {
+ MutableStylePropertySet* propertySet =
+ targetElement->ensureAnimatedSMILStyleProperties();
+ if (propertySet->removeProperty(m_animator.cssProperty())) {
+ targetElement->setNeedsStyleRecalc(
+ LocalStyleChange,
+ StyleChangeReasonForTracing::create(StyleChangeReason::Animation));
+ }
}
}
- if (shouldApply == ApplyXMLandCSSAnimation ||
- m_animator.isAnimatingSVGDom()) {
+ if (m_animator.isAnimatingSVGDom()) {
// SVG DOM animVal animation code-path.
targetElement->clearAnimatedAttribute(attributeName());
- if (shouldApply != DontApplyAnimation)
+ if (shouldApply)
targetElement->invalidateAnimatedAttribute(attributeName());
}
@@ -355,28 +344,26 @@ void SVGAnimateElement::applyResultsToTarget() {
if (!m_animatedProperty)
return;
+ if (!shouldApplyAnimation(*targetElement(), attributeName()))
+ return;
+
// We do update the style and the animation property independent of each
// other.
- ShouldApplyAnimationType shouldApply =
- shouldApplyAnimation(targetElement(), attributeName());
- if (shouldApply == DontApplyAnimation)
- return;
- if (shouldApply == ApplyXMLandCSSAnimation ||
- m_animator.isAnimatingCSSProperty()) {
+ if (m_animator.isAnimatingCSSProperty()) {
// CSS properties animation code-path.
// Convert the result of the animation to a String and apply it as CSS
// property on the target.
- CSSPropertyID id = cssPropertyID(attributeName().localName());
MutableStylePropertySet* propertySet =
targetElement()->ensureAnimatedSMILStyleProperties();
- if (propertySet->setProperty(id, m_animatedProperty->valueAsString(), false,
- 0))
+ if (propertySet->setProperty(m_animator.cssProperty(),
+ m_animatedProperty->valueAsString(), false,
+ 0)) {
targetElement()->setNeedsStyleRecalc(
LocalStyleChange,
StyleChangeReasonForTracing::create(StyleChangeReason::Animation));
+ }
}
- if (shouldApply == ApplyXMLandCSSAnimation ||
- m_animator.isAnimatingSVGDom()) {
+ if (m_animator.isAnimatingSVGDom()) {
// SVG DOM animVal animation code-path.
// At this point the SVG DOM values are already changed, unlike for CSS.
// We only have to trigger update notifications here.
« no previous file with comments | « third_party/WebKit/Source/core/svg/SVGAnimateElement.h ('k') | third_party/WebKit/Source/core/svg/SVGAnimatedTypeAnimator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698