Automatic update from web-platform-tests Reland "Started implementing the STAPIT algorithm" Changed SMILTimeContainer to step through all times where an animation stops or ends when just playing it normally. Currently it will only add slowdowns but also makes the animations more "correct". The "repeatn-remove-add-animation.html" test has been changed to work more reliably with the new stepping. This commit also fixes issue 688742 Bug: 688742, 986219, 997279 Change-Id: I7f1a68c42994eb5b080a87bd2df53cb80316ecff Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1768765 Reviewed-by: Fredrik Söderquist <fs@opera.com> Reviewed-by: Philip Rogers <pdr@chromium.org> Commit-Queue: Edvard Thörnros <edvardt@opera.com> Cr-Commit-Position: refs/heads/master@{#691141} -- wpt-commits: 5a8e09eae29344d2a907be9ff5c9c3a877f635ca wpt-pr: 18672
103 lines
3.6 KiB
JavaScript
103 lines
3.6 KiB
JavaScript
// NOTE(edvardt):
|
|
// This file is a slimmed down wrapper for the old SVGAnimationTestCase.js,
|
|
// it has some convenience functions and should not be used for new tests.
|
|
// New tests should not build on this API as it's just meant to keep things
|
|
// working.
|
|
|
|
// Helper functions
|
|
const xlinkNS = "http://www.w3.org/1999/xlink"
|
|
|
|
function expectFillColor(element, red, green, blue, message) {
|
|
let color = window.getComputedStyle(element, null).fill;
|
|
var re = new RegExp("rgba?\\(([^, ]*), ([^, ]*), ([^, ]*)(?:, )?([^, ]*)\\)");
|
|
rgb = re.exec(color);
|
|
|
|
assert_approx_equals(Number(rgb[1]), red, 2.0, message);
|
|
assert_approx_equals(Number(rgb[2]), green, 2.0, message);
|
|
assert_approx_equals(Number(rgb[3]), blue, 2.0, message);
|
|
}
|
|
|
|
function expectColor(element, red, green, blue, property) {
|
|
if (typeof property != "string")
|
|
color = getComputedStyle(element).getPropertyValue("color");
|
|
else
|
|
color = getComputedStyle(element).getPropertyValue(property);
|
|
var re = new RegExp("rgba?\\(([^, ]*), ([^, ]*), ([^, ]*)(?:, )?([^, ]*)\\)");
|
|
rgb = re.exec(color);
|
|
assert_approx_equals(Number(rgb[1]), red, 2.0);
|
|
assert_approx_equals(Number(rgb[2]), green, 2.0);
|
|
assert_approx_equals(Number(rgb[3]), blue, 2.0);
|
|
}
|
|
|
|
function createSVGElement(type) {
|
|
return document.createElementNS("http://www.w3.org/2000/svg", type);
|
|
}
|
|
|
|
// Inspired by Layoutests/animations/animation-test-helpers.js
|
|
function moveAnimationTimelineAndSample(index) {
|
|
var animationId = expectedResults[index][0];
|
|
var time = expectedResults[index][1];
|
|
var sampleCallback = expectedResults[index][2];
|
|
var animation = rootSVGElement.ownerDocument.getElementById(animationId);
|
|
|
|
// If we want to sample the animation end, add a small delta, to reliable point past the end of the animation.
|
|
newTime = time;
|
|
|
|
// The sample time is relative to the start time of the animation, take that into account.
|
|
rootSVGElement.setCurrentTime(newTime);
|
|
|
|
// NOTE(edvardt):
|
|
// This is a dumb hack, some of the old tests sampled before the animation start, this
|
|
// isn't technically part of the animation tests and is "impossible" to translate since
|
|
// tests start automatically. Thus I solved it by skipping it.
|
|
if (time != 0.0)
|
|
sampleCallback();
|
|
}
|
|
|
|
var currentTest = 0;
|
|
var expectedResults;
|
|
|
|
function sampleAnimation(t) {
|
|
if (currentTest == expectedResults.length) {
|
|
t.done();
|
|
return;
|
|
}
|
|
|
|
moveAnimationTimelineAndSample(currentTest);
|
|
++currentTest;
|
|
|
|
step_timeout(t.step_func(function () { sampleAnimation(t); }), 0);
|
|
}
|
|
|
|
function runAnimationTest(t, expected) {
|
|
if (!expected)
|
|
throw("Expected results are missing!");
|
|
if (currentTest > 0)
|
|
throw("Not allowed to call runAnimationTest() twice");
|
|
|
|
expectedResults = expected;
|
|
testCount = expectedResults.length;
|
|
currentTest = 0;
|
|
|
|
step_timeout(t.step_func(function () { sampleAnimation(this); }), 50);
|
|
}
|
|
|
|
function smil_async_test(func) {
|
|
async_test(t => {
|
|
window.onload = t.step_func(function () {
|
|
// Pause animations, we'll drive them manually.
|
|
// This also ensures that the timeline is paused before
|
|
// it starts. This should make the instance time of the below
|
|
// 'click' (for instance) 0, and hence minimize rounding
|
|
// errors for the addition in moveAnimationTimelineAndSample.
|
|
rootSVGElement.pauseAnimations();
|
|
|
|
// If eg. an animation is running with begin="0s", and
|
|
// we want to sample the first time, before the animation
|
|
// starts, then we can't delay the testing by using an
|
|
// onclick event, as the animation would be past start time.
|
|
func(t);
|
|
});
|
|
});
|
|
}
|