Implement MathML spacing around operators .
authorfred.wang@free.fr <fred.wang@free.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 12 Mar 2014 06:46:52 +0000 (06:46 +0000)
committerfred.wang@free.fr <fred.wang@free.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 12 Mar 2014 06:46:52 +0000 (06:46 +0000)
https://bugs.webkit.org/show_bug.cgi?id=115787

Reviewed by Chris Fleizach.

Source/WebCore:

This makes the <mo> operators use the lspace/rspace properties to
determine their spacing. The spacing is now consistent with the one
of <mfenced> and as a consequence bug 118843 is fixed. This also ensures
that the rendering of <mo> elements is updated when the form or
attributes are changed.

Tests: mathml/presentation/dir-mo.html
       mathml/presentation/mo-form-dynamic.html
       mathml/presentation/mo-form-minus-plus.html
       mathml/presentation/mo-form.html
       mathml/presentation/mo-lspace-rspace-dynamic.html
       mathml/presentation/mo-lspace-rspace.html
       mathml/presentation/mo-whitespaces.html

* css/mathml.css:
* mathml/MathMLInlineContainerElement.cpp:
(WebCore::MathMLInlineContainerElement::childrenChanged):
* mathml/MathMLInlineContainerElement.h:
* rendering/mathml/RenderMathMLOperator.cpp:
(WebCore::RenderMathMLOperator::setOperatorPropertiesFromOpDictEntry):
(WebCore::RenderMathMLOperator::SetOperatorProperties):
(WebCore::RenderMathMLOperator::updateFromElement):
(WebCore::RenderMathMLOperator::updateOperatorProperties):
(WebCore::RenderMathMLOperator::updateStyle):
* rendering/mathml/RenderMathMLOperator.h:
* rendering/mathml/RenderMathMLRow.cpp:
(WebCore::RenderMathMLRow::updateOperatorProperties):
* rendering/mathml/RenderMathMLRow.h:
* rendering/mathml/RenderMathMLToken.h:

LayoutTests:

Add many new tests to verify the form/lspace/rspace properties of the
<mo> element and that the whitespace of the text content is collapsed.
Update fenced-mi now that bug 118843 is fixed.

* mathml/presentation/dir-mo-expected.html: Added.
* mathml/presentation/dir-mo.html: Added.
* mathml/presentation/fenced-expected.html:
* mathml/presentation/fenced-mi-expected.html:
* mathml/presentation/mo-form-dynamic-expected.html: Added.
* mathml/presentation/mo-form-dynamic.html: Added.
* mathml/presentation/mo-form-expected.html: Added.
* mathml/presentation/mo-form-minus-plus-expected.html: Added.
* mathml/presentation/mo-form-minus-plus.html: Added.
* mathml/presentation/mo-form.html: Added.
* mathml/presentation/mo-lspace-rspace-dynamic-expected.html: Added.
* mathml/presentation/mo-lspace-rspace-dynamic.html: Added.
* mathml/presentation/mo-lspace-rspace-expected.html: Added.
* mathml/presentation/mo-lspace-rspace.html: Added.
* mathml/presentation/mo-whitespaces-expected.html: Added.
* mathml/presentation/mo-whitespaces.html: Added.
* platform/mac/mathml/presentation/mo-stretch-expected.txt: update reference.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@165461 268f45cc-cd09-0410-ab3c-d52691b4dbfc

27 files changed:
LayoutTests/ChangeLog
LayoutTests/mathml/presentation/dir-mo-expected.html [new file with mode: 0644]
LayoutTests/mathml/presentation/dir-mo.html [new file with mode: 0644]
LayoutTests/mathml/presentation/fenced-expected.html
LayoutTests/mathml/presentation/fenced-mi-expected.html
LayoutTests/mathml/presentation/mo-form-dynamic-expected.html [new file with mode: 0644]
LayoutTests/mathml/presentation/mo-form-dynamic.html [new file with mode: 0644]
LayoutTests/mathml/presentation/mo-form-expected.html [new file with mode: 0644]
LayoutTests/mathml/presentation/mo-form-minus-plus-expected.html [new file with mode: 0644]
LayoutTests/mathml/presentation/mo-form-minus-plus.html [new file with mode: 0644]
LayoutTests/mathml/presentation/mo-form.html [new file with mode: 0644]
LayoutTests/mathml/presentation/mo-lspace-rspace-dynamic-expected.html [new file with mode: 0644]
LayoutTests/mathml/presentation/mo-lspace-rspace-dynamic.html [new file with mode: 0644]
LayoutTests/mathml/presentation/mo-lspace-rspace-expected.html [new file with mode: 0644]
LayoutTests/mathml/presentation/mo-lspace-rspace.html [new file with mode: 0644]
LayoutTests/mathml/presentation/mo-whitespaces-expected.html [new file with mode: 0644]
LayoutTests/mathml/presentation/mo-whitespaces.html [new file with mode: 0644]
LayoutTests/platform/mac/mathml/presentation/mo-stretch-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/css/mathml.css
Source/WebCore/mathml/MathMLInlineContainerElement.cpp
Source/WebCore/mathml/MathMLInlineContainerElement.h
Source/WebCore/rendering/mathml/RenderMathMLOperator.cpp
Source/WebCore/rendering/mathml/RenderMathMLOperator.h
Source/WebCore/rendering/mathml/RenderMathMLRow.cpp
Source/WebCore/rendering/mathml/RenderMathMLRow.h
Source/WebCore/rendering/mathml/RenderMathMLToken.h

index 18cc6b5..d96385d 100644 (file)
@@ -1,3 +1,32 @@
+2014-03-11  Frédéric Wang  <fred.wang@free.fr>
+
+        Implement MathML spacing around operators .
+        https://bugs.webkit.org/show_bug.cgi?id=115787
+
+        Reviewed by Chris Fleizach.
+
+        Add many new tests to verify the form/lspace/rspace properties of the
+        <mo> element and that the whitespace of the text content is collapsed.
+        Update fenced-mi now that bug 118843 is fixed.
+
+        * mathml/presentation/dir-mo-expected.html: Added.
+        * mathml/presentation/dir-mo.html: Added.
+        * mathml/presentation/fenced-expected.html:
+        * mathml/presentation/fenced-mi-expected.html:
+        * mathml/presentation/mo-form-dynamic-expected.html: Added.
+        * mathml/presentation/mo-form-dynamic.html: Added.
+        * mathml/presentation/mo-form-expected.html: Added.
+        * mathml/presentation/mo-form-minus-plus-expected.html: Added.
+        * mathml/presentation/mo-form-minus-plus.html: Added.
+        * mathml/presentation/mo-form.html: Added.
+        * mathml/presentation/mo-lspace-rspace-dynamic-expected.html: Added.
+        * mathml/presentation/mo-lspace-rspace-dynamic.html: Added.
+        * mathml/presentation/mo-lspace-rspace-expected.html: Added.
+        * mathml/presentation/mo-lspace-rspace.html: Added.
+        * mathml/presentation/mo-whitespaces-expected.html: Added.
+        * mathml/presentation/mo-whitespaces.html: Added.
+        * platform/mac/mathml/presentation/mo-stretch-expected.txt: update reference.
+
 2014-03-11  Manuel Rego Casasnovas  <rego@igalia.com>
 
         [CSS Grid Layout] Add layout test for anonymous grid items
diff --git a/LayoutTests/mathml/presentation/dir-mo-expected.html b/LayoutTests/mathml/presentation/dir-mo-expected.html
new file mode 100644 (file)
index 0000000..c6dd585
--- /dev/null
@@ -0,0 +1,18 @@
+<!doctype html>
+<html>
+  <head>
+    <title>dir mo</title>
+    <meta charset="utf-8"/>
+  </head>
+  <body>
+
+    <!-- This checks prefix form in RTL mode. -->
+    _<math dir="rtl"><mo style="-webkit-margin-start: 0em; -webkit-margin-end: 0.055555555555555em;" lspace="0em" rspace="0em">+</mo><mi>x</mi></math>_
+
+    <br/>
+
+    <!-- This checks leading and trailing spaces in RTL mode. -->
+    _<math dir="rtl"><mi>x</mi><mo style="-webkit-margin-start: 1em; -webkit-margin-end: 2em;" lspace="0em" rspace="0em">+</mo><mi>y</mi></math>_
+
+  </body>
+</html>
diff --git a/LayoutTests/mathml/presentation/dir-mo.html b/LayoutTests/mathml/presentation/dir-mo.html
new file mode 100644 (file)
index 0000000..341f47e
--- /dev/null
@@ -0,0 +1,18 @@
+<!doctype html>
+<html>
+  <head>
+    <title>dir mo</title>
+    <meta charset="utf-8"/>
+  </head>
+  <body>
+
+    <!-- This checks prefix form in RTL mode. -->
+    _<math dir="rtl"><mo>+</mo><mi>x</mi></math>_
+
+    <br/>
+
+    <!-- This checks leading and trailing spaces in RTL mode. -->
+    _<math dir="rtl"><mi>x</mi><mo lspace="1em" rspace="2em">+</mo><mi>y</mi></math>_
+
+  </body>
+</html>
index 9f8ca20..e3fff3e 100644 (file)
          <mrow> and <mo> elements, as described in the MathML specification.
          Note that the MathML operator dictionary defines "(" and ")" as fences,
          so we don't need an explicit "fence" attribute on the <mo> elements.-->
