| Index: Source/core/animation/StringKeyframe.cpp
|
| diff --git a/Source/core/animation/StringKeyframe.cpp b/Source/core/animation/StringKeyframe.cpp
|
| index 76e4fcf7843944e1b8c7d0418a1923e5d4df1720..ca62b1dc0a028ddd4f10ddc2f54d19e4ec8cae6e 100644
|
| --- a/Source/core/animation/StringKeyframe.cpp
|
| +++ b/Source/core/animation/StringKeyframe.cpp
|
| @@ -56,7 +56,7 @@ void StringKeyframe::setPropertyValue(CSSPropertyID property, const String& valu
|
| m_propertySet->setProperty(property, value, false, styleSheetContents);
|
| }
|
|
|
| -void StringKeyframe::setPropertyValue(CSSPropertyID property, PassRefPtrWillBeRawPtr<CSSValue> value)
|
| +void StringKeyframe::setPropertyValue(CSSPropertyID property, CSSValue value)
|
| {
|
| ASSERT(property != CSSPropertyInvalid);
|
| ASSERT(CSSAnimations::isAllowedAnimation(property));
|
| @@ -103,12 +103,12 @@ DEFINE_TRACE(StringKeyframe)
|
| Keyframe::trace(visitor);
|
| }
|
|
|
| -StringKeyframe::CSSPropertySpecificKeyframe::CSSPropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, CSSValue* value, EffectModel::CompositeOperation op)
|
| +StringKeyframe::CSSPropertySpecificKeyframe::CSSPropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, NullableCSSValue value, EffectModel::CompositeOperation op)
|
| : Keyframe::PropertySpecificKeyframe(offset, easing, op)
|
| , m_value(value)
|
| { }
|
|
|
| -StringKeyframe::CSSPropertySpecificKeyframe::CSSPropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, CSSValue* value)
|
| +StringKeyframe::CSSPropertySpecificKeyframe::CSSPropertySpecificKeyframe(double offset, PassRefPtr<TimingFunction> easing, NullableCSSValue value)
|
| : Keyframe::PropertySpecificKeyframe(offset, easing, EffectModel::CompositeReplace)
|
| , m_value(value)
|
| {
|
| @@ -118,7 +118,7 @@ StringKeyframe::CSSPropertySpecificKeyframe::CSSPropertySpecificKeyframe(double
|
| void StringKeyframe::CSSPropertySpecificKeyframe::populateAnimatableValue(CSSPropertyID property, Element& element, const ComputedStyle* baseStyle) const
|
| {
|
| if (!m_animatableValueCache && (baseStyle || !m_value->isInheritedValue()))
|
| - m_animatableValueCache = StyleResolver::createAnimatableValueSnapshot(element, baseStyle, property, m_value.get());
|
| + m_animatableValueCache = StyleResolver::createAnimatableValueSnapshot(element, baseStyle, property, m_value);
|
| }
|
|
|
| namespace {
|
| @@ -157,8 +157,8 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyfram
|
| CSSPropertyID property = propertyHandle.cssProperty();
|
|
|
| // FIXME: Refactor this into a generic piece that lives in InterpolationEffect, and a template parameter specific converter.
|
| - CSSValue* fromCSSValue = m_value.get();
|
| - CSSValue* toCSSValue = toCSSPropertySpecificKeyframe(end).value();
|
| + NullableCSSValue nullableFromCSSValue = m_value;
|
| + NullableCSSValue nullableToCSSValue = toCSSPropertySpecificKeyframe(end).value();
|
| InterpolationRange range = RangeAll;
|
| bool fallBackToLegacy = false;
|
|
|
| @@ -166,13 +166,13 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyfram
|
| bool forceDefaultInterpolation = false;
|
|
|
| // FIXME: Remove this check once neutral keyframes are implemented in StringKeyframes.
|
| - if (!fromCSSValue || !toCSSValue)
|
| - return DeferredLegacyStyleInterpolation::create(fromCSSValue, toCSSValue, property);
|
| -
|
| - ASSERT(fromCSSValue && toCSSValue);
|
| + if (!nullableFromCSSValue || !nullableToCSSValue)
|
| + return DeferredLegacyStyleInterpolation::create(nullableFromCSSValue, nullableToCSSValue, property);
|
| + CSSValue& fromCSSValue = *nullableFromCSSValue;
|
| + CSSValue& toCSSValue = *nullableToCSSValue;
|
|
|
| if (!CSSPropertyMetadata::isAnimatableProperty(property)) {
|
| - if (fromCSSValue == toCSSValue)
|
| + if (fromCSSValue.ptrEquals(toCSSValue))
|
| return ConstantStyleInterpolation::create(fromCSSValue, property);
|
|
|
| return nullptr;
|
| @@ -181,11 +181,11 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyfram
|
| // FIXME: Generate this giant switch statement.
|
| switch (property) {
|
| case CSSPropertyLineHeight:
|
| - if (LengthStyleInterpolation::canCreateFrom(*fromCSSValue) && LengthStyleInterpolation::canCreateFrom(*toCSSValue))
|
| - return LengthStyleInterpolation::create(*fromCSSValue, *toCSSValue, property, RangeNonNegative);
|
| + if (LengthStyleInterpolation::canCreateFrom(fromCSSValue) && LengthStyleInterpolation::canCreateFrom(toCSSValue))
|
| + return LengthStyleInterpolation::create(fromCSSValue, toCSSValue, property, RangeNonNegative);
|
|
|
| - if (DoubleStyleInterpolation::canCreateFrom(*fromCSSValue) && DoubleStyleInterpolation::canCreateFrom(*toCSSValue))
|
| - return DoubleStyleInterpolation::create(*fromCSSValue, *toCSSValue, property, CSSPrimitiveValue::CSS_NUMBER, RangeNonNegative);
|
| + if (DoubleStyleInterpolation::canCreateFrom(fromCSSValue) && DoubleStyleInterpolation::canCreateFrom(toCSSValue))
|
| + return DoubleStyleInterpolation::create(fromCSSValue, toCSSValue, property, CSSPrimitiveValue::CSS_NUMBER, RangeNonNegative);
|
|
|
| break;
|
| case CSSPropertyBorderBottomWidth:
|
| @@ -242,8 +242,8 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyfram
|
| case CSSPropertyWebkitTransformOriginZ:
|
| case CSSPropertyX:
|
| case CSSPropertyY:
|
| - if (LengthStyleInterpolation::canCreateFrom(*fromCSSValue, property) && LengthStyleInterpolation::canCreateFrom(*toCSSValue, property))
|
| - return LengthStyleInterpolation::create(*fromCSSValue, *toCSSValue, property, range);
|
| + if (LengthStyleInterpolation::canCreateFrom(fromCSSValue, property) && LengthStyleInterpolation::canCreateFrom(toCSSValue, property))
|
| + return LengthStyleInterpolation::create(fromCSSValue, toCSSValue, property, range);
|
|
|
| // FIXME: Handle keywords e.g. 'smaller', 'larger'.
|
| if (property == CSSPropertyFontSize)
|
| @@ -266,19 +266,19 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyfram
|
| case CSSPropertyStopOpacity:
|
| case CSSPropertyStrokeOpacity:
|
| case CSSPropertyStrokeMiterlimit:
|
| - if (DoubleStyleInterpolation::canCreateFrom(*fromCSSValue) && DoubleStyleInterpolation::canCreateFrom(*toCSSValue))
|
| - return DoubleStyleInterpolation::create(*fromCSSValue, *toCSSValue, property, toCSSPrimitiveValue(fromCSSValue)->primitiveType(), setRange(property));
|
| + if (DoubleStyleInterpolation::canCreateFrom(fromCSSValue) && DoubleStyleInterpolation::canCreateFrom(toCSSValue))
|
| + return DoubleStyleInterpolation::create(fromCSSValue, toCSSValue, property, toCSSPrimitiveValue(fromCSSValue).primitiveType(), setRange(property));
|
| break;
|
|
|
| case CSSPropertyMotionRotation: {
|
| - RefPtrWillBeRawPtr<Interpolation> interpolation = DoubleStyleInterpolation::maybeCreateFromMotionRotation(*fromCSSValue, *toCSSValue, property);
|
| + RefPtrWillBeRawPtr<Interpolation> interpolation = DoubleStyleInterpolation::maybeCreateFromMotionRotation(fromCSSValue, toCSSValue, property);
|
| if (interpolation)
|
| return interpolation.release();
|
| break;
|
| }
|
| case CSSPropertyVisibility:
|
| - if (VisibilityStyleInterpolation::canCreateFrom(*fromCSSValue) && VisibilityStyleInterpolation::canCreateFrom(*toCSSValue) && (VisibilityStyleInterpolation::isVisible(*fromCSSValue) || VisibilityStyleInterpolation::isVisible(*toCSSValue)))
|
| - return VisibilityStyleInterpolation::create(*fromCSSValue, *toCSSValue, property);
|
| + if (VisibilityStyleInterpolation::canCreateFrom(fromCSSValue) && VisibilityStyleInterpolation::canCreateFrom(toCSSValue) && (VisibilityStyleInterpolation::isVisible(fromCSSValue) || VisibilityStyleInterpolation::isVisible(toCSSValue)))
|
| + return VisibilityStyleInterpolation::create(fromCSSValue, toCSSValue, property);
|
|
|
| break;
|
|
|
| @@ -298,12 +298,12 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyfram
|
| case CSSPropertyWebkitColumnRuleColor:
|
| case CSSPropertyWebkitTextStrokeColor:
|
| {
|
| - RefPtrWillBeRawPtr<Interpolation> interpolation = ColorStyleInterpolation::maybeCreateFromColor(*fromCSSValue, *toCSSValue, property);
|
| + RefPtrWillBeRawPtr<Interpolation> interpolation = ColorStyleInterpolation::maybeCreateFromColor(fromCSSValue, toCSSValue, property);
|
| if (interpolation)
|
| return interpolation.release();
|
|
|
| // Current color should use LegacyStyleInterpolation
|
| - if (ColorStyleInterpolation::shouldUseLegacyStyleInterpolation(*fromCSSValue, *toCSSValue))
|
| + if (ColorStyleInterpolation::shouldUseLegacyStyleInterpolation(fromCSSValue, toCSSValue))
|
| fallBackToLegacy = true;
|
|
|
| break;
|
| @@ -312,11 +312,11 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyfram
|
| case CSSPropertyBorderImageSource:
|
| case CSSPropertyListStyleImage:
|
| case CSSPropertyWebkitMaskBoxImageSource:
|
| - if (fromCSSValue == toCSSValue)
|
| + if (fromCSSValue.ptrEquals(toCSSValue))
|
| return ConstantStyleInterpolation::create(fromCSSValue, property);
|
|
|
| - if (ImageStyleInterpolation::canCreateFrom(*fromCSSValue) && ImageStyleInterpolation::canCreateFrom(*toCSSValue))
|
| - return ImageStyleInterpolation::create(*fromCSSValue, *toCSSValue, property);
|
| + if (ImageStyleInterpolation::canCreateFrom(fromCSSValue) && ImageStyleInterpolation::canCreateFrom(toCSSValue))
|
| + return ImageStyleInterpolation::create(fromCSSValue, toCSSValue, property);
|
|
|
| forceDefaultInterpolation = true;
|
| break;
|
| @@ -327,15 +327,17 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyfram
|
| range = RangeNonNegative;
|
| // Fall through
|
| case CSSPropertyObjectPosition:
|
| - if (LengthPairStyleInterpolation::canCreateFrom(*fromCSSValue) && LengthPairStyleInterpolation::canCreateFrom(*toCSSValue))
|
| - return LengthPairStyleInterpolation::create(*fromCSSValue, *toCSSValue, property, range);
|
| + if (LengthPairStyleInterpolation::canCreateFrom(fromCSSValue) && LengthPairStyleInterpolation::canCreateFrom(toCSSValue))
|
| + return LengthPairStyleInterpolation::create(fromCSSValue, toCSSValue, property, range);
|
| break;
|
|
|
| case CSSPropertyPerspectiveOrigin:
|
| case CSSPropertyTransformOrigin: {
|
| - RefPtrWillBeRawPtr<Interpolation> interpolation = ListStyleInterpolation<LengthStyleInterpolation>::maybeCreateFromList(*fromCSSValue, *toCSSValue, property, range);
|
| - if (interpolation)
|
| - return interpolation.release();
|
| + if (fromCSSValue.isValueList() && toCSSValue.isValueList()) {
|
| + RefPtrWillBeRawPtr<Interpolation> interpolation = ListStyleInterpolation<LengthStyleInterpolation>::maybeCreateFromList(toCSSValueList(fromCSSValue), toCSSValueList(toCSSValue), property, range);
|
| + if (interpolation)
|
| + return interpolation.release();
|
| + }
|
|
|
| // FIXME: Handle keywords: top, right, left, center, bottom
|
| fallBackToLegacy = true;
|
| @@ -345,12 +347,14 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyfram
|
|
|
| case CSSPropertyBoxShadow:
|
| case CSSPropertyTextShadow: {
|
| - RefPtrWillBeRawPtr<Interpolation> interpolation = ListStyleInterpolation<ShadowStyleInterpolation>::maybeCreateFromList(*fromCSSValue, *toCSSValue, property);
|
| - if (interpolation)
|
| - return interpolation.release();
|
| + if (fromCSSValue.isValueList() && toCSSValue.isValueList()) {
|
| + RefPtrWillBeRawPtr<Interpolation> interpolation = ListStyleInterpolation<ShadowStyleInterpolation>::maybeCreateFromList(toCSSValueList(fromCSSValue), toCSSValueList(toCSSValue), property);
|
| + if (interpolation)
|
| + return interpolation.release();
|
| + }
|
|
|
| // FIXME: AnimatableShadow incorrectly animates between inset and non-inset values so it will never indicate it needs default interpolation
|
| - if (ShadowStyleInterpolation::usesDefaultStyleInterpolation(*fromCSSValue, *toCSSValue)) {
|
| + if (ShadowStyleInterpolation::usesDefaultStyleInterpolation(fromCSSValue, toCSSValue)) {
|
| forceDefaultInterpolation = true;
|
| break;
|
| }
|
| @@ -363,11 +367,11 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyfram
|
| }
|
|
|
| case CSSPropertyClip: {
|
| - if (LengthBoxStyleInterpolation::usesDefaultInterpolation(*fromCSSValue, *toCSSValue)) {
|
| + if (LengthBoxStyleInterpolation::usesDefaultInterpolation(fromCSSValue, toCSSValue)) {
|
| forceDefaultInterpolation = true;
|
| break;
|
| }
|
| - RefPtrWillBeRawPtr<Interpolation> interpolation = LengthBoxStyleInterpolation::maybeCreateFrom(*fromCSSValue, *toCSSValue, property);
|
| + RefPtrWillBeRawPtr<Interpolation> interpolation = LengthBoxStyleInterpolation::maybeCreateFrom(fromCSSValue, toCSSValue, property);
|
| if (interpolation)
|
| return interpolation.release();
|
| break;
|
| @@ -375,17 +379,17 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyfram
|
|
|
| case CSSPropertyBorderImageSlice:
|
| case CSSPropertyWebkitMaskBoxImageSlice: {
|
| - RefPtrWillBeRawPtr<Interpolation> interpolation = ImageSliceStyleInterpolation::maybeCreate(*fromCSSValue, *toCSSValue, property);
|
| + RefPtrWillBeRawPtr<Interpolation> interpolation = ImageSliceStyleInterpolation::maybeCreate(fromCSSValue, toCSSValue, property);
|
| if (interpolation)
|
| return interpolation.release();
|
| - if (ImageSliceStyleInterpolation::usesDefaultInterpolation(*fromCSSValue, *toCSSValue))
|
| + if (ImageSliceStyleInterpolation::usesDefaultInterpolation(fromCSSValue, toCSSValue))
|
| forceDefaultInterpolation = true;
|
|
|
| break;
|
| }
|
|
|
| case CSSPropertyStrokeDasharray: {
|
| - RefPtrWillBeRawPtr<Interpolation> interpolation = SVGStrokeDasharrayStyleInterpolation::maybeCreate(*fromCSSValue, *toCSSValue, property);
|
| + RefPtrWillBeRawPtr<Interpolation> interpolation = SVGStrokeDasharrayStyleInterpolation::maybeCreate(fromCSSValue, toCSSValue, property);
|
| if (interpolation)
|
| return interpolation.release();
|
|
|
| @@ -393,7 +397,7 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyfram
|
| }
|
|
|
| case CSSPropertyWebkitFilter: {
|
| - RefPtrWillBeRawPtr<Interpolation> interpolation = FilterStyleInterpolation::maybeCreateList(*fromCSSValue, *toCSSValue, property);
|
| + RefPtrWillBeRawPtr<Interpolation> interpolation = FilterStyleInterpolation::maybeCreateList(fromCSSValue, toCSSValue, property);
|
| if (interpolation)
|
| return interpolation.release();
|
|
|
| @@ -408,17 +412,17 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyfram
|
| break;
|
| }
|
|
|
| - if (fromCSSValue == toCSSValue)
|
| + if (fromCSSValue.ptrEquals(toCSSValue))
|
| return ConstantStyleInterpolation::create(fromCSSValue, property);
|
|
|
| if (forceDefaultInterpolation)
|
| return nullptr;
|
|
|
| - if (fromCSSValue->isCSSWideKeyword() || toCSSValue->isCSSWideKeyword())
|
| + if (fromCSSValue.isCSSWideKeyword() || toCSSValue.isCSSWideKeyword())
|
| fallBackToLegacy = true;
|
|
|
| if (fallBackToLegacy) {
|
| - if (DeferredLegacyStyleInterpolation::interpolationRequiresStyleResolve(*fromCSSValue) || DeferredLegacyStyleInterpolation::interpolationRequiresStyleResolve(*toCSSValue)) {
|
| + if (DeferredLegacyStyleInterpolation::interpolationRequiresStyleResolve(fromCSSValue) || DeferredLegacyStyleInterpolation::interpolationRequiresStyleResolve(toCSSValue)) {
|
| // FIXME: Handle these cases outside of DeferredLegacyStyleInterpolation.
|
| return DeferredLegacyStyleInterpolation::create(fromCSSValue, toCSSValue, property);
|
| }
|
| @@ -440,12 +444,12 @@ PassRefPtrWillBeRawPtr<Interpolation> StringKeyframe::CSSPropertySpecificKeyfram
|
|
|
| PassOwnPtrWillBeRawPtr<Keyframe::PropertySpecificKeyframe> StringKeyframe::CSSPropertySpecificKeyframe::neutralKeyframe(double offset, PassRefPtr<TimingFunction> easing) const
|
| {
|
| - return adoptPtrWillBeNoop(new CSSPropertySpecificKeyframe(offset, easing, static_cast<CSSValue*>(0), EffectModel::CompositeAdd));
|
| + return adoptPtrWillBeNoop(new CSSPropertySpecificKeyframe(offset, easing, nullptr, EffectModel::CompositeAdd));
|
| }
|
|
|
| PassOwnPtrWillBeRawPtr<Keyframe::PropertySpecificKeyframe> StringKeyframe::CSSPropertySpecificKeyframe::cloneWithOffset(double offset) const
|
| {
|
| - Keyframe::PropertySpecificKeyframe* theClone = new CSSPropertySpecificKeyframe(offset, m_easing, m_value.get());
|
| + Keyframe::PropertySpecificKeyframe* theClone = new CSSPropertySpecificKeyframe(offset, m_easing, m_value);
|
| toCSSPropertySpecificKeyframe(theClone)->m_animatableValueCache = m_animatableValueCache;
|
| return adoptPtrWillBeNoop(theClone);
|
| }
|
|
|