Bug 1874684 - Part 37: Fix unified compilation. r=allstarschh
[gecko.git] / layout / style / test / test_align_justify_computed_values.html
blobaa13762cb7b8e6a7707665ded606fd063b28c4b8
1 <!DOCTYPE HTML>
2 <html>
3 <!--
4 https://bugzilla.mozilla.org/show_bug.cgi?id=696253
5 -->
6 <head>
7 <meta charset="utf-8">
8 <title>Test align/justify-items/self/content computed values</title>
9 <script src="/tests/SimpleTest/SimpleTest.js"></script>
10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
11 </head>
12 <body style="position:relative">
13 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=696253">Mozilla Bug 696253</a>
14 <style>
15 #flexContainer, #flexContainerGrid { display: flex; position:relative; }
16 #gridContainer, #gridContainerFlex { display: grid; position:relative; }
17 #display b, #absChild { position:absolute; }
18 </style>
19 <div id="display">
20 <div id="myDiv"></div>
21 <div id="flexContainer"><a></a><b></b></div>
22 <div id="gridContainer"><a></a><b></b></div>
23 <div id="flexContainerGrid"><a style="diplay:grid"></a><b style="diplay:grid"></b></div>
24 <div id="gridContainerFlex"><a style="diplay:flex"></a><b style="diplay:flex"></b></div>
25 </div>
26 <div id="absChild"></div>
27 <pre id="test">
28 <script type="application/javascript">
29 "use strict";
31 * Utility function for getting computed style of "align-self":
33 function getComputedAlignSelf(elem) {
34 return window.getComputedStyle(elem).alignSelf;
36 function getComputedAlignItems(elem) {
37 return window.getComputedStyle(elem).alignItems;
39 function getComputedAlignContent(elem) {
40 return window.getComputedStyle(elem).alignContent;
42 function getComputedJustifySelf(elem) {
43 return window.getComputedStyle(elem).justifySelf;
45 function getComputedJustifyItems(elem) {
46 return window.getComputedStyle(elem).justifyItems;
48 function getComputedJustifyContent(elem) {
49 return window.getComputedStyle(elem).justifyContent;
52 /**
53 * Test behavior of 'align-self:auto' (Bug 696253 and Bug 1304012)
54 * ===============================================
56 * In a previous revision of the CSS Alignment spec, align-self:auto
57 * was required to actually *compute* to the parent's align-items value --
58 * but now, the spec says it simply computes to itself, and it should
59 * only get converted into the parent's align-items value when it's used
60 * in layout. This test verifies that we do indeed have it compute to
61 * itself, regardless of the parent's align-items value.
65 * Tests for a block node with a parent node:
67 function testGeneralNode(elem) {
68 // Test initial computed style
69 // (Initial value should be 'auto', which should compute to itself)
70 is(getComputedAlignSelf(elem), "auto", elem.tagName + ": " +
71 "initial computed value of 'align-self' should be 'auto'");
73 // Test value after setting align-self explicitly to "auto"
74 elem.style.alignSelf = "auto";
75 is(getComputedAlignSelf(elem), "auto", elem.tagName + ": " +
76 "computed value of 'align-self: auto' should be 'auto'");
77 elem.style.alignSelf = ""; // clean up
79 // Test value after setting align-self explicitly to "inherit"
80 elem.style.alignSelf = "inherit";
81 if (elem.parentNode && elem.parentNode.style) {
82 is(getComputedAlignSelf(elem), getComputedAlignSelf(elem.parentNode),
83 elem.tagName + ": computed value of 'align-self: inherit' " +
84 "should match the value on the parent");
85 } else {
86 is(getComputedAlignSelf(elem), "auto", elem.tagName + ": " +
87 "computed value of 'align-self: inherit' should be 'auto', " +
88 "when there is no parent");
90 elem.style.alignSelf = ""; // clean up
94 * Tests that depend on us having a parent node:
96 function testNodeThatHasParent(elem) {
97 // Sanity-check that we actually do have a styleable parent:
98 ok(elem.parentNode && elem.parentNode.style, elem.tagName + ": " +
99 "bug in test -- expecting caller to pass us a node with a parent");
101 // Test initial computed style when "align-items" has been set on our parent.
102 // (elem's initial "align-self" value should be "auto", which should compute
103 // to its parent's "align-items" value, which in this case is "center".)
104 elem.parentNode.style.alignItems = "center";
105 is(getComputedAlignSelf(elem), "auto", elem.tagName + ": " +
106 "initial computed value of 'align-self' should be 'auto', even " +
107 "after changing parent's 'align-items' value");
109 // ...and now test computed style after setting "align-self" explicitly to
110 // "auto" (with parent "align-items" still at "center")
111 elem.style.alignSelf = "auto";
112 is(getComputedAlignSelf(elem), "auto", elem.tagName + ": " +
113 "computed value of 'align-self: auto' should remain 'auto', after " +
114 "being explicitly set");
116 elem.style.alignSelf = ""; // clean up
117 elem.parentNode.style.alignItems = ""; // clean up
119 // Finally: test computed style after setting "align-self" to "inherit"
120 // and leaving parent at its initial value which should be "auto".
121 elem.style.alignSelf = "inherit";
122 is(getComputedAlignSelf(elem), "auto", elem.tagName + ": " +
123 "computed value of 'align-self: inherit' should take parent's " +
124 "computed 'align-self' value (which should be 'auto', " +
125 "if we haven't explicitly set any other style");
126 elem.style.alignSelf = ""; // clean up
130 * Main test function
132 function main() {
133 // Test the root node
134 // ==================
135 // (It's special because it has no parent ComputedStyle.)
137 var rootNode = document.documentElement;
139 // Sanity-check that we actually have the root node, as far as CSS is concerned.
140 // (Note: rootNode.parentNode is a HTMLDocument object -- not an element that
141 // we inherit style from.)
142 ok(!rootNode.parentNode.style,
143 "expecting root node to have no node to inherit style from");
145 testGeneralNode(rootNode);
147 // Test the body node
148 // ==================
149 // (It's special because it has no grandparent ComputedStyle.)
151 var body = document.getElementsByTagName("body")[0];
152 is(body.parentNode, document.documentElement,
153 "expecting body element's parent to be the root node");
155 testGeneralNode(body);
156 testNodeThatHasParent(body);
159 // align-items/self tests:
161 //// Block tests
162 var element = document.body;
163 var child = document.getElementById("display");
164 var absChild = document.getElementById("absChild");
165 is(getComputedAlignItems(element), 'normal', "default align-items value for block container");
166 is(getComputedAlignSelf(child), 'auto', "default align-self value for block child");
167 is(getComputedAlignSelf(absChild), 'auto', "default align-self value for block container abs.pos. child");
168 element.style.alignItems = "end";
169 is(getComputedAlignSelf(child), 'auto', "align-self:auto value persists for block child");
170 is(getComputedAlignSelf(absChild), 'auto', "align-self:auto value persists for block container abs.pos. child");
171 element.style.alignItems = "left";
172 is(getComputedAlignItems(element), 'end', "align-items:left is an invalid declaration");
173 is(getComputedAlignSelf(child), 'auto', "align-self:auto persists for block child");
174 is(getComputedAlignSelf(absChild), 'auto', "align-self:auto value persists for block container abs.pos. child");
175 element.style.alignItems = "right";
176 is(getComputedAlignItems(element), 'end', "align-items:right is an invalid declaration");
177 is(getComputedAlignSelf(child), 'auto', "align-self:auto value persists for block child");
178 is(getComputedAlignSelf(absChild), 'auto', "align-self:auto value persists for block container abs.pos. child");
180 //// Flexbox tests
181 function testFlexAlignItemsSelf(elem) {
182 var item = elem.firstChild;
183 var abs = elem.children[1];
184 is(getComputedAlignItems(elem), 'normal', "default align-items value for flex container");
185 is(getComputedAlignSelf(item), 'auto', "default align-self value for flex item");
186 is(getComputedAlignSelf(abs), 'auto', "default align-self value for flex container abs.pos. child");
187 elem.style.alignItems = "flex-end";
188 is(getComputedAlignSelf(item), 'auto', "align-self:auto value persists for flex container child");
189 is(getComputedAlignSelf(abs), 'auto', "align-self:auto value persists for flex container abs.pos. child");
190 elem.style.alignItems = "left";
191 is(getComputedAlignItems(elem), 'flex-end', "align-items:left is an invalid declaration");
192 elem.style.alignItems = "";
194 testFlexAlignItemsSelf(document.getElementById("flexContainer"));
195 testFlexAlignItemsSelf(document.getElementById("flexContainerGrid"));
197 //// Grid tests
198 function testGridAlignItemsSelf(elem) {
199 var item = elem.firstChild;
200 var abs = elem.children[1];
201 is(getComputedAlignItems(elem), 'normal', "default align-items value for grid container");
202 is(getComputedAlignSelf(item), 'auto', "default align-self value for grid item");
203 is(getComputedAlignSelf(abs), 'auto', "default align-self value for grid container abs.pos. child");
204 elem.style.alignItems = "end";
205 is(getComputedAlignSelf(item), 'auto', "align-self:auto value persists for grid container child");
206 is(getComputedAlignSelf(abs), 'auto', "align-self:auto value persists for grid container abs.pos. child");
208 elem.style.alignItems = "left";
209 is(getComputedAlignItems(elem), 'end', "align-items:left is an invalid declaration");
210 is(getComputedAlignSelf(item), 'auto', "align-self:auto value persists for grid container child");
211 is(getComputedAlignSelf(abs), 'auto', "align-self:auto value persists for grid container abs.pos. child");
212 elem.style.alignItems = "right";
213 is(getComputedAlignItems(elem), 'end', "align-items:right is an invalid declaration");
214 is(getComputedAlignSelf(item), 'auto', "align-self:auto value persists for grid container child");
215 is(getComputedAlignSelf(abs), 'auto', "align-self:auto value persists for grid container abs.pos. child");
217 item.style.alignSelf = "";
218 abs.style.alignSelf = "";
219 elem.style.alignItems = "";
220 item.style.alignSelf = "";
222 testGridAlignItemsSelf(document.getElementById("gridContainer"));
223 testGridAlignItemsSelf(document.getElementById("gridContainerFlex"));
226 // justify-items/self tests:
228 //// Block tests
229 element = document.body;
230 child = document.getElementById("display");
231 absChild = document.getElementById("absChild");
232 is(getComputedJustifyItems(element), 'normal', "default justify-items value for block container");
233 is(getComputedJustifySelf(child), 'auto', "default justify-self value for block container child");
234 is(getComputedJustifySelf(absChild), 'auto', "default justify-self value for block container abs.pos. child");
235 element.style.justifyItems = "end";
236 is(getComputedJustifySelf(child), 'auto', "justify-self:auto value persists for block child");
237 is(getComputedJustifySelf(absChild), 'auto', "justify-self:auto value persists for block container abs.pos. child");
238 element.style.justifyItems = "left";
239 is(getComputedJustifyItems(element), 'left', "justify-items:left computes to itself on a block");
240 is(getComputedJustifySelf(child), 'auto', "justify-self:auto value persists for block child");
241 is(getComputedJustifySelf(absChild), 'auto', "justify-self:auto value persists for block container abs.pos. child");
242 element.style.justifyItems = "right";
243 is(getComputedJustifySelf(child), 'auto', "justify-self:auto value persists for block child");
244 is(getComputedJustifySelf(absChild), 'auto', "justify-self:auto value persists for block container abs.pos. child");
245 element.style.justifyItems = "safe right";
246 is(getComputedJustifySelf(child), 'auto', "justify-self:auto value persists for block child");
247 element.style.justifyItems = "";
248 child.style.justifySelf = "left";
249 is(getComputedJustifySelf(child), 'left', "justify-self:left computes to left on block child");
250 child.style.justifySelf = "right";
251 is(getComputedJustifySelf(child), 'right', "justify-self:right computes to right on block child");
252 child.style.justifySelf = "";
253 absChild.style.justifySelf = "right";
254 is(getComputedJustifySelf(absChild), 'right', "justify-self:right computes to right on block container abs.pos. child");
256 //// Flexbox tests
257 function testFlexJustifyItemsSelf(elem) {
258 var item = elem.firstChild;
259 var abs = elem.children[1];
260 is(getComputedJustifyItems(elem), 'normal', "default justify-items value for flex container");
261 is(getComputedJustifySelf(item), 'auto', "default justify-self value for flex item");
262 is(getComputedJustifySelf(abs), 'auto', "default justify-self value for flex container abs.pos. child");
263 elem.style.justifyItems = "flex-end";
264 is(getComputedJustifySelf(item), 'auto', "justify-self:auto value persists for flex container child");
265 is(getComputedJustifySelf(abs), 'auto', "justify-self:auto value persists for flex container abs.pos. child");
266 elem.style.justifyItems = "left";
267 is(getComputedJustifyItems(elem), 'left', "justify-items:left computes to itself for flex container");
268 elem.style.justifyItems = "safe right";
269 is(getComputedJustifySelf(item), 'auto', "justify-self:auto value persists for flex container child");
270 // XXX TODO: add left/right tests (bug 1221565)
271 elem.style.justifyItems = "";
273 testFlexJustifyItemsSelf(document.getElementById("flexContainer"));
274 testFlexJustifyItemsSelf(document.getElementById("flexContainerGrid"));
276 //// Grid tests
277 function testGridJustifyItemsSelf(elem) {
278 var item = elem.firstChild;
279 var abs = elem.children[1];
280 is(getComputedJustifyItems(elem), 'normal', "default justify-items value for grid container");
281 is(getComputedJustifySelf(item), 'auto', "default justify-self value for grid item");
282 is(getComputedJustifySelf(abs), 'auto', "default justify-self value for grid container abs.pos. child");
283 elem.style.justifyItems = "end";
284 is(getComputedJustifySelf(item), 'auto', "justify-self:auto value persists for grid container child");
285 is(getComputedJustifySelf(abs), 'auto', "justify-self:auto value persists for grid container abs.pos. child");
286 elem.style.justifyItems = "left";
287 is(getComputedJustifyItems(elem), 'left', "justify-items:left computes to itself for grid container");
288 is(getComputedJustifySelf(item), 'auto', "justify-self:auto value persists for grid container child");
289 is(getComputedJustifySelf(abs), 'auto', "justify-self:auto value persists for grid container abs.pos. child");
290 elem.style.justifyItems = "legacy left";
291 is(getComputedJustifySelf(item), 'auto', "justify-self:auto value persists for grid container child");
292 is(getComputedJustifySelf(abs), 'auto', "justify-self:auto value persists for grid container abs.pos. child");
293 elem.style.justifyItems = "right";
294 is(getComputedJustifySelf(item), 'auto', "justify-self:auto value persists for grid container child");
295 is(getComputedJustifySelf(abs), 'auto', "justify-self:auto value persists for grid container abs.pos. child");
296 elem.style.justifyItems = "safe right";
297 is(getComputedJustifySelf(item), 'auto', "justify-self:auto value persists for grid container child");
298 elem.style.justifyItems = "legacy right";
299 is(getComputedJustifySelf(item), 'auto', "justify-self:auto value persists for grid container child");
300 is(getComputedJustifySelf(abs), 'auto', "justify-self:auto value persists for grid container abs.pos. child");
301 elem.style.justifyItems = "legacy center";
302 item.style.justifyItems = "inherit";
303 abs.style.justifyItems = "inherit";
304 is(getComputedJustifySelf(item), 'auto', "justify-self:auto value persists for grid container child");
305 is(getComputedJustifySelf(abs), 'auto', "justify-self:auto value persists for grid container abs.pos. child");
306 is(getComputedJustifyItems(elem), 'legacy center', "justify-items computes to itself grid container");
307 is(getComputedJustifyItems(item), 'legacy center', "justify-items inherits including legacy keyword to grid item");
308 is(getComputedJustifyItems(abs), 'legacy center', "justify-items inherits including legacy keyword to grid container abs.pos. child");
309 elem.style.justifyItems = "";
310 item.style.justifySelf = "left";
311 is(getComputedJustifySelf(item), 'left', "justify-self:left computes to left on grid item");
312 item.style.justifySelf = "right";
313 is(getComputedJustifySelf(item), 'right', "justify-self:right computes to right on grid item");
314 item.style.justifySelf = "safe right";
315 is(getComputedJustifySelf(item), 'safe right', "justify-self:'safe right' computes to 'safe right' on grid item");
316 item.style.justifySelf = "";
317 abs.style.justifySelf = "right";
318 is(getComputedJustifySelf(abs), 'right', "justify-self:right computes to right on grid container abs.pos. child");
319 abs.style.justifySelf = "";
320 elem.style.justifyItems = "";
321 item.style.justifySelf = "";
323 testGridJustifyItemsSelf(document.getElementById("gridContainer"));
324 testGridJustifyItemsSelf(document.getElementById("gridContainerFlex"));
327 // align-content tests:
329 //// Block tests
330 element = document.body;
331 child = document.getElementById("display");
332 absChild = document.getElementById("absChild");
333 is(getComputedAlignContent(element), 'normal', "default align-content value for block container");
334 is(getComputedAlignContent(child), 'normal', "default align-content value for block child");
335 is(getComputedAlignContent(absChild), 'normal', "default align-content value for block container abs.pos. child");
336 element.style.alignContent = "end";
337 is(getComputedAlignContent(child), 'normal', "default align-content isn't affected by parent align-content value for in-flow child");
338 is(getComputedAlignContent(absChild), 'normal', "default align-content isn't affected by parent align-content value for block container abs.pos. child");
339 element.style.alignContent = "left";
340 is(getComputedAlignContent(element), 'end', "align-content:left isn't a valid declaration");
341 is(getComputedAlignContent(absChild), 'normal', "default align-content isn't affected by parent align-content value for block container abs.pos. child");
342 element.style.alignContent = "right";
343 is(getComputedAlignContent(element), 'end', "align-content:right isn't a valid declaration");
344 is(getComputedAlignContent(absChild), 'normal', "default align-content isn't affected by parent align-content value for block container abs.pos. child");
345 element.style.alignContent = "";
347 //// Flexbox tests
348 function testFlexAlignContent(elem) {
349 var item = elem.firstChild;
350 var abs = elem.children[1];
351 is(getComputedAlignContent(elem), 'normal', "default align-content value for flex container");
352 is(getComputedAlignContent(item), 'normal', "default align-content value for flex item");
353 is(getComputedAlignContent(abs), 'normal', "default align-content value for flex container abs.pos. child");
354 elem.style.alignContent = "safe end";
355 is(getComputedAlignContent(elem), 'safe end', "align-content:'safe end' computes to itself for flex container");
356 is(getComputedAlignContent(item), 'normal', "default align-content isn't affected by parent align-content value for flex item");
357 is(getComputedAlignContent(abs), 'normal', "default align-content isn't affected by parent align-content value for flex container abs.pos. child");
358 elem.style.alignContent = "";
360 testFlexAlignContent(document.getElementById("flexContainer"));
361 testFlexAlignContent(document.getElementById("flexContainerGrid"));
363 //// Grid tests
364 function testGridAlignContent(elem) {
365 var item = elem.firstChild;
366 var abs = elem.children[1];
367 is(getComputedAlignContent(elem), 'normal', "default align-content value for grid container");
368 is(getComputedAlignContent(item), 'normal', "default align-content value for grid item");
369 is(getComputedAlignContent(abs), 'normal', "default align-content value for grid container abs.pos. child");
370 elem.style.alignContent = "safe end";
371 is(getComputedAlignContent(elem), 'safe end', "align-content:'safe end' computes to itself on grid container");
372 is(getComputedAlignContent(item), 'normal', "default align-content isn't affected by parent align-content value for grid item");
373 is(getComputedAlignContent(abs), 'normal', "default align-content isn't affected by parent align-content value for grid container abs.pos. child");
374 elem.style.alignContent = "safe end";
375 item.style.alignContent = "inherit";
376 abs.style.alignContent = "inherit";
377 is(getComputedAlignContent(elem), 'safe end', "align-content:'safe end' computes to 'align-content:safe end' on grid container");
378 is(getComputedAlignContent(item), 'safe end', "align-content:'safe end' inherits as 'align-content:safe end' to grid item");
379 is(getComputedAlignContent(abs), 'safe end', "align-content:'safe end' inherits as 'align-content:safe end' to grid container abs.pos. child");
380 item.style.alignContent = "";
381 abs.style.alignContent = "";
382 elem.style.alignContent = "";
383 item.style.alignContent = "";
385 testGridAlignContent(document.getElementById("gridContainer"));
386 testGridAlignContent(document.getElementById("gridContainerFlex"));
390 // justify-content tests:
392 //// Block tests
393 element = document.body;
394 child = document.getElementById("display");
395 absChild = document.getElementById("absChild");
396 is(getComputedJustifyContent(element), 'normal', "default justify-content value for block container");
397 is(getComputedJustifyContent(child), 'normal', "default justify-content value for block child");
398 is(getComputedJustifyContent(absChild), 'normal', "default justify-content value for block container abs.pos. child");
399 element.style.justifyContent = "end";
400 is(getComputedJustifyContent(child), 'normal', "default justify-content isn't affected by parent justify-content value for in-flow child");
401 is(getComputedJustifyContent(absChild), 'normal', "default justify-content isn't affected by parent justify-content value for block container abs.pos. child");
402 element.style.justifyContent = "left";
403 is(getComputedJustifyContent(element), 'left', "justify-content:left computes to left on block child");
404 is(getComputedJustifyContent(absChild), 'normal', "default justify-content isn't affected by parent justify-content value for block container abs.pos. child");
405 element.style.justifyContent = "right";
406 is(getComputedJustifyContent(element), 'right', "justify-content:right computes to right on block child");
407 is(getComputedJustifyContent(absChild), 'normal', "default justify-content isn't affected by parent justify-content value for block container abs.pos. child");
408 element.style.justifyContent = "safe right";
409 is(getComputedJustifyContent(element), 'safe right', "justify-content:'safe right' computes to 'justify-content:safe right'");
410 element.style.justifyContent = "";
411 child.style.justifyContent = "left";
412 is(getComputedJustifyContent(child), 'left', "justify-content:left computes to left on block child");
413 child.style.justifyContent = "right";
414 is(getComputedJustifyContent(child), 'right', "justify-content:right computes to right on block child");
415 child.style.justifyContent = "safe left";
416 is(getComputedJustifyContent(child), 'safe left', "justify-content:safe left computes to 'safe left' on block child");
417 child.style.justifyContent = "";
418 absChild.style.justifyContent = "right";
419 is(getComputedJustifyContent(absChild), 'right', "justify-content:right computes to right on block container abs.pos. child");
420 absChild.style.justifyContent = "";
422 //// Flexbox tests
423 function testFlexJustifyContent(elem) {
424 var item = elem.firstChild;
425 var abs = elem.children[1];
426 is(getComputedJustifyContent(elem), 'normal', "default justify-content value for flex container");
427 is(getComputedJustifyContent(item), 'normal', "default justify-content value for flex item");
428 is(getComputedJustifyContent(abs), 'normal', "default justify-content value for flex container abs.pos. child");
429 elem.style.justifyContent = "safe end";
430 is(getComputedJustifyContent(elem), 'safe end', "justify-content:'safe end' computes to itself for flex container");
431 is(getComputedJustifyContent(item), 'normal', "default justify-content isn't affected by parent justify-content value for flex item");
432 is(getComputedJustifyContent(abs), 'normal', "default justify-content isn't affected by parent justify-content value for flex container abs.pos. child");
433 // XXX TODO: add left/right tests (bug 1221565)
434 elem.style.justifyContent = "";
436 testFlexJustifyContent(document.getElementById("flexContainer"));
437 testFlexJustifyContent(document.getElementById("flexContainerGrid"));
439 //// Grid tests
440 function testGridJustifyContent(elem) {
441 var item = elem.firstChild;
442 var abs = elem.children[1];
443 is(getComputedJustifyContent(elem), 'normal', "default justify-content value for grid container");
444 is(getComputedJustifyContent(item), 'normal', "default justify-content value for grid item");
445 is(getComputedJustifyContent(abs), 'normal', "default justify-content value for grid container abs.pos. child");
446 elem.style.justifyContent = "safe end";
447 is(getComputedJustifyContent(elem), 'safe end', "justify-content:'safe end' computes to itself on grid container");
448 is(getComputedJustifyContent(item), 'normal', "default justify-content isn't affected by parent justify-content value for grid item");
449 is(getComputedJustifyContent(abs), 'normal', "default justify-content isn't affected by parent justify-content value for grid container abs.pos. child");
450 elem.style.justifyContent = "left";
451 is(getComputedJustifyContent(elem), 'left', "justify-content:left computes to left on grid container");
452 is(getComputedJustifyContent(abs), 'normal', "default justify-content isn't affected by parent justify-content value for grid container abs.pos. child");
453 elem.style.justifyContent = "right";
454 is(getComputedJustifyContent(elem), 'right', "justify-content:right computes to right on grid container");
455 is(getComputedJustifyContent(abs), 'normal', "default justify-content isn't affected by parent justify-content value for grid container abs.pos. child");
456 elem.style.justifyContent = "safe right";
457 item.style.justifyContent = "inherit";
458 abs.style.justifyContent = "inherit";
459 is(getComputedJustifyContent(elem), 'safe right', "justify-content:'safe right' computes to 'justify-content:safe right' on grid container");
460 is(getComputedJustifyContent(item), 'safe right', "justify-content:'safe right' inherits as 'justify-content:safe right' to grid item");
461 is(getComputedJustifyContent(abs), 'safe right', "justify-content:'safe right' inherits as 'justify-content:safe right' to grid container abs.pos. child");
462 item.style.justifyContent = "left";
463 is(getComputedJustifyContent(item), 'left', "justify-content:left computes to left on grid item");
464 item.style.justifyContent = "right";
465 is(getComputedJustifyContent(item), 'right', "justify-content:right computes to right on grid item");
466 item.style.justifyContent = "safe right";
467 is(getComputedJustifyContent(item), 'safe right', "justify-content:'safe right' computes to 'safe right' on grid item");
468 item.style.justifyContent = "";
469 abs.style.justifyContent = "right";
470 is(getComputedJustifyContent(abs), 'right', "justify-content:right computes to right on grid container abs.pos. child");
471 abs.style.justifyContent = "";
472 elem.style.justifyContent = "";
473 item.style.justifyContent = "";
475 testGridJustifyContent(document.getElementById("gridContainer"));
476 testGridJustifyContent(document.getElementById("gridContainerFlex"));
479 main();
481 </script>
482 </pre>
483 </body>
484 </html>