-    <!-- FIXME: <mfenced> and its expanded form do not use the same spacing,
-         so -webkit-margin-start and -webkit-margin-end are currently set
-         explicitly below. See bug 118843. -->
     <math>
       <mrow>
         <mo>(</mo>
         <mrow>
           <mspace width="48px" height="24px" depth="24px" mathbackground="#0f0"/> 
-          <mo separator="true" style="-webkit-margin-start: 0; -webkit-margin-end: .25em;">,</mo>
+          <mo separator="true">,</mo>
           <mspace width="48px" height="24px" depth="24px" mathbackground="#0f0"/> 
-          <mo separator="true" style="-webkit-margin-start: 0; -webkit-margin-end: .25em;">,</mo>
+          <mo separator="true">,</mo>
           <mspace width="48px" height="24px" depth="24px" mathbackground="#0f0"/> 
         </mrow> 
         <mo>)</mo>
index 5f530ce..6cee639 100644 (file)
@@ -10,9 +10,6 @@
          <mrow> and <mo> elements, as described in the MathML specification.
          The MathML operator dictionary defines '(', ')', '{', '}' as fences,
          so we don't need an explicit "fence" attribute on the <mo> elements.-->
-    <!-- FIXME: <mfenced> and its expanded form do not use the same spacing,
-         so -webkit-margin-start and -webkit-margin-end are currently set
-         explicitly below. See bug 118843. -->
 
     <p>
       <math>
@@ -20,9 +17,9 @@
           <mo>(</mo>
           <mrow>
             <mi>x</mi>
-            <mo separator="true" style="-webkit-margin-start: 0; -webkit-margin-end: .25em;">,</mo>
+            <mo separator="true">,</mo>
             <mi>y</mi>
-            <mo separator="true" style="-webkit-margin-start: 0; -webkit-margin-end: .25em;">,</mo>
+            <mo separator="true">,</mo>
             <mi>z</mi>
           </mrow>
           <mo>)</mo>
@@ -36,9 +33,9 @@
           <mo>{</mo>
           <mrow>
             <mi>x</mi>
-            <mo separator="true" style="-webkit-margin-start: 0; -webkit-margin-end: .25em;">1</mo>
+            <mo separator="true">1</mo>
             <mi>y</mi>
-            <mo separator="true" style="-webkit-margin-start: 0; -webkit-margin-end: .25em;">2</mo>
+            <mo separator="true">2</mo>
             <mi>z</mi>
           </mrow>
           <mo>}</mo>
           <mo>(</mo>
           <mrow>
             <mi>x</mi>
-            <mo separator="true" style="-webkit-margin-start: 0; -webkit-margin-end: .25em;">1</mo>
+            <mo separator="true">1</mo>
             <mi>y</mi>
-            <mo separator="true" style="-webkit-margin-start: 0; -webkit-margin-end: .25em;">2</mo>
+            <mo separator="true">2</mo>
             <mi>z</mi>
-            <mo separator="true" style="-webkit-margin-start: 0; -webkit-margin-end: .25em;">3</mo>
+            <mo separator="true">3</mo>
             <mi>u</mi>
-            <mo separator="true" style="-webkit-margin-start: 0; -webkit-margin-end: .25em;">3</mo>
+            <mo separator="true">3</mo>
             <mi>v</mi>
-            <mo separator="true" style="-webkit-margin-start: 0; -webkit-margin-end: .25em;">3</mo>
+            <mo separator="true">3</mo>
             <mi>w</mi>
           </mrow>
           <mo>)</mo>
