| Index: LayoutTests/animations/interpolation/resources/interpolation-test.js
|
| diff --git a/LayoutTests/animations/interpolation/resources/interpolation-test.js b/LayoutTests/animations/interpolation/resources/interpolation-test.js
|
| index 5b5ee62c9dc7a3af620e6e7eb560e3010302e709..cf0f5023f9f10b248cbe6a71607e1a5e211dc8fd 100644
|
| --- a/LayoutTests/animations/interpolation/resources/interpolation-test.js
|
| +++ b/LayoutTests/animations/interpolation/resources/interpolation-test.js
|
| @@ -53,6 +53,7 @@
|
| (function() {
|
| var webkitPrefix = 'webkitAnimation' in document.documentElement.style ? '-webkit-' : '';
|
| var isRefTest = false;
|
| + var webAnimationsTest = typeof Element.prototype.animate === 'function';
|
| var startEvent = webkitPrefix ? 'webkitAnimationStart' : 'animationstart';
|
| var endEvent = webkitPrefix ? 'webkitAnimationEnd' : 'animationend';
|
| var testCount = 0;
|
| @@ -69,9 +70,21 @@
|
| ' background: gold;\n' +
|
| '}\n';
|
| var fragment = document.createDocumentFragment();
|
| + var fragmentAttachedListeners = [];
|
| var style = document.createElement('style');
|
| + var cssTests = document.createElement('div');
|
| + cssTests.id = 'css-tests';
|
| + cssTests.textContent = 'CSS Animations:';
|
| var afterTestCallback = null;
|
| fragment.appendChild(style);
|
| + fragment.appendChild(cssTests);
|
| +
|
| + if (webAnimationsTest) {
|
| + var waTests = document.createElement('div');
|
| + waTests.id = 'web-animations-tests';
|
| + waTests.textContent = 'Web Animations API:';
|
| + fragment.appendChild(waTests);
|
| + }
|
|
|
| var updateScheduled = false;
|
| function maybeScheduleUpdate() {
|
| @@ -83,6 +96,7 @@
|
| updateScheduled = false;
|
| style.innerHTML = cssText;
|
| document.body.appendChild(fragment);
|
| + fragmentAttachedListeners.forEach(function(listener) {listener();});
|
| }, 0);
|
| }
|
|
|
| @@ -96,13 +110,17 @@
|
| }
|
| style.parentNode.removeChild(style);
|
| } else {
|
| - var resultString = '';
|
| + var cssResultString = 'CSS Animations:\n';
|
| + var waResultString = 'Web Animations API:\n';
|
| for (var i = 0; i < targets.length; i++) {
|
| - resultString += targets[i].getResultString() + '\n';
|
| + if (targets[i].testType === 'css') {
|
| + cssResultString += targets[i].getResultString() + '\n';
|
| + } else {
|
| + waResultString += targets[i].getResultString() + '\n';
|
| + }
|
| }
|
| - var results = document.createElement('div');
|
| - results.style.whiteSpace = 'pre';
|
| - results.textContent = resultString;
|
| + var results = document.createElement('pre');
|
| + results.textContent = cssResultString + (webAnimationsTest ? '\n' + waResultString : '');
|
| results.id = 'results';
|
| document.body.appendChild(results);
|
| }
|
| @@ -156,8 +174,26 @@
|
| }));
|
| }
|
|
|
| - function describeTest(params) {
|
| - return params.property + ': from [' + params.from + '] to [' + params.to + ']';
|
| + function createTestContainer(description, className) {
|
| + var testContainer = document.createElement('div');
|
| + testContainer.setAttribute('description', description);
|
| + testContainer.classList.add('test');
|
| + if (className) {
|
| + testContainer.classList.add(className);
|
| + }
|
| + return testContainer;
|
| + }
|
| +
|
| + function convertPropertyToCamelCase(property) {
|
| + return property.replace(/^-/, '').replace(/-\w/g, function(m) {return m[1].toUpperCase();});
|
| + }
|
| +
|
| + function describeCSSTest(params) {
|
| + return 'CSS ' + params.property + ': from [' + params.from + '] to [' + params.to + ']';
|
| + }
|
| +
|
| + function describeWATest(params) {
|
| + return 'element.animate() ' + convertPropertyToCamelCase(params.property) + ': from [' + params.from + '] to [' + params.to + ']';
|
| }
|
|
|
| function assertInterpolation(params, expectations) {
|
| @@ -170,15 +206,22 @@
|
| }
|
| var testId = defineKeyframes(params);
|
| var nextCaseId = 0;
|
| - var testContainer = document.createElement('div');
|
| - testContainer.setAttribute('description', describeTest(params));
|
| - testContainer.classList.add('test');
|
| - testContainer.classList.add(testId);
|
| - fragment.appendChild(testContainer);
|
| + var cssTestContainer = createTestContainer(describeCSSTest(params), testId);
|
| + cssTests.appendChild(cssTestContainer);
|
| + if (webAnimationsTest) {
|
| + var waTestContainer = createTestContainer(describeWATest(params), testId);
|
| + waTests.appendChild(waTestContainer);
|
| + }
|
| expectations.forEach(function(expectation) {
|
| - testContainer.appendChild(makeInterpolationTest(
|
| - expectation.at, testId, 'case-' + ++nextCaseId, params, expectation.is));
|
| + cssTestContainer.appendChild(makeInterpolationTest(
|
| + 'css', expectation.at, testId, 'case-' + ++nextCaseId, params, expectation.is));
|
| });
|
| + if (webAnimationsTest) {
|
| + expectations.forEach(function(expectation) {
|
| + waTestContainer.appendChild(makeInterpolationTest(
|
| + 'web-animations', expectation.at, testId, 'case-' + ++nextCaseId, params, expectation.is));
|
| + });
|
| + }
|
| maybeScheduleUpdate();
|
| }
|
|
|
| @@ -192,14 +235,21 @@
|
| return testId;
|
| }
|
|
|
| - function normalizeValue(value) {
|
| + function roundNumbers(value) {
|
| return value.
|
| // Round numbers to two decimal places.
|
| replace(/-?\d*\.\d+/g, function(n) {
|
| return (parseFloat(n).toFixed(2)).
|
| - replace(/\.0*$/, '').
|
| + replace(/\.\d+/, function(m) {
|
| + return m.replace(/0+$/, '');
|
| + }).
|
| + replace(/\.$/, '').
|
| replace(/^-0$/, '0');
|
| - }).
|
| + });
|
| + }
|
| +
|
| + function normalizeValue(value) {
|
| + return roundNumbers(value).
|
| // Place whitespace between tokens.
|
| replace(/([\w\d.]+|[^\s])/g, '$1 ').
|
| replace(/\s+/g, ' ');
|
| @@ -243,7 +293,7 @@
|
| return value;
|
| }
|
|
|
| - function makeInterpolationTest(fraction, testId, caseId, params, expectation) {
|
| + function makeInterpolationTest(testType, fraction, testId, caseId, params, expectation) {
|
| console.assert(expectation === undefined || !isRefTest);
|
| var targetContainer = createTargetContainer(caseId);
|
| var target = targetContainer.querySelector('.target') || targetContainer;
|
| @@ -255,6 +305,7 @@
|
| replica.classList.add('replica');
|
| replica.style.setProperty(params.property, expectation);
|
| }
|
| + target.testType = testType;
|
| target.getResultString = function() {
|
| if (!CSS.supports(params.property, expectation)) {
|
| return 'FAIL: [' + params.property + ': ' + expectation + '] is not supported';
|
| @@ -262,15 +313,16 @@
|
| var value = getComputedStyle(this).getPropertyValue(params.property);
|
| var result = '';
|
| var reason = '';
|
| + var property = testType === 'css' ? params.property : convertPropertyToCamelCase(params.property);
|
| if (expectation !== undefined) {
|
| var parsedExpectation = getComputedStyle(replica).getPropertyValue(params.property);
|
| var pass = normalizeValue(value) === normalizeValue(parsedExpectation);
|
| result = pass ? 'PASS: ' : 'FAIL: ';
|
| reason = pass ? '' : ', expected [' + expectation + ']' +
|
| - (expectation === parsedExpectation ? '' : ' (parsed as [' + sanitizeUrls(parsedExpectation) + '])');
|
| + (expectation === parsedExpectation ? '' : ' (parsed as [' + sanitizeUrls(roundNumbers(parsedExpectation)) + '])');
|
| value = pass ? expectation : sanitizeUrls(value);
|
| }
|
| - return result + params.property + ' from [' + params.from + '] to ' +
|
| + return result + property + ' from [' + params.from + '] to ' +
|
| '[' + params.to + '] was [' + value + ']' +
|
| ' at ' + fraction + reason;
|
| };
|
| @@ -278,13 +330,29 @@
|
| this.style[params.property] = getComputedStyle(this).getPropertyValue(params.property);
|
| };
|
| var easing = createEasing(fraction);
|
| - cssText += '.' + testId + ' .' + caseId + '.active {\n' +
|
| - ' ' + webkitPrefix + 'animation: ' + testId + ' ' + durationSeconds + 's forwards;\n' +
|
| - ' ' + webkitPrefix + 'animation-timing-function: ' + easing + ';\n' +
|
| - ' ' + webkitPrefix + 'animation-iteration-count: ' + iterationCount + ';\n' +
|
| - ' ' + webkitPrefix + 'animation-delay: ' + delaySeconds + 's;\n' +
|
| - '}\n';
|
| testCount++;
|
| + if (testType === 'css') {
|
| + cssText += '.' + testId + ' .' + caseId + '.active {\n' +
|
| + ' ' + webkitPrefix + 'animation: ' + testId + ' ' + durationSeconds + 's forwards;\n' +
|
| + ' ' + webkitPrefix + 'animation-timing-function: ' + easing + ';\n' +
|
| + ' ' + webkitPrefix + 'animation-iteration-count: ' + iterationCount + ';\n' +
|
| + ' ' + webkitPrefix + 'animation-delay: ' + delaySeconds + 's;\n' +
|
| + '}\n';
|
| + } else {
|
| + var keyframes = [{}, {}];
|
| + keyframes[0][convertPropertyToCamelCase(params.property)] = params.from;
|
| + keyframes[1][convertPropertyToCamelCase(params.property)] = params.to;
|
| + fragmentAttachedListeners.push(function() {
|
| + target.animate(keyframes, {
|
| + fill: 'forwards',
|
| + duration: 1,
|
| + easing: easing,
|
| + delay: -0.5,
|
| + iterations: 0.5,
|
| + });
|
| + animationEnded();
|
| + });
|
| + }
|
| var testFragment = document.createDocumentFragment();
|
| testFragment.appendChild(targetContainer);
|
| replica && testFragment.appendChild(replicaContainer);
|
| @@ -318,7 +386,7 @@
|
| return !finished && animationEventCount === testCount;
|
| }
|
|
|
| - function endEventListener() {
|
| + function animationEnded() {
|
| animationEventCount++;
|
| if (!isLastAnimationEvent()) {
|
| return;
|
| @@ -328,7 +396,7 @@
|
|
|
| if (window.internals) {
|
| durationSeconds = 0;
|
| - document.documentElement.addEventListener(endEvent, endEventListener);
|
| + document.documentElement.addEventListener(endEvent, animationEnded);
|
| } else if (webkitPrefix) {
|
| durationSeconds = 1e9;
|
| iterationCount = 1;
|
| @@ -341,7 +409,7 @@
|
| setTimeout(finishTest, 0);
|
| });
|
| } else {
|
| - document.documentElement.addEventListener(endEvent, endEventListener);
|
| + document.documentElement.addEventListener(endEvent, animationEnded);
|
| }
|
|
|
| if (!window.testRunner) {
|
|
|