| Index: third_party/WebKit/LayoutTests/imported/web-platform-tests/web-animations/testcommon.js
|
| diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/web-animations/testcommon.js b/third_party/WebKit/LayoutTests/imported/web-platform-tests/web-animations/testcommon.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e7179cc1883a9739face2d29f383112295df9ec4
|
| --- /dev/null
|
| +++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/web-animations/testcommon.js
|
| @@ -0,0 +1,166 @@
|
| +/*
|
| +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() {
|
| + div.remove();
|
| + });
|
| + return div;
|
| +}
|
| +
|
| +// Creates a style element with the specified rules, appends it to the document
|
| +// head and removes the created element during test cleanup.
|
| +// |rules| is an object. For example:
|
| +// { '@keyframes anim': '' ,
|
| +// '.className': 'animation: anim 100s;' };
|
| +// or
|
| +// { '.className1::before': 'content: ""; width: 0px; transition: all 10s;',
|
| +// '.className2::before': 'width: 100px;' };
|
| +// The object property name could be a keyframes name, or a selector.
|
| +// The object property value is declarations which are property:value pairs
|
| +// split by a space.
|
| +function createStyle(test, rules, doc) {
|
| + if (!doc) {
|
| + doc = document;
|
| + }
|
| + var extraStyle = doc.createElement('style');
|
| + doc.head.appendChild(extraStyle);
|
| + if (rules) {
|
| + var sheet = extraStyle.sheet;
|
| + for (var selector in rules) {
|
| + sheet.insertRule(selector + '{' + rules[selector] + '}',
|
| + sheet.cssRules.length);
|
| + }
|
| + }
|
| + test.add_cleanup(function() {
|
| + extraStyle.remove();
|
| + });
|
| +}
|
| +
|
| +// Create a pseudo element
|
| +function createPseudo(test, type) {
|
| + createStyle(test, { '@keyframes anim': '',
|
| + ['.pseudo::' + type]: 'animation: anim 10s;' });
|
| + var div = createDiv(test);
|
| + div.classList.add('pseudo');
|
| + var anims = document.getAnimations();
|
| + assert_true(anims.length >= 1);
|
| + var anim = anims[anims.length - 1];
|
| + assert_equals(anim.effect.target.parentElement, div);
|
| + assert_equals(anim.effect.target.type, '::' + type);
|
| + anim.cancel();
|
| + return anim.effect.target;
|
| +}
|
| +
|
| +// 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;
|
| + }
|
| +}
|
| +
|
| +function waitForAnimationFrames(frameCount) {
|
| + return new Promise(function(resolve, reject) {
|
| + function handleFrame() {
|
| + if (--frameCount <= 0) {
|
| + resolve();
|
| + } else {
|
| + window.requestAnimationFrame(handleFrame); // wait another frame
|
| + }
|
| + }
|
| + window.requestAnimationFrame(handleFrame);
|
| + });
|
| +}
|
|
|