| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <title>Verify that one can override the layout of MathML elements with the CSS display property</title> | |
| <link rel="help" href="https://w3c.github.io/mathml-core/#layout-algorithms"> | |
| <meta name="assert" content="Verify that one can override the display of a MathML element."> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="/mathml/support/layout-comparison.js"></script> | |
| <script src="/mathml/support/mathml-fragments.js"></script> | |
| <script src="/mathml/support/fonts.js"></script> | |
| <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> | |
| <style> | |
| math { | |
| font-family: inherit; | |
| } | |
| mfrac { | |
| padding: 0; | |
| } | |
| </style> | |
| <script> | |
| const Xsize = 25; | |
| const templates = { | |
| "block display": `<math style="display: block;">XXX</math>`, | |
| "block display with contrained width": `<math style="display: block; width: ${2*Xsize}px;">XXX</math>`, | |
| "list display inside display block": `<math style="display: block">\ | |
| <mmultiscripts style="display: list-item;">X</mmultiscripts>\ | |
| <maction style="display: list-item;">X</maction>\ | |
| <mpadded style="display: list-item;">X</mpadded>\ | |
| <msqrt style="display: list-item;">X</msqrt>\ | |
| <mroot style="display: list-item;">X</mroot>\ | |
| <mtext style="display: list-item;">X</mtext>\ | |
| </math>`, | |
| "inline display": `<math style="display: inline;">XXX</math>`, | |
| "inline-block display": `<math style="display: inline-block">XXX</math>`, | |
| "table display (math)": `<math style="display: table">\ | |
| <mfrac style='display: table-row'>\ | |
| <msub style='display: table-cell'>X</msub>\ | |
| <msup style='display: table-cell'>X</msup>\ | |
| <msubsup style='display: table-cell'>X</msubsup>\ | |
| </mfrac>\ | |
| <mtable style='display: table-row'>\ | |
| <munder style='display: table-cell'>X</munder>\ | |
| <mover style='display: table-cell'>X</mover>\ | |
| <munderover style='display: table-cell'>X</munderover>\ | |
| </mtable>\ | |
| </math>`, | |
| "table display (mrow)": `<math display="block">\ | |
| <mrow style="display: table">\ | |
| <mfrac style='display: table-row'>\ | |
| <msub style='display: table-cell'>X</msub>\ | |
| <msup style='display: table-cell'>X</msup>\ | |
| <msubsup style='display: table-cell'>X</msubsup>\ | |
| </mfrac>\ | |
| <mtable style='display: table-row'>\ | |
| <munder style='display: table-cell'>X</munder>\ | |
| <mover style='display: table-cell'>X</mover>\ | |
| <munderover style='display: table-cell'>X</munderover>\ | |
| </mtable>\ | |
| </mrow></math>`, | |
| "inline-table display (math)": `<math style="display: inline-table">\ | |
| <mfrac style='display: table-row'>\ | |
| <msub style='display: table-cell'>X</msub>\ | |
| <msup style='display: table-cell'>X</msup>\ | |
| <msubsup style='display: table-cell'>X</msubsup>\ | |
| </mfrac>\ | |
| <mtable style='display: table-row'>\ | |
| <munder style='display: table-cell'>X</munder>\ | |
| <mover style='display: table-cell'>X</mover>\ | |
| <munderover style='display: table-cell'>X</munderover>\ | |
| </mtable>\ | |
| </math>`, | |
| "inline-table display (mrow)": `<math display="block">\ | |
| <mrow style="display: inline-table">\ | |
| <mfrac style='display: table-row'>\ | |
| <msub style='display: table-cell'>X</msub>\ | |
| <msup style='display: table-cell'>X</msup>\ | |
| <msubsup style='display: table-cell'>X</msubsup>\ | |
| </mfrac>\ | |
| <mtable style='display: table-row'>\ | |
| <munder style='display: table-cell'>X</munder>\ | |
| <mover style='display: table-cell'>X</mover>\ | |
| <munderover style='display: table-cell'>X</munderover>\ | |
| </mtable>\ | |
| </mrow></math>`, | |
| "flexbox display (math)": `<math style="display: flex; flex-direction: column;">XXX</math>`, | |
| "flexbox display (mrow)": `<math display="block"><mrow style="display: flex; flex-direction: column;">XXX</mrow></math>`, | |
| "grid display (math)": `<math style="display: grid; grid-gap: 2px; grid-template-columns: ${Xsize}px ${Xsize}px ${Xsize}px;>">XXXXXXXXX</math>`, | |
| "grid display (mrow)": `<math display="block"><mrow style="display: grid; grid-gap: 2px; grid-template-columns: ${Xsize}px ${Xsize}px ${Xsize}px;>">XXXXXXXXX</mrow></math>`, | |
| "ruby display (math)": `<math style="display: ruby;">\ | |
| <mrow style="display: ruby-base;">X</mrow>\ | |
| <mrow style="display: ruby-text">XX</mrow>\ | |
| </math>`, | |
| "ruby display (mrow)": `<math display="block"><mrow style="display: ruby;">\ | |
| <mrow style="display: ruby-base;">X</mrow>\ | |
| <mrow style="display: ruby-text">XX</mrow>\ | |
| </mrow></math>`, | |
| "block display with column width (math)": `<math style="display: block; column-width: ${2*Xsize}px">\ | |
| <mrow>XXXX</mrow><mrow>XXXX</mrow><mrow>XXXX</mrow>\ | |
| </math>`, | |
| "block display with column width (mrow)": `<math style="display: block"><mrow style="display: block; column-width: ${2*Xsize}px">\ | |
| <mrow>XXXX</mrow><mrow>XXXX</mrow><mrow>XXXX</mrow>\ | |
| </mrow></math>`, | |
| }; | |
| setup({ explicit_done: true }); | |
| window.addEventListener("load", () => { loadAllFonts().then(runTests); }); | |
| function runTests() { | |
| for (let key in templates) { | |
| if (!templates.hasOwnProperty(key)) | |
| continue; | |
| let mathtest = templates[key]. | |
| replace(/X/g, `<mspace style="display: inline-block; width: ${Xsize}px; height: ${Xsize}px; background: black"></mspace>`); | |
| let reference = mathtest. | |
| replace(/maction|math|mfrac|mmultiscripts|mover|mover|mpadded|mrow|mspace|msubsup|msub|msup|mtable|munderover|munder|msqrt|mroot|mtext/g, "div"); | |
| document.body.insertAdjacentHTML("beforeend", `<div style="font: 20px/1 Ahem; position: absolute;">\ | |
| <div><span>${key}:</span>${mathtest}</div>\ | |
| <div><span>${key}:</span>${reference}</div>\ | |
| </div>`); | |
| let div = document.body.lastElementChild; | |
| let elementDiv = div.firstElementChild; | |
| let referenceDiv = div.lastElementChild; | |
| test(function() { | |
| const epsilon = 1; | |
| compareLayout(elementDiv, referenceDiv, epsilon); | |
| }, `${key}`); | |
| div.style = "display: none;"; // Hide the div after measurement. | |
| } | |
| done(); | |
| } | |
| </script> | |
| </head> | |
| <body> | |
| <div id="log"></div> | |
| </body> | |
| </html> |