test_transitions_and_reframes.html 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. <!DOCTYPE HTML>
  2. <html>
  3. <!--
  4. https://bugzilla.mozilla.org/show_bug.cgi?id=625289
  5. -->
  6. <head>
  7. <meta charset="utf-8">
  8. <title>Test for Bug 625289</title>
  9. <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  10. <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
  11. <style>
  12. :root,
  13. #e1, #e2 > div,
  14. #b1::before, #b2 > div::before,
  15. #a1::after, #a2 > div::after {
  16. margin-left: 0;
  17. }
  18. :root.t,
  19. #e1.t, #e2.t > div,
  20. #b1.t::before, #b2.t > div::before,
  21. #a1.t::after, #a2.t > div::after {
  22. transition: margin-left linear 1s;
  23. }
  24. #b1::before, #b2 > div::before,
  25. #a1::after, #a2 > div::after {
  26. content: "x";
  27. display: block;
  28. }
  29. :root.m,
  30. #e1.m, #e2.m > div,
  31. #b1.m::before, #b2.m > div::before,
  32. #a1.m::after, #a2.m > div::after {
  33. margin-left: 100px;
  34. }
  35. .o { overflow: hidden }
  36. .n { display: none }
  37. #fline { color: blue; font-size: 20px; width: 800px; }
  38. #fline::first-line { color: yellow }
  39. #fline.narrow { width: 50px }
  40. #fline i { transition: color linear 1s }
  41. #flexboxtest #flex { display: flex; flex-direction: column }
  42. #flexboxtest #flextransition { color: blue; transition: color 5s linear }
  43. #flexboxtest #flexkid[newstyle] { resize: both }
  44. #flexboxtest #flextransition[newstyle] { color: yellow }
  45. </style>
  46. </head>
  47. <body>
  48. <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=625289">Mozilla Bug 625289</a>
  49. <div id="container"></div>
  50. <div id="fline">
  51. This text has an <i>i element</i> in it.
  52. </div>
  53. <div id="flexboxtest">
  54. <div id="flex">
  55. hello
  56. <span id="flexkid">this appears</span>
  57. hello
  58. <div id="flextransition">color transition</div>
  59. </div>
  60. </div>
  61. <pre id="test">
  62. <script>
  63. "use strict";
  64. function advance_clock(milliseconds) {
  65. SpecialPowers.DOMWindowUtils.advanceTimeAndRefresh(milliseconds);
  66. }
  67. var container = document.getElementById("container");
  68. function make_elements(idName, child) {
  69. var e = document.createElement("div");
  70. e.setAttribute("id", idName);
  71. if (child) {
  72. e.appendChild(document.createElement("div"));
  73. }
  74. container.appendChild(e);
  75. return e;
  76. }
  77. function assert_margin_at_quarter(element, pseudo, passes)
  78. {
  79. var desc;
  80. var useParent = false;
  81. if (element == document.documentElement) {
  82. desc = "root element";
  83. } else if (element.id) {
  84. desc = "element " + element.id;
  85. } else {
  86. desc = "child of element " + element.parentNode.id;
  87. useParent = true;
  88. }
  89. var classes = (useParent ? element.parentNode : element).getAttribute("class");
  90. if (classes) {
  91. desc += " (classes: " + classes + ")";
  92. }
  93. if (pseudo) {
  94. desc += " " + pseudo + " pseudo-element";
  95. }
  96. (passes ? is : todo_is)(getComputedStyle(element, pseudo).marginLeft, "25px",
  97. "margin of " + desc);
  98. }
  99. function do_test(test)
  100. {
  101. var expected_props = [ "element", "test_child", "pseudo", "passes",
  102. "dynamic_change_transition", "start_from_none" ];
  103. for (var propidx in expected_props) {
  104. if (! expected_props[propidx] in test) {
  105. ok(false, "expected " + expected_props[propidx] + " on test object");
  106. }
  107. }
  108. var e;
  109. if (typeof(test.element) == "string") {
  110. e = make_elements(test.element, test.test_child);
  111. } else {
  112. if (test.test_child) {
  113. ok(false, "test_child unexpected");
  114. }
  115. e = test.element;
  116. }
  117. var target = test.test_child ? e.firstChild : e;
  118. if (!test.dynamic_change_transition) {
  119. e.classList.add("t");
  120. }
  121. if (test.start_from_none) {
  122. e.classList.add("n");
  123. }
  124. advance_clock(100);
  125. e.classList.add("m");
  126. e.classList.add("o");
  127. if (test.dynamic_change_transition) {
  128. e.classList.add("t");
  129. }
  130. if (test.start_from_none) {
  131. e.classList.remove("n");
  132. }
  133. advance_clock(0);
  134. advance_clock(250);
  135. assert_margin_at_quarter(target, test.pseudo, test.passes);
  136. if (typeof(test.element) == "string") {
  137. e.remove();
  138. } else {
  139. target.style.transition = "";
  140. target.removeAttribute("class");
  141. }
  142. }
  143. advance_clock(0);
  144. var tests = [
  145. { element:"e1", test_child:false, pseudo:"", passes:true,
  146. dynamic_change_transition:false, start_from_none:false },
  147. { element:"e2", test_child:true, pseudo:"", passes:true,
  148. dynamic_change_transition:false, start_from_none:false },
  149. { element:"b1", test_child:false, pseudo:"::before", passes:true,
  150. dynamic_change_transition:false, start_from_none:false },
  151. { element:"b2", test_child:true, pseudo:"::before", passes:true,
  152. dynamic_change_transition:false, start_from_none:false },
  153. { element:"a1", test_child:false, pseudo:"::after", passes:true,
  154. dynamic_change_transition:false, start_from_none:false },
  155. { element:"a2", test_child:true, pseudo:"::after", passes:true,
  156. dynamic_change_transition:false, start_from_none:false },
  157. { element:document.documentElement, test_child:false, pseudo:"", passes:true,
  158. dynamic_change_transition:false, start_from_none:false },
  159. // Recheck with a dynamic change in transition
  160. { element:"e1", test_child:false, pseudo:"", passes:true,
  161. dynamic_change_transition:true, start_from_none:false },
  162. { element:"e2", test_child:true, pseudo:"", passes:true,
  163. dynamic_change_transition:true, start_from_none:false },
  164. { element:"b1", test_child:false, pseudo:"::before", passes:true,
  165. dynamic_change_transition:true, start_from_none:false },
  166. { element:"b2", test_child:true, pseudo:"::before", passes:true,
  167. dynamic_change_transition:true, start_from_none:false },
  168. { element:"a1", test_child:false, pseudo:"::after", passes:true,
  169. dynamic_change_transition:true, start_from_none:false },
  170. { element:"a2", test_child:true, pseudo:"::after", passes:true,
  171. dynamic_change_transition:true, start_from_none:false },
  172. { element:document.documentElement, test_child:false, pseudo:"", passes:true,
  173. dynamic_change_transition:true, start_from_none:false },
  174. // Recheck starting from display:none. Note that these tests all fail,
  175. // although we could get *some* of them to pass by calling
  176. // RestyleManager::TryInitiatingTransition from
  177. // ElementRestyler::RestyleUndisplayedChildren.
  178. { element:"e1", test_child:false, pseudo:"", passes:false,
  179. dynamic_change_transition:false, start_from_none:true },
  180. { element:"e2", test_child:true, pseudo:"", passes:false,
  181. dynamic_change_transition:false, start_from_none:true },
  182. { element:"b1", test_child:false, pseudo:"::before", passes:false,
  183. dynamic_change_transition:false, start_from_none:true },
  184. { element:"b2", test_child:true, pseudo:"::before", passes:false,
  185. dynamic_change_transition:false, start_from_none:true },
  186. { element:"a1", test_child:false, pseudo:"::after", passes:false,
  187. dynamic_change_transition:false, start_from_none:true },
  188. { element:"a2", test_child:true, pseudo:"::after", passes:false,
  189. dynamic_change_transition:false, start_from_none:true },
  190. { element:document.documentElement, test_child:false, pseudo:"", passes:false,
  191. dynamic_change_transition:false, start_from_none:true },
  192. // Recheck with a dynamic change in transition and starting from display:none
  193. { element:"e1", test_child:false, pseudo:"", passes:false,
  194. dynamic_change_transition:true, start_from_none:true },
  195. { element:"e2", test_child:true, pseudo:"", passes:false,
  196. dynamic_change_transition:true, start_from_none:true },
  197. { element:"b1", test_child:false, pseudo:"::before", passes:false,
  198. dynamic_change_transition:true, start_from_none:true },
  199. { element:"b2", test_child:true, pseudo:"::before", passes:false,
  200. dynamic_change_transition:true, start_from_none:true },
  201. { element:"a1", test_child:false, pseudo:"::after", passes:false,
  202. dynamic_change_transition:true, start_from_none:true },
  203. { element:"a2", test_child:true, pseudo:"::after", passes:false,
  204. dynamic_change_transition:true, start_from_none:true },
  205. { element:document.documentElement, test_child:false, pseudo:"", passes:false,
  206. dynamic_change_transition:true, start_from_none:true },
  207. ];
  208. for (var testidx in tests) {
  209. do_test(tests[testidx]);
  210. }
  211. var fline = document.getElementById("fline");
  212. var fline_i_cs = getComputedStyle(fline.firstElementChild, "");
  213. // Note that the color in the ::first-line is never used in the test
  214. // since we avoid reporting ::first-line data in getComputedStyle.
  215. // However, if we were to start a transition (incorrectly), that would
  216. // show up in getComputedStyle.
  217. var COLOR_IN_LATER_LINES = "rgb(0, 0, 255)";
  218. function do_firstline_test(test) {
  219. if (test.widening) {
  220. fline.classList.add("narrow");
  221. is (fline_i_cs.color, COLOR_IN_LATER_LINES, "initial color");
  222. } else {
  223. is (fline_i_cs.color, COLOR_IN_LATER_LINES, "initial color");
  224. }
  225. if (test.widening) {
  226. fline.classList.remove("narrow");
  227. } else {
  228. fline.classList.add("narrow");
  229. }
  230. if (test.set_overflow) {
  231. fline.classList.add("o");
  232. }
  233. advance_clock(100);
  234. if (test.widening) {
  235. is (fline_i_cs.color, COLOR_IN_LATER_LINES,
  236. "::first-line changes don't trigger transitions");
  237. } else {
  238. is (fline_i_cs.color, COLOR_IN_LATER_LINES,
  239. "::first-line changes don't trigger transitions");
  240. }
  241. fline.removeAttribute("class");
  242. }
  243. var firstline_tests = [
  244. { widening: true, set_overflow: false },
  245. { widening: false, set_overflow: false },
  246. { widening: true, set_overflow: true },
  247. { widening: false, set_overflow: true },
  248. ];
  249. for (var firstline_test_idx in firstline_tests) {
  250. do_firstline_test(firstline_tests[firstline_test_idx]);
  251. }
  252. function do_flexbox_reframe_test()
  253. {
  254. var flextransition = document.getElementById("flextransition");
  255. var cs = getComputedStyle(flextransition, "");
  256. cs.backgroundColor;
  257. flextransition.setAttribute("newstyle", "");
  258. document.getElementById("flexkid").setAttribute("newstyle", "");
  259. is(cs.color, "rgb(0, 0, 255)",
  260. "color at start of wrapped flexbox transition");
  261. advance_clock(1000);
  262. is(cs.color, "rgb(51, 51, 204)",
  263. "color one second in to wrapped flexbox transition");
  264. }
  265. do_flexbox_reframe_test();
  266. SpecialPowers.DOMWindowUtils.restoreNormalRefresh();
  267. </script>
  268. </pre>
  269. </body>
  270. </html>