4 https://bugzilla.mozilla.org/show_bug.cgi?id=531585
7 <title>Test for Bug
531585 (transitionend event)
</title>
8 <script src=
"/tests/SimpleTest/SimpleTest.js"></script>
9 <link rel=
"stylesheet" type=
"text/css" href=
"/tests/SimpleTest/test.css"/>
11 <style type=
"text/css">
13 .bar { margin: 10px; }
15 #one { transition-duration: 500ms; transition-property: all
; }
16 #two { transition: margin-left
1s; }
17 #three { transition: margin
0.5s 0.25s; }
19 #four, #five
, #six
, #
seven::before
, #
seven::after
{
20 transition: 500ms color
;
21 border-color: black
; /* don't derive from color */
22 column-rule-color: black
; /* don't derive from color */
23 text-decoration-color: black
; /* don't derive from color */
24 outline-color: black
; /* don't derive from color */
28 /* give the reversing transition a long duration; the reversing will
30 transition-duration: 30s;
31 transition-timing-function: cubic-bezier
(0, 1, 1, 0);
34 #seven::before
, #
seven::after
{
36 transition-duration: 50ms;
38 #seven[foo
]::before
, #seven
[foo
]::after
{ color: lime
; }
42 <a target=
"_blank" href=
"https://bugzilla.mozilla.org/show_bug.cgi?id=531585">Mozilla Bug
531585</a>
45 <span id=
"one" style=
"color:blue"></span>
46 <span id=
"two"></span>
47 <span id=
"three"></span>
48 <span id=
"four" style=
"color: blue"></span>
49 <span id=
"five" style=
"color: blue"></span>
50 <span id=
"six" style=
"color: blue"></span>
51 <span id=
"seven" style=
"color: blue"></span>
55 <script type=
"application/javascript">
57 /** Test for Bug
531585 (transitionend event) **/
59 SimpleTest.waitForExplicitFinish();
60 SimpleTest.requestFlakyTimeout(
"untriaged");
62 function started_test() { ++gTestCount; }
63 function finished_test() { if (--gTestCount ==
0) { SimpleTest.finish(); } }
65 function $(id) { return document.getElementById(id); }
66 function cs(id) { return getComputedStyle($(id),
""); }
68 var got_one_root = false;
69 var got_one_target = false;
70 var got_two_target = false;
71 var got_three_top = false;
72 var got_three_right = false;
73 var got_three_bottom = false;
74 var got_three_left = false;
75 var got_four_root = false;
77 var did_finish_five = false;
78 var did_finish_six = false;
79 var got_before = false;
80 var got_after = false;
82 // Flush layout to guarantee consistent transitions.
83 document.body.getBoundingClientRect();
85 document.documentElement.addEventListener(
"transitionend",
87 if (event.target == $(
"one")) {
88 ok(!got_one_root,
"transitionend on one on root");
89 is(event.propertyName,
"border-right-color",
90 "propertyName for transitionend on one");
91 is(event.elapsedTime,
0.5,
92 "elapsedTime for transitionend on one");
93 is(cs(
"one").borderRightColor,
"rgb(0, 255, 0)",
94 "computed style for transitionend on one");
97 } else if (event.target == $(
"four")) {
98 ok(!got_four_root,
"transitionend on four on root");
99 is(event.propertyName,
"color",
100 "propertyName for transitionend on four");
101 // Reported time should (really?) be shortened by reversing.
102 ok(event.elapsedTime <
30,
103 "elapsedTime for transitionend on four");
104 is(cs(
"four").color,
"rgb(0, 0, 255)",
105 "computed style for transitionend on four (end of reverse transition)");
106 got_four_root = true;
108 } else if (event.target == document.body) {
109 // A synthesized event.
110 ok(!got_body,
"transitionend on body on root");
111 is(event.propertyName,
"some-unknown-prop",
112 "propertyName for transitionend on body");
113 // Reported time should (really?) be shortened by reversing.
114 is(event.elapsedTime,
0.5,
115 "elapsedTime for transitionend on body");
118 } else if (event.target == $(
"seven")) {
121 is(event.pseudoElement,
"::before");
123 ok(!got_after,
"transitionend on #seven::after");
125 is(event.pseudoElement,
"::after");
127 is(event.propertyName,
"color");
128 is(event.isTrusted, true);
131 if ((event.target == $(
"five") && did_finish_five) ||
132 (event.target == $(
"six") && did_finish_six)) {
134 "it seems that transitionstart and transitionend had been " +
135 "processed in the same frame");
139 "unexpected event on " + event.target.nodeName +
140 " element with id '" + event.target.id +
"' " +
141 "elapsedTime=" + event.elapsedTime +
142 " propertyName='" + event.propertyName +
"'");
146 $(
"one").addEventListener(
"transitionend",
148 is(event.propertyName,
"color",
"unexpected " +
149 "property name for transitionend on one on target");
151 "transitionend on one on target (color)");
152 got_one_target = true;
153 event.stopPropagation();
154 is(event.elapsedTime,
0.5,
155 "elapsedTime for transitionend on one");
156 is(cs(
"one").getPropertyValue(event.propertyName),
"rgb(0, 255, 0)",
157 "computed style of " + event.propertyName +
" for transitionend on one");
161 started_test(); // color on #one
162 $(
"one").style.color =
"lime";
165 $(
"two").addEventListener(
"transitionend",
167 event.stopPropagation();
169 ok(!got_two_target,
"transitionend on two on target");
170 is(event.propertyName,
"margin-left",
171 "propertyName for transitionend on two");
172 is(event.elapsedTime,
1,
173 "elapsedTime for transitionend on two");
174 is(event.bubbles, true,
175 "transitionend events should bubble");
176 is(event.cancelable, false,
177 "transitionend events should not be cancelable");
178 is(cs(
"two").marginLeft,
"10px",
179 "computed style for transitionend on two");
180 got_two_target = true;
184 started_test(); // #two
185 $(
"two").className =
"bar";
187 $(
"three").addEventListener(
"transitionend",
189 event.stopPropagation();
191 switch (event.propertyName) {
193 ok(!got_three_top,
"should only get margin-top once");
194 got_three_top = true;
197 ok(!got_three_right,
"should only get margin-right once");
198 got_three_right = true;
200 case
"margin-bottom":
201 ok(!got_three_bottom,
"should only get margin-bottom once");
202 got_three_bottom = true;
205 ok(!got_three_left,
"should only get margin-left once");
206 got_three_left = true;
209 ok(false,
"unexpected property name " + event.propertyName +
210 " for transitionend on three");
212 is(event.elapsedTime,
0.5,
213 "elapsedTime for transitionend on three");
214 is(cs(
"three").getPropertyValue(event.propertyName),
"10px",
215 "computed style for transitionend on three");
219 started_test(); // margin-top on #three
220 started_test(); // margin-right on #three
221 started_test(); // margin-bottom on #three
222 started_test(); // margin-left on #three
223 $(
"three").className =
"bar";
225 // We reverse the transition on four, and we should only get an event
226 // at the end of the second transition.
227 started_test(); // #four (listener on root)
228 $(
"four").style.color =
"lime";
230 // We cancel the transition on five by changing 'transition-property',
231 // and should thus get no event.
232 $(
"five").style.color =
"lime";
234 // We cancel the transition on six by changing 'transition-duration' and
235 // then changing the value, so we should get no event.
236 $(
"six").style.color =
"lime";
238 started_test(); // #seven::before (listener on root)
239 started_test(); // #seven::after (listener on root)
240 $(
"seven").setAttribute(
"foo",
"bar");
242 $(
"five").addEventListener(
"transitionstart", function() {
243 if (cs(
"five").color ==
"rgb(0, 255, 0)") {
244 // The transition has finished already.
245 did_finish_five = true;
247 $(
"five").style.transitionProperty =
"margin-left";
250 $(
"six").addEventListener(
"transitionstart", function() {
251 if (cs(
"six").color ==
"rgb(0, 255, 0)") {
252 // The transition has finished already.
253 did_finish_six = true;
255 $(
"six").style.transitionDuration =
"0s";
256 $(
"six").style.transitionDelay =
"0s";
257 $(
"six").style.color =
"blue";
260 function poll_start_reversal() {
261 if (cs(
"four").color !=
"rgb(0, 0, 255)") {
262 // The forward transition has started.
263 $(
"four").style.color =
"blue";
265 // The forward transition has not started yet.
266 setTimeout(poll_start_reversal,
20);
269 setTimeout(poll_start_reversal,
200);
271 // And make our own event to dispatch to the body.
272 started_test(); // synthesized event to body (listener on root)
274 var e = new TransitionEvent(
"transitionend",
278 propertyName:
"some-unknown-prop",
280 pseudoElement:
"pseudo"
283 is(e.cancelable, true);
284 is(e.propertyName,
"some-unknown-prop");
285 is(e.elapsedTime,
0.5);
286 is(e.pseudoElement,
"pseudo");
287 is(e.isTrusted, false)
289 document.body.dispatchEvent(e);