Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(972)

Side by Side Diff: LayoutTests/animations/interpolation/resources/interpolation-test.js

Issue 1265873002: Add test coverage for interpolations using CSS wide keywords and neutral keyframes (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebased Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2015 Google Inc. All rights reserved. 2 * Copyright (C) 2015 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 cssAnimationsData.sharedStyle.textContent += '' + 72 cssAnimationsData.sharedStyle.textContent += '' +
73 '@keyframes animation' + id + ' {' + 73 '@keyframes animation' + id + ' {' +
74 'from {' + property + ': ' + from + ';}' + 74 'from {' + property + ': ' + from + ';}' +
75 'to {' + property + ': ' + to + ';}' + 75 'to {' + property + ': ' + to + ';}' +
76 '}'; 76 '}';
77 target.style.animationName = 'animation' + id; 77 target.style.animationName = 'animation' + id;
78 target.style.animationDuration = '2e10s'; 78 target.style.animationDuration = '2e10s';
79 target.style.animationDelay = '-1e10s'; 79 target.style.animationDelay = '-1e10s';
80 target.style.animationTimingFunction = createEasing(at); 80 target.style.animationTimingFunction = createEasing(at);
81 }, 81 },
82 rebaseline: false,
82 }; 83 };
83 84
84 var cssTransitionsInterpolation = { 85 var cssTransitionsInterpolation = {
85 name: 'CSS Transitions', 86 name: 'CSS Transitions',
86 supportsProperty: function() {return true;}, 87 supportsProperty: function() {return true;},
87 supportsValue: function() {return true;}, 88 supportsValue: function() {return true;},
88 setup: function(property, from, target) { 89 setup: function(property, from, target) {
89 target.style[property] = from; 90 target.style[property] = from;
90 }, 91 },
91 nonInterpolationExpectations: function(from, to) { 92 nonInterpolationExpectations: function(from, to) {
92 return expectFlip(from, to, -Infinity); 93 return expectFlip(from, to, -Infinity);
93 }, 94 },
94 interpolate: function(property, from, to, at, target) { 95 interpolate: function(property, from, to, at, target) {
95 target.style.transitionDuration = '2e10s'; 96 target.style.transitionDuration = '2e10s';
96 target.style.transitionDelay = '-1e10s'; 97 target.style.transitionDelay = '-1e10s';
97 target.style.transitionTimingFunction = createEasing(at); 98 target.style.transitionTimingFunction = createEasing(at);
98 target.style.transitionProperty = property; 99 target.style.transitionProperty = property;
99 target.style[property] = to; 100 target.style[property] = to;
100 }, 101 },
102 rebaseline: false,
101 }; 103 };
102 104
103 var webAnimationsInterpolation = { 105 var webAnimationsInterpolation = {
104 name: 'Web Animations', 106 name: 'Web Animations',
105 supportsProperty: function(property) {return property.indexOf('-webkit-') != = 0;}, 107 supportsProperty: function(property) {return property.indexOf('-webkit-') != = 0;},
106 supportsValue: function(value) {return value !== '';}, 108 supportsValue: function(value) {return value !== '';},
107 setup: function() {}, 109 setup: function() {},
108 nonInterpolationExpectations: function(from, to) { 110 nonInterpolationExpectations: function(from, to) {
109 return expectFlip(from, to, 0.5); 111 return expectFlip(from, to, 0.5);
110 }, 112 },
111 interpolate: function(property, from, to, at, target) { 113 interpolate: function(property, from, to, at, target) {
112 var keyframes = [{}, {}]; 114 var keyframes = [{}, {}];
113 keyframes[0][property] = from; 115 keyframes[0][property] = from;
114 keyframes[1][property] = to; 116 keyframes[1][property] = to;
115 var player = target.animate(keyframes, { 117 var player = target.animate(keyframes, {
116 fill: 'forwards', 118 fill: 'forwards',
117 duration: 1, 119 duration: 1,
118 easing: createEasing(at), 120 easing: createEasing(at),
119 delay: -0.5, 121 delay: -0.5,
120 iterations: 0.5, 122 iterations: 0.5,
121 }); 123 });
122 }, 124 },
125 rebaseline: false,
123 }; 126 };
124 127
125 function expectFlip(from, to, flipAt) { 128 function expectFlip(from, to, flipAt) {
126 return [-0.3, 0, 0.3, 0.5, 0.6, 1, 1.5].map(function(at) { 129 return [-0.3, 0, 0.3, 0.5, 0.6, 1, 1.5].map(function(at) {
127 return { 130 return {
128 at: at, 131 at: at,
129 is: at < flipAt ? from : to 132 is: at < flipAt ? from : to
130 }; 133 };
131 }); 134 });
132 } 135 }
(...skipping 27 matching lines...) Expand all
160 return new Promise(function(resolve) { 163 return new Promise(function(resolve) {
161 var script = document.createElement('script'); 164 var script = document.createElement('script');
162 script.src = url; 165 script.src = url;
163 script.onload = resolve; 166 script.onload = resolve;
164 document.head.appendChild(script); 167 document.head.appendChild(script);
165 }); 168 });
166 } 169 }
167 170
168 function createTargetContainer(parent) { 171 function createTargetContainer(parent) {
169 var targetContainer = createElement(parent); 172 var targetContainer = createElement(parent);
173 targetContainer.classList.add('container');
170 var template = document.querySelector('#target-template'); 174 var template = document.querySelector('#target-template');
171 if (template) { 175 if (template) {
172 targetContainer.appendChild(template.content.cloneNode(true)); 176 targetContainer.appendChild(template.content.cloneNode(true));
173 } 177 }
174 var target = targetContainer.querySelector('.target') || targetContainer; 178 var target = targetContainer.querySelector('.target') || targetContainer;
175 target.classList.add('target'); 179 target.classList.add('target');
176 target.parentElement.classList.add('parent'); 180 target.parentElement.classList.add('parent');
177 targetContainer.target = target; 181 targetContainer.target = target;
178 return targetContainer; 182 return targetContainer;
179 } 183 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 } 226 }
223 if (options.to) { 227 if (options.to) {
224 console.assert(CSS.supports(options.property, options.to)); 228 console.assert(CSS.supports(options.property, options.to));
225 } 229 }
226 interpolationTests.push({ 230 interpolationTests.push({
227 options: options, 231 options: options,
228 expectations: expectations, 232 expectations: expectations,
229 }); 233 });
230 } 234 }
231 235
232 function createTestTargets(interpolationMethods, interpolationTests, container ) { 236 function createTestTargets(interpolationMethods, interpolationTests, container , rebaselineContainer) {
233 var targets = []; 237 var targets = [];
234 interpolationMethods.forEach(function(interpolationMethod) { 238 interpolationMethods.forEach(function(interpolationMethod, interpolationMeth odIndex) {
235 var methodContainer = createElement(container); 239 var methodContainer = createElement(container);
236 interpolationTests.forEach(function(interpolationTest) { 240 interpolationTests.forEach(function(interpolationTest) {
237 var property = interpolationTest.options.property; 241 var property = interpolationTest.options.property;
238 var from = interpolationTest.options.from; 242 var from = interpolationTest.options.from;
239 var to = interpolationTest.options.to; 243 var to = interpolationTest.options.to;
240 if ((interpolationTest.options.method && interpolationTest.options.metho d != interpolationMethod.name) 244 if ((interpolationTest.options.method && interpolationTest.options.metho d != interpolationMethod.name)
241 || !interpolationMethod.supportsProperty(property) 245 || !interpolationMethod.supportsProperty(property)
242 || !interpolationMethod.supportsValue(from) 246 || !interpolationMethod.supportsValue(from)
243 || !interpolationMethod.supportsValue(to)) { 247 || !interpolationMethod.supportsValue(to)) {
244 return; 248 return;
245 } 249 }
250 if (interpolationMethod.rebaseline) {
251 var rebaseline = createElement(rebaselineContainer, 'pre');
252 rebaseline.appendChild(document.createTextNode(`\
253 assertInterpolation({
254 property: '${property}',
255 from: '${from}',
256 to: '${to}',
257 }, [\n`));
258 var rebaselineExpectation;
259 rebaseline.appendChild(rebaselineExpectation = document.createTextNode (''));
260 rebaseline.appendChild(document.createTextNode(']);\n\n'));
261 }
246 var testText = interpolationMethod.name + ': property <' + property + '> from [' + from + '] to [' + to + ']'; 262 var testText = interpolationMethod.name + ': property <' + property + '> from [' + from + '] to [' + to + ']';
247 var testContainer = createElement(methodContainer, 'div', testText); 263 var testContainer = createElement(methodContainer, 'div', testText);
248 createElement(testContainer, 'br'); 264 createElement(testContainer, 'br');
249 var expectations = interpolationTest.expectations; 265 var expectations = interpolationTest.expectations;
250 if (expectations === expectNoInterpolation) { 266 if (expectations === expectNoInterpolation) {
251 expectations = interpolationMethod.nonInterpolationExpectations(from, to); 267 expectations = interpolationMethod.nonInterpolationExpectations(from, to);
252 } 268 }
253 expectations.forEach(function(expectation) { 269 expectations.forEach(function(expectation) {
254 var actualTargetContainer = createTargetContainer(testContainer); 270 var actualTargetContainer = createTargetContainer(testContainer);
255 var expectedTargetContainer = createTargetContainer(testContainer); 271 var expectedTargetContainer = createTargetContainer(testContainer);
256 expectedTargetContainer.target.classList.add('expected'); 272 expectedTargetContainer.target.classList.add('expected');
257 expectedTargetContainer.target.style[property] = expectation.is; 273 expectedTargetContainer.target.style[property] = expectation.is;
258 var target = actualTargetContainer.target; 274 var target = actualTargetContainer.target;
259 target.classList.add('actual'); 275 target.classList.add('actual');
260 interpolationMethod.setup(property, from, target); 276 interpolationMethod.setup(property, from, target);
261 target.interpolate = function() { 277 target.interpolate = function() {
262 interpolationMethod.interpolate(property, from, to, expectation.at, target); 278 interpolationMethod.interpolate(property, from, to, expectation.at, target);
263 }; 279 };
264 target.measure = function() { 280 target.measure = function() {
265 var actualValue = getComputedStyle(target)[property]; 281 var actualValue = getComputedStyle(target)[property];
266 test(function() { 282 test(function() {
267 assert_equals( 283 assert_equals(
268 normalizeValue(actualValue), 284 normalizeValue(actualValue),
269 normalizeValue(getComputedStyle(expectedTargetContainer.target)[ property])); 285 normalizeValue(getComputedStyle(expectedTargetContainer.target)[ property]));
270 }, testText + ' at (' + expectation.at + ') is [' + sanitizeUrls(act ualValue) + ']'); 286 }, testText + ' at (' + expectation.at + ') is [' + sanitizeUrls(act ualValue) + ']');
287 if (interpolationMethod.rebaseline) {
288 rebaselineExpectation.textContent += ` {at: ${expectation.at}, is : '${actualValue}'},\n`;
289 }
271 }; 290 };
272 targets.push(target); 291 targets.push(target);
273 }); 292 });
274 }); 293 });
275 }); 294 });
276 return targets; 295 return targets;
277 } 296 }
278 297
279 function runInterpolationTests() { 298 function runInterpolationTests() {
280 var interpolationMethods = [ 299 var interpolationMethods = [
281 cssTransitionsInterpolation, 300 cssTransitionsInterpolation,
282 cssAnimationsInterpolation, 301 cssAnimationsInterpolation,
283 ]; 302 ];
284 if (webAnimationsEnabled) { 303 if (webAnimationsEnabled) {
285 interpolationMethods.push(webAnimationsInterpolation); 304 interpolationMethods.push(webAnimationsInterpolation);
286 } 305 }
306 var rebaselineContainer = createElement(document.body);
287 var container = createElement(document.body); 307 var container = createElement(document.body);
288 var targets = createTestTargets(interpolationMethods, interpolationTests, co ntainer); 308 var targets = createTestTargets(interpolationMethods, interpolationTests, co ntainer, rebaselineContainer);
289 getComputedStyle(document.documentElement).left; // Force a style recalc for transitions. 309 getComputedStyle(document.documentElement).left; // Force a style recalc for transitions.
290 // Separate interpolation and measurement into different phases to avoid (ta rgets.length) style recalcs. 310 // Separate interpolation and measurement into different phases to avoid O(n ^2) of the number of targets.
291 for (var target of targets) { 311 for (var target of targets) {
292 target.interpolate(); 312 target.interpolate();
293 } 313 }
294 for (var target of targets) { 314 for (var target of targets) {
295 target.measure(); 315 target.measure();
296 } 316 }
297 if (window.testRunner) { 317 if (window.testRunner) {
298 container.remove(); 318 container.remove();
299 } 319 }
300 afterTestHook(); 320 afterTestHook();
(...skipping 10 matching lines...) Expand all
311 loadScript('../../resources/testharness.js').then(function() { 331 loadScript('../../resources/testharness.js').then(function() {
312 return loadScript('../../resources/testharnessreport.js'); 332 return loadScript('../../resources/testharnessreport.js');
313 }).then(function() { 333 }).then(function() {
314 var asyncHandle = async_test('This test uses interpolation-test.js.') 334 var asyncHandle = async_test('This test uses interpolation-test.js.')
315 requestAnimationFrame(function() { 335 requestAnimationFrame(function() {
316 runInterpolationTests(); 336 runInterpolationTests();
317 asyncHandle.done() 337 asyncHandle.done()
318 }); 338 });
319 }); 339 });
320 })(); 340 })();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698