test_grid_repeats.html 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <script type="text/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
  6. <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css" />
  7. <style>
  8. body {
  9. margin: 40px;
  10. }
  11. .wrapper {
  12. display: grid;
  13. width: 600px;
  14. grid-gap: 0px;
  15. background-color: #f00;
  16. }
  17. .grid1 {
  18. grid-template-columns: 50px 0px repeat(auto-fit, 100px);
  19. }
  20. .grid2 {
  21. grid-template-columns: 50px 0px [real-before] repeat(auto-fit, [before] 100px [after]) [real-after] 0px [final];
  22. }
  23. .grid3 {
  24. grid-template-columns: repeat(3, 66px) [real-before] repeat(auto-fit, [before] 100px [after]) [real-after];
  25. }
  26. .grid4 {
  27. grid-template-columns: repeat(2, 100px) repeat(auto-fill, 50px);
  28. }
  29. .grid5 {
  30. grid-template-columns: [real-before] repeat(auto-fit, [before] 100px [after]) [real-after];
  31. }
  32. .grid6 {
  33. grid-template-columns: [first] 0px [real-before] repeat(auto-fit, [before] 100px [after]) [real-after];
  34. }
  35. .grid7 {
  36. grid-template-columns: [real-before] repeat(auto-fit, [before] 100px [after]) [real-after] 0px [final];
  37. }
  38. .grid8 {
  39. grid-template-columns: [real-before] repeat(auto-fit, [before] 1000px [after]) [real-after];
  40. }
  41. .grid9 {
  42. grid-template-columns: [real-before] repeat(auto-fit, 100px [after]) [real-after];
  43. }
  44. .grid10 {
  45. grid-template-columns: [real-before] repeat(auto-fit, [before] 100px) [real-after];
  46. }
  47. .box {
  48. background-color: #444;
  49. color: #fff;
  50. }
  51. .a {
  52. grid-column: auto;
  53. }
  54. .b {
  55. grid-column: 4;
  56. }
  57. .c {
  58. grid-column: 6;
  59. }
  60. .d {
  61. grid-column: 7;
  62. }
  63. .e {
  64. grid-column: 5;
  65. }
  66. </style>
  67. <script>
  68. 'use strict';
  69. SimpleTest.waitForExplicitFinish();
  70. function testLines(elementName, grid, expectedValues) {
  71. for (let i = 0; i < grid.cols.lines.length; i++) {
  72. is(grid.cols.lines[i].number, (i + 1), elementName + " line " + (i + 1) + " has expected number.");
  73. is(grid.cols.lines[i].start, expectedValues[i].start, elementName + " line " + (i + 1) + " has expected start.");
  74. is(grid.cols.lines[i].breadth, 0, elementName + " line " + (i + 1) + " has zero breadth.");
  75. is(grid.cols.lines[i].names + "", expectedValues[i].names, elementName + " line " + (i + 1) + " has expected names.");
  76. }
  77. }
  78. function runTests() {
  79. let wrapper = document.getElementById("wrapper1");
  80. let grid = wrapper.getGridFragments()[0];
  81. // test auto-fit count
  82. is(grid.cols.tracks.length, 7, "Grid column track array reports removed auto-fit columns.");
  83. // test resolved value of grid-template-columns
  84. let templateColumnsText = getComputedStyle(wrapper).gridTemplateColumns;
  85. is(templateColumnsText, "50px 0px 0px 100px 0px 0px 0px",
  86. "Resolved value of grid-template-columns reports removed auto-fits as '0px'.");
  87. // test starts, breadths, and states
  88. let expectedValues = [
  89. { "start": 0,
  90. "breadth": 50,
  91. "state": "static" },
  92. { "start": 50,
  93. "breadth": 0,
  94. "state": "static" },
  95. { "start": 50,
  96. "breadth": 0,
  97. "state": "removed" },
  98. { "start": 50,
  99. "breadth": 100,
  100. "state": "repeat" },
  101. { "start": 150,
  102. "breadth": 0,
  103. "state": "removed" },
  104. { "start": 150,
  105. "breadth": 0,
  106. "state": "removed" },
  107. { "start": 150,
  108. "breadth": 0,
  109. "state": "removed" },
  110. ];
  111. for (let i = 0; i < grid.cols.tracks.length; i++) {
  112. is(grid.cols.tracks[i].start, expectedValues[i].start, "Column " + (i + 1) + " has expected start.");
  113. is(grid.cols.tracks[i].breadth, expectedValues[i].breadth, "Column " + (i + 1) + " has expected breadth.");
  114. is(grid.cols.tracks[i].state, expectedValues[i].state, "Column " + (i + 1) + " has expected state.");
  115. }
  116. wrapper = document.getElementById("wrapper2");
  117. grid = wrapper.getGridFragments()[0];
  118. // test auto-fit count
  119. is(grid.cols.lines.length, 9, "Grid column line array reports removed auto-fit columns.");
  120. // test resolved value of grid-template-columns
  121. templateColumnsText = getComputedStyle(wrapper).gridTemplateColumns;
  122. is(templateColumnsText, "50px 0px [real-before before] 0px [after before] 100px [after before] 0px [after before] 100px [after before] 0px [after real-after] 0px [final]",
  123. "Resolved value of grid-template-columns reports lines for removed tracks.");
  124. // test starts and names
  125. expectedValues = [
  126. { "start": 0,
  127. "names": "" },
  128. { "start": 50,
  129. "names": "" },
  130. { "start": 50,
  131. "names": "real-before,before" },
  132. { "start": 50,
  133. "names": "after,before" },
  134. { "start": 150,
  135. "names": "after,before" },
  136. { "start": 150,
  137. "names": "after,before" },
  138. { "start": 250,
  139. "names": "after,before" },
  140. { "start": 250,
  141. "names": "after,real-after" },
  142. { "start": 250,
  143. "names": "final" },
  144. ];
  145. testLines("wrapper2", grid, expectedValues);
  146. wrapper = document.getElementById("wrapper3");
  147. grid = wrapper.getGridFragments()[0];
  148. // test resolved value of grid-template-columns
  149. templateColumnsText = getComputedStyle(wrapper).gridTemplateColumns;
  150. is(templateColumnsText, "66px 66px 66px [real-before before] 100px [after before] 0px [after before] 100px [after before] 100px [after real-after]",
  151. "Resolved value of grid-template-columns reports lines for removed tracks.");
  152. wrapper = document.getElementById("wrapper4");
  153. grid = wrapper.getGridFragments()[0];
  154. // test auto-fill count of tracks
  155. is(grid.cols.tracks.length, 10, "Grid column track array respects auto-fill columns.");
  156. if (grid.cols.tracks.length == 10) {
  157. // test for static and repeat
  158. is(grid.cols.tracks[1].state, "static", "Grid column track 2 is marked as static.");
  159. is(grid.cols.tracks[2].state, "repeat", "Grid column track 3 is marked as repeat.");
  160. }
  161. wrapper = document.getElementById("wrapper5");
  162. grid = wrapper.getGridFragments()[0];
  163. // test resolved value of grid-template-columns
  164. templateColumnsText = getComputedStyle(wrapper).gridTemplateColumns;
  165. is(templateColumnsText, "[real-before before] 0px [after before] 0px [after before] 0px [after before] 0px [after before] 0px [after before] 0px [after real-after]", "Resolved value of grid-template-columns no longer lists 'none' when all auto-fit tracks are empty.");
  166. wrapper = document.getElementById("wrapper6");
  167. grid = wrapper.getGridFragments()[0];
  168. // test starts and names
  169. expectedValues = [
  170. { "start": 0,
  171. "names": "first" },
  172. { "start": 0,
  173. "names": "real-before,before" },
  174. { "start": 0,
  175. "names": "after,before" },
  176. { "start": 0,
  177. "names": "after,before" },
  178. { "start": 100,
  179. "names": "after,before" },
  180. { "start": 100,
  181. "names": "after,before" },
  182. { "start": 100,
  183. "names": "after,before" },
  184. { "start": 100,
  185. "names": "after,real-after" },
  186. ];
  187. testLines("wrapper6", grid, expectedValues);
  188. wrapper = document.getElementById("wrapper7");
  189. grid = wrapper.getGridFragments()[0];
  190. // test starts and names
  191. expectedValues = [
  192. { "start": 0,
  193. "names": "real-before,before" },
  194. { "start": 0,
  195. "names": "after,before" },
  196. { "start": 0,
  197. "names": "after,before" },
  198. { "start": 0,
  199. "names": "after,before" },
  200. { "start": 100,
  201. "names": "after,before" },
  202. { "start": 100,
  203. "names": "after,before" },
  204. { "start": 100,
  205. "names": "after,real-after" },
  206. { "start": 100,
  207. "names": "final" },
  208. ];
  209. testLines("wrapper7", grid, expectedValues);
  210. wrapper = document.getElementById("wrapper8");
  211. grid = wrapper.getGridFragments()[0];
  212. // test starts and names
  213. expectedValues = [
  214. { "start": 0,
  215. "names": "real-before,before" },
  216. { "start": 0,
  217. "names": "after,real-after" },
  218. ];
  219. testLines("wrapper8", grid, expectedValues);
  220. wrapper = document.getElementById("wrapper9");
  221. grid = wrapper.getGridFragments()[0];
  222. // test starts and names
  223. expectedValues = [
  224. { "start": 0,
  225. "names": "real-before" },
  226. { "start": 0,
  227. "names": "after" },
  228. { "start": 0,
  229. "names": "after" },
  230. { "start": 0,
  231. "names": "after" },
  232. { "start": 100,
  233. "names": "after" },
  234. { "start": 200,
  235. "names": "after" },
  236. { "start": 200,
  237. "names": "after,real-after" },
  238. ];
  239. testLines("wrapper9", grid, expectedValues);
  240. wrapper = document.getElementById("wrapper10");
  241. grid = wrapper.getGridFragments()[0];
  242. // test starts and names
  243. expectedValues = [
  244. { "start": 0,
  245. "names": "real-before,before" },
  246. { "start": 0,
  247. "names": "before" },
  248. { "start": 0,
  249. "names": "before" },
  250. { "start": 0,
  251. "names": "before" },
  252. { "start": 100,
  253. "names": "before" },
  254. { "start": 200,
  255. "names": "before" },
  256. { "start": 200,
  257. "names": "real-after" },
  258. ];
  259. testLines("wrapper10", grid, expectedValues);
  260. SimpleTest.finish();
  261. }
  262. </script>
  263. </head>
  264. <body onLoad="runTests();">
  265. <div id="wrapper1" class="wrapper grid1">
  266. <div id="boxB" class="box b">B</div>
  267. </div>
  268. <br/>
  269. <div id="wrapper2" class="wrapper grid2">
  270. <div id="boxB" class="box b">B</div>
  271. <div id="boxC" class="box c">C</div>
  272. </div>
  273. <br/>
  274. <div id="wrapper3" class="wrapper grid3">
  275. <div id="boxB" class="box b">B</div>
  276. <div id="boxC" class="box c">C</div>
  277. <div id="boxD" class="box d">D</div>
  278. </div>
  279. <br/>
  280. <div id="wrapper4" class="wrapper grid4">
  281. <div id="boxA" class="box a">A</div>
  282. </div>
  283. <br/>
  284. <div id="wrapper5" class="wrapper grid5">
  285. </div>
  286. <br/>
  287. <div id="wrapper6" class="wrapper grid6">
  288. <div id="boxB" class="box b">B</div>
  289. </div>
  290. <br/>
  291. <div id="wrapper7" class="wrapper grid7">
  292. <div id="boxB" class="box b">B</div>
  293. </div>
  294. <br/>
  295. <div id="wrapper8" class="wrapper grid8">
  296. </div>
  297. <br/>
  298. <div id="wrapper9" class="wrapper grid9">
  299. <div id="boxB" class="box b">B</div>
  300. <div id="boxE" class="box e">E</div>
  301. </div>
  302. <br/>
  303. <div id="wrapper10" class="wrapper grid10">
  304. <div id="boxB" class="box b">B</div>
  305. <div id="boxE" class="box e">E</div>
  306. </div>
  307. </body>
  308. </html>