Index: third_party/WebKit/Source/core/animation/StringKeyframe.cpp |
diff --git a/third_party/WebKit/Source/core/animation/StringKeyframe.cpp b/third_party/WebKit/Source/core/animation/StringKeyframe.cpp |
index 61a93763675fa0f4d4415ccbf99528fa2ec54065..581f943e08be2e38487a49b2166277dd1e153ee7 100644 |
--- a/third_party/WebKit/Source/core/animation/StringKeyframe.cpp |
+++ b/third_party/WebKit/Source/core/animation/StringKeyframe.cpp |
@@ -5,6 +5,7 @@ |
#include "config.h" |
#include "core/animation/StringKeyframe.h" |
+#include "core/XLinkNames.h" |
#include "core/animation/AngleSVGInterpolation.h" |
#include "core/animation/CSSColorInterpolationType.h" |
#include "core/animation/CSSImageInterpolationType.h" |
@@ -38,6 +39,7 @@ |
#include "core/animation/PointSVGInterpolation.h" |
#include "core/animation/RectSVGInterpolation.h" |
#include "core/animation/SVGStrokeDasharrayStyleInterpolation.h" |
+#include "core/animation/SVGValueInterpolationType.h" |
#include "core/animation/TransformSVGInterpolation.h" |
#include "core/animation/VisibilityStyleInterpolation.h" |
#include "core/animation/css/CSSAnimations.h" |
@@ -130,131 +132,176 @@ bool StringKeyframe::CSSPropertySpecificKeyframe::populateAnimatableValue(CSSPro |
namespace { |
-const Vector<const InterpolationType*>* applicableTypesForProperty(CSSPropertyID property) |
+// TODO(alancutter): Move this into its own file. |
+const Vector<const InterpolationType*>* applicableTypesForProperty(PropertyHandle property) |
{ |
- using ApplicableTypesMap = HashMap<CSSPropertyID, const Vector<const InterpolationType*>*>; |
+ // TODO(alancutter): Initialise this entire HashMap once instead of initialising each property individually. |
+ using ApplicableTypesMap = HashMap<PropertyHandle, const Vector<const InterpolationType*>*>; |
DEFINE_STATIC_LOCAL(ApplicableTypesMap, applicableTypesMap, ()); |
auto entry = applicableTypesMap.find(property); |
if (entry != applicableTypesMap.end()) |
return entry->value; |
+ bool fallbackToLegacy = false; |
auto applicableTypes = new Vector<const InterpolationType*>(); |
- switch (property) { |
- case CSSPropertyBaselineShift: |
- case CSSPropertyBorderBottomWidth: |
- case CSSPropertyBorderLeftWidth: |
- case CSSPropertyBorderRightWidth: |
- case CSSPropertyBorderTopWidth: |
- case CSSPropertyBottom: |
- case CSSPropertyCx: |
- case CSSPropertyCy: |
- case CSSPropertyFlexBasis: |
- case CSSPropertyHeight: |
- case CSSPropertyLeft: |
- case CSSPropertyLetterSpacing: |
- case CSSPropertyMarginBottom: |
- case CSSPropertyMarginLeft: |
- case CSSPropertyMarginRight: |
- case CSSPropertyMarginTop: |
- case CSSPropertyMaxHeight: |
- case CSSPropertyMaxWidth: |
- case CSSPropertyMinHeight: |
- case CSSPropertyMinWidth: |
- case CSSPropertyMotionOffset: |
- case CSSPropertyOutlineOffset: |
- case CSSPropertyOutlineWidth: |
- case CSSPropertyPaddingBottom: |
- case CSSPropertyPaddingLeft: |
- case CSSPropertyPaddingRight: |
- case CSSPropertyPaddingTop: |
- case CSSPropertyPerspective: |
- case CSSPropertyR: |
- case CSSPropertyRight: |
- case CSSPropertyRx: |
- case CSSPropertyRy: |
- case CSSPropertyShapeMargin: |
- case CSSPropertyStrokeDashoffset: |
- case CSSPropertyStrokeWidth: |
- case CSSPropertyTop: |
- case CSSPropertyVerticalAlign: |
- case CSSPropertyWebkitBorderHorizontalSpacing: |
- case CSSPropertyWebkitBorderVerticalSpacing: |
- case CSSPropertyWebkitColumnGap: |
- case CSSPropertyWebkitColumnRuleWidth: |
- case CSSPropertyWebkitColumnWidth: |
- case CSSPropertyWebkitPerspectiveOriginX: |
- case CSSPropertyWebkitPerspectiveOriginY: |
- case CSSPropertyWebkitTransformOriginX: |
- case CSSPropertyWebkitTransformOriginY: |
- case CSSPropertyWebkitTransformOriginZ: |
- case CSSPropertyWidth: |
- case CSSPropertyWordSpacing: |
- case CSSPropertyX: |
- case CSSPropertyY: |
- applicableTypes->append(new CSSLengthInterpolationType(property)); |
- break; |
- case CSSPropertyFlexGrow: |
- case CSSPropertyFlexShrink: |
- case CSSPropertyFillOpacity: |
- case CSSPropertyFloodOpacity: |
- case CSSPropertyFontSizeAdjust: |
- case CSSPropertyOpacity: |
- case CSSPropertyOrphans: |
- case CSSPropertyShapeImageThreshold: |
- case CSSPropertyStopOpacity: |
- case CSSPropertyStrokeMiterlimit: |
- case CSSPropertyStrokeOpacity: |
- case CSSPropertyWebkitColumnCount: |
- case CSSPropertyWidows: |
- case CSSPropertyZIndex: |
- applicableTypes->append(new CSSNumberInterpolationType(property)); |
- break; |
- case CSSPropertyLineHeight: |
- applicableTypes->append(new CSSLengthInterpolationType(property)); |
- applicableTypes->append(new CSSNumberInterpolationType(property)); |
- break; |
- case CSSPropertyBackgroundColor: |
- case CSSPropertyBorderBottomColor: |
- case CSSPropertyBorderLeftColor: |
- case CSSPropertyBorderRightColor: |
- case CSSPropertyBorderTopColor: |
- case CSSPropertyColor: |
- case CSSPropertyFloodColor: |
- case CSSPropertyLightingColor: |
- case CSSPropertyOutlineColor: |
- case CSSPropertyStopColor: |
- case CSSPropertyTextDecorationColor: |
- case CSSPropertyWebkitColumnRuleColor: |
- case CSSPropertyWebkitTextStrokeColor: |
- applicableTypes->append(new CSSColorInterpolationType(property)); |
- break; |
- case CSSPropertyFill: |
- case CSSPropertyStroke: |
- applicableTypes->append(new CSSPaintInterpolationType(property)); |
- break; |
- case CSSPropertyBoxShadow: |
- case CSSPropertyTextShadow: |
- applicableTypes->append(new CSSShadowListInterpolationType(property)); |
- break; |
- case CSSPropertyBorderImageSource: |
- case CSSPropertyListStyleImage: |
- case CSSPropertyWebkitMaskBoxImageSource: |
- applicableTypes->append(new CSSImageInterpolationType(property)); |
- break; |
- case CSSPropertyBackgroundImage: |
- case CSSPropertyWebkitMaskImage: |
- applicableTypes->append(new CSSImageListInterpolationType(property)); |
- break; |
- default: |
- // TODO(alancutter): Support all interpolable CSS properties here so we can stop falling back to the old StyleInterpolation implementation. |
- if (CSSPropertyMetadata::isInterpolableProperty(property)) { |
- delete applicableTypes; |
- applicableTypesMap.add(property, nullptr); |
- return nullptr; |
+ |
+ if (property.isCSSProperty()) { |
+ CSSPropertyID cssProperty = property.cssProperty(); |
+ switch (cssProperty) { |
+ case CSSPropertyBaselineShift: |
+ case CSSPropertyBorderBottomWidth: |
+ case CSSPropertyBorderLeftWidth: |
+ case CSSPropertyBorderRightWidth: |
+ case CSSPropertyBorderTopWidth: |
+ case CSSPropertyBottom: |
+ case CSSPropertyCx: |
+ case CSSPropertyCy: |
+ case CSSPropertyFlexBasis: |
+ case CSSPropertyHeight: |
+ case CSSPropertyLeft: |
+ case CSSPropertyLetterSpacing: |
+ case CSSPropertyMarginBottom: |
+ case CSSPropertyMarginLeft: |
+ case CSSPropertyMarginRight: |
+ case CSSPropertyMarginTop: |
+ case CSSPropertyMaxHeight: |
+ case CSSPropertyMaxWidth: |
+ case CSSPropertyMinHeight: |
+ case CSSPropertyMinWidth: |
+ case CSSPropertyMotionOffset: |
+ case CSSPropertyOutlineOffset: |
+ case CSSPropertyOutlineWidth: |
+ case CSSPropertyPaddingBottom: |
+ case CSSPropertyPaddingLeft: |
+ case CSSPropertyPaddingRight: |
+ case CSSPropertyPaddingTop: |
+ case CSSPropertyPerspective: |
+ case CSSPropertyR: |
+ case CSSPropertyRight: |
+ case CSSPropertyRx: |
+ case CSSPropertyRy: |
+ case CSSPropertyShapeMargin: |
+ case CSSPropertyStrokeDashoffset: |
+ case CSSPropertyStrokeWidth: |
+ case CSSPropertyTop: |
+ case CSSPropertyVerticalAlign: |
+ case CSSPropertyWebkitBorderHorizontalSpacing: |
+ case CSSPropertyWebkitBorderVerticalSpacing: |
+ case CSSPropertyWebkitColumnGap: |
+ case CSSPropertyWebkitColumnRuleWidth: |
+ case CSSPropertyWebkitColumnWidth: |
+ case CSSPropertyWebkitPerspectiveOriginX: |
+ case CSSPropertyWebkitPerspectiveOriginY: |
+ case CSSPropertyWebkitTransformOriginX: |
+ case CSSPropertyWebkitTransformOriginY: |
+ case CSSPropertyWebkitTransformOriginZ: |
+ case CSSPropertyWidth: |
+ case CSSPropertyWordSpacing: |
+ case CSSPropertyX: |
+ case CSSPropertyY: |
+ applicableTypes->append(new CSSLengthInterpolationType(cssProperty)); |
+ break; |
+ case CSSPropertyFlexGrow: |
+ case CSSPropertyFlexShrink: |
+ case CSSPropertyFillOpacity: |
+ case CSSPropertyFloodOpacity: |
+ case CSSPropertyFontSizeAdjust: |
+ case CSSPropertyOpacity: |
+ case CSSPropertyOrphans: |
+ case CSSPropertyShapeImageThreshold: |
+ case CSSPropertyStopOpacity: |
+ case CSSPropertyStrokeMiterlimit: |
+ case CSSPropertyStrokeOpacity: |
+ case CSSPropertyWebkitColumnCount: |
+ case CSSPropertyWidows: |
+ case CSSPropertyZIndex: |
+ applicableTypes->append(new CSSNumberInterpolationType(cssProperty)); |
+ break; |
+ case CSSPropertyLineHeight: |
+ applicableTypes->append(new CSSLengthInterpolationType(cssProperty)); |
+ applicableTypes->append(new CSSNumberInterpolationType(cssProperty)); |
+ break; |
+ case CSSPropertyBackgroundColor: |
+ case CSSPropertyBorderBottomColor: |
+ case CSSPropertyBorderLeftColor: |
+ case CSSPropertyBorderRightColor: |
+ case CSSPropertyBorderTopColor: |
+ case CSSPropertyColor: |
+ case CSSPropertyFloodColor: |
+ case CSSPropertyLightingColor: |
+ case CSSPropertyOutlineColor: |
+ case CSSPropertyStopColor: |
+ case CSSPropertyTextDecorationColor: |
+ case CSSPropertyWebkitColumnRuleColor: |
+ case CSSPropertyWebkitTextStrokeColor: |
+ applicableTypes->append(new CSSColorInterpolationType(cssProperty)); |
+ break; |
+ case CSSPropertyFill: |
+ case CSSPropertyStroke: |
+ applicableTypes->append(new CSSPaintInterpolationType(cssProperty)); |
+ break; |
+ case CSSPropertyBoxShadow: |
+ case CSSPropertyTextShadow: |
+ applicableTypes->append(new CSSShadowListInterpolationType(cssProperty)); |
+ break; |
+ case CSSPropertyBorderImageSource: |
+ case CSSPropertyListStyleImage: |
+ case CSSPropertyWebkitMaskBoxImageSource: |
+ applicableTypes->append(new CSSImageInterpolationType(cssProperty)); |
+ break; |
+ case CSSPropertyBackgroundImage: |
+ case CSSPropertyWebkitMaskImage: |
+ applicableTypes->append(new CSSImageListInterpolationType(cssProperty)); |
+ break; |
+ default: |
+ // TODO(alancutter): Support all interpolable CSS properties here so we can stop falling back to the old StyleInterpolation implementation. |
+ if (CSSPropertyMetadata::isInterpolableProperty(cssProperty)) |
+ fallbackToLegacy = true; |
+ break; |
+ } |
+ applicableTypes->append(new CSSValueInterpolationType(cssProperty)); |
+ } else { |
+ const QualifiedName& attribute = property.svgAttribute(); |
+ if (attribute == HTMLNames::classAttr |
+ || attribute == SVGNames::clipPathUnitsAttr |
+ || attribute == SVGNames::edgeModeAttr |
+ || attribute == SVGNames::filterUnitsAttr |
+ || attribute == SVGNames::gradientUnitsAttr |
+ || attribute == SVGNames::inAttr |
+ || attribute == SVGNames::in2Attr |
+ || attribute == SVGNames::lengthAdjustAttr |
+ || attribute == SVGNames::markerUnitsAttr |
+ || attribute == SVGNames::maskContentUnitsAttr |
+ || attribute == SVGNames::maskUnitsAttr |
+ || attribute == SVGNames::methodAttr |
+ || attribute == SVGNames::modeAttr |
+ || attribute == SVGNames::operatorAttr |
+ || attribute == SVGNames::patternContentUnitsAttr |
+ || attribute == SVGNames::patternUnitsAttr |
+ || attribute == SVGNames::preserveAlphaAttr |
+ || attribute == SVGNames::preserveAspectRatioAttr |
+ || attribute == SVGNames::primitiveUnitsAttr |
+ || attribute == SVGNames::resultAttr |
+ || attribute == SVGNames::spacingAttr |
+ || attribute == SVGNames::spreadMethodAttr |
+ || attribute == SVGNames::stitchTilesAttr |
+ || attribute == SVGNames::targetAttr |
+ || attribute == SVGNames::typeAttr |
+ || attribute == SVGNames::xChannelSelectorAttr |
+ || attribute == SVGNames::yChannelSelectorAttr |
+ || attribute == XLinkNames::hrefAttr) { |
+ applicableTypes->append(new SVGValueInterpolationType(attribute)); |
+ } else { |
+ fallbackToLegacy = true; |
} |
- break; |
} |
- applicableTypes->append(new CSSValueInterpolationType(property)); |
+ |
+ if (fallbackToLegacy) { |
+ delete applicableTypes; |
+ applicableTypesMap.add(property, nullptr); |
+ return nullptr; |
+ } |
+ |
applicableTypesMap.add(property, applicableTypes); |
return applicableTypes; |
} |
@@ -279,14 +326,14 @@ PassRefPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyframe::createLeg |
PassRefPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyframe::maybeCreateInterpolation(PropertyHandle propertyHandle, Keyframe::PropertySpecificKeyframe& end, Element* element, const ComputedStyle* baseStyle) const |
{ |
- CSSPropertyID property = propertyHandle.cssProperty(); |
- const Vector<const InterpolationType*>* applicableTypes = applicableTypesForProperty(property); |
+ const Vector<const InterpolationType*>* applicableTypes = applicableTypesForProperty(propertyHandle); |
if (applicableTypes) |
return InvalidatableInterpolation::create(*applicableTypes, *this, end); |
// TODO(alancutter): Remove the remainder of this function. |
// FIXME: Refactor this into a generic piece that lives in InterpolationEffect, and a template parameter specific converter. |
+ CSSPropertyID property = propertyHandle.cssProperty(); |
CSSValue* fromCSSValue = m_value.get(); |
CSSValue* toCSSValue = toCSSPropertySpecificKeyframe(end).value(); |
InterpolationRange range = RangeAll; |
@@ -527,6 +574,10 @@ PassRefPtr<Interpolation> createSVGInterpolation(SVGPropertyBase* fromValue, SVG |
PassRefPtr<Interpolation> SVGPropertySpecificKeyframe::maybeCreateInterpolation(PropertyHandle propertyHandle, Keyframe::PropertySpecificKeyframe& end, Element* element, const ComputedStyle* baseStyle) const |
{ |
+ const Vector<const InterpolationType*>* applicableTypes = applicableTypesForProperty(propertyHandle); |
+ if (applicableTypes) |
+ return InvalidatableInterpolation::create(*applicableTypes, *this, end); |
+ |
ASSERT(element); |
RefPtrWillBeRawPtr<SVGAnimatedPropertyBase> attribute = toSVGElement(element)->propertyFromAttribute(propertyHandle.svgAttribute()); |
ASSERT(attribute); |