<!DOCTYPE html> <html> <head> <meta charset=utf-8> <title>Test serialization of CSS 'grid' shorthand property</title> <link rel="author" title="Simon Sapin" href="mailto:simon.sapin@exyr.org"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <link rel='stylesheet' href='/resources/testharness.css'> </head> <body> <script> var isGridTemplateSubgridValueEnabled = SpecialPowers.getBoolPref("layout.css.grid-template-subgrid-value.enabled"); var initial_values = { gridTemplateAreas: "none", gridTemplateRows: "none", gridTemplateColumns: "none", gridAutoFlow: "row", gridAutoRows: "auto", gridAutoColumns: "auto", gridRowGap: "0px", gridColumnGap: "0px", }; // For various specified values of the grid-template subproperties, // test the serialization of the shorthand. var grid_template_test_cases = [ { gridTemplateColumns: "100px", shorthand: "none / 100px", }, { gridTemplateRows: "minmax(auto,1fr)", shorthand: "1fr / none", }, { gridTemplateColumns: "minmax(auto,1fr)", shorthand: "none / 1fr", }, { gridTemplateRows: "40px", shorthand: "40px / none", }, { gridTemplateRows: "40px", gridTemplateColumns: "subgrid", shorthand: isGridTemplateSubgridValueEnabled ? "40px / subgrid" : "", }, { gridTemplateRows: "[foo] 40px [bar]", gridTemplateColumns: "[baz] 100px [fizz]", shorthand: "[foo] 40px [bar] / [baz] 100px [fizz]", }, { gridTemplateAreas: "\"a\"", gridTemplateRows: "20px", shorthand: "\"a\" 20px", }, { gridTemplateAreas: "\"a\"", gridTemplateRows: "[foo] 20px [bar]", shorthand: "[foo] \"a\" 20px [bar]", }, { gridTemplateAreas: "\"a\"", gridTemplateRows: "[foo] repeat(1, 20px) [bar]", shorthand: "[foo] \"a\" 20px [bar]", }, { gridTemplateAreas: "\"a a\"", gridTemplateColumns: "repeat(2, 100px)", gridTemplateRows: "auto", shorthand: "\"a a\" auto / 100px 100px", }, // Combinations of longhands that make the shorthand non-serializable: { gridTemplateAreas: "\"a\"", gridTemplateRows: "20px 100px", shorthand: "", }, { gridTemplateAreas: "\"a\" \"b\"", gridTemplateRows: "20px", shorthand: "", }, { gridTemplateAreas: "\"a\"", gridTemplateRows: "subgrid", shorthand: "", }, { gridTemplateAreas: "\"a\"", gridTemplateRows: "subgrid [foo]", shorthand: "", }, { gridTemplateAreas: "\"a\"", gridTemplateRows: "20px", gridTemplateColumns: "subgrid", shorthand: "", }, { gridTemplateAreas: "\"a\"", gridTemplateRows: "repeat(auto-fill, 20px)", shorthand: "", }, { gridTemplateAreas: "\"a\"", gridTemplateColumns: "repeat(auto-fill, 100px)", gridTemplateRows: "auto", shorthand: "", }, ]; grid_test_cases = grid_template_test_cases.concat([ { gridAutoFlow: "row", shorthand: "none / none", }, { gridAutoRows: "40px", shorthand: "auto-flow 40px / none", }, { gridAutoRows: "minmax(auto,1fr)", shorthand: "auto-flow 1fr / none", }, { gridAutoFlow: "column dense", gridAutoRows: "minmax(min-content, max-content)", shorthand: "", }, { gridAutoFlow: "column dense", gridAutoColumns: "minmax(min-content, max-content)", shorthand: "none / auto-flow dense minmax(min-content, max-content)", }, { gridAutoFlow: "column", gridAutoColumns: "minmax(auto,1fr)", shorthand: "none / auto-flow 1fr", }, { gridAutoFlow: "row dense", gridAutoColumns: "minmax(min-content, 2fr)", shorthand: "", }, { gridAutoFlow: "row dense", gridAutoRows: "minmax(min-content, 2fr)", shorthand: "auto-flow dense minmax(min-content, 2fr) / none", }, { gridAutoFlow: "row", gridAutoRows: "40px", gridTemplateColumns: "100px", shorthand: "auto-flow 40px / 100px", }, { gridAutoFlow: "row", gridRowGap: "0px", shorthand: "none / none", }, { gridAutoFlow: "row", gridRowGap: "1px", shorthand: "", }, { gridAutoFlow: "row", gridColumnGap: "1px", shorthand: "", }, ]); var grid_important_test_cases = [ { "grid-auto-flow": "row", "grid-row-gap": "0px", shorthand: "", }, { "grid-auto-flow": "row", "grid-column-gap": "1px", shorthand: "", }, ]; function run_tests(test_cases, shorthand, subproperties) { test_cases.forEach(function(test_case) { test(function() { var element = document.createElement('div'); document.body.appendChild(element); subproperties.forEach(function(longhand) { element.style[longhand] = test_case[longhand] || initial_values[longhand]; }); assert_equals(element.style[shorthand], test_case.shorthand); }, "test shorthand serialization " + JSON.stringify(test_case)); }); } function run_important_tests(test_cases, shorthand, subproperties) { test_cases.forEach(function(test_case) { test(function() { var element = document.createElement('div'); document.body.appendChild(element); subproperties.forEach(function(longhand) { element.style.setProperty(longhand, test_case[longhand] || initial_values[longhand], "important"); }); assert_equals(element.style[shorthand], test_case.shorthand); }, "test shorthand serialization " + JSON.stringify(test_case)); }); } run_tests(grid_template_test_cases, "gridTemplate", [ "gridTemplateAreas", "gridTemplateColumns", "gridTemplateRows"]); run_tests(grid_test_cases, "grid", [ "gridTemplateAreas", "gridTemplateColumns", "gridTemplateRows", "gridAutoFlow", "gridAutoColumns", "gridAutoRows", "gridColumnGap", "gridRowGap"]); run_important_tests(grid_important_test_cases, "grid", [ "grid-template-areas", "grid-template-columns", "grid-template-rows", "grid-auto-flow", "grid-auto-columns", "grid-auto-rows", "grid-column-gap", "grid-row-gap"]); </script> </body> </html>