summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/css/css-transitions/Document-getAnimations.tentative.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/css/css-transitions/Document-getAnimations.tentative.html')
-rw-r--r--testing/web-platform/tests/css/css-transitions/Document-getAnimations.tentative.html196
1 files changed, 196 insertions, 0 deletions
diff --git a/testing/web-platform/tests/css/css-transitions/Document-getAnimations.tentative.html b/testing/web-platform/tests/css/css-transitions/Document-getAnimations.tentative.html
new file mode 100644
index 0000000000..d1cf6e499b
--- /dev/null
+++ b/testing/web-platform/tests/css/css-transitions/Document-getAnimations.tentative.html
@@ -0,0 +1,196 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Document.getAnimations() for CSS transitions</title>
+<link rel="help" href="https://drafts.csswg.org/css-transitions-2/#animation-composite-order">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/helper.js"></script>
+<div id="log"></div>
+<script>
+'use strict';
+
+test(t => {
+ assert_equals(document.getAnimations().length, 0,
+ 'getAnimations returns an empty sequence for a document'
+ + ' with no animations');
+}, 'getAnimations for non-animated content');
+
+test(t => {
+ const div = addDiv(t);
+
+ // Add a couple of transitions
+ div.style.left = '0px';
+ div.style.top = '0px';
+ getComputedStyle(div).transitionProperty;
+
+ div.style.transition = 'all 100s';
+ div.style.left = '100px';
+ div.style.top = '100px';
+ assert_equals(document.getAnimations().length, 2,
+ 'getAnimations returns two running CSS Transitions');
+
+ // Remove both
+ div.style.transitionProperty = 'none';
+ assert_equals(document.getAnimations().length, 0,
+ 'getAnimations returns no running CSS Transitions');
+}, 'getAnimations for CSS Transitions');
+
+test(t => {
+ const div = addDiv(t);
+
+ // Add a couple of transitions
+ div.style.top = '0px';
+ div.style.left = '0px';
+ getComputedStyle(div).transitionProperty;
+
+ div.style.transition = 'all 100s';
+ div.style.top = '100px';
+ div.style.left = '100px';
+
+ var animations = document.getAnimations();
+ assert_equals(animations.length, 2,
+ 'getAnimations returns two running CSS Transitions');
+ assert_equals(animations[0].transitionProperty, 'left');
+ assert_equals(animations[1].transitionProperty, 'top');
+}, 'getAnimations for CSS Transitions sort by property name');
+
+promise_test(async t => {
+ const div = addDiv(t);
+
+ // Add a couple of transitions
+ div.style.top = '0px';
+ div.style.left = '0px';
+ getComputedStyle(div).transitionProperty;
+
+ div.style.transition = 'all 100s';
+ div.style.top = '100px';
+ div.style.left = '100px';
+
+ var animations = document.getAnimations();
+ assert_equals(animations.length, 2,
+ 'getAnimations returns two running CSS Transitions');
+ assert_equals(animations[0].transitionProperty, 'left');
+ assert_equals(animations[1].transitionProperty, 'top');
+
+ // Add one more transition. As the previous call to getAnimations triggered a
+ // style change, the new animation is in a higher transition generation even
+ // though no frame was rendered for the previous transitions.
+ div.style.opacity = '1'
+ div.style.transition = 'all 100s';
+ div.style.opacity = '0'
+ animations = document.getAnimations();
+ assert_equals(animations.length, 3,
+ 'getAnimations returns three running CSS Transitions');
+ assert_equals(animations[0].transitionProperty, 'left', '1');
+ assert_equals(animations[1].transitionProperty, 'top', '2');
+ assert_equals(animations[2].transitionProperty, 'opacity', '3');
+}, 'getAnimations for CSS Transitions sort by transition generation');
+
+function pseudoTest(description, testMarkerPseudos) {
+ test(t => {
+ // Create two divs with the following arrangement:
+ //
+ // parent
+ // (::marker,) // Optionally
+ // ::before,
+ // ::after
+ // |
+ // child
+
+ addStyle(t, {
+ '.init::after': 'content: ""; width: 0px; transition: all 100s;',
+ '.init::before': 'content: ""; width: 0px; transition: all 100s;',
+ '.change::after': 'width: 100px;',
+ '.change::before': 'width: 100px;',
+ });
+
+ if (testMarkerPseudos) {
+ addStyle(t, {
+ '.init::marker': 'content: ""; color: red; transition: all 100s;',
+ '.change::marker': 'color: green;',
+ });
+ }
+
+ const parent = addDiv(t, { 'style': 'display: list-item' });
+ const child = addDiv(t);
+ parent.appendChild(child);
+
+ parent.style.left = '0px';
+ parent.style.transition = 'left 100s';
+ parent.classList.add('init');
+ child.style.left = '0px';
+ child.style.transition = 'left 100s';
+ getComputedStyle(parent).left;
+
+ parent.style.left = '100px';
+ parent.classList.add('change');
+ child.style.left = '100px';
+
+ const expectedTransitions = [
+ [parent, undefined],
+ [parent, '::marker'],
+ [parent, '::before'],
+ [parent, '::after'],
+ [child, undefined],
+ ];
+ if (!testMarkerPseudos) {
+ expectedTransitions.splice(1, 1);
+ }
+
+ const transitions = document.getAnimations();
+ assert_equals(
+ transitions.length,
+ expectedTransitions.length,
+ 'CSS transition on both pseudo-elements and elements are returned'
+ );
+
+ for (const [index, expected] of expectedTransitions.entries()) {
+ const [element, pseudo] = expected;
+ const actual = transitions[index];
+
+ if (pseudo) {
+ assert_equals(
+ actual.effect.target,
+ element,
+ `Transition #${index + 1} has expected target`
+ );
+ assert_equals(
+ actual.effect.pseudoElement,
+ pseudo,
+ `Transition #${index + 1} has expected pseudo type`
+ );
+ } else {
+ assert_equals(
+ actual.effect.target,
+ element,
+ `Transition #${index + 1} has expected target`
+ );
+ assert_equals(
+ actual.effect.pseudoElement,
+ null,
+ `Transition #${index + 1} has null pseudo type`
+ );
+ }
+ }
+ }, description);
+}
+
+pseudoTest('CSS Transitions targetting (pseudo-)elements should have correct '
+ + 'order after sorting', false)
+pseudoTest('CSS Transitions targetting (pseudo-)elements should have correct '
+ + 'order after sorting (::marker)', true)
+
+promise_test(async t => {
+ const div = addDiv(t, { style: 'left: 0px; transition: all 50ms' });
+ getComputedStyle(div).left;
+
+ div.style.left = '100px';
+ const animations = div.getAnimations();
+ assert_equals(animations.length, 1, 'Got transition');
+ await animations[0].finished;
+
+ assert_equals(document.getAnimations().length, 0,
+ 'No animations returned');
+}, 'Transitions are not returned after they have finished');
+
+</script>