diff --git a/LayoutTests/mathml/presentation/mo-form-dynamic-expected.html b/LayoutTests/mathml/presentation/mo-form-dynamic-expected.html
new file mode 100644 (file)
index 0000000..9fab0c9
--- /dev/null
@@ -0,0 +1,24 @@
+<!doctype html>
+<html>
+  <head>
+    <title>form dynamic</title>
+    <meta charset="utf-8"/>
+  </head>
+  <body>
+    
+    _<math><merror><mi>x</mi><mo>+</mo><mi>y</mi></merror></math>_
+    _<math><mi>x</mi><mo>+</mo><mi>y</mi></math>_
+    _<math><mphantom><mi>x</mi><mo>+</mo><mi>y</mi></mphantom></math>_
+    _<math><mrow><mi>x</mi><mo>+</mo><mi>y</mi></mrow></math>_
+    _<math><msqrt><mi>x</mi><mo>+</mo><mi>y</mi></msqrt></math>_
+    _<math><mstyle><mi>x</mi><mo>+</mo><mi>y</mi></mstyle></math>_
+
+    _<math><merror><mo>−</mo><mi>y</mi></merror></math>_
+    _<math><mo>−</mo><mi>y</mi></math>_
+    _<math><mphantom><mo>−</mo><mi>y</mi></mphantom></math>_
+    _<math><mrow><mo>−</mo><mi>y</mi></mrow></math>_
+    _<math><msqrt><mo>−</mo><mi>y</mi></msqrt></math>_
+    _<math><mstyle><mo>−</mo><mi>y</mi></mstyle></math>_
+    
+  </body>
+</html>
diff --git a/LayoutTests/mathml/presentation/mo-form-dynamic.html b/LayoutTests/mathml/presentation/mo-form-dynamic.html
new file mode 100644 (file)
index 0000000..f3b6e74
--- /dev/null
@@ -0,0 +1,38 @@
+<!doctype html>
+<html>
+  <head>
+    <title>form dynamic</title>
+    <meta charset="utf-8"/>
+    <script>
+      function test()
+      {
+        for (var i = 1; i <= 6; i++) {
+          var row = document.getElementById("row" + i);
+          var x = document.getElementById("x" + i);
+          x.parentNode.removeChild(x);
+          row.insertBefore(x, row.firstElementChild);
+        }
+      }
+    </script>
+  </head>
+  <body onload="test()">
+    
+    <!-- This test verifies that the form of the operators (and thus their spacing) is updated when you change the child list. -->
+    <!-- The test should render the same as the static reference -->
+
+    _<math><merror id="row1"><mo>+</mo><mi>y</mi></merror></math>_
+    _<math id="row2"><mo>+</mo><mi>y</mi></math>_
+    _<math><mphantom id="row3"><mo>+</mo><mi>y</mi></mphantom></math>_
+    _<math><mrow id="row4"><mo>+</mo><mi>y</mi></mrow></math>_
+    _<math><msqrt id="row5"><mo>+</mo><mi>y</mi></msqrt></math>_
+    _<math><mstyle id="row6"><mo>+</mo><mi>y</mi></mstyle></math>_
+
+    _<math><merror><mi id="x1">x</mi><mo>−</mo><mi>y</mi></merror></math>_
+    _<math><mi id="x2">x</mi><mo>−</mo><mi>y</mi></math>_
+    _<math><mphantom><mi id="x3">x</mi><mo>−</mo><mi>y</mi></mphantom></math>_
+    _<math><mrow><mi id="x4">x</mi><mo>−</mo><mi>y</mi></mrow></math>_
+    _<math><msqrt><mi id="x5">x</mi><mo>−</mo><mi>y</mi></msqrt></math>_
+    _<math><mstyle><mi id="x6">x</mi><mo>−</mo><mi>y</mi></mstyle></math>_
+    
+  </body>
+</html>
diff --git a/LayoutTests/mathml/presentation/mo-form-expected.html b/LayoutTests/mathml/presentation/mo-form-expected.html
new file mode 100644 (file)
index 0000000..c4f810a
--- /dev/null
@@ -0,0 +1,25 @@
+<!doctype html>
+<html>
+  <head>
+    <title>attribute form</title>
+    <meta charset="utf-8"/>
+  </head>
+  <body>
+
+    <!-- This checks the effect of @form on a prefix operator. -->
+    _<math><mo lspace="thickmathspace" rspace="thickmathspace">∇</mo></math>_
+    _<math><mo lspace="verythinmathspace" rspace="veryverythinmathspace">∇</mo></math>_
+    _<math><mo lspace="thickmathspace" rspace="thickmathspace">∇</mo></math>_
+
+    <!-- This checks the effect of @form on an infix operator. -->
+    _<math><mo lspace="mediummathspace" rspace="mediummathspace">⋉</mo></math>_
+    _<math><mo lspace="thickmathspace" rspace="thickmathspace">⋉</mo></math>_
+    _<math><mo lspace="thickmathspace" rspace="thickmathspace">⋉</mo></math>_
+
+    <!-- This checks the effect of @form on a postfix operator. -->
+    _<math><mo lspace="thickmathspace" rspace="thickmathspace">♭</mo></math>_
+    _<math><mo lspace="thickmathspace" rspace="thickmathspace">♭</mo></math>_
+    _<math><mo lspace="0em" rspace="verythinmathspace">♭</mo></math>_
+
+  </body>
+</html>
diff --git a/LayoutTests/mathml/presentation/mo-form-minus-plus-expected.html b/LayoutTests/mathml/presentation/mo-form-minus-plus-expected.html
new file mode 100644 (file)
index 0000000..9b25b2d
--- /dev/null
@@ -0,0 +1,84 @@
+<!doctype html>
+<html>
+  <head>
+    <title>form</title>
+    <meta charset="utf-8"/>
+  </head>
+  <body>
+
+    <!-- These operators should have form "prefix" -->
+
+    _<math><merror><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">−</mo><mi>x</mi></merror></math>_
+    _<math><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">−</mo><mi>x</mi></math>_
+    _<math><mphantom><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">−</mo><mi>x</mi></mphantom></math>_
+    _<math><mrow><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">−</mo><mi>x</mi></mrow></math>_
+    _<math><msqrt><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">−</mo><mi>x</mi></msqrt></math>_
+    _<math><mstyle><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">−</mo><mi>x</mi></mstyle></math>_
+
+    <br/>
+
+    _<math><merror><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">+</mo><mi>x</mi></merror></math>_
+    _<math><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">+</mo><mi>x</mi></math>_
+    _<math><mphantom><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">+</mo><mi>x</mi></mphantom></math>_
+    _<math><mrow><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">+</mo><mi>x</mi></mrow></math>_
+    _<math><msqrt><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">+</mo><mi>x</mi></msqrt></math>_
+    _<math><mstyle><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">+</mo><mi>x</mi></mstyle></math>_
+
+    <br/>
+
+    _<math><merror><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">±</mo><mi>x</mi></merror></math>_
+    _<math><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">±</mo><mi>x</mi></math>_
+    _<math><mphantom><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">±</mo><mi>x</mi></mphantom></math>_
+    _<math><mrow><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">±</mo><mi>x</mi></mrow></math>_
+    _<math><msqrt><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">±</mo><mi>x</mi></msqrt></math>_
+    _<math><mstyle><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">±</mo><mi>x</mi></mstyle></math>_
+
+    <br/>
+
+    _<math><merror><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">∓</mo><mi>x</mi></merror></math>_
+    _<math><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">∓</mo><mi>x</mi></math>_
+    _<math><mphantom><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">∓</mo><mi>x</mi></mphantom></math>_
+    _<math><mrow><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">∓</mo><mi>x</mi></mrow></math>_
+    _<math><msqrt><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">∓</mo><mi>x</mi></msqrt></math>_
+    _<math><mstyle><mo form="prefix" lspace="0em" rspace="veryverythinmathspace">∓</mo><mi>x</mi></mstyle></math>_
+
+    <br/>
+
+    <!-- These operators should have form "infix" -->
+
+    _<math><merror><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">−</mo><mi>y</mi></merror></math>_
+    _<math><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">−</mo><mi>y</mi></math>_
+    _<math><mphantom><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">−</mo><mi>y</mi></mphantom></math>_
+    _<math><mrow><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">−</mo><mi>y</mi></mrow></math>_
+    _<math><msqrt><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">−</mo><mi>y</mi></msqrt></math>_
+    _<math><mstyle><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">−</mo><mi>y</mi></mstyle></math>_
+
+    <br/>
+
+    _<math><merror><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">+</mo><mi>y</mi></merror></math>_
+    _<math><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">+</mo><mi>y</mi></math>_
+    _<math><mphantom><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">+</mo><mi>y</mi></mphantom></math>_
+    _<math><mrow><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">+</mo><mi>y</mi></mrow></math>_
+    _<math><msqrt><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">+</mo><mi>y</mi></msqrt></math>_
+    _<math><mstyle><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">+</mo><mi>y</mi></mstyle></math>_
+
+    <br/>
+
+    _<math><merror><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">±</mo><mi>y</mi></merror></math>_
+    _<math><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">±</mo><mi>y</mi></math>_
+    _<math><mphantom><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">±</mo><mi>y</mi></mphantom></math>_
+    _<math><mrow><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">±</mo><mi>y</mi></mrow></math>_
+    _<math><msqrt><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">±</mo><mi>y</mi></msqrt></math>_
+    _<math><mstyle><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">±</mo><mi>y</mi></mstyle></math>_
+
+    <br/>
+
+    _<math><merror><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">∓</mo><mi>y</mi></merror></math>_
+    _<math><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">∓</mo><mi>y</mi></math>_
+    _<math><mphantom><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">∓</mo><mi>y</mi></mphantom></math>_
+    _<math><mrow><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">∓</mo><mi>y</mi></mrow></math>_
+    _<math><msqrt><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">∓</mo><mi>y</mi></msqrt></math>_
+    _<math><mstyle><mi>x</mi><mo form="infix" lspace="mediummathspace" rspace="mediummathspace">∓</mo><mi>y</mi></mstyle></math>_
+
+  </body>
+</html>
diff --git a/LayoutTests/mathml/presentation/mo-form-minus-plus.html b/LayoutTests/mathml/presentation/mo-form-minus-plus.html
new file mode 100644 (file)
index 0000000..f9bc96a
--- /dev/null
@@ -0,0 +1,84 @@
+<!doctype html>
+<html>
+  <head>
+    <title>form</title>
+    <meta charset="utf-8"/>
+  </head>
+  <body>
+
+    <!-- These operators should have form "prefix" -->
+
+    _<math><merror><mo>−</mo><mi>x</mi></merror></math>_
+    _<math><mo>−</mo><mi>x</mi></math>_
+    _<math><mphantom><mo>−</mo><mi>x</mi></mphantom></math>_
+    _<math><mrow><mo>−</mo><mi>x</mi></mrow></math>_
+    _<math><msqrt><mo>−</mo><mi>x</mi></msqrt></math>_
+    _<math><mstyle><mo>−</mo><mi>x</mi></mstyle></math>_
+
+    <br/>
+
+    _<math><merror><mo>+</mo><mi>x</mi></merror></math>_
+    _<math><mo>+</mo><mi>x</mi></math>_
+    _<math><mphantom><mo>+</mo><mi>x</mi></mphantom></math>_
+    _<math><mrow><mo>+</mo><mi>x</mi></mrow></math>_
+    _<math><msqrt><mo>+</mo><mi>x</mi></msqrt></math>_
+    _<math><mstyle><mo>+</mo><mi>x</mi></mstyle></math>_
+
+    <br/>
+
+    _<math><merror><mo>±</mo><mi>x</mi></merror></math>_
+    _<math><mo>±</mo><mi>x</mi></math>_
+    _<math><mphantom><mo>±</mo><mi>x</mi></mphantom></math>_
+    _<math><mrow><mo>±</mo><mi>x</mi></mrow></math>_
+    _<math><msqrt><mo>±</mo><mi>x</mi></msqrt></math>_
+    _<math><mstyle><mo>±</mo><mi>x</mi></mstyle></math>_
+
+    <br/>
+
+    _<math><merror><mo>∓</mo><mi>x</mi></merror></math>_
+    _<math><mo>∓</mo><mi>x</mi></math>_
+    _<math><mphantom><mo>∓</mo><mi>x</mi></mphantom></math>_
+    _<math><mrow><mo>∓</mo><mi>x</mi></mrow></math>_
+    _<math><msqrt><mo>∓</mo><mi>x</mi></msqrt></math>_
+    _<math><mstyle><mo>∓</mo><mi>x</mi></mstyle></math>_
+
+    <br/>
+
+    <!-- These operators should have form "infix" -->
+
+    _<math><merror><mi>x</mi><mo>−</mo><mi>y</mi></merror></math>_
+    _<math><mi>x</mi><mo>−</mo><mi>y</mi></math>_
+    _<math><mphantom><mi>x</mi><mo>−</mo><mi>y</mi></mphantom></math>_
+    _<math><mrow><mi>x</mi><mo>−</mo><mi>y</mi></mrow></math>_
+    _<math><msqrt><mi>x</mi><mo>−</mo><mi>y</mi></msqrt></math>_
+    _<math><mstyle><mi>x</mi><mo>−</mo><mi>y</mi></mstyle></math>_
+
+    <br/>
+
+    _<math><merror><mi>x</mi><mo>+</mo><mi>y</mi></merror></math>_
+    _<math><mi>x</mi><mo>+</mo><mi>y</mi></math>_
+    _<math><mphantom><mi>x</mi><mo>+</mo><mi>y</mi></mphantom></math>_
+    _<math><mrow><mi>x</mi><mo>+</mo><mi>y</mi></mrow></math>_
+    _<math><msqrt><mi>x</mi><mo>+</mo><mi>y</mi></msqrt></math>_
+    _<math><mstyle><mi>x</mi><mo>+</mo><mi>y</mi></mstyle></math>_
+
+    <br/>
+
+    _<math><merror><mi>x</mi><mo>±</mo><mi>y</mi></merror></math>_
+    _<math><mi>x</mi><mo>±</mo><mi>y</mi></math>_
+    _<math><mphantom><mi>x</mi><mo>±</mo><mi>y</mi></mphantom></math>_
+    _<math><mrow><mi>x</mi><mo>±</mo><mi>y</mi></mrow></math>_
+    _<math><msqrt><mi>x</mi><mo>±</mo><mi>y</mi></msqrt></math>_
+    _<math><mstyle><mi>x</mi><mo>±</mo><mi>y</mi></mstyle></math>_
+
+    <br/>
+
+    _<math><merror><mi>x</mi><mo>∓</mo><mi>y</mi></merror></math>_
+    _<math><mi>x</mi><mo>∓</mo><mi>y</mi></math>_
+    _<math><mphantom><mi>x</mi><mo>∓</mo><mi>y</mi></mphantom></math>_
+    _<math><mrow><mi>x</mi><mo>∓</mo><mi>y</mi></mrow></math>_
+    _<math><msqrt><mi>x</mi><mo>∓</mo><mi>y</mi></msqrt></math>_
+    _<math><mstyle><mi>x</mi><mo>∓</mo><mi>y</mi></mstyle></math>_
+
+  </body>
+</html>
diff --git a/LayoutTests/mathml/presentation/mo-form.html b/LayoutTests/mathml/presentation/mo-form.html
new file mode 100644 (file)
index 0000000..6730277
--- /dev/null
@@ -0,0 +1,25 @@
+<!doctype html>
+<html>
+  <head>
+    <title>attribute form</title>
+    <meta charset="utf-8"/>
+  </head>
+  <body>
+
+    <!-- This checks the effect of @form on a prefix operator. -->
+    _<math><mo form="infix">∇</mo></math>_
+    _<math><mo form="prefix">∇</mo></math>_
+    _<math><mo form="postfix">∇</mo></math>_
+
+    <!-- This checks the effect of @form on an infix operator. -->
+    _<math><mo form="infix">⋉</mo></math>_
+    _<math><mo form="prefix">⋉</mo></math>_
+    _<math><mo form="postfix">⋉</mo></math>_
+
+    <!-- This checks the effect of @form on a postfix operator. -->
+    _<math><mo form="infix">♭</mo></math>_
+    _<math><mo form="prefix">♭</mo></math>_
+    _<math><mo form="postfix">♭</mo></math>_
+
+  </body>
+</html>
diff --git a/LayoutTests/mathml/presentation/mo-lspace-rspace-dynamic-expected.html b/LayoutTests/mathml/presentation/mo-lspace-rspace-dynamic-expected.html
new file mode 100644 (file)
index 0000000..41f177d
--- /dev/null
@@ -0,0 +1,17 @@
+<!doctype html>
+<html>
+  <head>
+    <title>attribute lspace rspace dynamic</title>
+    <meta charset="utf-8"/>
+  </head>
+  <body>
+
+    <math><mi>x</mi><mo lspace="3em">X</mo><mi>y</mi></math><br/>
+    <math><mi>x</mi><mo rspace="5em">X</mo><mi>y</mi></math><br/>
+    <math><mi>x</mi><mo lspace="3em" rspace="5em">X</mo><mi>y</mi></math><br/>
+    <math><mi>x</mi><mo rspace="5em">X</mo><mi>y</mi></math><br/>
+    <math><mi>x</mi><mo lspace="3em">X</mo><mi>y</mi></math><br/>
+    <math><mi>x</mi><mo>X</mo><mi>y</mi></math>
+
+  </body>
+</html>
diff --git a/LayoutTests/mathml/presentation/mo-lspace-rspace-dynamic.html b/LayoutTests/mathml/presentation/mo-lspace-rspace-dynamic.html
new file mode 100644 (file)
index 0000000..f43f7f7
--- /dev/null
@@ -0,0 +1,31 @@
+<!doctype html>
+<html>
+  <head>
+    <title>attribute lspace rspace dynamic</title>
+    <meta charset="utf-8"/>
+    <script>
+      function test()
+      {
+        document.getElementById("mo1").setAttribute("lspace", "3em");
+        document.getElementById("mo2").setAttribute("rspace", "5em");
+        document.getElementById("mo3").setAttribute("lspace", "3em");
+        document.getElementById("mo3").setAttribute("rspace", "5em");
+        document.getElementById("mo4").removeAttribute("lspace");
+        document.getElementById("mo5").removeAttribute("rspace");
+        document.getElementById("mo6").removeAttribute("lspace");
+        document.getElementById("mo6").removeAttribute("rspace");
+      }
+    </script>
+  </head>
+  <body onload="test()">
+
+    <!-- This tests adding/removing lspace/rspace. This should render the same as the static reference. -->
+    <math><mi>x</mi><mo id="mo1">X</mo><mi>y</mi></math><br/>
+    <math><mi>x</mi><mo id="mo2">X</mo><mi>y</mi></math><br/>
+    <math><mi>x</mi><mo id="mo3">X</mo><mi>y</mi></math><br/>
+    <math><mi>x</mi><mo id="mo4" lspace="3em" rspace="5em">X</mo><mi>y</mi></math><br/>
+    <math><mi>x</mi><mo id="mo5" lspace="3em" rspace="5em">X</mo><mi>y</mi></math><br/>
+    <math><mi>x</mi><mo id="mo6" lspace="3em" rspace="5em">X</mo><mi>y</mi></math>
+
+  </body>
+</html>
diff --git a/LayoutTests/mathml/presentation/mo-lspace-rspace-expected.html b/LayoutTests/mathml/presentation/mo-lspace-rspace-expected.html
new file mode 100644 (file)
index 0000000..c02e319
--- /dev/null
@@ -0,0 +1,40 @@
+<!doctype html>
+<html>
+  <head>
+    <title>attribute lspace rspace</title>
+    <meta charset="utf-8"/>
+  </head>
+  <body>
+
+    <!-- These operators are not from the operator dictionary, the default is spacing is lspace = rspace = thickmathspace = 5/18em. -->
+    <math><mi>x</mi><mo lspace="0em" rspace="0em" style="-webkit-margin-start: 0.27777777777777em; -webkit-margin-end: 0.27777777777777em;">X</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo lspace="0em" rspace="0em" style="-webkit-margin-start: 1em; -webkit-margin-end: 0.27777777777777em;">X</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo lspace="0em" rspace="0em" style="-webkit-margin-start: 0.27777777777777em; -webkit-margin-end: 2em;">X</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo lspace="0em" rspace="0em" style="-webkit-margin-start: 3em; -webkit-margin-end: 4em;">X</mo><mi>y</mi></math>
+
+    <br/>
+
+    <!-- Same with multi-char <mo lspace="0em" rspace="0em">. -->
+    <math><mi>x</mi><mo lspace="0em" rspace="0em" style="-webkit-margin-start: 0.27777777777777em; -webkit-margin-end: 0.27777777777777em;">XXX</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo lspace="0em" rspace="0em" style="-webkit-margin-start: 1em; -webkit-margin-end: 0.27777777777777em;">XXX</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo lspace="0em" rspace="0em" style="-webkit-margin-start: 0.27777777777777em; -webkit-margin-end: 2em;">XXX</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo lspace="0em" rspace="0em" style="-webkit-margin-start: 3em; -webkit-margin-end: 4em;">XXX</mo><mi>y</mi></math>
+
+    <br/>
+
+    <!-- This should have the default spacing from operator dictionary, that is rspace = rspace = mediummathspace = 4/18em. --> 
+    <math><mi>x</mi><mo lspace="0em" rspace="0em" style="-webkit-margin-start: 0.22222222222222em; -webkit-margin-end: 0.22222222222222em;">+</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo lspace="0em" rspace="0em" style="-webkit-margin-start: 1em; -webkit-margin-end: 0.22222222222222em;">+</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo lspace="0em" rspace="0em" style="-webkit-margin-start: 0.22222222222222em; -webkit-margin-end: 2em;">+</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo lspace="0em" rspace="0em" style="-webkit-margin-start: 3em; -webkit-margin-end: 4em;">+</mo><mi>y</mi></math>
+
+    <br/>
+
+    <!-- Same with an explicit form="prefix". The default is now lspace=0 and rspace = veryverythinmathspace = 1/18em -->
+    <math><mi>x</mi><mo lspace="0em" rspace="0em" style="-webkit-margin-start: 0em; -webkit-margin-end: 0.055555555555555em;">+</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo lspace="0em" rspace="0em" style="-webkit-margin-start: 1em; -webkit-margin-end: 0.055555555555555em;">+</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo lspace="0em" rspace="0em" style="-webkit-margin-start: 0em; -webkit-margin-end: 2em;">+</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo lspace="0em" rspace="0em" style="-webkit-margin-start: 3em; -webkit-margin-end: 4em;">+</mo><mi>y</mi></math>
+
+  </body>
+</html>
diff --git a/LayoutTests/mathml/presentation/mo-lspace-rspace.html b/LayoutTests/mathml/presentation/mo-lspace-rspace.html
new file mode 100644 (file)
index 0000000..99f7127
--- /dev/null
@@ -0,0 +1,40 @@
+<!doctype html>
+<html>
+  <head>
+    <title>attribute lspace rspace</title>
+    <meta charset="utf-8"/>
+  </head>
+  <body>
+
+    <!-- These operators are not from the operator dictionary, the default is spacing is lspace = rspace = thickmathspace = 5/18em. -->
+    <math><mi>x</mi><mo>X</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo lspace="1em">X</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo rspace="2em">X</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo lspace="3em" rspace="4em">X</mo><mi>y</mi></math>
+
+    <br/>
+
+    <!-- Same with multi-char <mo>. -->
+    <math><mi>x</mi><mo>XXX</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo lspace="1em">XXX</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo rspace="2em">XXX</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo lspace="3em" rspace="4em">XXX</mo><mi>y</mi></math>
+
+    <br/>
+
+    <!-- This should have the default spacing from operator dictionary, that is rspace = rspace = mediummathspace = 4/18em. --> 
+    <math><mi>x</mi><mo>+</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo lspace="1em">+</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo rspace="2em">+</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo lspace="3em" rspace="4em" >+</mo><mi>y</mi></math>
+
+    <br/>
+
+    <!-- Same with an explicit form="prefix". The default is now lspace=0 and rspace = veryverythinmathspace = 1/18em -->
+    <math><mi>x</mi><mo form="prefix">+</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo form="prefix" lspace="1em">+</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo form="prefix" rspace="2em">+</mo><mi>y</mi></math>
+    <math><mi>x</mi><mo form="prefix" lspace="3em" rspace="4em" >+</mo><mi>y</mi></math>
+
+  </body>
+</html>
diff --git a/LayoutTests/mathml/presentation/mo-whitespaces-expected.html b/LayoutTests/mathml/presentation/mo-whitespaces-expected.html
new file mode 100644 (file)
index 0000000..e188d9d
--- /dev/null
@@ -0,0 +1,12 @@
+<!doctype html>
+<html>
+  <head>
+    <title>mo whitespaces</title>
+    <meta charset="utf-8"/>
+  </head>
+  <body>
+
+    <math><mo>(</mo><mi>x</mi><mo>+</mo><mi>y</mi><mo>)</mo></math>
+
+  </body>
+</html>
diff --git a/LayoutTests/mathml/presentation/mo-whitespaces.html b/LayoutTests/mathml/presentation/mo-whitespaces.html
new file mode 100644 (file)
index 0000000..897fe08
--- /dev/null
@@ -0,0 +1,14 @@
+<!doctype html>
+<html>
+  <head>
+    <title>mo whitespaces</title>
+    <meta charset="utf-8"/>
+  </head>
+  <body>
+
+    <!-- This test verifies that leading and trailing spaces are ignored. -->
+
+    <math><mo>&#x20;&#x9;&#xA;&#xD;(&#x20;&#x9;&#xA;&#xD;</mo><mi>x</mi><mo>&#x20;&#x9;&#xA;&#xD;+&#x20;&#x9;&#xA;&#xD;</mo><mi>y</mi><mo>&#x20;&#x9;&#xA;&#xD;)&#x20;&#x9;&#xA;&#xD;</mo></math>
+
+  </body>
+</html>
index c05d5bb..03ffbe4 100644 (file)
@@ -3,379 +3,379 @@ layer at (0,0) size 800x600
 layer at (0,0) size 800x260
   RenderBlock {HTML} at (0,0) size 800x260
     RenderBody {BODY} at (8,8) size 784x244
