Skip to content

Commit 3ee1ec5

Browse files
committed
Merge pull request #423 from alancutter/easingFunction
Don't store Javascript functions on AnimationEffectTiming.easing or keyframe.easing
2 parents b183b98 + 6a2f700 commit 3ee1ec5

File tree

5 files changed

+31
-22
lines changed

5 files changed

+31
-22
lines changed

src/keyframe-interpolations.js

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,13 @@
7373
function makeInterpolations(propertySpecificKeyframeGroups) {
7474
var interpolations = [];
7575
for (var groupName in propertySpecificKeyframeGroups) {
76-
var group = propertySpecificKeyframeGroups[groupName];
77-
for (var i = 0; i < group.length - 1; i++) {
78-
var startTime = group[i].offset;
79-
var endTime = group[i + 1].offset;
80-
var startValue = group[i].value;
81-
var endValue = group[i + 1].value;
76+
var keyframes = propertySpecificKeyframeGroups[groupName];
77+
for (var i = 0; i < keyframes.length - 1; i++) {
78+
var startTime = keyframes[i].offset;
79+
var endTime = keyframes[i + 1].offset;
80+
var startValue = keyframes[i].value;
81+
var endValue = keyframes[i + 1].value;
82+
var easing = keyframes[i].easing;
8283
if (startTime == endTime) {
8384
if (endTime == 1) {
8485
startValue = endValue;
@@ -89,7 +90,7 @@
8990
interpolations.push({
9091
startTime: startTime,
9192
endTime: endTime,
92-
easing: group[i].easing,
93+
easing: shared.toTimingFunction(easing ? easing : 'linear'),
9394
property: groupName,
9495
interpolation: scope.propertyInterpolation(groupName, startValue, endValue)
9596
});

src/normalize-keyframes.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -239,17 +239,13 @@
239239
name: 'NotSupportedError',
240240
message: 'add compositing is not supported'
241241
};
242-
} else if (member == 'easing') {
243-
memberValue = shared.toTimingFunction(memberValue);
244242
} else {
245243
memberValue = '' + memberValue;
246244
}
247245
expandShorthandAndAntiAlias(member, memberValue, keyframe);
248246
}
249247
if (keyframe.offset == undefined)
250248
keyframe.offset = null;
251-
if (keyframe.easing == undefined)
252-
keyframe.easing = shared.toTimingFunction('linear');
253249
return keyframe;
254250
});
255251

src/timing-utilities.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@
151151
function normalizeTimingInput(timingInput, forGroup) {
152152
timingInput = shared.numericTimingToObject(timingInput);
153153
var timing = makeTiming(timingInput, forGroup);
154-
timing._easing = toTimingFunction(timing.easing);
154+
timing._easingFunction = toTimingFunction(timing.easing);
155155
return timing;
156156
}
157157

@@ -304,7 +304,7 @@
304304
var currentDirectionIsForwards = timing.direction == 'normal' || timing.direction == (currentIterationIsOdd ? 'alternate-reverse' : 'alternate');
305305
var directedTime = currentDirectionIsForwards ? iterationTime : iterationDuration - iterationTime;
306306
var timeFraction = directedTime / iterationDuration;
307-
return iterationDuration * timing.easing(timeFraction);
307+
return iterationDuration * timing._easingFunction(timeFraction);
308308
}
309309

310310
function calculateTimeFraction(activeDuration, localTime, timing) {

test/js/keyframes.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ suite('keyframes', function() {
158158
{left: '0px'}
159159
]);
160160
});
161-
assert.equal('' + normalizedKeyframes[0].easing, 'function (x) { return x; }');
161+
assert.equal(normalizedKeyframes[0].easing, 'easy-peasy');
162162
});
163163

