mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +00:00
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:
parent
91b20a5ee5
commit
e3efce4cc6
@ -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
|
||||
|
@ -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' );
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
|
@ -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 },
|
||||
|
@ -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[];
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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.
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user