test_transitions_events.html 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. <!DOCTYPE HTML>
  2. <html>
  3. <!--
  4. https://bugzilla.mozilla.org/show_bug.cgi?id=531585
  5. -->
  6. <head>
  7. <title>Test for Bug 531585 (transitionend event)</title>
  8. <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  9. <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
  10. </head>
  11. <style type="text/css">
  12. .bar { margin: 10px; }
  13. #one { transition-duration: 500ms; transition-property: all; }
  14. #two { transition: margin-left 1s; }
  15. #three { transition: margin 0.5s 0.25s; }
  16. #four, #five, #six, #seven::before, #seven::after {
  17. transition: 500ms color;
  18. border-color: black; /* don't derive from color */
  19. -moz-column-rule-color: black; /* don't derive from color */
  20. text-decoration-color: black; /* don't derive from color */
  21. outline-color: black; /* don't derive from color */
  22. }
  23. #four {
  24. /* give the reversing transition a long duration; the reversing will
  25. still be quick */
  26. transition-duration: 30s;
  27. transition-timing-function: cubic-bezier(0, 1, 1, 0);
  28. }
  29. #seven::before, #seven::after {
  30. content: "x";
  31. transition-duration: 50ms;
  32. }
  33. #seven[foo]::before, #seven[foo]::after { color: lime; }
  34. </style>
  35. <body>
  36. <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=531585">Mozilla Bug 531585</a>
  37. <p id="display">
  38. <span id="one" style="color:blue"></span>
  39. <span id="two"></span>
  40. <span id="three"></span>
  41. <span id="four" style="color: blue"></span>
  42. <span id="five" style="color: blue"></span>
  43. <span id="six" style="color: blue"></span>
  44. <span id="seven" style="color: blue"></span>
  45. </p>
  46. <pre id="test">
  47. <script type="application/javascript">
  48. /** Test for Bug 531585 (transitionend event) **/
  49. SimpleTest.waitForExplicitFinish();
  50. SimpleTest.requestFlakyTimeout("untriaged");
  51. var gTestCount = 0;
  52. function started_test() { ++gTestCount; }
  53. function finished_test() { if (--gTestCount == 0) { SimpleTest.finish(); } }
  54. function $(id) { return document.getElementById(id); }
  55. function cs(id) { return getComputedStyle($(id), ""); }
  56. var got_one_root = false;
  57. var got_one_target = false;
  58. var got_two_target = false;
  59. var got_three_top = false;
  60. var got_three_right = false;
  61. var got_three_bottom = false;
  62. var got_three_left = false;
  63. var got_four_root = false;
  64. var got_body = false;
  65. var did_stops = false;
  66. var got_before = false;
  67. var got_after = false;
  68. document.documentElement.addEventListener("transitionend",
  69. function(event) {
  70. if (event.target == $("one")) {
  71. ok(!got_one_root, "transitionend on one on root");
  72. is(event.propertyName, "border-right-color",
  73. "propertyName for transitionend on one");
  74. is(event.elapsedTime, 0.5,
  75. "elapsedTime for transitionend on one");
  76. is(cs("one").borderRightColor, "rgb(0, 255, 0)",
  77. "computed style for transitionend on one");
  78. got_one_root = true;
  79. finished_test();
  80. } else if (event.target == $("four")) {
  81. ok(!got_four_root, "transitionend on four on root");
  82. is(event.propertyName, "color",
  83. "propertyName for transitionend on four");
  84. // Reported time should (really?) be shortened by reversing.
  85. ok(event.elapsedTime < 30,
  86. "elapsedTime for transitionend on four");
  87. is(cs("four").color, "rgb(0, 0, 255)",
  88. "computed style for transitionend on four (end of reverse transition)");
  89. got_four_root = true;
  90. finished_test();
  91. } else if (event.target == document.body) {
  92. // A synthesized event.
  93. ok(!got_body, "transitionend on body on root");
  94. is(event.propertyName, "some-unknown-prop",
  95. "propertyName for transitionend on body");
  96. // Reported time should (really?) be shortened by reversing.
  97. is(event.elapsedTime, 0.5,
  98. "elapsedTime for transitionend on body");
  99. got_body = true;
  100. finished_test();
  101. } else if (event.target == $("seven")) {
  102. if (!got_before) {
  103. got_before = true;
  104. is(event.pseudoElement, "::before");
  105. } else {
  106. ok(!got_after, "transitionend on #seven::after");
  107. got_after = true;
  108. is(event.pseudoElement, "::after");
  109. }
  110. is(event.propertyName, "color");
  111. is(event.isTrusted, true);
  112. finished_test();
  113. } else {
  114. if (!did_stops &&
  115. (event.target == $("five") || event.target == $("six"))) {
  116. todo(false,
  117. "timeout to stop transitions firing later than it should be");
  118. return;
  119. }
  120. ok(false,
  121. "unexpected event on " + event.target.nodeName +
  122. " element with id '" + event.target.id + "' " +
  123. "elapsedTime=" + event.elapsedTime +
  124. " propertyName='" + event.propertyName + "'");
  125. }
  126. }, false);
  127. $("one").addEventListener("transitionend",
  128. function(event) {
  129. is(event.propertyName, "color", "unexpected " +
  130. "property name for transitionend on one on target");
  131. ok(!got_one_target,
  132. "transitionend on one on target (color)");
  133. got_one_target = true;
  134. event.stopPropagation();
  135. is(event.elapsedTime, 0.5,
  136. "elapsedTime for transitionend on one");
  137. is(cs("one").getPropertyValue(event.propertyName), "rgb(0, 255, 0)",
  138. "computed style of " + event.propertyName + " for transitionend on one");
  139. finished_test();
  140. }, false);
  141. started_test(); // color on #one
  142. $("one").style.color = "lime";
  143. $("two").addEventListener("transitionend",
  144. function(event) {
  145. event.stopPropagation();
  146. ok(!got_two_target, "transitionend on two on target");
  147. is(event.propertyName, "margin-left",
  148. "propertyName for transitionend on two");
  149. is(event.elapsedTime, 1,
  150. "elapsedTime for transitionend on two");
  151. is(event.bubbles, true,
  152. "transitionend events should bubble");
  153. is(event.cancelable, false,
  154. "transitionend events should not be cancelable");
  155. is(cs("two").marginLeft, "10px",
  156. "computed style for transitionend on two");
  157. got_two_target = true;
  158. finished_test();
  159. }, false);
  160. started_test(); // #two
  161. $("two").className = "bar";
  162. $("three").addEventListener("transitionend",
  163. function(event) {
  164. event.stopPropagation();
  165. switch (event.propertyName) {
  166. case "margin-top":
  167. ok(!got_three_top, "should only get margin-top once");
  168. got_three_top = true;
  169. break;
  170. case "margin-right":
  171. ok(!got_three_right, "should only get margin-right once");
  172. got_three_right = true;
  173. break;
  174. case "margin-bottom":
  175. ok(!got_three_bottom, "should only get margin-bottom once");
  176. got_three_bottom = true;
  177. break;
  178. case "margin-left":
  179. ok(!got_three_left, "should only get margin-left once");
  180. got_three_left = true;
  181. break;
  182. default:
  183. ok(false, "unexpected property name " + event.propertyName +
  184. " for transitionend on three");
  185. }
  186. is(event.elapsedTime, 0.5,
  187. "elapsedTime for transitionend on three");
  188. is(cs("three").getPropertyValue(event.propertyName), "10px",
  189. "computed style for transitionend on three");
  190. finished_test();
  191. }, true);
  192. started_test(); // margin-top on #three
  193. started_test(); // margin-right on #three
  194. started_test(); // margin-bottom on #three
  195. started_test(); // margin-left on #three
  196. $("three").className = "bar";
  197. // We reverse the transition on four, and we should only get an event
  198. // at the end of the second transition.
  199. started_test(); // #four (listener on root)
  200. $("four").style.color = "lime";
  201. // We cancel the transition on five by changing 'transition-property',
  202. // and should thus get no event.
  203. $("five").style.color = "lime";
  204. // We cancel the transition on six by changing 'transition-duration' and
  205. // then changing the value, so we should get no event.
  206. $("six").style.color = "lime";
  207. started_test(); // #seven::before (listener on root)
  208. started_test(); // #seven::after (listener on root)
  209. $("seven").setAttribute("foo", "bar");
  210. setTimeout(function() {
  211. if (cs("five") != "rgb(0, 255, 0)" &&
  212. cs("six") != "rgb(0, 255, 0)") {
  213. // The transition hasn't finished already.
  214. did_stops = true;
  215. }
  216. $("five").style.transitionProperty = "margin-left";
  217. $("six").style.transitionDuration = "0s";
  218. $("six").style.transitionDelay = "0s";
  219. $("six").style.color = "blue";
  220. }, 100);
  221. function poll_start_reversal() {
  222. if (cs("four").color != "rgb(0, 0, 255)") {
  223. // The forward transition has started.
  224. $("four").style.color = "blue";
  225. } else {
  226. // The forward transition has not started yet.
  227. setTimeout(poll_start_reversal, 20);
  228. }
  229. }
  230. setTimeout(poll_start_reversal, 200);
  231. // And make our own event to dispatch to the body.
  232. started_test(); // synthesized event to body (listener on root)
  233. var e = new TransitionEvent("transitionend",
  234. {
  235. bubbles: true,
  236. cancelable: true,
  237. propertyName: "some-unknown-prop",
  238. elapsedTime: 0.5,
  239. pseudoElement: "pseudo"
  240. });
  241. is(e.bubbles, true);
  242. is(e.cancelable, true);
  243. is(e.propertyName, "some-unknown-prop");
  244. is(e.elapsedTime, 0.5);
  245. is(e.pseudoElement, "pseudo");
  246. is(e.isTrusted, false)
  247. document.body.dispatchEvent(e);
  248. </script>
  249. </pre>
  250. </body>
  251. </html>