Bug 1343589 - Add a test that reverse() updates animations on the compositor
MozReview-Commit-ID: FR8kR7TMl33
--- a/dom/animation/Animation.cpp
+++ b/dom/animation/Animation.cpp
@@ -541,16 +541,18 @@ Animation::Reverse(ErrorResult& aRv)
if (aRv.Failed()) {
SilentlySetPlaybackRate(-mPlaybackRate);
return;
}
if (IsRelevant()) {
nsNodeUtils::AnimationChanged(this);
}
+ // Play(), above, unconditionally calls PostUpdate so we don't need to do
+ // it here.
}
// ---------------------------------------------------------------------------
//
// JS wrappers for Animation interface:
//
// ---------------------------------------------------------------------------
new file mode 100644
--- /dev/null
+++ b/layout/style/test/file_animations_reverse.html
@@ -0,0 +1,72 @@
+<!doctype html>
+<html>
+<head>
+ <meta charset=utf-8>
+ <script type="application/javascript"
+ src="/tests/SimpleTest/paint_listener.js"></script>
+ <script type="application/javascript" src="animation_utils.js"></script>
+ <script>
+ var ok = opener.ok.bind(opener);
+ var is = opener.is.bind(opener);
+ var todo = opener.todo.bind(opener);
+ function finish() {
+ var o = opener;
+ self.close();
+ o.SimpleTest.finish();
+ }
+ </script>
+ <style type="text/css">
+ @keyframes anim {
+ 0% { transform: translate(0px) }
+ 100% { transform: translate(100px) }
+ }
+ .target {
+ /* The animation target needs geometry in order to qualify for OMTA */
+ width: 100px;
+ height: 100px;
+ background-color: white;
+ }
+ </style>
+</head>
+<body>
+<div id="display"></div>
+<script type="application/javascript">
+"use strict";
+
+runOMTATest(function() {
+ runAllAsyncAnimTests().then(function() {
+ finish();
+ });
+}, finish, opener.SpecialPowers);
+
+addAsyncAnimTest(function *() {
+ var [ div, cs ] = new_div("animation: anim 10s linear");
+ const animation = div.getAnimations()[0];
+
+ // Animation is initially running on compositor
+ yield waitForPaintsFlushed();
+ advance_clock(5000);
+ omta_is(div, 'transform', { tx: 50 }, RunningOn.Compositor,
+ 'Animation is initally animating on compositor');
+
+ // Reverse animation
+ animation.reverse();
+
+ // At this point the playbackRate has changed but the transform will
+ // not have changed.
+ yield waitForPaints();
+ omta_is(div, 'transform', { tx: 50 }, RunningOn.Compositor,
+ 'Animation value does not change after being reversed');
+
+ // However, we should still have sent a layer transaction to update the
+ // playbackRate on the compositor so that on the next tick we advance
+ // in the right direction.
+ advance_clock(1000);
+ omta_is(div, 'transform', { tx: 40 }, RunningOn.Compositor,
+ 'Animation proceeds in reverse direction');
+
+ done_div();
+});
+</script>
+</body>
+</html>
--- a/layout/style/test/mochitest.ini
+++ b/layout/style/test/mochitest.ini
@@ -59,16 +59,18 @@ support-files = file_animations_effect_t
[test_animations_iterationstart.html]
support-files = file_animations_iterationstart.html
[test_animations_omta.html]
[test_animations_omta_start.html]
[test_animations_pausing.html]
support-files = file_animations_pausing.html
[test_animations_playbackrate.html]
support-files = file_animations_playbackrate.html
+[test_animations_reverse.html]
+support-files = file_animations_reverse.html
[test_animations_styles_on_event.html]
skip-if = stylo # timeout bug 1328505
support-files = file_animations_styles_on_event.html
[test_animations_with_disabled_properties.html]
support-files = file_animations_with_disabled_properties.html
[test_any_dynamic.html]
[test_asyncopen2.html]
[test_at_rule_parse_serialize.html]
--- a/layout/style/test/stylo-failures.md
+++ b/layout/style/test/stylo-failures.md
@@ -49,16 +49,17 @@ to mochitest command.
* test_animations_effect_timing_duration.html [1]
* test_animations_effect_timing_enddelay.html [1]
* test_animations_effect_timing_iterations.html [1]
* test_animations_iterationstart.html [1]
* test_animations_omta.html [1]
* test_animations_omta_start.html [1]
* test_animations_pausing.html [1]
* test_animations_playbackrate.html [1]
+ * test_animations_reverse.html [1]
* SMIL Animation
* test_restyles_in_smil_animation.html [2]
* CSS Timing Functions: Frames timing functions
* test_value_storage.html `frames` [30]
* Property parsing and computation:
* test_property_syntax_errors.html `animation` [404]
* test_value_storage.html `animation` [280]
* test_any_dynamic.html: slow selector handling [3]
new file mode 100644
--- /dev/null
+++ b/layout/style/test/test_animations_reverse.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1343589
+-->
+<head>
+ <meta charset=utf-8>
+ <title>Test for Animation.reverse() on compositor animations (Bug 1343589)</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank"
+ href="https://bugzilla.mozilla.org/show_bug.cgi?id=1343589">Mozilla Bug 1343589</a>
+<div id="display"></div>
+<pre id="test">
+<script type="application/javascript">
+"use strict";
+
+SimpleTest.waitForExplicitFinish();
+
+SpecialPowers.pushPrefEnv(
+ { "set": [[ "dom.animations-api.core.enabled", true]] },
+ function() {
+ window.open("file_animations_reverse.html");
+ });
+</script>
+</pre>
+</body>
+</html>