Skip to content

Commit

Permalink
[mathml] Bad automatic determination of form due to non-element nodes
Browse files Browse the repository at this point in the history
Currently, Blink does not implement complete spec rules for determining
the form of an <mo> element [1]. It just checks whether there are a
nodes before or after the <mo> to calculate whether the form is prefix,
infix or postfix. Once we support embellished operators [2], this will
require a bigger code refactoring.

Meanwhile, this CL fixes the common case where the <mo> has non-element
nodes before or after it that must be ignored for the calculation of the
form. This is visible on test #24 from Mozilla's MathML test [3] where
the prefix/postfix form of "|" are stretchy but the non-stretchy infix
form is used because of whitespace text nodes.

Bug: 6606, 1121113, 1124301

[1] https://bugs.chromium.org/p/chromium/issues/detail?id=1121113
[2] https://bugs.chromium.org/p/chromium/issues/detail?id=1124298
[3] https://fred-wang.github.io/MathFonts/mozilla_mathml_test/

Change-Id: I42ff3b821d2f2da201b1ff4a4612a8d5756486a8
  • Loading branch information
fred-wang authored and chromium-wpt-export-bot committed Aug 10, 2021
1 parent 4c5408d commit 0871f23
Showing 1 changed file with 68 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Stretch properties</title>
<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
<link rel="help" href="https://w3c.github.io/mathml-core/#dictionary-based-attributes">
<meta name="assert" content="Verify ">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/mathml/support/fonts.js"></script>
<style>
math {
font: 25px/1 Ahem;
}
@font-face {
font-family: operators;
src: url("/fonts/math/operators.woff");
}
mo {
font-family: operators;
}
</style>
<script>
setup({ explicit_done: true });
window.addEventListener("load", () => { loadAllFonts().then(runTests); });

function runTests() {

var epsilon = 1;
var emToPx = 25;
var element;

test(function() {
element = document.getElementById("mn_vertical_line");
assert_approx_equals(element.getBoundingClientRect().height, 1 * emToPx, epsilon, "<mn> element");

element = document.getElementById("mo_prefix_vertical_line");
assert_approx_equals(element.getBoundingClientRect().height, 6 * emToPx, epsilon, "Prefix <mo> element");

element = document.getElementById("mo_infix_vertical_line");
assert_approx_equals(element.getBoundingClientRect().height, 1 * emToPx, epsilon, "Infix <mo> element");

element = document.getElementById("mo_postfix_vertical_line");
assert_approx_equals(element.getBoundingClientRect().height, 6 * emToPx, epsilon, "Postfix <mo> element");
}, `Stretchy vertical line`);

done();
}
</script>
</head>
<body>
<div id="log"></div>
<p>
<math>
<mrow>
<!-- Some non-element nodes before -->
<mo id="mo_prefix_vertical_line" style="color: green">|</mo>
<mn id="mn_vertical_line">|</mn>
<mspace width="1em" height="3em" depth="3em" style="background: blue"/>
<mo id="mo_infix_vertical_line" lspace="0" rspace="0">|</mo>
<mo id="mo_postfix_vertical_line" style="color: green">|</mo>
<!-- Some non-element nodes after -->
</mrow>
</math>
</p>
</body>
</html>

0 comments on commit 0871f23

Please sign in to comment.