mirror of
https://github.com/servo/servo.git
synced 2025-06-25 01:24:37 +01:00
115 lines
2.6 KiB
JavaScript
115 lines
2.6 KiB
JavaScript
/*
|
|
Distributed under both the W3C Test Suite License [1] and the W3C
|
|
3-clause BSD License [2]. To contribute to a W3C Test Suite, see the
|
|
policies and contribution forms [3].
|
|
|
|
[1] http://www.w3.org/Consortium/Legal/2008/04-testsuite-license
|
|
[2] http://www.w3.org/Consortium/Legal/2008/03-bsd-license
|
|
[3] http://www.w3.org/2004/10/27-testcases
|
|
*/
|
|
|
|
"use strict";
|
|
|
|
var ANIMATION_END_TIME = 1000;
|
|
var ANIMATION_TOP_DEFAULT = 300;
|
|
var ANIMATION_TOP_0 = 10;
|
|
var ANIMATION_TOP_0_5 = 100;
|
|
var ANIMATION_TOP_1 = 200;
|
|
|
|
var KEYFRAMES = [ {
|
|
top : ANIMATION_TOP_0 + 'px',
|
|
offset : 0
|
|
}, {
|
|
top : ANIMATION_TOP_0_5 + 'px',
|
|
offset : 1 / 2
|
|
}, {
|
|
top : ANIMATION_TOP_1 + 'px',
|
|
offset : 1
|
|
} ];
|
|
|
|
// creates new animation for given target
|
|
function newAnimation(animationTarget) {
|
|
animationTarget.style.top = ANIMATION_TOP_DEFAULT + 'px';
|
|
return new Animation(animationTarget, KEYFRAMES, ANIMATION_END_TIME);
|
|
}
|
|
|
|
// creates div element, appends it to the document body and
|
|
// removes the created element during test cleanup
|
|
function createDiv(test, doc) {
|
|
if (!doc) {
|
|
doc = document;
|
|
}
|
|
var div = doc.createElement('div');
|
|
doc.body.appendChild(div);
|
|
test.add_cleanup(function() {
|
|
removeElement(div);
|
|
});
|
|
return div;
|
|
}
|
|
|
|
// Removes element
|
|
function removeElement(element) {
|
|
element.parentNode.removeChild(element);
|
|
}
|
|
|
|
// Returns the type name of given object
|
|
function type(object) {
|
|
return Object.prototype.toString.call(object).slice(8, -1);
|
|
}
|
|
|
|
// Convert px unit value to a Number
|
|
function pxToNum(str) {
|
|
return Number(String(str).match(/^(-?[\d.]+)px$/)[1]);
|
|
}
|
|
|
|
// Cubic bezier with control points (0, 0), (x1, y1), (x2, y2), and (1, 1).
|
|
function cubicBezier(x1, y1, x2, y2) {
|
|
function xForT(t) {
|
|
var omt = 1-t;
|
|
return 3 * omt * omt * t * x1 + 3 * omt * t * t * x2 + t * t * t;
|
|
}
|
|
|
|
function yForT(t) {
|
|
var omt = 1-t;
|
|
return 3 * omt * omt * t * y1 + 3 * omt * t * t * y2 + t * t * t;
|
|
}
|
|
|
|
function tForX(x) {
|
|
// Binary subdivision.
|
|
var mint = 0, maxt = 1;
|
|
for (var i = 0; i < 30; ++i) {
|
|
var guesst = (mint + maxt) / 2;
|
|
var guessx = xForT(guesst);
|
|
if (x < guessx) {
|
|
maxt = guesst;
|
|
} else {
|
|
mint = guesst;
|
|
}
|
|
}
|
|
return (mint + maxt) / 2;
|
|
}
|
|
|
|
return function bezierClosure(x) {
|
|
if (x == 0) {
|
|
return 0;
|
|
}
|
|
if (x == 1) {
|
|
return 1;
|
|
}
|
|
return yForT(tForX(x));
|
|
}
|
|
}
|
|
|
|
function stepEnd(nsteps) {
|
|
return function stepEndClosure(x) {
|
|
return Math.floor(x * nsteps) / nsteps;
|
|
}
|
|
}
|
|
|
|
function stepStart(nsteps) {
|
|
return function stepStartClosure(x) {
|
|
var result = Math.floor(x * nsteps + 1.0) / nsteps;
|
|
return (result > 1.0) ? 1.0 : result;
|
|
}
|
|
}
|
|
|