164164
test('Normalize keyframes where some properties are given non-string, non-number values.', function() {
@@ -441,6 +441,18 @@ suite('keyframes', function() {
441441
assert.equal(interpolations[1].property, 'left');
442442
assert.equal(typeof interpolations[1].interpolation, 'function');
443443
});
444+
445+
test('Make interpolations with invalid easing.', function() {
446+
var interpolations;
447+
assert.doesNotThrow(function() {
448+
interpolations = makeInterpolations(makePropertySpecificKeyframeGroups(normalizeKeyframes([
449+
{left: '0px', easing: 'pants and ducks'},
450+
{left: '200px'},
451+
])));
452+
});
453+
assert.equal(interpolations.length, 1);
454+
assert.equal(interpolations[0].easing.toString(), 'function (x) { return x; }');
455+
});
444456
});
445457

446458
suite('keyframe-interpolations - convertEffectInput', function() {

test/js/timing-utilities.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
suite('timing-utilities', function() {
22
test('normalize timing input', function() {
33
assert.equal(normalizeTimingInput(1).duration, 1);
4-
assert.equal(normalizeTimingInput(1).easing(0.2), 0.2);
4+
assert.equal(normalizeTimingInput(1)._easingFunction(0.2), 0.2);
55
assert.equal(normalizeTimingInput(undefined).duration, 0);
66
});
77
test('calculating active duration', function() {
@@ -90,13 +90,13 @@ suite('timing-utilities', function() {
9090
});
9191
test('calculating transformed time', function() {
9292
// calculateTransformedTime(currentIteration, iterationDuration, iterationTime, timingInput);
93-
assert.equal(calculateTransformedTime(4, 1000, 200, {easing: function(x) { return x; }, direction: 'normal'}), 200);
94-
assert.equal(calculateTransformedTime(4, 1000, 200, {easing: function(x) { return x; }, direction: 'reverse'}), 800);
95-
assert.closeTo(calculateTransformedTime(4, 1000, 200, {easing: function(x) { return x * x; }, direction: 'reverse'}), 640, 0.0001);
96-
assert.closeTo(calculateTransformedTime(4, 1000, 600, {easing: function(x) { return x * x; }, direction: 'alternate'}), 360, 0.0001);
97-
assert.closeTo(calculateTransformedTime(3, 1000, 600, {easing: function(x) { return x * x; }, direction: 'alternate'}), 160, 0.0001);
98-
assert.closeTo(calculateTransformedTime(4, 1000, 600, {easing: function(x) { return x * x; }, direction: 'alternate-reverse'}), 160, 0.0001);
99-
assert.closeTo(calculateTransformedTime(3, 1000, 600, {easing: function(x) { return x * x; }, direction: 'alternate-reverse'}), 360, 0.0001);
93+
assert.equal(calculateTransformedTime(4, 1000, 200, {_easingFunction: function(x) { return x; }, direction: 'normal'}), 200);
94+
assert.equal(calculateTransformedTime(4, 1000, 200, {_easingFunction: function(x) { return x; }, direction: 'reverse'}), 800);
95+
assert.closeTo(calculateTransformedTime(4, 1000, 200, {_easingFunction: function(x) { return x * x; }, direction: 'reverse'}), 640, 0.0001);
96+
assert.closeTo(calculateTransformedTime(4, 1000, 600, {_easingFunction: function(x) { return x * x; }, direction: 'alternate'}), 360, 0.0001);
97+
assert.closeTo(calculateTransformedTime(3, 1000, 600, {_easingFunction: function(x) { return x * x; }, direction: 'alternate'}), 160, 0.0001);
98+
assert.closeTo(calculateTransformedTime(4, 1000, 600, {_easingFunction: function(x) { return x * x; }, direction: 'alternate-reverse'}), 160, 0.0001);
99+
assert.closeTo(calculateTransformedTime(3, 1000, 600, {_easingFunction: function(x) { return x * x; }, direction: 'alternate-reverse'}), 360, 0.0001);
100100
});
101101
test('EffectTime', function() {
102102
var timing = normalizeTimingInput({duration: 1000, iterations: 4, iterationStart: 0.5, easing: 'linear', direction: 'alternate', delay: 100, fill: 'forwards'});

0 commit comments

Comments
 (0)