summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/web-animations/interfaces/KeyframeEffect/setTarget.html
blob: 2b07d3de6e0f8080d500fca3f746dcd82b0f705d (plain)
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
<!DOCTYPE html>
<meta charset=utf-8>
<title>Writable effect.target tests</title>
<link rel="help"
  href="https://w3c.github.io/web-animations/#dom-keyframeeffect-target">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../testcommon.js"></script>
<body>
<div id="log"></div>
<script>
"use strict";

var gKeyFrames = { 'marginLeft': ['0px', '100px'] };

test(function(t) {
  var div = createDiv(t);
  var effect = new KeyframeEffect(null, gKeyFrames, 100 * MS_PER_SEC);
  effect.target = div;

  var anim = new Animation(effect, document.timeline);
  anim.play();

  anim.currentTime = 50 * MS_PER_SEC;
  assert_equals(getComputedStyle(div).marginLeft, '50px',
                'Value at 50% progress');
}, 'Test setting target before constructing the associated animation');

test(function(t) {
  var div = createDiv(t);
  div.style.marginLeft = '10px';
  var effect = new KeyframeEffect(null, gKeyFrames, 100 * MS_PER_SEC);
  var anim = new Animation(effect, document.timeline);
  anim.play();

  anim.currentTime = 50 * MS_PER_SEC;
  assert_equals(getComputedStyle(div).marginLeft, '10px',
                'Value at 50% progress before setting new target');
  effect.target = div;
  assert_equals(getComputedStyle(div).marginLeft, '50px',
                'Value at 50% progress after setting new target');
}, 'Test setting target from null to a valid target');

test(function(t) {
  var div = createDiv(t);
  div.style.marginLeft = '10px';
  var anim = div.animate(gKeyFrames, 100 * MS_PER_SEC);

  anim.currentTime = 50 * MS_PER_SEC;
  assert_equals(getComputedStyle(div).marginLeft, '50px',
                'Value at 50% progress before clearing the target')

  anim.effect.target = null;
  assert_equals(getComputedStyle(div).marginLeft, '10px',
                'Value after clearing the target')
}, 'Test setting target from a valid target to null');

test(function(t) {
  var a = createDiv(t);
  var b = createDiv(t);
  a.style.marginLeft = '10px';
  b.style.marginLeft = '20px';
  var anim = a.animate(gKeyFrames, 100 * MS_PER_SEC);

  anim.currentTime = 50 * MS_PER_SEC;
  assert_equals(getComputedStyle(a).marginLeft, '50px',
                'Value of 1st element (currently targeted) before ' +
                'changing the effect target');
  assert_equals(getComputedStyle(b).marginLeft, '20px',
                'Value of 2nd element (currently not targeted) before ' +
                'changing the effect target');
  anim.effect.target = b;
  assert_equals(getComputedStyle(a).marginLeft, '10px',
                'Value of 1st element (currently not targeted) after ' +
                'changing the effect target');
  assert_equals(getComputedStyle(b).marginLeft, '50px',
                'Value of 2nd element (currently targeted) after ' +
                'changing the effect target');

  // This makes sure the animation property is changed correctly on new
  // targeted element.
  anim.currentTime = 75 * MS_PER_SEC;
  assert_equals(getComputedStyle(b).marginLeft, '75px',
                'Value of 2nd target (currently targeted) after ' +
                'changing the animation current time.');
}, 'Test setting target from a valid target to another target');

test(function(t) {
  var anim = createDiv(t).animate([ { marginLeft: '0px' },
                                    { marginLeft: '-20px' },
                                    { marginLeft: '100px' },
                                    { marginLeft: '50px' } ],
                                  { duration: 100 * MS_PER_SEC,
                                    spacing: 'paced(margin-left)' });

  anim.effect.target = null;

  var frames = anim.effect.getKeyframes();
  var slots = frames.length - 1;
  assert_equals(frames[0].computedOffset, 0.0, '1st frame offset');
  assert_equals(frames[1].computedOffset, 1.0 / slots, '2nd frame offset');
  assert_equals(frames[2].computedOffset, 2.0 / slots, '3rd frame offset');
  assert_equals(frames[3].computedOffset, 1.0, 'last frame offset');
}, 'Test falling back to distribute spacing mode after setting null target');

test(function(t) {
  var effect = new KeyframeEffect(null,
                                  [ { marginLeft: '0px' },
                                    { marginLeft: '-20px' },
                                    { marginLeft: '100px' },
                                    { marginLeft: '50px' } ],
                                  { duration: 100 * MS_PER_SEC,
                                    spacing: 'paced(margin-left)' });
  var frames = effect.getKeyframes();
  var slots = frames.length - 1;
  assert_equals(frames[1].computedOffset, 1.0 / slots, '2nd frame offset');
  assert_equals(frames[2].computedOffset, 2.0 / slots, '3rd frame offset');
}, 'Test falling back to distribute spacing mode if there is no context ' +
   'element');

test(function(t) {
  var div1 = createDiv(t);
  var div2 = createDiv(t);
  div1.style.marginLeft = '-20px';
  div2.style.marginLeft = '-50px';
  var child1 = document.createElement('div');
  var child2 = document.createElement('div');
  div1.appendChild(child1);
  div2.appendChild(child2);
  //      body
  //    /      \
  //  div1     div2
  // (-20px)  (-50px)
  //   |        |
  // child1   child2
  var anim = child1.animate([ { marginLeft: '0px' },
                              { marginLeft: 'inherit' },
                              { marginLeft: '100px' },
                              { marginLeft: '50px' } ],
                            { duration: 100 * MS_PER_SEC,
                              spacing: 'paced(margin-left)' });

  var frames = anim.effect.getKeyframes();
  var cumDist = [0, 20, 140, 190];
  assert_equals(frames[1].computedOffset, cumDist[1] / cumDist[3],
                '2nd frame offset');
  assert_equals(frames[2].computedOffset, cumDist[2] / cumDist[3],
                '3rd frame offset');

  anim.effect.target = child2;
  frames = anim.effect.getKeyframes();
  cumDist = [0, 50, 200, 250];
  assert_equals(frames[1].computedOffset, cumDist[1] / cumDist[3],
                '2nd frame offset after setting a new target');
  assert_equals(frames[2].computedOffset, cumDist[2] / cumDist[3],
                '3rd frame offset after setting a new target');
}, 'Test paced spacing mode after setting a new target');

</script>
</body>