-      RenderMathMLMath {math} at (0,0) size 195x25 [padding: 0 1 0 1]
-        RenderMathMLRow {mrow} at (1,0) size 193x25
-          RenderMathMLOperator {mo} at (1,5) size 8x14
+      RenderMathMLMath {math} at (0,0) size 126x25 [padding: 0 1 0 1]
+        RenderMathMLRow {mrow} at (1,0) size 124x25
+          RenderMathMLOperator {mo} at (0,5) size 7x14
             RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
               RenderBlock (anonymous) at (0,0) size 5x14
                 RenderText at (0,-6) size 5x24
                   text run at (0,-6) width 5: "("
-          RenderMathMLOperator {mo} at (13,5) size 8x14
+          RenderMathMLOperator {mo} at (7,5) size 7x14
             RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
               RenderBlock (anonymous) at (0,0) size 5x14
                 RenderText at (0,-6) size 5x24
                   text run at (0,-6) width 5: ")"
-          RenderMathMLOperator {mo} at (26,5) size 11x14
+          RenderMathMLOperator {mo} at (14,5) size 10x14
             RenderMathMLBlock (anonymous, flex) at (0,0) size 10x14
               RenderBlock (anonymous) at (0,0) size 8x14
                 RenderText at (0,-6) size 8x24
                   text run at (0,-6) width 8: "{"
