File: animation-trigger-once-play-state.tentative.html

package info (click to toggle)
thunderbird 1%3A143.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 4,703,968 kB
  • sloc: cpp: 7,770,492; javascript: 5,943,842; ansic: 3,918,754; python: 1,418,263; xml: 653,354; asm: 474,045; java: 183,079; sh: 111,238; makefile: 20,410; perl: 14,359; objc: 13,059; yacc: 4,583; pascal: 3,405; lex: 1,720; ruby: 999; exp: 762; sql: 715; awk: 580; php: 436; lisp: 430; sed: 69; csh: 10
file content (114 lines) | stat: -rw-r--r-- 4,352 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<!DOCTYPE html>
<html>
  <head>
    <link rel="help" src="https://drafts.csswg.org/css-animations-2/#animation-trigger">
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <script src="/web-animations/testcommon.js"></script>
    <script src="/dom/events/scrolling/scroll_support.js"></script>
    <script src="support/support.js"></script>
  </head>
  <body>
    <style>
      @keyframes myAnim {
        from { transform: scaleX(1); }
        to { transform: scaleX(5); }
      }
      .subject, .target {
        height: 50px;
        width: 50px;
        background-color: red;
      }
      .subject {
        view-timeline: --viewtimeline;
      }
      .target {
        animation: myAnim linear 0.5s forwards;
        animation-trigger: once --viewtimeline 150px 200px;
      }
      .scroller {
        overflow-y: scroll;
        height: 500px;
        width: 500px;
        border: solid 1px;
        position: relative;
      }
      #wrapper {
        timeline-scope: --viewtimeline;
      }
      #space {
        width: 50px;
        height: 600px;
      }
    </style>
    <div id="wrapper">
      <div id="scroller" class="scroller">
        <div id="space"></div>
        <div id="subject" class="subject"></div>
        <div id="space"></div>
      </div>
      <div id="target" class="target"></div>
    </div>
    <script>
      target = document.getElementById("target");

      function changePlayStateTo(state) {
        target.style.animationPlayState = state;
      }

      // The trigger and exit ranges are the same for this test.
      const CSS_TRIGGER_START_PX = 150;
      const CSS_TRIGGER_END_PX = 200;

      async function testPlayStateChange(test, rangeBoundaries) {
        const initial_transform = getComputedStyle(target).transform;
        // This enters the trigger range and should play the animation. Changing
        // animation-play-state to "paused" should pause the animation, so we
        // should not see an animationend event.
        await testAnimationTrigger(test, async () => {
            await rangeBoundaries.enterTriggerRange();
            // Make a little progess.
            await waitForAnimationFrames(5);
            changePlayStateTo("paused");
          }, target, ["animationstart", "animationend"], [true, false]);
        await waitForAnimationFrames(5);
        const partial_transform = getComputedStyle(target).transform;
        assert_not_equals(partial_transform, initial_transform,
          "animation made progress before pause.");

        await waitForAnimationFrames(5);
        assert_equals(getComputedStyle(target).transform, partial_transform,
          "animation is paused and progress is not being made.");

        await testAnimationTrigger(test, async () => {
            await rangeBoundaries.exitExitRangeAbove();
            await waitForAnimationFrames(5);
            // check that exiting the exit range did not affect the animation.
            assert_equals(getComputedStyle(target).transform, partial_transform,
              "animation still paused after exiting the exit range.");
            changePlayStateTo("running");
          }, target, ["animationstart", "animationend"], [false, true]);

        const final_transform = getComputedStyle(target).transform;
        assert_not_equals(final_transform, initial_transform,
          "animation is at the end, not the start");
        assert_not_equals(final_transform, partial_transform,
          "animation is at the end, beyond partial progress.");
      }

      promise_test(async (test) => {
        scroller = document.getElementById("scroller");
        target = document.getElementById("target");

        const COVER_START_OFFSET = 100;
        const rangeBoundaries = getRangeBoundariesForTest(
                                      COVER_START_OFFSET + CSS_TRIGGER_START_PX,
                                      COVER_START_OFFSET + CSS_TRIGGER_END_PX,
                                      COVER_START_OFFSET + CSS_TRIGGER_START_PX,
                                      COVER_START_OFFSET + CSS_TRIGGER_END_PX,
                                      scroller);
        await testPlayStateChange(test, rangeBoundaries);
      }, "once trigger respects animation-play-state.");
    </script>
  </body>
</html>