<!DOCTYPE HTML> <html> <!-- https://bugzilla.mozilla.org/show_bug.cgi?id=696253 --> <head> <meta charset="utf-8"> <title>Test for Bug 696253</title> <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> <script type="text/javascript" src="property_database.js"></script> <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> </head> <body> <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=696253">Mozilla Bug 696253</a> <div id="display"> <div id="content"> </div> </div> <pre id="test"> <script type="application/javascript;version=1.7"> "use strict"; /** Test for Bug 696253 **/ /* (Testing the 'flex' CSS shorthand property) */ // The CSS property name for the shorthand we're testing: const gFlexPropName = "flex"; // Info from property_database.js on this property: const gFlexPropInfo = gCSSProperties[gFlexPropName]; // The name of the property in the DOM (i.e. in elem.style): // (NOTE: In this case it's actually the same as the CSS property name -- // "flex" -- but that's not guaranteed in general.) const gFlexDOMName = gFlexPropInfo.domProp; // Default values for shorthand subproperties, when they're not specified // explicitly in a testcase. This lets the testcases be more concise. // // The values here are from the flexbox spec on the 'flex' shorthand: // "When omitted, [flex-grow and flex-shrink are] set to '1'." // "When omitted [..., flex-basis's] specified value is '0%'." let gFlexShorthandDefaults = { "flex-grow": "1", "flex-shrink": "1", "flex-basis": "0%" }; let gFlexShorthandTestcases = [ /* { "flex": "SPECIFIED value for flex shorthand", // Expected Computed Values of Subproperties // Semi-optional -- if unspecified, the expected value is taken // from gFlexShorthandDefaults. "flex-grow": "EXPECTED computed value for flex-grow property", "flex-shrink": "EXPECTED computed value for flex-shrink property", "flex-basis": "EXPECTED computed value for flex-basis property", }, */ // Initial values of subproperties: // -------------------------------- // (checked by another test that uses property_database.js, too, but // might as well check here, too, for thoroughness). { "flex": "", "flex-grow": "0", "flex-shrink": "1", "flex-basis": "auto", }, { "flex": "initial", "flex-grow": "0", "flex-shrink": "1", "flex-basis": "auto", }, // Special keyword "none" --> "0 0 auto" // ------------------------------------- { "flex": "none", "flex-grow": "0", "flex-shrink": "0", "flex-basis": "auto", }, // One Value (numeric) --> sets flex-grow // -------------------------------------- { "flex": "0", "flex-grow": "0", }, { "flex": "5", "flex-grow": "5", }, { "flex": "1000", "flex-grow": "1000", }, { "flex": "0.0000001", "flex-grow": "1e-7" }, { "flex": "20000000", "flex-grow": "2e+7" }, // One Value (length or other nonnumeric) --> sets flex-basis // ---------------------------------------------------------- { "flex": "0px", "flex-basis": "0px", }, { "flex": "0%", "flex-basis": "0%", }, { "flex": "25px", "flex-basis": "25px", }, { "flex": "5%", "flex-basis": "5%", }, { "flex": "auto", "flex-basis": "auto", }, { "flex": "-moz-fit-content", "flex-basis": "-moz-fit-content", }, { "flex": "calc(5px + 6px)", "flex-basis": "11px", }, { "flex": "calc(15% + 30px)", "flex-basis": "calc(30px + 15%)", }, // Two Values (numeric) --> sets flex-grow, flex-shrink // ---------------------------------------------------- { "flex": "0 0", "flex-grow": "0", "flex-shrink": "0", }, { "flex": "0 2", "flex-grow": "0", "flex-shrink": "2", }, { "flex": "3 0", "flex-grow": "3", "flex-shrink": "0", }, { "flex": "0.5000 2.03", "flex-grow": "0.5", "flex-shrink": "2.03", }, { "flex": "300.0 500.0", "flex-grow": "300", "flex-shrink": "500", }, // Two Values (numeric & length-ish) --> sets flex-grow, flex-basis // ---------------------------------------------------------------- { "flex": "0 0px", "flex-grow": "0", "flex-basis": "0px", }, { "flex": "0 0%", "flex-grow": "0", "flex-basis": "0%", }, { "flex": "10 30px", "flex-grow": "10", "flex-basis": "30px", }, { "flex": "99px 2.3", "flex-grow": "2.3", "flex-basis": "99px", }, { "flex": "99% 6", "flex-grow": "6", "flex-basis": "99%", }, { "flex": "auto 5", "flex-grow": "5", "flex-basis": "auto", }, { "flex": "5 -moz-fit-content", "flex-grow": "5", "flex-basis": "-moz-fit-content", }, { "flex": "calc(5% + 10px) 3", "flex-grow": "3", "flex-basis": "calc(10px + 5%)", }, // Three Values --> Sets all three subproperties // --------------------------------------------- { "flex": "0 0 0", "flex-grow": "0", "flex-shrink": "0", "flex-basis": "0px", }, { "flex": "0.0 0.00 0px", "flex-grow": "0", "flex-shrink": "0", "flex-basis": "0px", }, { "flex": "0% 0 0", "flex-grow": "0", "flex-shrink": "0", "flex-basis": "0%", }, { "flex": "10px 3 2", "flex-grow": "3", "flex-shrink": "2", "flex-basis": "10px", }, ]; function runFlexShorthandTest(aFlexShorthandTestcase) { let content = document.getElementById("content"); let elem = document.createElement("div"); elem.style[gFlexDOMName] = aFlexShorthandTestcase[gFlexPropName]; content.appendChild(elem); gFlexPropInfo.subproperties.forEach(function(aSubPropName) { var expectedVal = aSubPropName in aFlexShorthandTestcase ? aFlexShorthandTestcase[aSubPropName] : gFlexShorthandDefaults[aSubPropName]; // Compare computed value against expected computed value (from testcase) is(window.getComputedStyle(elem, null).getPropertyValue(aSubPropName), expectedVal, "Computed value of subproperty \"" + aSubPropName + "\" when we set \"" + gFlexPropName + ": " + aFlexShorthandTestcase[gFlexPropName] + "\""); }); // Clean up content.removeChild(elem); } function main() { gFlexShorthandTestcases.forEach(runFlexShorthandTest); } main(); </script> </pre> </body> </html>