-          RenderMathMLOperator {mo} at (43,5) size 11x14
+          RenderMathMLOperator {mo} at (24,5) size 10x14
             RenderMathMLBlock (anonymous, flex) at (0,0) size 10x14
               RenderBlock (anonymous) at (0,0) size 8x14
                 RenderText at (0,-6) size 8x24
                   text run at (0,-6) width 8: "}"
-          RenderMathMLOperator {mo} at (59,5) size 8x14
+          RenderMathMLOperator {mo} at (34,5) size 7x14
             RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
               RenderBlock (anonymous) at (0,0) size 5x14
                 RenderText at (0,-6) size 5x24
                   text run at (0,-6) width 5: "["
-          RenderMathMLOperator {mo} at (72,5) size 8x14
+          RenderMathMLOperator {mo} at (41,5) size 7x14
             RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
               RenderBlock (anonymous) at (0,0) size 5x14
                 RenderText at (0,-6) size 5x24
                   text run at (0,-6) width 5: "]"
-          RenderMathMLOperator {mo} at (86,4) size 9x16
+          RenderMathMLOperator {mo} at (48,4) size 8x16
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{2308}"
-          RenderMathMLOperator {mo} at (100,4) size 9x16
+          RenderMathMLOperator {mo} at (56,4) size 8x16
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{2309}"
-          RenderMathMLOperator {mo} at (115,4) size 8x16
+          RenderMathMLOperator {mo} at (64,4) size 8x16
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{230A}"
-          RenderMathMLOperator {mo} at (129,4) size 9x16
+          RenderMathMLOperator {mo} at (72,4) size 8x16
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{230B}"
-          RenderMathMLOperator {mo} at (143,2) size 12x20
+          RenderMathMLOperator {mo} at (80,2) size 12x20
             RenderMathMLBlock (anonymous, flex) at (0,0) size 11x20
               RenderBlock (anonymous) at (0,0) size 7x20
                 RenderText at (0,-3) size 7x24
                   text run at (0,-3) width 7: "\x{222B}"
-          RenderMathMLOperator {mo} at (161,0) size 4x25
-            RenderMathMLBlock (anonymous, flex) at (0,0) size 3x12
+          RenderMathMLOperator {mo} at (91,0) size 8x25
+            RenderMathMLBlock (anonymous, flex) at (1,0) size 4x12
               RenderBlock (anonymous) at (0,0) size 3x12
                 RenderText at (0,-6) size 3x24
                   text run at (0,-6) width 3: "|"
