<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>MathML inside foreignObject</title>
<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#html-and-svg">
<meta name="assert" content="Verify that MathML can be used inside a foreignObject element.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/mathml/support/feature-detection.js"></script>
<script>
  setup({ explicit_done: true });
  window.addEventListener("DOMContentLoaded", function() {
      var scale = 2;
      var epsilon = 1;
      var mfrac = document.getElementById("mfrac");
      var num = mfrac.firstElementChild.getBoundingClientRect();
      var denom = mfrac.lastElementChild.getBoundingClientRect();
      test(function() {
          assert_true(MathMLFeatureDetection.has_mspace());
          // The values of width and height are inverted (because of the
          // rotation) and multiplied by the scale factor.
          assert_approx_equals(num.height, 30 * scale, epsilon, "numerator width");
          assert_approx_equals(num.width, 40 * scale, epsilon, "numerator height");
          assert_approx_equals(denom.height, 50 * scale, epsilon, "numerator width");
          assert_approx_equals(denom.width, 60 * scale, epsilon, "numerator height");
      }, "mspace layout in SVG foreignObject");
      test(function() {
          // The horizontal/vertical metrics are inverted (because of the
          // rotation) and multiplied by the scale factor.
          assert_true(MathMLFeatureDetection.has_mfrac());
          assert_greater_than_equal(num.right - denom.left,
                                    (40 + 60) * scale,
                                    "numerator is on the right of denominator");
          assert_approx_equals((num.top + num.bottom) / 2,
                               (denom.top + denom.bottom) / 2,
                               epsilon, "numerator and denominator are vertically aligned");
      }, "mfrac layout in SVG foreignObject");
      done();
  });
</script>
</head>
<body>
  <div id="log"></div>
  <svg width="400px" height="400px">
    <g transform="rotate(90, 200, 200) scale(2)">
      <foreignObject width="400px" height="400px"
                     requiredExtensions="http://www.w3.org/1998/Math/MathML">
        <math>
          <mfrac id="mfrac">
            <mspace width="30px" height="40px" style="background: cyan"></mspace>
            <mspace width="50px" height="60px" style="background: yellow"></mspace>
          </mfrac>
        </math>
      </foreignObject>
    </g>
  </svg>
</body>
</html>
