Bug 1501117 - Part 2: Serialize timing function from web animation api with servo. r=emilio,birtles

It's worth to serialize the timing function from web animation api with
servo, too. However, we need an FFI to do that, so this patch also add a
new FFI.

Depends on D10443

Differential Revision: https://phabricator.services.mozilla.com/D10444

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Boris Chiou 2018-11-01 21:33:56 +00:00
parent 91b20a5ee5
commit e3efce4cc6
9 changed files with 41 additions and 117 deletions

View File

@ -5,8 +5,8 @@
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "ComputedTimingFunction.h"
#include "mozilla/ServoBindings.h"
#include "nsAlgorithm.h" // For clamped()
#include "nsStyleUtil.h"
namespace mozilla {
@ -178,24 +178,32 @@ ComputedTimingFunction::Compare(const ComputedTimingFunction& aRhs) const
void
ComputedTimingFunction::AppendToString(nsAString& aResult) const
{
nsTimingFunction timing;
switch (mType) {
case Type::CubicBezier:
nsStyleUtil::AppendCubicBezierTimingFunction(mTimingFunction.X1(),
mTimingFunction.Y1(),
mTimingFunction.X2(),
mTimingFunction.Y2(),
aResult);
timing.mTiming = StyleComputedTimingFunction::CubicBezier(
mTimingFunction.X1(),
mTimingFunction.Y1(),
mTimingFunction.X2(),
mTimingFunction.Y2());
break;
case Type::Step:
nsStyleUtil::AppendStepsTimingFunction(mSteps.mSteps,
mSteps.mPos,
aResult);
timing.mTiming = StyleComputedTimingFunction::Steps(
mSteps.mSteps,
mSteps.mPos);
break;
case Type::Linear:
case Type::Ease:
case Type::EaseIn:
case Type::EaseOut:
case Type::EaseInOut:
timing.mTiming = StyleComputedTimingFunction::Keyword(
static_cast<StyleTimingKeyword>(mType));
break;
default:
nsStyleUtil::AppendCubicBezierKeywordTimingFunction(
StyleTimingKeyword(uint8_t(mType)), aResult);
break;
MOZ_ASSERT_UNREACHABLE("Unsupported timing type");
}
Servo_SerializeEasing(&timing, &aResult);
}
/* static */ int32_t

View File

@ -19,7 +19,7 @@
// We clamp +infinity or -inifinity value in floating point to
// maximum floating point value or -maxinum floating point value.
const max_float = 3.40282e+38;
const max_float = '3.40282e38';
test(function(t) {
var div = addDiv(t);
@ -37,12 +37,12 @@ test(function(t) {
anim.effect.updateTiming({ easing: 'cubic-bezier(0, -1e+39, 0, 0)' });
assert_equals(anim.effect.getComputedTiming().easing,
'cubic-bezier(0, ' + -max_float + ', 0, 0)',
'cubic-bezier(0, ' + '-' + max_float + ', 0, 0)',
'y1 control point for effect easing is out of lower boundary');
anim.effect.updateTiming({ easing: 'cubic-bezier(0, 0, 0, -1e+39)' });
assert_equals(anim.effect.getComputedTiming().easing,
'cubic-bezier(0, 0, 0, ' + -max_float + ')',
'cubic-bezier(0, 0, 0, ' + '-' + max_float + ')',
'y2 control point for effect easing is out of lower boundary');
}, 'Clamp y1 and y2 control point out of boundaries for effect easing' );
@ -63,12 +63,12 @@ test(function(t) {
anim.effect.setKeyframes([ { easing: 'cubic-bezier(0, -1e+39, 0, 0)' }]);
assert_equals(anim.effect.getKeyframes()[0].easing,
'cubic-bezier(0, ' + -max_float + ', 0, 0)',
'cubic-bezier(0, ' + '-' + max_float + ', 0, 0)',
'y1 control point for keyframe easing is out of lower boundary');
anim.effect.setKeyframes([ { easing: 'cubic-bezier(0, 0, 0, -1e+39)' }]);
assert_equals(anim.effect.getKeyframes()[0].easing,
'cubic-bezier(0, 0, 0, ' + -max_float + ')',
'cubic-bezier(0, 0, 0, ' + '-' + max_float + ')',
'y2 control point for keyframe easing is out of lower boundary');
}, 'Clamp y1 and y2 control point out of boundaries for keyframe easing' );
@ -89,12 +89,12 @@ test(function(t) {
div.style.animation = 'anim 100s cubic-bezier(0, -1e+39, 0, 0)';
assert_equals(div.getAnimations()[0].effect.getKeyframes()[0].easing,
'cubic-bezier(0, ' + -max_float + ', 0, 0)',
'cubic-bezier(0, ' + '-' + max_float + ', 0, 0)',
'y1 control point for CSS animation is out of lower boundary');
div.style.animation = 'anim 100s cubic-bezier(0, 0, 0, -1e+39)';
assert_equals(div.getAnimations()[0].effect.getKeyframes()[0].easing,
'cubic-bezier(0, 0, 0, ' + -max_float + ')',
'cubic-bezier(0, 0, 0, ' + '-' + max_float + ')',
'y2 control point for CSS animation is out of lower boundary');
}, 'Clamp y1 and y2 control point out of boundaries for CSS animation' );
@ -124,7 +124,7 @@ test(function(t) {
flushComputedStyle(div);
div.style.marginLeft = '0px';
assert_equals(div.getAnimations()[0].effect.getKeyframes()[0].easing,
'cubic-bezier(0, ' + -max_float + ', 0, 0)',
'cubic-bezier(0, ' + '-' + max_float + ', 0, 0)',
'y1 control point for CSS transition on lower boundary');
div.style.transition = '';
div.style.marginLeft = '';
@ -133,7 +133,7 @@ test(function(t) {
flushComputedStyle(div);
div.style.marginLeft = '0px';
assert_equals(div.getAnimations()[0].effect.getKeyframes()[0].easing,
'cubic-bezier(0, 0, 0, ' + -max_float + ')',
'cubic-bezier(0, 0, 0, ' + '-' + max_float + ')',
'y2 control point for CSS transition on lower boundary');
}, 'Clamp y1 and y2 control point out of boundaries for CSS transition' );

View File

@ -603,6 +603,10 @@ bool Servo_ParseEasing(
RawGeckoURLExtraData* data,
nsTimingFunctionBorrowedMut output);
void Servo_SerializeEasing(
nsTimingFunctionBorrowed easing,
nsAString* output);
void Servo_GetComputedKeyframeValues(
RawGeckoKeyframeListBorrowed keyframes,
RawGeckoElementBorrowed element,

View File

@ -105,10 +105,6 @@ CSS_KEY(double, double)
CSS_KEY(double-circle, double_circle)
CSS_KEY(drop-shadow, drop_shadow)
CSS_KEY(e-resize, e_resize)
CSS_KEY(ease, ease)
CSS_KEY(ease-in, ease_in)
CSS_KEY(ease-in-out, ease_in_out)
CSS_KEY(ease-out, ease_out)
CSS_KEY(ellipse, ellipse)
CSS_KEY(ellipsis, ellipsis)
CSS_KEY(end, end)
@ -144,7 +140,6 @@ CSS_KEY(layout, layout)
CSS_KEY(left, left)
CSS_KEY(legacy, legacy)
CSS_KEY(line-through, line_through)
CSS_KEY(linear, linear)
CSS_KEY(list-item, list_item)
CSS_KEY(mandatory, mandatory)
CSS_KEY(manipulation, manipulation)

View File

@ -618,15 +618,6 @@ const KTableEntry nsCSSProps::kTouchActionKTable[] = {
{ eCSSKeyword_UNKNOWN, -1 }
};
const KTableEntry nsCSSProps::kTransitionTimingFunctionKTable[] = {
{ eCSSKeyword_linear, StyleTimingKeyword::Linear },
{ eCSSKeyword_ease, StyleTimingKeyword::Ease },
{ eCSSKeyword_ease_in, StyleTimingKeyword::EaseIn },
{ eCSSKeyword_ease_out, StyleTimingKeyword::EaseOut },
{ eCSSKeyword_ease_in_out, StyleTimingKeyword::EaseInOut },
{ eCSSKeyword_UNKNOWN, -1 }
};
const KTableEntry nsCSSProps::kVerticalAlignKTable[] = {
{ eCSSKeyword_baseline, NS_STYLE_VERTICAL_ALIGN_BASELINE },
{ eCSSKeyword_sub, NS_STYLE_VERTICAL_ALIGN_SUB },

View File

@ -351,7 +351,6 @@ public:
static const KTableEntry kTextEmphasisStyleShapeKTable[];
static const KTableEntry kTextOverflowKTable[];
static const KTableEntry kTouchActionKTable[];
static const KTableEntry kTransitionTimingFunctionKTable[];
static const KTableEntry kVerticalAlignKTable[];
static const KTableEntry kWidthKTable[]; // also min-width, max-width
static const KTableEntry kFlexBasisKTable[];

View File

@ -274,77 +274,6 @@ nsStyleUtil::AppendPaintOrderValue(uint8_t aValue,
}
}
/* static */ void
nsStyleUtil::AppendStepsTimingFunction(uint32_t aStepNumber,
mozilla::StyleStepPosition aStepPos,
nsAString& aResult)
{
aResult.AppendLiteral("steps(");
aResult.AppendInt(aStepNumber);
switch (aStepPos) {
case StyleStepPosition::JumpStart:
aResult.AppendLiteral(", jump-start)");
break;
case StyleStepPosition::JumpNone:
aResult.AppendLiteral(", jump-none)");
break;
case StyleStepPosition::JumpBoth:
aResult.AppendLiteral(", jump-both)");
break;
case StyleStepPosition::Start:
aResult.AppendLiteral(", start)");
break;
case StyleStepPosition::JumpEnd:
case StyleStepPosition::End:
aResult.AppendLiteral(")");
break;
default:
MOZ_ASSERT_UNREACHABLE("Unsupported timing function");
}
}
/* static */ void
nsStyleUtil::AppendCubicBezierTimingFunction(float aX1, float aY1,
float aX2, float aY2,
nsAString& aResult)
{
// set the value from the cubic-bezier control points
// (We could try to regenerate the keywords if we want.)
aResult.AppendLiteral("cubic-bezier(");
aResult.AppendFloat(aX1);
aResult.AppendLiteral(", ");
aResult.AppendFloat(aY1);
aResult.AppendLiteral(", ");
aResult.AppendFloat(aX2);
aResult.AppendLiteral(", ");
aResult.AppendFloat(aY2);
aResult.Append(')');
}
/* static */ void
nsStyleUtil::AppendCubicBezierKeywordTimingFunction(
StyleTimingKeyword aType,
nsAString& aResult)
{
switch (aType) {
case StyleTimingKeyword::Linear:
case StyleTimingKeyword::Ease:
case StyleTimingKeyword::EaseIn:
case StyleTimingKeyword::EaseOut:
case StyleTimingKeyword::EaseInOut: {
nsCSSKeyword keyword = nsCSSProps::ValueToKeywordEnum(
static_cast<int32_t>(aType),
nsCSSProps::kTransitionTimingFunctionKTable);
AppendASCIItoUTF16(nsCSSKeywords::GetStringValue(keyword),
aResult);
break;
}
default:
MOZ_ASSERT_UNREACHABLE("unexpected aType");
break;
}
}
/* static */ float
nsStyleUtil::ColorComponentToFloat(uint8_t aAlpha)
{

View File

@ -76,16 +76,6 @@ public:
aResult.AppendFloat(aNumber);
}
static void AppendStepsTimingFunction(uint32_t aStepNumber,
mozilla::StyleStepPosition aStepPos,
nsAString& aResult);
static void AppendCubicBezierTimingFunction(float aX1, float aY1,
float aX2, float aY2,
nsAString& aResult);
static void AppendCubicBezierKeywordTimingFunction(
mozilla::StyleTimingKeyword aType,
nsAString& aResult);
/*
* Convert an author-provided floating point number to an integer (0
* ... 255) appropriate for use in the alpha component of a color.

View File

@ -3467,6 +3467,14 @@ pub extern "C" fn Servo_ParseEasing(
}
}
#[no_mangle]
pub unsafe extern "C" fn Servo_SerializeEasing(
easing: nsTimingFunctionBorrowed,
output: *mut nsAString,
) {
easing.mTiming.to_css(&mut CssWriter::new(&mut *output)).unwrap();
}
#[no_mangle]
pub extern "C" fn Servo_GetProperties_Overriding_Animation(
element: RawGeckoElementBorrowed,