-          RenderMathMLOperator {mo} at (170,4) size 9x16
+          RenderMathMLOperator {mo} at (98,4) size 9x16
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{2016}"
-          RenderMathMLOperator {mo} at (183,4) size 9x16
-            RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
+          RenderMathMLOperator {mo} at (106,4) size 18x16
+            RenderMathMLBlock (anonymous, flex) at (4,0) size 9x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{2225}"
-      RenderText {#text} at (194,2) size 5x18
-        text run at (194,2) width 5: " "
+      RenderText {#text} at (125,2) size 5x18
+        text run at (125,2) width 5: " "
       RenderBR {BR} at (0,0) size 0x0
-      RenderMathMLMath {math} at (0,24) size 199x143 [padding: 0 1 0 1]
-        RenderMathMLRow {mrow} at (1,0) size 197x143
-          RenderMathMLOperator {mo} at (1,0) size 8x143
+      RenderMathMLMath {math} at (0,24) size 126x143 [padding: 0 1 0 1]
+        RenderMathMLRow {mrow} at (1,0) size 124x143
+          RenderMathMLOperator {mo} at (0,0) size 7x143
             RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
               RenderBlock (anonymous) at (0,0) size 5x14
                 RenderText at (0,-6) size 5x24
                   text run at (0,-6) width 5: "("
-          RenderMathMLOperator {mo} at (13,0) size 8x143
+          RenderMathMLOperator {mo} at (7,0) size 7x143
             RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
               RenderBlock (anonymous) at (0,0) size 5x14
                 RenderText at (0,-6) size 5x24
                   text run at (0,-6) width 5: ")"
-          RenderMathMLOperator {mo} at (26,0) size 11x143
+          RenderMathMLOperator {mo} at (14,0) size 10x143
             RenderMathMLBlock (anonymous, flex) at (0,0) size 10x14
               RenderBlock (anonymous) at (0,0) size 8x14
                 RenderText at (0,-6) size 8x24
                   text run at (0,-6) width 8: "{"
-          RenderMathMLOperator {mo} at (43,0) size 11x143
+          RenderMathMLOperator {mo} at (24,0) size 10x143
             RenderMathMLBlock (anonymous, flex) at (0,0) size 10x14
               RenderBlock (anonymous) at (0,0) size 8x14
                 RenderText at (0,-6) size 8x24
                   text run at (0,-6) width 8: "}"
-          RenderMathMLOperator {mo} at (59,0) size 8x143
+          RenderMathMLOperator {mo} at (34,0) size 7x143
             RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
               RenderBlock (anonymous) at (0,0) size 5x14
                 RenderText at (0,-6) size 5x24
                   text run at (0,-6) width 5: "["
-          RenderMathMLOperator {mo} at (72,0) size 8x143
+          RenderMathMLOperator {mo} at (41,0) size 7x143
             RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
               RenderBlock (anonymous) at (0,0) size 5x14
                 RenderText at (0,-6) size 5x24
                   text run at (0,-6) width 5: "]"
-          RenderMathMLOperator {mo} at (86,0) size 9x143
+          RenderMathMLOperator {mo} at (48,0) size 8x143
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{2308}"
-          RenderMathMLOperator {mo} at (100,0) size 9x143
+          RenderMathMLOperator {mo} at (56,0) size 8x143
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{2309}"
-          RenderMathMLOperator {mo} at (115,0) size 8x143
+          RenderMathMLOperator {mo} at (64,0) size 8x143
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{230A}"
-          RenderMathMLOperator {mo} at (129,0) size 9x143
+          RenderMathMLOperator {mo} at (72,0) size 8x143
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{230B}"
-          RenderMathMLOperator {mo} at (143,0) size 12x143
+          RenderMathMLOperator {mo} at (80,0) size 12x143
             RenderMathMLBlock (anonymous, flex) at (0,0) size 11x20
               RenderBlock (anonymous) at (0,0) size 7x20
                 RenderText at (0,-3) size 7x24
                   text run at (0,-3) width 7: "\x{222B}"
-          RenderMathMLOperator {mo} at (161,0) size 4x143
-            RenderMathMLBlock (anonymous, flex) at (0,0) size 3x12
+          RenderMathMLOperator {mo} at (91,0) size 8x143
+            RenderMathMLBlock (anonymous, flex) at (1,0) size 4x12
               RenderBlock (anonymous) at (0,0) size 3x12
                 RenderText at (0,-6) size 3x24
                   text run at (0,-6) width 3: "|"
-          RenderMathMLOperator {mo} at (170,0) size 9x76
+          RenderMathMLOperator {mo} at (98,0) size 9x76
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{2016}"
-          RenderMathMLOperator {mo} at (184,0) size 9x76
-            RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
+          RenderMathMLOperator {mo} at (106,0) size 18x76
+            RenderMathMLBlock (anonymous, flex) at (4,0) size 9x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{2225}"
-          RenderMathMLSpace {mspace} at (196,0) size 1x76
-      RenderText {#text} at (198,85) size 5x18
-        text run at (198,85) width 5: " "
-      RenderMathMLMath {math} at (202,49) size 199x93 [padding: 0 1 0 1]
-        RenderMathMLRow {mrow} at (1,0) size 197x93
-          RenderMathMLOperator {mo} at (1,0) size 8x93
+          RenderMathMLSpace {mspace} at (123,0) size 1x76
+      RenderText {#text} at (125,85) size 5x18
+        text run at (125,85) width 5: " "
+      RenderMathMLMath {math} at (129,49) size 126x93 [padding: 0 1 0 1]
+        RenderMathMLRow {mrow} at (1,0) size 124x93
+          RenderMathMLOperator {mo} at (0,0) size 7x93
             RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
               RenderBlock (anonymous) at (0,0) size 5x14
                 RenderText at (0,-6) size 5x24
                   text run at (0,-6) width 5: "("
-          RenderMathMLOperator {mo} at (13,0) size 8x93
+          RenderMathMLOperator {mo} at (7,0) size 7x93
             RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
               RenderBlock (anonymous) at (0,0) size 5x14
                 RenderText at (0,-6) size 5x24
                   text run at (0,-6) width 5: ")"
-          RenderMathMLOperator {mo} at (26,0) size 11x93
+          RenderMathMLOperator {mo} at (14,0) size 10x93
             RenderMathMLBlock (anonymous, flex) at (0,0) size 10x14
               RenderBlock (anonymous) at (0,0) size 8x14
                 RenderText at (0,-6) size 8x24
                   text run at (0,-6) width 8: "{"
-          RenderMathMLOperator {mo} at (43,0) size 11x93
+          RenderMathMLOperator {mo} at (24,0) size 10x93
             RenderMathMLBlock (anonymous, flex) at (0,0) size 10x14
               RenderBlock (anonymous) at (0,0) size 8x14
                 RenderText at (0,-6) size 8x24
                   text run at (0,-6) width 8: "}"
-          RenderMathMLOperator {mo} at (59,0) size 8x93
+          RenderMathMLOperator {mo} at (34,0) size 7x93
             RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
               RenderBlock (anonymous) at (0,0) size 5x14
                 RenderText at (0,-6) size 5x24
                   text run at (0,-6) width 5: "["
-          RenderMathMLOperator {mo} at (72,0) size 8x93
+          RenderMathMLOperator {mo} at (41,0) size 7x93
             RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
               RenderBlock (anonymous) at (0,0) size 5x14
                 RenderText at (0,-6) size 5x24
                   text run at (0,-6) width 5: "]"
-          RenderMathMLOperator {mo} at (86,0) size 9x93
+          RenderMathMLOperator {mo} at (48,0) size 8x93
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{2308}"
-          RenderMathMLOperator {mo} at (100,0) size 9x93
+          RenderMathMLOperator {mo} at (56,0) size 8x93
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{2309}"
-          RenderMathMLOperator {mo} at (115,0) size 8x93
+          RenderMathMLOperator {mo} at (64,0) size 8x93
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{230A}"
-          RenderMathMLOperator {mo} at (129,0) size 9x93
+          RenderMathMLOperator {mo} at (72,0) size 8x93
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{230B}"
-          RenderMathMLOperator {mo} at (143,0) size 12x93
+          RenderMathMLOperator {mo} at (80,0) size 12x93
             RenderMathMLBlock (anonymous, flex) at (0,0) size 11x20
               RenderBlock (anonymous) at (0,0) size 7x20
                 RenderText at (0,-3) size 7x24
                   text run at (0,-3) width 7: "\x{222B}"
-          RenderMathMLOperator {mo} at (161,0) size 4x93
-            RenderMathMLBlock (anonymous, flex) at (0,0) size 3x12
+          RenderMathMLOperator {mo} at (91,0) size 8x93
+            RenderMathMLBlock (anonymous, flex) at (1,0) size 4x12
               RenderBlock (anonymous) at (0,0) size 3x12
                 RenderText at (0,-6) size 3x24
                   text run at (0,-6) width 3: "|"
-          RenderMathMLOperator {mo} at (170,0) size 9x51
+          RenderMathMLOperator {mo} at (98,0) size 9x51
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{2016}"
-          RenderMathMLOperator {mo} at (184,0) size 9x51
-            RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
+          RenderMathMLOperator {mo} at (106,0) size 18x51
+            RenderMathMLBlock (anonymous, flex) at (4,0) size 9x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{2225}"
-          RenderMathMLSpace {mspace} at (196,0) size 1x51
-      RenderText {#text} at (400,85) size 5x18
-        text run at (400,85) width 5: " "
-      RenderMathMLMath {math} at (404,79) size 199x33 [padding: 0 1 0 1]
-        RenderMathMLRow {mrow} at (1,0) size 197x33
-          RenderMathMLOperator {mo} at (1,0) size 8x33
+          RenderMathMLSpace {mspace} at (123,0) size 1x51
+      RenderText {#text} at (254,85) size 5x18
+        text run at (254,85) width 5: " "
+      RenderMathMLMath {math} at (258,79) size 126x33 [padding: 0 1 0 1]
+        RenderMathMLRow {mrow} at (1,0) size 124x33
+          RenderMathMLOperator {mo} at (0,0) size 7x33
             RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
               RenderBlock (anonymous) at (0,0) size 5x14
                 RenderText at (0,-6) size 5x24
                   text run at (0,-6) width 5: "("
-          RenderMathMLOperator {mo} at (13,0) size 8x33
+          RenderMathMLOperator {mo} at (7,0) size 7x33
             RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
               RenderBlock (anonymous) at (0,0) size 5x14
                 RenderText at (0,-6) size 5x24
                   text run at (0,-6) width 5: ")"
-          RenderMathMLOperator {mo} at (26,9) size 11x14
+          RenderMathMLOperator {mo} at (14,9) size 10x14
             RenderMathMLBlock (anonymous, flex) at (0,0) size 10x14
               RenderBlock (anonymous) at (0,0) size 8x14
                 RenderText at (0,-6) size 8x24
                   text run at (0,-6) width 8: "{"
-          RenderMathMLOperator {mo} at (43,9) size 11x14
+          RenderMathMLOperator {mo} at (24,9) size 10x14
             RenderMathMLBlock (anonymous, flex) at (0,0) size 10x14
               RenderBlock (anonymous) at (0,0) size 8x14
                 RenderText at (0,-6) size 8x24
                   text run at (0,-6) width 8: "}"
-          RenderMathMLOperator {mo} at (59,0) size 8x33
+          RenderMathMLOperator {mo} at (34,0) size 7x33
             RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
               RenderBlock (anonymous) at (0,0) size 5x14
                 RenderText at (0,-6) size 5x24
                   text run at (0,-6) width 5: "["
-          RenderMathMLOperator {mo} at (72,0) size 8x33
+          RenderMathMLOperator {mo} at (41,0) size 7x33
             RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
               RenderBlock (anonymous) at (0,0) size 5x14
                 RenderText at (0,-6) size 5x24
                   text run at (0,-6) width 5: "]"
-          RenderMathMLOperator {mo} at (86,0) size 9x33
+          RenderMathMLOperator {mo} at (48,0) size 8x33
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{2308}"
-          RenderMathMLOperator {mo} at (100,0) size 9x33
+          RenderMathMLOperator {mo} at (56,0) size 8x33
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{2309}"
-          RenderMathMLOperator {mo} at (115,0) size 8x33
+          RenderMathMLOperator {mo} at (64,0) size 8x33
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{230A}"
-          RenderMathMLOperator {mo} at (129,0) size 9x33
+          RenderMathMLOperator {mo} at (72,0) size 8x33
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{230B}"
-          RenderMathMLOperator {mo} at (143,6) size 12x20
+          RenderMathMLOperator {mo} at (80,6) size 12x20
             RenderMathMLBlock (anonymous, flex) at (0,0) size 11x20
               RenderBlock (anonymous) at (0,0) size 7x20
                 RenderText at (0,-3) size 7x24
                   text run at (0,-3) width 7: "\x{222B}"
-          RenderMathMLOperator {mo} at (161,0) size 4x33
-            RenderMathMLBlock (anonymous, flex) at (0,0) size 3x12
+          RenderMathMLOperator {mo} at (91,0) size 8x33
+            RenderMathMLBlock (anonymous, flex) at (1,0) size 4x12
               RenderBlock (anonymous) at (0,0) size 3x12
                 RenderText at (0,-6) size 3x24
                   text run at (0,-6) width 3: "|"
-          RenderMathMLOperator {mo} at (170,8) size 9x16
+          RenderMathMLOperator {mo} at (98,8) size 9x16
             RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{2016}"
-          RenderMathMLOperator {mo} at (184,8) size 9x16
-            RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
+          RenderMathMLOperator {mo} at (106,8) size 18x16
+            RenderMathMLBlock (anonymous, flex) at (4,0) size 9x16
               RenderBlock (anonymous) at (0,0) size 8x16
                 RenderText at (0,-5) size 8x24
                   text run at (0,-5) width 8: "\x{2225}"
-          RenderMathMLSpace {mspace} at (196,0) size 1x21
-      RenderText {#text} at (602,85) size 5x18
-        text run at (602,85) width 5: " "
+          RenderMathMLSpace {mspace} at (123,0) size 1x21
+      RenderText {#text} at (383,85) size 5x18
+        text run at (383,85) width 5: " "
       RenderBR {BR} at (0,0) size 0x0
-      RenderMathMLMath {math} at (0,166) size 211x79 [padding: 0 1 0 1]
-        RenderMathMLSquareRoot {msqrt} at (1,0) size 209x79 [intrinsic padding: 3 0 3 12]
-          RenderMathMLRow (anonymous) at (12,3) size 197x73
-            RenderMathMLOperator {mo} at (1,0) size 8x73
+      RenderMathMLMath {math} at (0,166) size 138x79 [padding: 0 1 0 1]
+        RenderMathMLSquareRoot {msqrt} at (1,0) size 136x79 [intrinsic padding: 3 0 3 12]
+          RenderMathMLRow (anonymous) at (12,3) size 124x73
+            RenderMathMLOperator {mo} at (0,0) size 7x73
               RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
                 RenderBlock (anonymous) at (0,0) size 5x14
                   RenderText at (0,-6) size 5x24
                     text run at (0,-6) width 5: "("
-            RenderMathMLOperator {mo} at (13,0) size 8x73
+            RenderMathMLOperator {mo} at (7,0) size 7x73
               RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
                 RenderBlock (anonymous) at (0,0) size 5x14
                   RenderText at (0,-6) size 5x24
                     text run at (0,-6) width 5: ")"
-            RenderMathMLOperator {mo} at (26,0) size 11x73
+            RenderMathMLOperator {mo} at (14,0) size 10x73
               RenderMathMLBlock (anonymous, flex) at (0,0) size 10x14
                 RenderBlock (anonymous) at (0,0) size 8x14
                   RenderText at (0,-6) size 8x24
                     text run at (0,-6) width 8: "{"
-            RenderMathMLOperator {mo} at (43,0) size 11x73
+            RenderMathMLOperator {mo} at (24,0) size 10x73
               RenderMathMLBlock (anonymous, flex) at (0,0) size 10x14
                 RenderBlock (anonymous) at (0,0) size 8x14
                   RenderText at (0,-6) size 8x24
                     text run at (0,-6) width 8: "}"
-            RenderMathMLOperator {mo} at (59,0) size 8x73
+            RenderMathMLOperator {mo} at (34,0) size 7x73
               RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
                 RenderBlock (anonymous) at (0,0) size 5x14
                   RenderText at (0,-6) size 5x24
                     text run at (0,-6) width 5: "["
-            RenderMathMLOperator {mo} at (72,0) size 8x73
+            RenderMathMLOperator {mo} at (41,0) size 7x73
               RenderMathMLBlock (anonymous, flex) at (0,0) size 7x14
                 RenderBlock (anonymous) at (0,0) size 5x14
                   RenderText at (0,-6) size 5x24
                     text run at (0,-6) width 5: "]"
-            RenderMathMLOperator {mo} at (86,0) size 9x73
+            RenderMathMLOperator {mo} at (48,0) size 8x73
               RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
                 RenderBlock (anonymous) at (0,0) size 8x16
                   RenderText at (0,-5) size 8x24
                     text run at (0,-5) width 8: "\x{2308}"
-            RenderMathMLOperator {mo} at (100,0) size 9x73
+            RenderMathMLOperator {mo} at (56,0) size 8x73
               RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
                 RenderBlock (anonymous) at (0,0) size 8x16
                   RenderText at (0,-5) size 8x24
                     text run at (0,-5) width 8: "\x{2309}"
-            RenderMathMLOperator {mo} at (115,0) size 8x73
+            RenderMathMLOperator {mo} at (64,0) size 8x73
               RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
                 RenderBlock (anonymous) at (0,0) size 8x16
                   RenderText at (0,-5) size 8x24
                     text run at (0,-5) width 8: "\x{230A}"
-            RenderMathMLOperator {mo} at (129,0) size 9x73
+            RenderMathMLOperator {mo} at (72,0) size 8x73
               RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
                 RenderBlock (anonymous) at (0,0) size 8x16
                   RenderText at (0,-5) size 8x24
                     text run at (0,-5) width 8: "\x{230B}"
-            RenderMathMLOperator {mo} at (143,0) size 12x73
+            RenderMathMLOperator {mo} at (80,0) size 12x73
               RenderMathMLBlock (anonymous, flex) at (0,0) size 11x20
                 RenderBlock (anonymous) at (0,0) size 7x20
                   RenderText at (0,-3) size 7x24
                     text run at (0,-3) width 7: "\x{222B}"
-            RenderMathMLOperator {mo} at (161,0) size 4x73
-              RenderMathMLBlock (anonymous, flex) at (0,0) size 3x12
+            RenderMathMLOperator {mo} at (91,0) size 8x73
+              RenderMathMLBlock (anonymous, flex) at (1,0) size 4x12
                 RenderBlock (anonymous) at (0,0) size 3x12
                   RenderText at (0,-6) size 3x24
                     text run at (0,-6) width 3: "|"
-            RenderMathMLOperator {mo} at (170,0) size 9x41
+            RenderMathMLOperator {mo} at (98,0) size 9x41
               RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
                 RenderBlock (anonymous) at (0,0) size 8x16
                   RenderText at (0,-5) size 8x24
                     text run at (0,-5) width 8: "\x{2016}"
-            RenderMathMLOperator {mo} at (184,0) size 9x41
-              RenderMathMLBlock (anonymous, flex) at (0,0) size 8x16
+            RenderMathMLOperator {mo} at (106,0) size 18x41
+              RenderMathMLBlock (anonymous, flex) at (4,0) size 9x16
                 RenderBlock (anonymous) at (0,0) size 8x16
                   RenderText at (0,-5) size 8x24
                     text run at (0,-5) width 8: "\x{2225}"
-            RenderMathMLSpace {mspace} at (196,0) size 1x41
+            RenderMathMLSpace {mspace} at (123,0) size 1x41
       RenderText {#text} at (0,0) size 0x0
index 02ae547..ec65380 100644 (file)
@@ -1,3 +1,40 @@
+2014-03-11  Frédéric Wang  <fred.wang@free.fr>
+
+        Implement MathML spacing around operators .
+        https://bugs.webkit.org/show_bug.cgi?id=115787
+
+        Reviewed by Chris Fleizach.
+
+        This makes the <mo> operators use the lspace/rspace properties to
+        determine their spacing. The spacing is now consistent with the one
+        of <mfenced> and as a consequence bug 118843 is fixed. This also ensures
+        that the rendering of <mo> elements is updated when the form or
+        attributes are changed.
+
+        Tests: mathml/presentation/dir-mo.html
+               mathml/presentation/mo-form-dynamic.html
+               mathml/presentation/mo-form-minus-plus.html
+               mathml/presentation/mo-form.html
+               mathml/presentation/mo-lspace-rspace-dynamic.html
+               mathml/presentation/mo-lspace-rspace.html
+               mathml/presentation/mo-whitespaces.html
+
+        * css/mathml.css:
+        * mathml/MathMLInlineContainerElement.cpp:
+        (WebCore::MathMLInlineContainerElement::childrenChanged):
+        * mathml/MathMLInlineContainerElement.h:
+        * rendering/mathml/RenderMathMLOperator.cpp:
+        (WebCore::RenderMathMLOperator::setOperatorPropertiesFromOpDictEntry):
+        (WebCore::RenderMathMLOperator::SetOperatorProperties):
+        (WebCore::RenderMathMLOperator::updateFromElement):
+        (WebCore::RenderMathMLOperator::updateOperatorProperties):
+        (WebCore::RenderMathMLOperator::updateStyle):
+        * rendering/mathml/RenderMathMLOperator.h:
+        * rendering/mathml/RenderMathMLRow.cpp:
+        (WebCore::RenderMathMLRow::updateOperatorProperties):
+        * rendering/mathml/RenderMathMLRow.h:
+        * rendering/mathml/RenderMathMLToken.h:
+
 2014-03-11  Brent Fulgham  <bfulgham@apple.com>
 
         Get the incomplete WebVTT Regions code to build again.
index d3a2d99..203c165 100644 (file)
@@ -105,18 +105,6 @@ msubsup > mi:first-child + * + * {
     -webkit-margin-start: 0.14em; /* This is larger than 0.1em because the child's font-size is smaller than the <msubsup>'s. */
 }
 
-/* FIXME: For a RenderMathMLOperator's margin-start and margin-end, or for a MathML "embellished operator", check the operator's lspace and rspace attributes,
-   and the MathML operator dictionary. */
-math > mo, mrow > mo, msqrt > mo, mtd > mo {
-    -webkit-margin-start: 0.2em;
-    -webkit-margin-end: 0.2em;
-}
-math > mo:first-child, mrow > mo:first-child, msqrt > mo:first-child, mtd > mo:first-child,
-math > mo:last-child, mrow > mo:last-child, msqrt > mo:last-child, mtd > mo:last-child {
-    -webkit-margin-start: 0.1em;
-    -webkit-margin-end: 0.1em;
-}
-
 mroot {
     position: relative;
 }
index edc809c..90ddb99 100644 (file)
@@ -55,6 +55,20 @@ PassRefPtr<MathMLInlineContainerElement> MathMLInlineContainerElement::create(co
     return adoptRef(new MathMLInlineContainerElement(tagName, document));
 }
 
+void MathMLInlineContainerElement::childrenChanged(const ChildChange& change)
+{
+    if (renderer()) {
+        if (renderer()->isRenderMathMLRow())
+            toRenderMathMLRow(renderer())->updateOperatorProperties();
+        else if (hasLocalName(mathTag) || hasLocalName(msqrtTag)) {
+            auto childRenderer = renderer()->firstChild();
+            if (childRenderer && childRenderer->isRenderMathMLRow())
+                toRenderMathMLRow(childRenderer)->updateOperatorProperties();
+        }
+    }
+    MathMLElement::childrenChanged(change);
+}
+
 RenderPtr<RenderElement> MathMLInlineContainerElement::createElementRenderer(PassRef<RenderStyle> style)
 {
     if (hasLocalName(annotation_xmlTag))
index eb7b3d6..3636aab 100644 (file)
@@ -40,6 +40,7 @@ public:
 
 protected:
     MathMLInlineContainerElement(const QualifiedName& tagName, Document&);
+    void childrenChanged(const ChildChange&);
 
 private:
     virtual RenderPtr<RenderElement> createElementRenderer(PassRef<RenderStyle>) override;
index 667df60..f70109c 100644 (file)
@@ -1160,8 +1160,8 @@ void RenderMathMLOperator::setOperatorPropertiesFromOpDictEntry(const MathMLOper
         m_operatorFlags = entry->flags;
 
     // Leading and trailing space is specified as multiple of 1/18em.
-    m_leadingSpace = entry->lspace * style().fontSize() / 18;
-    m_trailingSpace = entry->rspace * style().fontSize() / 18;
+    m_leadingSpace = entry->lspace * style().font().size() / 18;
+    m_trailingSpace = entry->rspace * style().font().size() / 18;
 }
 
 void RenderMathMLOperator::SetOperatorProperties()
@@ -1195,9 +1195,9 @@ void RenderMathMLOperator::SetOperatorProperties()
         m_operatorFlags &= MathMLOperatorDictionary::Fence | MathMLOperatorDictionary::Separator; // This resets all but the Fence and Separator properties.
     else
         m_operatorFlags = 0; // This resets all the operator properties.
-    m_leadingSpace = 5 * style().fontSize() / 18; // This sets leading space to "thickmathspace".
-    m_trailingSpace = 5 * style().fontSize() / 18; // This sets trailing space to "thickmathspace".
-    m_minSize = style().fontSize(); // This sets minsize to "1em".
+    m_leadingSpace = 5 * style().font().size() / 18; // This sets leading space to "thickmathspace".
+    m_trailingSpace = 5 * style().font().size() / 18; // This sets trailing space to "thickmathspace".
+    m_minSize = style().font().size(); // This sets minsize to "1em".
     m_maxSize = intMaxForLayoutUnit; // This sets maxsize to "infinity".
 
     if (m_operator) {
@@ -1237,20 +1237,6 @@ void RenderMathMLOperator::SetOperatorProperties()
         if (maxsize != "infinity")
             parseMathMLLength(maxsize, m_maxSize, &style(), false);
     }
-
-    // FIXME: this should be removed when operator spacing is implemented (https://bugs.webkit.org/show_bug.cgi?id=115787). At the moment spacing for normal <mo> elements is handled in mathml.css and mfenced uses the arbitrary constants below.
-    if (isFencedOperator()) {
-        if (hasOperatorFlag(MathMLOperatorDictionary::Fence)) {
-            m_leadingSpace = 0.1f * style().fontSize();
-            m_trailingSpace = 0.1f * style().fontSize();
-        } else if (hasOperatorFlag(MathMLOperatorDictionary::Separator)) {
-            m_leadingSpace = 0;
-            m_trailingSpace = 0.25f * style().fontSize();
-        }
-    } else {
-        m_leadingSpace = 0;
-        m_trailingSpace = 0;
-    }
 }
 
 bool RenderMathMLOperator::isChildAllowed(const RenderObject&, const RenderStyle&) const
@@ -1374,6 +1360,20 @@ void RenderMathMLOperator::updateTokenContent()
     rebuildTokenContent(element().textContent());
 }
 
+void RenderMathMLOperator::updateFromElement()
+{
+    SetOperatorProperties();
+    RenderMathMLToken::updateFromElement();
+}
+
+void RenderMathMLOperator::updateOperatorProperties()
+{
+    SetOperatorProperties();
+    if (!isEmpty())
+        updateStyle();
+    setNeedsLayoutAndPrefWidthsRecalc();
+}
+
 bool RenderMathMLOperator::shouldAllowStretching(UChar& stretchedCharacter)
 {
     if (!hasOperatorFlag(MathMLOperatorDictionary::Stretchy))
@@ -1427,6 +1427,8 @@ void RenderMathMLOperator::updateStyle()
         m_isStretched = false;
 
     // We add spacing around the operator.
+    // FIXME: The spacing should be added to the whole embellished operator (https://bugs.webkit.org/show_bug.cgi?id=124831).
+    // FIXME: The spacing should only be added inside (perhaps inferred) mrow (http://www.w3.org/TR/MathML/chapter3.html#presm.opspacing).
     const auto& wrapper = toRenderElement(firstChild());
     auto newStyle = RenderStyle::createAnonymousStyleWithDisplay(&style(), FLEX);
     newStyle.get().setMarginStart(Length(m_leadingSpace, Fixed));
index f4d3d56..358fd50 100644 (file)
@@ -49,7 +49,6 @@ enum Flag {
 struct Entry {
     UChar character;
     Form form;
-    // FIXME: spacing around <mo> operators is not implemented yet (https://bugs.webkit.org/show_bug.cgi?id=115787).
     unsigned short lspace;
     unsigned short rspace;
     unsigned short flags;
@@ -81,6 +80,7 @@ public:
 
     void updateTokenContent(const String& operatorString);
     void updateTokenContent() override final;
+    void updateOperatorProperties();
 
 private:
     virtual const char* renderName() const override { return isAnonymous() ? "RenderMathMLOperator (anonymous)" : "RenderMathMLOperator"; }
@@ -93,6 +93,7 @@ private:
     virtual int firstLineBaseline() const override;
     virtual RenderMathMLOperator* unembellishedOperator() override { return this; }
     void rebuildTokenContent(const String& operatorString);
+    void updateFromElement() override;
 
     bool shouldAllowStretching(UChar& characterForStretching);
     StretchyCharacter* findAcceptableStretchyCharacter(UChar);
index a4af976..d2721e7 100644 (file)
@@ -55,6 +55,18 @@ RenderPtr<RenderMathMLRow> RenderMathMLRow::createAnonymousWithParentRenderer(Re
     return newMRow;
 }
 
+void RenderMathMLRow::updateOperatorProperties()
+{
+    for (RenderObject* child = firstChild(); child; child = child->nextSibling()) {
+        if (child->isRenderMathMLBlock()) {
+            auto renderOperator = toRenderMathMLBlock(child)->unembellishedOperator();
+            if (renderOperator)
+                renderOperator->updateOperatorProperties();
+        }
+    }
+    setNeedsLayoutAndPrefWidthsRecalc();
+}
+
 void RenderMathMLRow::layout()
 {
     int stretchHeightAboveBaseline = 0, stretchDepthBelowBaseline = 0;
index 16ddfcd..5732ec1 100644 (file)
@@ -40,6 +40,7 @@ public:
     RenderMathMLRow(Document&, PassRef<RenderStyle>);
 
     static RenderPtr<RenderMathMLRow> createAnonymousWithParentRenderer(RenderMathMLRoot&);
+    void updateOperatorProperties();
 
 protected:
     virtual void layout();
@@ -49,6 +50,8 @@ private:
     virtual const char* renderName() const override { return isAnonymous() ? "RenderMathMLRow (anonymous)" : "RenderMathMLRow"; }
 };
 
+RENDER_OBJECT_TYPE_CASTS(RenderMathMLRow, isRenderMathMLRow())
+
 }
 
 #endif // ENABLE(MATHML)
index 29fb171..352ff89 100644 (file)
@@ -45,13 +45,13 @@ public:
     virtual bool isChildAllowed(const RenderObject&, const RenderStyle&) const override { return true; };
     virtual void addChild(RenderObject* newChild, RenderObject* beforeChild) override;
     virtual void updateTokenContent();
+    void updateFromElement() override;
 
 protected:
     void createWrapperIfNeeded();
 
 private:
     virtual const char* renderName() const override { return isAnonymous() ? "RenderMathMLToken (anonymous)" : "RenderMathMLToken"; }
-    void updateFromElement() override;
     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle) override;
     virtual void updateStyle();
 };