| <!DOCTYPE html> | |
| <script src="../resources/testharness.js"></script> | |
| <script src="../resources/testharnessreport.js"></script> | |
| <script src="resources/alignment-parsing-utils-th.js"></script> | |
| <html> | |
| <body> | |
| <p>Test to verify auto value resolution works as expected in root elements (eg. document root / shadow roots / slotted elements / elements inside slot)</p> | |
| <div id="log"></div> | |
| <div id="host"> | |
| <div id="slotted" slot="s1"></div> | |
| </div> | |
| <script> | |
| var block = document.getElementById("host"); | |
| console.log(""); | |
| console.log("*** Test 'auto' value resolution for the document root node. ***"); | |
| test(function() { | |
| document.documentElement.style.alignSelf = "center"; | |
| checkValues(document.documentElement, "alignSelf", "align-self", "center", "center"); | |
| document.documentElement.style.alignSelf = "auto"; | |
| checkValues(document.documentElement, "alignSelf", "align-self", "auto", "auto"); | |
| }, "Check out how the DOM's root element resolves the align-self 'auto' values."); | |
| test(function() { | |
| document.documentElement.style.alignItems = "center"; | |
| checkValues(document.documentElement, "alignItems", "align-items", "center", "center"); | |
| document.body.style.alignItems = "auto"; // The 'auto' value is not valid for align-items. | |
| document.body.style.alignSelf = "auto"; | |
| checkValues(document.body, "alignItems", "align-items", "", "normal"); | |
| checkValues(document.body, "alignSelf", "align-self", "auto", "auto"); | |
| block.style.alignItems = ""; // Default value is 'normal' for align-items. | |
| block.style.alignSelf = "auto"; | |
| checkValues(block, "alignItems", "align-items", "", "normal"); | |
| checkValues(block, "alignSelf", "align-self", "auto", "auto"); | |
| }, "Check out how the DOM's root element align-items's value is used to resolve its children's align-self 'auto' values."); | |
| test(function() { | |
| document.documentElement.style.alignItems = "auto"; // The 'auto' value is not valid for align-items. | |
| checkValues(document.documentElement, "alignItems", "align-items", "center", "center"); | |
| document.documentElement.style.alignItems = ""; // Default value is 'normal' for align-items. | |
| checkValues(document.documentElement, "alignItems", "align-items", "", "normal"); | |
| }, "Check out how the DOM's root element deals with 'auto' value in align-items."); | |
| test(function() { | |
| document.documentElement.style.justifySelf = "left"; | |
| checkValues(document.documentElement, "justifySelf", "justify-self", "left", "left"); | |
| document.documentElement.style.justifySelf = "auto"; | |
| checkValues(document.documentElement, "justifySelf", "justify-self", "auto", "auto"); | |
| }, "Check out how the DOM's root element resolves the justify-self 'auto' values."); | |
| test(function() { | |
| console.log(); | |
| document.documentElement.style.justifyItems = "center"; | |
| checkValues(document.documentElement, "justifyItems", "justify-items", "center", "center"); | |
| document.body.style.justifyItems = "legacy"; | |
| document.body.style.justifySelf = "auto"; | |
| checkValues(document.body, "justifyItems", "justify-items", "legacy", "normal"); | |
| checkValues(document.body, "justifySelf", "justify-self", "auto", "auto"); | |
| block.style.justifyItems = "legacy"; | |
| block.style.justifySelf = "auto"; | |
| checkValues(block, "justifyItems", "justify-items", "legacy", "normal"); | |
| checkValues(block, "justifySelf", "justify-self", "auto", "auto"); | |
| }, "Check out how the DOM's root element justify-items's value is used to resolve its children's justify-self 'auto' values."); | |
| test(function() { | |
| document.documentElement.style.justifyItems = "legacy"; | |
| checkValues(document.documentElement, "justifyItems", "justify-items", "legacy", "normal"); | |
| checkValues(document.body, "justifySelf", "justify-self", "auto", "auto"); | |
| checkValues(block, "justifySelf", "justify-self", "auto", "auto"); | |
| }, "Check out how the DOM's root element deals with 'auto' value in justify-items."); | |
| test(function() { | |
| document.documentElement.style.justifyItems = "legacy center"; | |
| checkValues(document.documentElement, "justifyItems", "justify-items", "legacy center", "legacy center"); | |
| document.body.style.justifyItems = "legacy"; | |
| document.body.style.justifySelf = "auto"; | |
| checkValues(document.body, "justifyItems", "justify-items", "legacy", "legacy center"); | |
| checkValues(document.body, "justifySelf", "justify-self", "auto", "auto"); | |
| block.style.justifyItems = "legacy"; | |
| block.style.justifySelf = "auto"; | |
| checkValues(block, "justifyItems", "justify-items", "legacy", "legacy center"); | |
| checkValues(block, "justifySelf", "justify-self", "auto", "auto"); | |
| }, "Check out how the DOM's root element justify-items's value with 'legacy' keyword is used to resolve any descendant's justify-items 'auto' values."); | |
| test(function() { | |
| document.documentElement.style.justifyItems = "legacy"; | |
| checkValues(document.body, "justifyItems", "justify-items", "legacy", "normal"); | |
| checkValues(document.body, "justifySelf", "justify-self", "auto", "auto"); | |
| checkValues(block, "justifyItems", "justify-items", "legacy", "normal"); | |
| checkValues(block, "justifySelf", "justify-self", "auto", "auto"); | |
| }, "Check out how the DOM's root element recomputes its descendant's style when 'legacy' keyword is removed from its justify-items value."); | |
| console.log(""); | |
| console.log("*** Test 'auto' value resolution for the shadow DOM root node. ***"); | |
| var shadowHost = document.getElementById("host") | |
| var shadowRoot = shadowHost.attachShadow({mode:"open"}); | |
| var shadowNode = document.createElement('div'); | |
| shadowRoot.appendChild(shadowNode); | |
| console.log(""); | |
| console.log(); | |
| test(function() { | |
| shadowHost.style.alignItems = "center"; | |
| shadowNode.style.alignItems = "end"; | |
| checkValues(shadowHost, "alignItems", "align-items", "center", "center"); | |
| checkValues(shadowNode, "alignItems", "align-items", "end", "end"); | |
| shadowNode.style.alignItems = ""; | |
| checkValues(shadowNode, "alignItems", "align-items", "", "normal"); | |
| shadowNode.style.alignSelf = "auto"; | |
| checkValues(shadowNode, "alignSelf", "align-self", "auto", "auto"); | |
| }, "Shadow Node inherits from ShadowHost to resolve the 'auto' values for align-self."); | |
| test(function() { | |
| shadowHost.style.justifyItems = "center"; | |
| shadowNode.style.justifyItems = "right"; | |
| checkValues(shadowHost, "justifyItems", "justify-items", "center", "center"); | |
| checkValues(shadowNode, "justifyItems", "justify-items", "right", "right"); | |
| shadowNode.style.justifyItems = ""; | |
| checkValues(shadowNode, "justifyItems", "justify-items", "", "normal"); | |
| shadowNode.style.justifySelf = "auto"; | |
| checkValues(shadowNode, "justifySelf", "justify-self", "auto", "auto"); | |
| }, "Shadow Node inherits from ShadowHost to resolve the 'auto' values for justify-self."); | |
| test(function() { | |
| shadowHost.style.justifyItems = "legacy"; | |
| shadowNode.style.justifyItems = "right"; | |
| shadowNode.style.justifySelf = "auto"; | |
| checkValues(shadowHost, "justifyItems", "justify-items", "legacy", "normal"); | |
| checkValues(shadowNode, "justifyItems", "justify-items", "right", "right"); | |
| checkValues(shadowNode, "justifySelf", "justify-self", "auto", "auto"); | |
| checkValues(shadowHost, "justifyItems", "justify-items", "legacy", "normal"); | |
| document.documentElement.style.justifyItems = "legacy center"; | |
| checkValues(document.documentElement, "justifyItems", "justify-items", "legacy center", "legacy center"); | |
| checkValues(shadowHost, "justifyItems", "justify-items", "legacy", "legacy center"); | |
| checkValues(shadowNode, "justifyItems", "justify-items", "right", "right"); | |
| checkValues(shadowNode, "justifySelf", "justify-self", "auto", "auto"); | |
| shadowNode.style.justifyItems = "legacy"; | |
| checkValues(shadowNode, "justifyItems", "justify-items", "legacy", "legacy center"); | |
| document.documentElement.style.justifyItems = "legacy"; | |
| }, "Check out how the 'legacy' keyword in justify-items propagates from the DOM Tree to the Shadow Node."); | |
| console.log(""); | |
| console.log("*** Test 'auto' value resolution for the shadow DOM 'slotted' elements. ***"); | |
| var slotted = document.getElementById("slotted"); | |
| test(function() { | |
| shadowHost.style.alignItems = "center"; | |
| shadowNode.style.alignItems = "start"; | |
| slotted.style.alignItems = "end"; | |
| checkValues(slotted, "alignItems", "align-items", "end", "end"); | |
| slotted.style.alignItems = ""; | |
| checkValues(slotted, "alignItems", "align-items", "", "normal"); | |
| slotted.style.alignSelf = "start"; | |
| checkValues(slotted, "alignSelf", "align-self", "start", "start"); | |
| slotted.style.alignSelf = "auto"; | |
| checkValues(slotted, "alignSelf", "align-self", "auto", "auto"); | |
| }, "Check out how align-self uses the 'shadowHost' as 'slotted' element's parent while 'slot' is not assigned."); | |
| test(function() { | |
| shadowHost.style.justifyItems = "center"; | |
| shadowNode.style.justifyItems = "right"; | |
| slotted.style.justifyItems = "left"; | |
| checkValues(slotted, "justifyItems", "justify-items", "left", "left"); | |
| slotted.style.justifyItems = ""; | |
| checkValues(slotted, "justifyItems", "justify-items", "", "normal"); | |
| slotted.style.justifySelf = "start"; | |
| checkValues(slotted, "justifySelf", "justify-self", "start", "start"); | |
| slotted.style.justifySelf = "auto"; | |
| checkValues(slotted, "justifySelf", "justify-self", "auto", "auto"); | |
| }, "Check out how justify-self uses the 'shadowHost' as 'slotted' element's parent while 'slot' is not assigned."); | |
| test(function() { | |
| shadowHost.style.justifyItems = "legacy"; | |
| shadowNode.style.justifyItems = "right"; | |
| checkValues(shadowHost, "justifyItems", "justify-items", "legacy", "normal"); | |
| checkValues(shadowNode, "justifyItems", "justify-items", "right", "right"); | |
| document.documentElement.style.justifyItems = "legacy center"; | |
| checkValues(document.documentElement, "justifyItems", "justify-items", "legacy center", "legacy center"); | |
| checkValues(shadowHost, "justifyItems", "justify-items", "legacy", "legacy center"); | |
| slotted.style.justifyItems = "legacy"; | |
| checkValues(slotted, "justifyItems", "justify-items", "legacy", "normal"); | |
| slotted.style.justifySelf = "auto"; | |
| checkValues(slotted, "justifySelf", "justify-self", "auto", "auto"); | |
| shadowNode.style.justifyItems = "legacy"; | |
| checkValues(shadowNode, "justifyItems", "justify-items", "legacy", "legacy center"); | |
| checkValues(slotted, "justifyItems", "justify-items", "legacy", "normal"); | |
| checkValues(slotted, "justifySelf", "justify-self", "auto", "auto"); | |
| document.documentElement.style.justifyItems = "legacy"; | |
| }, "Check out how the 'legacy' keyword in justify-items affects the 'slotted' elements while 'slot' is not assigned."); | |
| // Slot element is assigned now. | |
| var slot = document.createElement('slot'); | |
| slot.setAttribute('name', 's1'); | |
| shadowNode.appendChild(slot); | |
| test(function() { | |
| shadowHost.style.alignItems = "center"; | |
| shadowNode.style.alignItems = "end"; | |
| slotted.style.alignItems = "start"; | |
| checkValues(slotted, "alignItems", "align-items", "start", "start"); | |
| slotted.style.alignItems = ""; | |
| checkValues(slotted, "alignItems", "align-items", "", "normal"); | |
| slotted.style.alignSelf = "start"; | |
| checkValues(slotted, "alignSelf", "align-self", "start", "start"); | |
| slotted.style.alignSelf = "auto"; | |
| checkValues(slotted, "alignSelf", "align-self", "auto", "auto"); | |
| }, "Check out how align-self uses the 'slot' element's parent (Shadow Node) as 'slotted' element' s parent after the 'slot' is assigned."); | |
| test(function() { | |
| shadowHost.style.justifyItems = "center"; | |
| shadowNode.style.justifyItems = "right"; | |
| slotted.style.justifyItems = "left"; | |
| checkValues(slotted, "justifyItems", "justify-items", "left", "left"); | |
| slotted.style.justifyItems = ""; | |
| checkValues(slotted, "justifyItems", "justify-items", "", "normal"); | |
| slotted.style.justifySelf = "start"; | |
| checkValues(slotted, "justifySelf", "justify-self", "start", "start"); | |
| slotted.style.justifySelf = "auto"; | |
| checkValues(slotted, "justifySelf", "justify-self", "auto", "auto"); | |
| }, "Check out how justify-self uses the 'slot' element's parent (Shadow Node) as 'slotted' element' s parent after the 'slot' is assigned."); | |
| test(function() { | |
| shadowHost.style.justifyItems = "legacy"; | |
| shadowNode.style.justifyItems = "right"; | |
| checkValues(shadowHost, "justifyItems", "justify-items", "legacy", "normal"); | |
| checkValues(shadowNode, "justifyItems", "justify-items", "right", "right"); | |
| document.documentElement.style.justifyItems = "legacy center"; | |
| checkValues(document.documentElement, "justifyItems", "justify-items", "legacy center", "legacy center"); | |
| checkValues(shadowHost, "justifyItems", "justify-items", "legacy", "legacy center"); | |
| slotted.style.justifyItems = "legacy"; | |
| checkValues(slotted, "justifyItems", "justify-items", "legacy", "normal"); // Shadow host is not the parent now, but ShadowNode. | |
| slotted.style.justifySelf = "auto"; | |
| checkValues(slotted, "justifySelf", "justify-self", "auto", "auto"); // Shadow host is not the parent now, but ShadowNode. | |
| shadowNode.style.justifyItems = "legacy"; | |
| checkValues(shadowNode, "justifyItems", "justify-items", "legacy", "legacy center"); | |
| checkValues(slotted, "justifyItems", "justify-items", "legacy", "legacy center"); // Now that shadowNode is auto, 'legacy' applies. | |
| checkValues(slotted, "justifySelf", "justify-self", "auto", "auto"); // Now that shadowNode is auto, 'legacy' applies. | |
| document.documentElement.style.justifyItems = "legacy"; | |
| }, "Check out how the 'legacy' keyword affects the 'slotted' elements after the 'slot' is assigned."); | |
| test(function() { | |
| shadowHost.style.alignItems = "center"; | |
| shadowNode.style.alignItems = "end"; | |
| slot.style.alignItems = "start"; | |
| checkValues(slot, "alignItems", "align-items", "start", "start"); | |
| slot.style.alignItems = ""; | |
| checkValues(slot, "alignItems", "align-items", "", "normal"); | |
| slot.style.alignSelf = "start"; | |
| checkValues(slot, "alignSelf", "align-self", "start", "start"); | |
| slot.style.alignSelf = "auto"; | |
| checkValues(slot, "alignSelf", "align-self", "auto", "auto"); | |
| }, "The 'slot' element should not use its parent inside the ShadowDOM tree to resolve the align-self 'auto' values because Blink does not support slots in the flat tree."); | |
| test(function() { | |
| shadowHost.style.justifyItems = "center"; | |
| shadowNode.style.justifyItems = "right"; | |
| slot.style.justifyItems = "left"; | |
| checkValues(slot, "justifyItems", "justify-items", "left", "left"); | |
| slot.style.justifyItems = "legacy"; | |
| checkValues(slot, "justifyItems", "justify-items", "legacy", "normal"); | |
| slot.style.justifySelf = "left"; | |
| checkValues(slot, "justifySelf", "justify-self", "left", "left"); | |
| slot.style.justifySelf = "auto"; | |
| checkValues(slot, "justifySelf", "justify-self", "auto", "auto"); | |
| }, "The 'slot' element should not use its parent inside the ShadowDOM tree to resolve the justify-self 'auto' values because Blink does not support slots in the flat tree."); | |
| </script> | |
| </body> | |
| </html> |