Refactor RenderMathMLFraction layout to avoid using flexbox
authorfred.wang@free.fr <fred.wang@free.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 11 Apr 2016 15:38:46 +0000 (15:38 +0000)
committerfred.wang@free.fr <fred.wang@free.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 11 Apr 2016 15:38:46 +0000 (15:38 +0000)
https://bugs.webkit.org/show_bug.cgi?id=153917

Patch by Frederic Wang <fwang@igalia.com> on 2016-04-11
Reviewed by Sergio Villar Senin.

Source/WebCore:

Based on a patch by Alejandro G. Castro <alex@igalia.com>

Implement the layoutBlock method to handle the layout calculations
directly in the class. This also fixes parsing of absolute values for
linethickness attribute (e.g. 10px) and adds support for the AxisHeight
and FractionRuleThickness MATH parameters.

Test: mathml/opentype/fraction-line.html

* accessibility/AccessibilityRenderObject.cpp:
(WebCore::AccessibilityRenderObject::mathLineThickness): Use the thickness relative to the
default line thickness since that's really what is expected by mathml-line-fraction.html
* css/mathml.css: Remove flexbox properties for mfrac.
(mfrac): Deleted.
(mfrac > *): Deleted.
(mfrac[numalign="left"] > :first-child): Deleted.
(mfrac[numalign="right"] > :first-child): Deleted.
(mfrac[denomalign="left"] > :last-child): Deleted.
(mfrac[denomalign="right"] > :last-child): Deleted.
(mfrac > :first-child): Deleted.
(mfrac > :last-child): Deleted.
(mfrac): Deleted.
* rendering/mathml/RenderMathMLBlock.cpp: Introduce a helper function to retrieve the math
axis height.
(WebCore::RenderMathMLBlock::mathAxisHeight):
* rendering/mathml/RenderMathMLBlock.h: Declare mathAxisHeight.
* rendering/mathml/RenderMathMLFraction.cpp:
(WebCore::RenderMathMLFraction::RenderMathMLFraction):
(WebCore::RenderMathMLFraction::parseAlignmentAttribute): Helper function to parse the align
attribute.
(WebCore::RenderMathMLFraction::isValid): Helper function to verify whether the child list
is valid with respect to the MathML specificitation.
(WebCore::RenderMathMLFraction::numerator): Helper function to retrieve the numerator.
(WebCore::RenderMathMLFraction::denominator): Helper function to retrieve the denominator.
(WebCore::RenderMathMLFraction::updateFromElement): Use the FractionRuleThickness parameter
when avaiable to calculate the default linethickness.
Fix computation of linethickness for absolute values (e.g. 10px), the default linethickness
must not be involved for such values.
We no longer need to manage style of anonymous wrappers.
(WebCore::RenderMathMLFraction::unembellishedOperator): Use the helper function and we no
longer care about anonymous wrappers.
(WebCore::RenderMathMLFraction::computePreferredLogicalWidths): Implement this function
without using flexbox.
(WebCore::RenderMathMLFraction::horizontalOffset): Helper function to get the horizontal
offsets of children depending of the alignment.
(WebCore::RenderMathMLFraction::layoutBlock): Implement this function without using flexbox.
(WebCore::RenderMathMLFraction::paint): Do not paint if the fraction is invalid. Use helper
function. Use the width of the renderer (instead of the one of the denominator) as the
length of the fraction bar.
(WebCore::RenderMathMLFraction::firstLineBaseline): Use the helper functions to get children
and axis height.
(WebCore::RenderMathMLFraction::paintChildren): Temporary function to remove in a
follow-up patch.
(WebCore::RenderMathMLFraction::fixChildStyle): Deleted. We no longer need to manage style
of anonymous wrappers.
(WebCore::RenderMathMLFraction::addChild): Deleted. We no longer need to manage
anonymous wrappers.
(WebCore::RenderMathMLFraction::styleDidChange): We no longer need to manage style of
anonymous wrappers.
(WebCore::RenderMathMLFraction::layout): Deleted.
* rendering/mathml/RenderMathMLFraction.h: Replace lineThickness with relativeLineThickness,
as needed by the accessibility code. Update function and members declarations.

LayoutTests:

* TestExpectations: No longer skip mathml/presentation/fractions-positions.html
* mathml/opentype/fraction-line-expected.html: Added. New test to verify AxisHeight and
FractionRuleThickness parameters.
* mathml/opentype/fraction-line.html: Added. New test to verify axis height and rule
thickness parameters.
* mathml/presentation/fractions-linethickness-expected.html: Adjust the test to be sure that
the default rule thickness is 1px.
* mathml/presentation/fractions-linethickness.html: Adjust the test to be sure that the
default rule thickness is 1px.
* platform/gtk/mathml/presentation/roots-expected.txt: Update reference to take into account
changes in the render tree.
* platform/ios-simulator/mathml/presentation/roots-expected.txt: Ditto
* platform/mac/TestExpectations: Mark fraction-line and fractions-linethickness as
possibly failing since these tests require Latin Modern Math to work reliably.
* platform/ios-simulator/TestExpectations: Ditto

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

17 files changed:
LayoutTests/ChangeLog
LayoutTests/TestExpectations
LayoutTests/mathml/opentype/fraction-line-expected.html [new file with mode: 0644]
LayoutTests/mathml/opentype/fraction-line.html [new file with mode: 0644]
LayoutTests/mathml/presentation/fractions-linethickness-expected.html
LayoutTests/mathml/presentation/fractions-linethickness.html
LayoutTests/platform/gtk/mathml/presentation/roots-expected.txt
LayoutTests/platform/ios-simulator/TestExpectations
LayoutTests/platform/ios-simulator/mathml/presentation/roots-expected.txt
LayoutTests/platform/mac/TestExpectations
Source/WebCore/ChangeLog
Source/WebCore/accessibility/AccessibilityRenderObject.cpp
Source/WebCore/css/mathml.css
Source/WebCore/rendering/mathml/RenderMathMLBlock.cpp
Source/WebCore/rendering/mathml/RenderMathMLBlock.h
Source/WebCore/rendering/mathml/RenderMathMLFraction.cpp
Source/WebCore/rendering/mathml/RenderMathMLFraction.h

index d8cef95..12868ff 100644 (file)
@@ -1,3 +1,26 @@
+2016-04-11  Frederic Wang  <fwang@igalia.com>
+
+        Refactor RenderMathMLFraction layout to avoid using flexbox
+        https://bugs.webkit.org/show_bug.cgi?id=153917
+
+        Reviewed by Sergio Villar Senin.
+
+        * TestExpectations: No longer skip mathml/presentation/fractions-positions.html
+        * mathml/opentype/fraction-line-expected.html: Added. New test to verify AxisHeight and
+        FractionRuleThickness parameters.
+        * mathml/opentype/fraction-line.html: Added. New test to verify axis height and rule
+        thickness parameters.
+        * mathml/presentation/fractions-linethickness-expected.html: Adjust the test to be sure that
+        the default rule thickness is 1px.
+        * mathml/presentation/fractions-linethickness.html: Adjust the test to be sure that the
+        default rule thickness is 1px.
+        * platform/gtk/mathml/presentation/roots-expected.txt: Update reference to take into account
+        changes in the render tree.
+        * platform/ios-simulator/mathml/presentation/roots-expected.txt: Ditto
+        * platform/mac/TestExpectations: Mark fraction-line and fractions-linethickness as
+        possibly failing since these tests require Latin Modern Math to work reliably.
+        * platform/ios-simulator/TestExpectations: Ditto
+
 2016-04-11  Commit Queue  <commit-queue@webkit.org>
 
         Unreviewed, rolling out r199290.
index a7eceaa..1cc57d2 100644 (file)
@@ -112,9 +112,6 @@ webkit.org/b/127860 [ Debug ] js/function-apply-aliased.html [ Skip ]
 # This test verifies dynamic manipulation of the mroot and msqrt elements.
 mathml/roots-removeChild.html [ ImageOnlyFailure ]
 
-# There is a small 1px size difference but this will be fixed when we refactor completely RenderMathMLFraction.
-mathml/presentation/fractions-positions.html [ Skip ]
-
 # For now we ignore margin/padding/border properties of MathML renderers.
 mathml/presentation/bug97990.html [ Skip ]
 
diff --git a/LayoutTests/mathml/opentype/fraction-line-expected.html b/LayoutTests/mathml/opentype/fraction-line-expected.html
new file mode 100644 (file)
index 0000000..da6bce1
--- /dev/null
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Fraction line (axis height and rule thickness)</title>
+    <meta charset="utf-8">
+    <style type="text/css">
+      math {
+        font-family: "Latin Modern Math";
+        font-size: 100px;
+      }
+    </style>
+  </head>
+  <body>
+
+    <div style="position: absolute; left: 0px; top: -25px;">
+      <math>
+        <mspace height="50px" depth="50px"/>
+        <mspace width="100px" height="2px" depth="2px" mathbackground="green"/>
+      </math>
+    </div>
+
+  </body>
+</html>
diff --git a/LayoutTests/mathml/opentype/fraction-line.html b/LayoutTests/mathml/opentype/fraction-line.html
new file mode 100644 (file)
index 0000000..7cfd0d3
--- /dev/null
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Fraction line (axis height and rule thickness)</title>
+    <meta charset="utf-8">
+    <style type="text/css">
+      /* For Latin Modern Math
+         AxisHeight = 250 * 100 / 1000 = 25px;
+         FractionRuleThickness = 40 * 100 / 1000 = 4px;
+       */
+      math {
+        font-family: "Latin Modern Math";
+        font-size: 100px;
+      }
+    </style>
+  </head>
+  <body>
+
+    <!-- This test passes if the (red) fraction bar is hidden by the green bar -->
+    <div style="position: absolute; left: 0px; top: 0px;">
+      <math>
+        <mspace height="50px" depth="50px"/>
+        <mfrac mathcolor="red">
+          <mspace width="50px"/>
+          <mspace width="50px"/>
+        </mfrac>
+      </math>
+    </div>
+
+    <!-- This green bar is moved up by AxisHeight and has thickness height + depth = FractionRuleThickness. -->
+    <div style="position: absolute; left: 0px; top: -25px;">
+      <math>
+        <mspace height="50px" depth="50px"/>
+        <mspace width="100px" height="2px" depth="2px" mathbackground="green"/>
+      </math>
+    </div>
+
+  </body>
+</html>
index 5f4a7cf..2eb8456 100644 (file)
@@ -3,6 +3,15 @@
   <head>
     <title>fractions linethickness</title>
     <meta charset="utf-8"/>
+    <style type="text/css">
+      /* For Latin Modern Math
+         FractionRuleThickness = 40 * 25 / 1000 = 1px;
+       */
+      math {
+        font-family: "Latin Modern Math";
+        font-size: 25px;
+      }
+    </style>
   </head>
   <body>
 
@@ -20,7 +29,7 @@
          gLineThick = 3.f;
       -->
 
-    <math mathsize="32px">
+    <math>
       <mfrac linethickness="0.33px"><mn>1</mn><mn>2</mn></mfrac>
       <mfrac linethickness="1px"><mn>1</mn><mn>2</mn></mfrac>
       <mfrac linethickness="3px"><mn>1</mn><mn>2</mn></mfrac>
index 2bcef16..415bf23 100644 (file)
@@ -3,11 +3,20 @@
   <head>
     <title>fractions linethickness</title>
     <meta charset="utf-8"/>
+    <style type="text/css">
+      /* For Latin Modern Math
+         FractionRuleThickness = 40 * 25 / 1000 = 1px;
+       */
+      math {
+        font-family: "Latin Modern Math";
+        font-size: 25px;
+      }
+    </style>
   </head>
   <body>
 
     <!-- This should draw fraction bars of increasing thickness -->
-    <math mathsize="32px">
+    <math>
       <mfrac linethickness="thin"><mn>1</mn><mn>2</mn></mfrac>
       <mfrac linethickness="medium"><mn>1</mn><mn>2</mn></mfrac>
       <mfrac linethickness="thick"><mn>1</mn><mn>2</mn></mfrac>
index 9da7319..dd7ddb0 100644 (file)
@@ -1,8 +1,8 @@
 layer at (0,0) size 800x600
   RenderView at (0,0) size 800x600
-layer at (0,0) size 800x492
-  RenderBlock {html} at (0,0) size 800x492
-    RenderBody {body} at (8,16) size 784x460
+layer at (0,0) size 800x491
+  RenderBlock {html} at (0,0) size 800x491
+    RenderBody {body} at (8,16) size 784x459
       RenderBlock {p} at (0,0) size 784x18
         RenderText {#text} at (0,0) size 177x17
           text run at (0,0) width 177: "square root (should be red): "
@@ -86,50 +86,48 @@ layer at (0,0) size 800x492
       RenderBlock {p} at (0,103) size 784x40
         RenderText {#text} at (0,8) size 113x17
           text run at (0,8) width 113: "root of a fraction: "
-        RenderMathMLMath {math} at (113,0) size 58x41 [padding: 0 1 0 1]
-          RenderMathMLSquareRoot {msqrt} at (1,0) size 56x41
+        RenderMathMLMath {math} at (113,0) size 56x41 [padding: 0 1 0 1]
+          RenderMathMLSquareRoot {msqrt} at (1,0) size 54x41
             RenderMathMLBlock (anonymous, flex) at (0,0) size 17x41
               RenderMathMLRadicalOperator (anonymous) at (0,0) size 17x41
                 RenderMathMLBlock (anonymous, flex) at (0,0) size 13x40
                   RenderBlock (anonymous) at (0,0) size 13x40
                     RenderText at (0,-56) size 13x106
                       text run at (0,-56) width 13: "\x{221A}"
-            RenderMathMLRootWrapper at (17,2) size 39x39
-              RenderMathMLFraction {mfrac} at (1,0) size 37x34
-                RenderMathMLBlock (anonymous, flex) at (0,0) size 37x17
-                  RenderMathMLRow {mrow} at (0,0) size 37x13
-                    RenderMathMLToken {mi} at (0,4) size 10x8 [padding: 0 2 0 0]
-                      RenderMathMLBlock (anonymous, flex) at (0,0) size 8x8
-                        RenderBlock (anonymous) at (0,0) size 8x8
-                          RenderText {#text} at (0,-50) size 8x106
-                            text run at (0,-50) width 8: "x"
-                    RenderMathMLOperator {mo} at (9,1) size 20x12
-                      RenderMathMLBlock (anonymous, flex) at (3,0) size 13x12
-                        RenderBlock (anonymous) at (0,0) size 12x12
-                          RenderText at (0,-47) size 12x106
-                            text run at (0,-47) width 12: "+"
-                    RenderMathMLToken {mn} at (28,0) size 9x12
-                      RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
-                        RenderBlock (anonymous) at (0,0) size 8x12
-                          RenderText {#text} at (0,-46) size 8x106
-                            text run at (0,-46) width 8: "1"
-                RenderMathMLBlock (anonymous, flex) at (0,16) size 37x18 [padding: 1 0 0 0]
-                  RenderMathMLRow {mrow} at (0,4) size 37x14
-                    RenderMathMLToken {mi} at (0,4) size 10x8 [padding: 0 2 0 0]
-                      RenderMathMLBlock (anonymous, flex) at (0,0) size 8x8
-                        RenderBlock (anonymous) at (0,0) size 8x8
-                          RenderText {#text} at (0,-50) size 8x106
-                            text run at (0,-50) width 8: "x"
-                    RenderMathMLOperator {mo} at (9,1) size 20x12
-                      RenderMathMLBlock (anonymous, flex) at (3,0) size 13x12
-                        RenderBlock (anonymous) at (0,0) size 12x12
-                          RenderText at (0,-47) size 12x106
-                            text run at (0,-47) width 12: "+"
-                    RenderMathMLToken {mn} at (28,0) size 9x12
-                      RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
-                        RenderBlock (anonymous) at (0,0) size 8x12
-                          RenderText {#text} at (0,-46) size 8x106
-                            text run at (0,-46) width 8: "2"
+            RenderMathMLRootWrapper at (17,2) size 37x39
+              RenderMathMLFraction {mfrac} at (0,0) size 37x34
+                RenderMathMLRow {mrow} at (0,0) size 37x13
+                  RenderMathMLToken {mi} at (0,4) size 10x8 [padding: 0 2 0 0]
+                    RenderMathMLBlock (anonymous, flex) at (0,0) size 8x8
+                      RenderBlock (anonymous) at (0,0) size 8x8
+                        RenderText {#text} at (0,-50) size 8x106
+                          text run at (0,-50) width 8: "x"
+                  RenderMathMLOperator {mo} at (9,1) size 20x12
+                    RenderMathMLBlock (anonymous, flex) at (3,0) size 13x12
+                      RenderBlock (anonymous) at (0,0) size 12x12
+                        RenderText at (0,-47) size 12x106
+                          text run at (0,-47) width 12: "+"
+                  RenderMathMLToken {mn} at (28,0) size 9x12
+                    RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
+                      RenderBlock (anonymous) at (0,0) size 8x12
+                        RenderText {#text} at (0,-46) size 8x106
+                          text run at (0,-46) width 8: "1"
+                RenderMathMLRow {mrow} at (0,20) size 37x14
+                  RenderMathMLToken {mi} at (0,4) size 10x8 [padding: 0 2 0 0]
+                    RenderMathMLBlock (anonymous, flex) at (0,0) size 8x8
+                      RenderBlock (anonymous) at (0,0) size 8x8
+                        RenderText {#text} at (0,-50) size 8x106
+                          text run at (0,-50) width 8: "x"
+                  RenderMathMLOperator {mo} at (9,1) size 20x12
+                    RenderMathMLBlock (anonymous, flex) at (3,0) size 13x12
+                      RenderBlock (anonymous) at (0,0) size 12x12
+                        RenderText at (0,-47) size 12x106
+                          text run at (0,-47) width 12: "+"
+                  RenderMathMLToken {mn} at (28,0) size 9x12
+                    RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
+                      RenderBlock (anonymous) at (0,0) size 8x12
+                        RenderText {#text} at (0,-46) size 8x106
+                          text run at (0,-46) width 8: "2"
       RenderBlock {p} at (0,159) size 784x18
         RenderText {#text} at (0,0) size 173x17
           text run at (0,0) width 173: "cube root (should be blue): "
@@ -200,8 +198,8 @@ layer at (0,0) size 800x492
       RenderBlock {p} at (0,227) size 784x40
         RenderText {#text} at (0,8) size 185x17
           text run at (0,8) width 185: "long index w/ complex base: "
-        RenderMathMLMath {math} at (185,0) size 92x41 [padding: 0 1 0 1]
-          RenderMathMLRoot {mroot} at (1,0) size 90x41
+        RenderMathMLMath {math} at (185,0) size 90x41 [padding: 0 1 0 1]
+          RenderMathMLRoot {mroot} at (1,0) size 88x41
             RenderMathMLRootWrapper at (4,8) size 40x33
               RenderMathMLRow {mrow} at (0,0) size 39x8
                 RenderMathMLToken {mi} at (0,2) size 6x5 [padding: 0 1 0 0]
@@ -235,82 +233,76 @@ layer at (0,0) size 800x492
                   RenderBlock (anonymous) at (0,0) size 13x40
                     RenderText at (0,-56) size 13x106
                       text run at (0,-56) width 13: "\x{221A}"
-            RenderMathMLRootWrapper at (51,2) size 39x39
-              RenderMathMLFraction {mfrac} at (1,0) size 37x34
-                RenderMathMLBlock (anonymous, flex) at (0,0) size 37x17
-                  RenderMathMLRow {mrow} at (0,0) size 37x13
-                    RenderMathMLToken {mi} at (0,4) size 10x8 [padding: 0 2 0 0]
-                      RenderMathMLBlock (anonymous, flex) at (0,0) size 8x8
-                        RenderBlock (anonymous) at (0,0) size 8x8
-                          RenderText {#text} at (0,-50) size 8x106
-                            text run at (0,-50) width 8: "x"
-                    RenderMathMLOperator {mo} at (9,1) size 20x12
-                      RenderMathMLBlock (anonymous, flex) at (3,0) size 13x12
-                        RenderBlock (anonymous) at (0,0) size 12x12
-                          RenderText at (0,-47) size 12x106
-                            text run at (0,-47) width 12: "+"
-                    RenderMathMLToken {mn} at (28,0) size 9x12
-                      RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
-                        RenderBlock (anonymous) at (0,0) size 8x12
-                          RenderText {#text} at (0,-46) size 8x106
-                            text run at (0,-46) width 8: "1"
-                RenderMathMLBlock (anonymous, flex) at (0,16) size 37x18 [padding: 1 0 0 0]
-                  RenderMathMLRow {mrow} at (0,4) size 37x14
-                    RenderMathMLToken {mi} at (0,4) size 10x8 [padding: 0 2 0 0]
-                      RenderMathMLBlock (anonymous, flex) at (0,0) size 8x8
-                        RenderBlock (anonymous) at (0,0) size 8x8
-                          RenderText {#text} at (0,-50) size 8x106
-                            text run at (0,-50) width 8: "x"
-                    RenderMathMLOperator {mo} at (9,1) size 20x12
-                      RenderMathMLBlock (anonymous, flex) at (3,0) size 13x12
-                        RenderBlock (anonymous) at (0,0) size 12x12
-                          RenderText at (0,-47) size 12x106
-                            text run at (0,-47) width 12: "+"
-                    RenderMathMLToken {mn} at (28,0) size 9x12
-                      RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
-                        RenderBlock (anonymous) at (0,0) size 8x12
-                          RenderText {#text} at (0,-46) size 8x106
-                            text run at (0,-46) width 8: "2"
-      RenderBlock {p} at (0,283) size 784x35
-        RenderText {#text} at (0,17) size 75x17
-          text run at (0,17) width 75: "high index: "
-        RenderMathMLMath {math} at (75,0) size 33x36 [padding: 0 1 0 1]
-          RenderMathMLRoot {mroot} at (1,0) size 31x36
-            RenderMathMLRootWrapper at (4,0) size 11x36
-              RenderMathMLFraction {mfrac} at (1,0) size 8x26
-                RenderMathMLBlock (anonymous, flex) at (0,0) size 8x18
-                  RenderMathMLFraction {mfrac} at (1,0) size 6x16
-                    RenderMathMLBlock (anonymous, flex) at (0,0) size 6x7
-                      RenderMathMLToken {mi} at (0,0) size 6x5 [padding: 0 1 0 0]
-                        RenderMathMLBlock (anonymous, flex) at (0,0) size 5x5
-                          RenderBlock (anonymous) at (0,0) size 5x5
-                            RenderText {#text} at (0,-29) size 5x61
-                              text run at (0,-29) width 5: "x"
-                    RenderMathMLBlock (anonymous, flex) at (0,6) size 6x10 [padding: 1 0 0 0]
-                      RenderMathMLToken {mi} at (0,2) size 6x7 [padding: 0 1 0 0]
-                        RenderMathMLBlock (anonymous, flex) at (0,0) size 5x6
-                          RenderBlock (anonymous) at (0,0) size 5x6
-                            RenderText {#text} at (0,-29) size 5x61
-                              text run at (0,-29) width 5: "y"
-                RenderMathMLBlock (anonymous, flex) at (0,17) size 8x9 [padding: 1 0 0 0]
-                  RenderMathMLToken {mi} at (1,2) size 6x6 [padding: 0 1 0 0]
-                    RenderMathMLBlock (anonymous, flex) at (0,0) size 4x5
-                      RenderBlock (anonymous) at (0,0) size 4x5
-                        RenderText {#text} at (0,-29) size 4x61
-                          text run at (0,-29) width 4: "z"
-            RenderMathMLBlock (anonymous, flex) at (5,0) size 18x36
-              RenderMathMLRadicalOperator (anonymous) at (0,18) size 17x18
+            RenderMathMLRootWrapper at (51,2) size 37x39
+              RenderMathMLFraction {mfrac} at (0,0) size 37x34
+                RenderMathMLRow {mrow} at (0,0) size 37x13
+                  RenderMathMLToken {mi} at (0,4) size 10x8 [padding: 0 2 0 0]
+                    RenderMathMLBlock (anonymous, flex) at (0,0) size 8x8
+                      RenderBlock (anonymous) at (0,0) size 8x8
+                        RenderText {#text} at (0,-50) size 8x106
+                          text run at (0,-50) width 8: "x"
+                  RenderMathMLOperator {mo} at (9,1) size 20x12
+                    RenderMathMLBlock (anonymous, flex) at (3,0) size 13x12
+                      RenderBlock (anonymous) at (0,0) size 12x12
+                        RenderText at (0,-47) size 12x106
+                          text run at (0,-47) width 12: "+"
+                  RenderMathMLToken {mn} at (28,0) size 9x12
+                    RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
+                      RenderBlock (anonymous) at (0,0) size 8x12
+                        RenderText {#text} at (0,-46) size 8x106
+                          text run at (0,-46) width 8: "1"
+                RenderMathMLRow {mrow} at (0,20) size 37x14
+                  RenderMathMLToken {mi} at (0,4) size 10x8 [padding: 0 2 0 0]
+                    RenderMathMLBlock (anonymous, flex) at (0,0) size 8x8
+                      RenderBlock (anonymous) at (0,0) size 8x8
+                        RenderText {#text} at (0,-50) size 8x106
+                          text run at (0,-50) width 8: "x"
+                  RenderMathMLOperator {mo} at (9,1) size 20x12
+                    RenderMathMLBlock (anonymous, flex) at (3,0) size 13x12
+                      RenderBlock (anonymous) at (0,0) size 12x12
+                        RenderText at (0,-47) size 12x106
+                          text run at (0,-47) width 12: "+"
+                  RenderMathMLToken {mn} at (28,0) size 9x12
+                    RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
+                      RenderBlock (anonymous) at (0,0) size 8x12
+                        RenderText {#text} at (0,-46) size 8x106
+                          text run at (0,-46) width 8: "2"
+      RenderBlock {p} at (0,283) size 784x34
+        RenderText {#text} at (0,16) size 75x17
+          text run at (0,16) width 75: "high index: "
+        RenderMathMLMath {math} at (75,0) size 29x35 [padding: 0 1 0 1]
+          RenderMathMLRoot {mroot} at (1,0) size 27x35
+            RenderMathMLRootWrapper at (4,0) size 7x35
+              RenderMathMLFraction {mfrac} at (0,0) size 6x24
+                RenderMathMLFraction {mfrac} at (0,0) size 6x15
+                  RenderMathMLToken {mi} at (0,0) size 6x5 [padding: 0 1 0 0]
+                    RenderMathMLBlock (anonymous, flex) at (0,0) size 5x5
+                      RenderBlock (anonymous) at (0,0) size 5x5
+                        RenderText {#text} at (0,-29) size 5x61
+                          text run at (0,-29) width 5: "x"
+                  RenderMathMLToken {mi} at (0,8) size 6x7 [padding: 0 1 0 0]
+                    RenderMathMLBlock (anonymous, flex) at (0,0) size 5x6
+                      RenderBlock (anonymous) at (0,0) size 5x6
+                        RenderText {#text} at (0,-29) size 5x61
+                          text run at (0,-29) width 5: "y"
+                RenderMathMLToken {mi} at (0,18) size 6x6 [padding: 0 1 0 0]
+                  RenderMathMLBlock (anonymous, flex) at (0,0) size 4x5
+                    RenderBlock (anonymous) at (0,0) size 4x5
+                      RenderText {#text} at (0,-29) size 4x61
+                        text run at (0,-29) width 4: "z"
+            RenderMathMLBlock (anonymous, flex) at (1,0) size 18x35
+              RenderMathMLRadicalOperator (anonymous) at (0,17) size 17x18
                 RenderMathMLBlock (anonymous, flex) at (0,0) size 13x17
                   RenderBlock (anonymous) at (0,0) size 13x17
                     RenderText at (0,-56) size 13x106
                       text run at (0,-56) width 13: "\x{221A}"
-            RenderMathMLRootWrapper at (22,20) size 9x16
+            RenderMathMLRootWrapper at (18,18) size 9x17
               RenderMathMLToken {mn} at (0,0) size 8x12
                 RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
                   RenderBlock (anonymous) at (0,0) size 8x12
                     RenderText {#text} at (0,-46) size 8x106
                       text run at (0,-46) width 8: "2"
-      RenderBlock {p} at (0,334) size 784x54
+      RenderBlock {p} at (0,333) size 784x54
         RenderText {#text} at (0,14) size 155x17
           text run at (0,14) width 155: "Imbricated square roots: "
         RenderMathMLMath {math} at (155,0) size 342x55 [padding: 0 1 0 1]
@@ -460,11 +452,11 @@ layer at (0,0) size 800x492
                                                             RenderText {#text} at (0,-45) size 12x106
                                                               text run at (0,-45) width 12: "A"
         RenderText {#text} at (0,0) size 0x0
-      RenderBlock {p} at (0,404) size 784x56
-        RenderText {#text} at (0,25) size 110x17
-          text run at (0,25) width 110: "Imbricated roots: "
-        RenderMathMLMath {math} at (110,0) size 366x57 [padding: 0 1 0 1]
-          RenderMathMLRoot {mroot} at (1,0) size 364x57
+      RenderBlock {p} at (0,403) size 784x56
+        RenderText {#text} at (0,24) size 110x17
+          text run at (0,24) width 110: "Imbricated roots: "
+        RenderMathMLMath {math} at (110,0) size 364x57 [padding: 0 1 0 1]
+          RenderMathMLRoot {mroot} at (1,0) size 362x57
             RenderMathMLRootWrapper at (4,15) size 6x42
               RenderMathMLToken {mn} at (0,0) size 5x7
                 RenderMathMLBlock (anonymous, flex) at (0,0) size 5x7
@@ -477,19 +469,19 @@ layer at (0,0) size 800x492
                   RenderBlock (anonymous) at (0,0) size 13x57
                     RenderText at (0,-56) size 13x106
                       text run at (0,-56) width 13: "\x{221A}"
-            RenderMathMLRootWrapper at (17,2) size 347x55
-              RenderMathMLRow {mrow} at (0,0) size 346x55
-                RenderMathMLToken {mn} at (0,26) size 8x12
+            RenderMathMLRootWrapper at (17,2) size 345x55
+              RenderMathMLRow {mrow} at (0,0) size 344x55
+                RenderMathMLToken {mn} at (0,25) size 8x12
                   RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
                     RenderBlock (anonymous) at (0,0) size 8x12
                       RenderText {#text} at (0,-46) size 8x106
                         text run at (0,-46) width 8: "1"
-                RenderMathMLOperator {mo} at (8,27) size 20x12
+                RenderMathMLOperator {mo} at (8,26) size 20x12
                   RenderMathMLBlock (anonymous, flex) at (3,0) size 13x12
                     RenderBlock (anonymous) at (0,0) size 12x12
                       RenderText at (0,-47) size 12x106
                         text run at (0,-47) width 12: "+"
-                RenderMathMLRoot {mroot} at (27,0) size 319x55
+                RenderMathMLRoot {mroot} at (27,0) size 317x55
                   RenderMathMLRootWrapper at (4,14) size 6x41
                     RenderMathMLToken {mn} at (0,0) size 5x8
                       RenderMathMLBlock (anonymous, flex) at (0,0) size 5x8
@@ -502,19 +494,19 @@ layer at (0,0) size 800x492
                         RenderBlock (anonymous) at (0,0) size 13x55
                           RenderText at (0,-56) size 13x106
                             text run at (0,-56) width 13: "\x{221A}"
-                  RenderMathMLRootWrapper at (17,2) size 302x53
-                    RenderMathMLRow {mrow} at (0,0) size 302x53
-                      RenderMathMLToken {mn} at (0,24) size 8x12
+                  RenderMathMLRootWrapper at (17,2) size 300x53
+                    RenderMathMLRow {mrow} at (0,0) size 300x53
+                      RenderMathMLToken {mn} at (0,23) size 8x12
                         RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
                           RenderBlock (anonymous) at (0,0) size 8x12
                             RenderText {#text} at (0,-46) size 8x106
                               text run at (0,-46) width 8: "2"
-                      RenderMathMLOperator {mo} at (8,25) size 20x12
+                      RenderMathMLOperator {mo} at (8,24) size 20x12
                         RenderMathMLBlock (anonymous, flex) at (3,0) size 13x12
                           RenderBlock (anonymous) at (0,0) size 12x12
                             RenderText at (0,-47) size 12x106
                               text run at (0,-47) width 12: "+"
-                      RenderMathMLRoot {mroot} at (27,0) size 275x53
+                      RenderMathMLRoot {mroot} at (27,0) size 273x53
                         RenderMathMLRootWrapper at (4,14) size 6x39
                           RenderMathMLToken {mn} at (0,0) size 5x7
                             RenderMathMLBlock (anonymous, flex) at (0,0) size 5x7
@@ -527,19 +519,19 @@ layer at (0,0) size 800x492
                               RenderBlock (anonymous) at (0,0) size 13x53
                                 RenderText at (0,-56) size 13x106
                                   text run at (0,-56) width 13: "\x{221A}"
-                        RenderMathMLRootWrapper at (17,2) size 258x51
-                          RenderMathMLRow {mrow} at (0,0) size 257x51
-                            RenderMathMLToken {mn} at (0,22) size 8x12
+                        RenderMathMLRootWrapper at (17,2) size 256x51
+                          RenderMathMLRow {mrow} at (0,0) size 255x51
+                            RenderMathMLToken {mn} at (0,21) size 8x12
                               RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
                                 RenderBlock (anonymous) at (0,0) size 8x12
                                   RenderText {#text} at (0,-46) size 8x106
                                     text run at (0,-46) width 8: "3"
-                            RenderMathMLOperator {mo} at (8,23) size 20x12
+                            RenderMathMLOperator {mo} at (8,22) size 20x12
                               RenderMathMLBlock (anonymous, flex) at (3,0) size 13x12
                                 RenderBlock (anonymous) at (0,0) size 12x12
                                   RenderText at (0,-47) size 12x106
                                     text run at (0,-47) width 12: "+"
-                            RenderMathMLRoot {mroot} at (27,0) size 230x51
+                            RenderMathMLRoot {mroot} at (27,0) size 228x51
                               RenderMathMLRootWrapper at (4,13) size 6x38
                                 RenderMathMLToken {mn} at (0,0) size 5x7
                                   RenderMathMLBlock (anonymous, flex) at (0,0) size 5x7
@@ -552,19 +544,19 @@ layer at (0,0) size 800x492
                                     RenderBlock (anonymous) at (0,0) size 13x51
                                       RenderText at (0,-56) size 13x106
                                         text run at (0,-56) width 13: "\x{221A}"
-                              RenderMathMLRootWrapper at (17,2) size 213x49
-                                RenderMathMLRow {mrow} at (0,0) size 212x49
-                                  RenderMathMLToken {mn} at (0,20) size 8x12
+                              RenderMathMLRootWrapper at (17,2) size 211x49
+                                RenderMathMLRow {mrow} at (0,0) size 210x49
+                                  RenderMathMLToken {mn} at (0,19) size 8x12
                                     RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
                                       RenderBlock (anonymous) at (0,0) size 8x12
                                         RenderText {#text} at (0,-46) size 8x106
                                           text run at (0,-46) width 8: "4"
-                                  RenderMathMLOperator {mo} at (8,21) size 20x12
+                                  RenderMathMLOperator {mo} at (8,20) size 20x12
                                     RenderMathMLBlock (anonymous, flex) at (3,0) size 13x12
                                       RenderBlock (anonymous) at (0,0) size 12x12
                                         RenderText at (0,-47) size 12x106
                                           text run at (0,-47) width 12: "+"
-                                  RenderMathMLRoot {mroot} at (27,0) size 185x49
+                                  RenderMathMLRoot {mroot} at (27,0) size 183x49
                                     RenderMathMLRootWrapper at (4,11) size 6x38
                                       RenderMathMLToken {mn} at (0,0) size 5x8
                                         RenderMathMLBlock (anonymous, flex) at (0,0) size 5x8
@@ -577,19 +569,19 @@ layer at (0,0) size 800x492
                                           RenderBlock (anonymous) at (0,0) size 13x48
                                             RenderText at (0,-56) size 13x106
                                               text run at (0,-56) width 13: "\x{221A}"
-                                    RenderMathMLRootWrapper at (17,2) size 168x47
-                                      RenderMathMLRow {mrow} at (0,0) size 168x41
-                                        RenderMathMLToken {mn} at (0,18) size 8x12
+                                    RenderMathMLRootWrapper at (17,2) size 166x47
+                                      RenderMathMLRow {mrow} at (0,0) size 166x41
+                                        RenderMathMLToken {mn} at (0,17) size 8x12
                                           RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
                                             RenderBlock (anonymous) at (0,0) size 8x12
                                               RenderText {#text} at (0,-46) size 8x106
                                                 text run at (0,-46) width 8: "5"
-                                        RenderMathMLOperator {mo} at (8,19) size 20x12
+                                        RenderMathMLOperator {mo} at (8,18) size 20x12
                                           RenderMathMLBlock (anonymous, flex) at (3,0) size 13x12
                                             RenderBlock (anonymous) at (0,0) size 12x12
                                               RenderText at (0,-47) size 12x106
                                                 text run at (0,-47) width 12: "+"
-                                        RenderMathMLRoot {mroot} at (27,0) size 141x41
+                                        RenderMathMLRoot {mroot} at (27,0) size 139x41
                                           RenderMathMLRootWrapper at (4,9) size 6x32
                                             RenderMathMLToken {mn} at (0,0) size 5x7
                                               RenderMathMLBlock (anonymous, flex) at (0,0) size 5x7
@@ -602,19 +594,19 @@ layer at (0,0) size 800x492
                                                 RenderBlock (anonymous) at (0,0) size 13x40
                                                   RenderText at (0,-56) size 13x106
                                                     text run at (0,-56) width 13: "\x{221A}"
-                                          RenderMathMLRootWrapper at (17,2) size 124x39
-                                            RenderMathMLRow {mrow} at (0,0) size 123x31
-                                              RenderMathMLToken {mn} at (0,16) size 8x12
+                                          RenderMathMLRootWrapper at (17,2) size 122x39
+                                            RenderMathMLRow {mrow} at (0,0) size 121x31
+                                              RenderMathMLToken {mn} at (0,15) size 8x12
                                                 RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
                                                   RenderBlock (anonymous) at (0,0) size 8x12
                                                     RenderText {#text} at (0,-46) size 8x106
                                                       text run at (0,-46) width 8: "6"
-                                              RenderMathMLOperator {mo} at (8,17) size 20x12
+                                              RenderMathMLOperator {mo} at (8,16) size 20x12
                                                 RenderMathMLBlock (anonymous, flex) at (3,0) size 13x12
                                                   RenderBlock (anonymous) at (0,0) size 12x12
                                                     RenderText at (0,-47) size 12x106
                                                       text run at (0,-47) width 12: "+"
-                                              RenderMathMLRoot {mroot} at (27,0) size 96x31
+                                              RenderMathMLRoot {mroot} at (27,0) size 94x31
                                                 RenderMathMLRootWrapper at (4,5) size 6x26
                                                   RenderMathMLToken {mn} at (0,0) size 5x7
                                                     RenderMathMLBlock (anonymous, flex) at (0,0) size 5x7
@@ -627,51 +619,49 @@ layer at (0,0) size 800x492
                                                       RenderBlock (anonymous) at (0,0) size 13x30
                                                         RenderText at (0,-56) size 13x106
                                                           text run at (0,-56) width 13: "\x{221A}"
-                                                RenderMathMLRootWrapper at (17,2) size 79x29
-                                                  RenderMathMLRow {mrow} at (0,0) size 79x29
-                                                    RenderMathMLToken {mn} at (0,14) size 8x12
+                                                RenderMathMLRootWrapper at (17,2) size 77x29
+                                                  RenderMathMLRow {mrow} at (0,0) size 77x28
+                                                    RenderMathMLToken {mn} at (0,13) size 8x12
                                                       RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
                                                         RenderBlock (anonymous) at (0,0) size 8x12
                                                           RenderText {#text} at (0,-46) size 8x106
                                                             text run at (0,-46) width 8: "7"
-                                                    RenderMathMLOperator {mo} at (8,15) size 20x12
+                                                    RenderMathMLOperator {mo} at (8,14) size 20x12
                                                       RenderMathMLBlock (anonymous, flex) at (3,0) size 13x12
                                                         RenderBlock (anonymous) at (0,0) size 12x12
                                                           RenderText at (0,-47) size 12x106
                                                             text run at (0,-47) width 12: "+"
-                                                    RenderMathMLRoot {mroot} at (27,0) size 52x29
-                                                      RenderMathMLRootWrapper at (4,0) size 26x29
-                                                        RenderMathMLFraction {mfrac} at (1,0) size 23x18
-                                                          RenderMathMLBlock (anonymous, flex) at (0,0) size 23x10
-                                                            RenderMathMLRow {mrow} at (0,0) size 23x8
-                                                              RenderMathMLToken {mi} at (0,2) size 6x5 [padding: 0 1 0 0]
-                                                                RenderMathMLBlock (anonymous, flex) at (0,0) size 5x5
-                                                                  RenderBlock (anonymous) at (0,0) size 5x5
-                                                                    RenderText {#text} at (0,-29) size 5x61
-                                                                      text run at (0,-29) width 5: "x"
-                                                              RenderMathMLOperator {mo} at (5,0) size 12x7
-                                                                RenderMathMLBlock (anonymous, flex) at (2,0) size 7x7
-                                                                  RenderBlock (anonymous) at (0,0) size 7x7
-                                                                    RenderText at (0,-27) size 7x61
-                                                                      text run at (0,-27) width 7: "+"
-                                                              RenderMathMLToken {mi} at (16,2) size 7x6 [padding: 0 1 0 0]
-                                                                RenderMathMLBlock (anonymous, flex) at (0,0) size 5x6
-                                                                  RenderBlock (anonymous) at (0,0) size 5x6
-                                                                    RenderText {#text} at (0,-29) size 5x61
-                                                                      text run at (0,-29) width 5: "y"
-                                                          RenderMathMLBlock (anonymous, flex) at (0,9) size 23x9 [padding: 1 0 0 0]
-                                                            RenderMathMLToken {mi} at (8,2) size 6x6 [padding: 0 1 0 0]
-                                                              RenderMathMLBlock (anonymous, flex) at (0,0) size 4x5
-                                                                RenderBlock (anonymous) at (0,0) size 4x5
-                                                                  RenderText {#text} at (0,-29) size 4x61
-                                                                    text run at (0,-29) width 4: "z"
-                                                      RenderMathMLBlock (anonymous, flex) at (20,0) size 18x29
-                                                        RenderMathMLRadicalOperator (anonymous) at (0,11) size 17x18
+                                                    RenderMathMLRoot {mroot} at (27,0) size 50x28
+                                                      RenderMathMLRootWrapper at (4,0) size 24x28
+                                                        RenderMathMLFraction {mfrac} at (0,0) size 23x17
+                                                          RenderMathMLRow {mrow} at (0,0) size 23x8
+                                                            RenderMathMLToken {mi} at (0,2) size 6x5 [padding: 0 1 0 0]
+                                                              RenderMathMLBlock (anonymous, flex) at (0,0) size 5x5
+                                                                RenderBlock (anonymous) at (0,0) size 5x5
+                                                                  RenderText {#text} at (0,-29) size 5x61
+                                                                    text run at (0,-29) width 5: "x"
+                                                            RenderMathMLOperator {mo} at (5,0) size 12x7
+                                                              RenderMathMLBlock (anonymous, flex) at (2,0) size 7x7
+                                                                RenderBlock (anonymous) at (0,0) size 7x7
+                                                                  RenderText at (0,-27) size 7x61
+                                                                    text run at (0,-27) width 7: "+"
+                                                            RenderMathMLToken {mi} at (16,2) size 7x6 [padding: 0 1 0 0]
+                                                              RenderMathMLBlock (anonymous, flex) at (0,0) size 5x6
+                                                                RenderBlock (anonymous) at (0,0) size 5x6
+                                                                  RenderText {#text} at (0,-29) size 5x61
+                                                                    text run at (0,-29) width 5: "y"
+                                                          RenderMathMLToken {mi} at (8,11) size 6x6 [padding: 0 1 0 0]
+                                                            RenderMathMLBlock (anonymous, flex) at (0,0) size 4x5
+                                                              RenderBlock (anonymous) at (0,0) size 4x5
+                                                                RenderText {#text} at (0,-29) size 4x61
+                                                                  text run at (0,-29) width 4: "z"
+                                                      RenderMathMLBlock (anonymous, flex) at (18,0) size 18x28
+                                                        RenderMathMLRadicalOperator (anonymous) at (0,10) size 17x18
                                                           RenderMathMLBlock (anonymous, flex) at (0,0) size 13x17
                                                             RenderBlock (anonymous) at (0,0) size 13x17
                                                               RenderText at (0,-56) size 13x106
                                                                 text run at (0,-56) width 13: "\x{221A}"
-                                                      RenderMathMLRootWrapper at (37,12) size 14x17
+                                                      RenderMathMLRootWrapper at (35,11) size 14x17
                                                         RenderMathMLToken {mi} at (0,0) size 14x13 [padding: 0 2 0 0]
                                                           RenderMathMLBlock (anonymous, flex) at (0,0) size 12x13
                                                             RenderBlock (anonymous) at (0,0) size 12x13
index 5a15333..a42cca4 100644 (file)
@@ -652,6 +652,10 @@ pageoverlay/overlay-large-document-scrolled.html [ Failure ]
 pageoverlay/overlay-large-document.html [ Failure ]
 webkit.org/b/153337 pageoverlay/overlay-installation.html [ Pass Failure ]
 
+# These tests require the Latin Modern Math font.
+mathml/opentype/fraction-line.html [ Pass ImageOnlyFailure ]
+mathml/presentation/fractions-linethickness.html [ Pass ImageOnlyFailure ]
+
 # MathML tests that fail:
 mathml/opentype/horizontal.html [ Failure ]
 mathml/opentype/opentype-stretchy-horizontal.html [ Failure ]
index 7f260ad..ae46426 100644 (file)
@@ -1,8 +1,8 @@
 layer at (0,0) size 800x600
   RenderView at (0,0) size 800x600
-layer at (0,0) size 800x518
-  RenderBlock {html} at (0,0) size 800x518
-    RenderBody {body} at (8,16) size 784x486
+layer at (0,0) size 800x517
+  RenderBlock {html} at (0,0) size 800x517
+    RenderBody {body} at (8,16) size 784x485
       RenderBlock {p} at (0,0) size 784x20
         RenderText {#text} at (0,0) size 181x19
           text run at (0,0) width 181: "square root (should be red): "
@@ -86,50 +86,48 @@ layer at (0,0) size 800x518
       RenderBlock {p} at (0,112) size 784x37
         RenderText {#text} at (0,8) size 117x19
           text run at (0,8) width 117: "root of a fraction: "
-        RenderMathMLMath {math} at (116,0) size 49x38 [padding: 0 1 0 1]
-          RenderMathMLSquareRoot {msqrt} at (1,0) size 47x38
+        RenderMathMLMath {math} at (116,0) size 47x38 [padding: 0 1 0 1]
+          RenderMathMLSquareRoot {msqrt} at (1,0) size 45x38
             RenderMathMLBlock (anonymous, flex) at (0,0) size 12x38
               RenderMathMLRadicalOperator (anonymous) at (0,0) size 12x38
                 RenderMathMLBlock (anonymous, flex) at (0,0) size 9x37
                   RenderBlock (anonymous) at (0,0) size 9x37
                     RenderText at (0,1) size 9x17
                       text run at (0,1) width 9: "\x{221A}"
-            RenderMathMLRootWrapper at (12,3) size 35x35
-              RenderMathMLFraction {mfrac} at (1,0) size 33x32
-                RenderMathMLBlock (anonymous, flex) at (0,0) size 33x16
-                  RenderMathMLRow {mrow} at (0,0) size 33x12
-                    RenderMathMLToken {mi} at (0,3) size 9x9 [padding: 0 2 0 0]
-                      RenderMathMLBlock (anonymous, flex) at (0,0) size 8x9
-                        RenderBlock (anonymous) at (0,0) size 8x9
-                          RenderText {#text} at (0,-4) size 8x17
-                            text run at (0,-4) width 8: "x"
-                    RenderMathMLOperator {mo} at (8,3) size 17x9
-                      RenderMathMLBlock (anonymous, flex) at (3,0) size 10x9
-                        RenderBlock (anonymous) at (0,0) size 9x9
-                          RenderText at (0,-4) size 9x17
-                            text run at (0,-4) width 9: "+"
-                    RenderMathMLToken {mn} at (24,0) size 9x12
-                      RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
-                        RenderBlock (anonymous) at (0,0) size 8x12
-                          RenderText {#text} at (0,-1) size 8x17
-                            text run at (0,-1) width 8: "1"
-                RenderMathMLBlock (anonymous, flex) at (0,15) size 33x17 [padding: 1 0 0 0]
-                  RenderMathMLRow {mrow} at (0,4) size 33x13
-                    RenderMathMLToken {mi} at (0,3) size 9x9 [padding: 0 2 0 0]
-                      RenderMathMLBlock (anonymous, flex) at (0,0) size 8x9
-                        RenderBlock (anonymous) at (0,0) size 8x9
-                          RenderText {#text} at (0,-4) size 8x17
-                            text run at (0,-4) width 8: "x"
-                    RenderMathMLOperator {mo} at (8,3) size 17x9
-                      RenderMathMLBlock (anonymous, flex) at (3,0) size 10x9
-                        RenderBlock (anonymous) at (0,0) size 9x9
-                          RenderText at (0,-4) size 9x17
-                            text run at (0,-4) width 9: "+"
-                    RenderMathMLToken {mn} at (24,0) size 9x12
-                      RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
-                        RenderBlock (anonymous) at (0,0) size 8x12
-                          RenderText {#text} at (0,-1) size 8x17
-                            text run at (0,-1) width 8: "2"
+            RenderMathMLRootWrapper at (12,3) size 33x35
+              RenderMathMLFraction {mfrac} at (0,0) size 33x32
+                RenderMathMLRow {mrow} at (0,0) size 33x12
+                  RenderMathMLToken {mi} at (0,3) size 9x9 [padding: 0 2 0 0]
+                    RenderMathMLBlock (anonymous, flex) at (0,0) size 8x9
+                      RenderBlock (anonymous) at (0,0) size 8x9
+                        RenderText {#text} at (0,-4) size 8x17
+                          text run at (0,-4) width 8: "x"
+                  RenderMathMLOperator {mo} at (8,3) size 17x9
+                    RenderMathMLBlock (anonymous, flex) at (3,0) size 10x9
+                      RenderBlock (anonymous) at (0,0) size 9x9
+                        RenderText at (0,-4) size 9x17
+                          text run at (0,-4) width 9: "+"
+                  RenderMathMLToken {mn} at (24,0) size 9x12
+                    RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
+                      RenderBlock (anonymous) at (0,0) size 8x12
+                        RenderText {#text} at (0,-1) size 8x17
+                          text run at (0,-1) width 8: "1"
+                RenderMathMLRow {mrow} at (0,19) size 33x13
+                  RenderMathMLToken {mi} at (0,3) size 9x9 [padding: 0 2 0 0]
+                    RenderMathMLBlock (anonymous, flex) at (0,0) size 8x9
+                      RenderBlock (anonymous) at (0,0) size 8x9
+                        RenderText {#text} at (0,-4) size 8x17
+                          text run at (0,-4) width 8: "x"
+                  RenderMathMLOperator {mo} at (8,3) size 17x9
+                    RenderMathMLBlock (anonymous, flex) at (3,0) size 10x9
+                      RenderBlock (anonymous) at (0,0) size 9x9
+                        RenderText at (0,-4) size 9x17
+                          text run at (0,-4) width 9: "+"
+                  RenderMathMLToken {mn} at (24,0) size 9x12
+                    RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
+                      RenderBlock (anonymous) at (0,0) size 8x12
+                        RenderText {#text} at (0,-1) size 8x17
+                          text run at (0,-1) width 8: "2"
       RenderBlock {p} at (0,165) size 784x20
         RenderText {#text} at (0,0) size 177x19
           text run at (0,0) width 177: "cube root (should be blue): "
@@ -200,8 +198,8 @@ layer at (0,0) size 800x518
       RenderBlock {p} at (0,237) size 784x37
         RenderText {#text} at (0,8) size 188x19
           text run at (0,8) width 188: "long index w/ complex base: "
-        RenderMathMLMath {math} at (187,0) size 78x38 [padding: 0 1 0 1]
-          RenderMathMLRoot {mroot} at (1,0) size 75x38
+        RenderMathMLMath {math} at (187,0) size 76x38 [padding: 0 1 0 1]
+          RenderMathMLRoot {mroot} at (1,0) size 73x38
             RenderMathMLRootWrapper at (4,8) size 33x30
               RenderMathMLRow {mrow} at (0,0) size 33x7
                 RenderMathMLToken {mi} at (0,1) size 5x5 [padding: 0 1 0 0]
@@ -235,82 +233,76 @@ layer at (0,0) size 800x518
                   RenderBlock (anonymous) at (0,0) size 9x37
                     RenderText at (0,1) size 9x17
                       text run at (0,1) width 9: "\x{221A}"
-            RenderMathMLRootWrapper at (39,3) size 36x35
-              RenderMathMLFraction {mfrac} at (1,0) size 33x32
-                RenderMathMLBlock (anonymous, flex) at (0,0) size 33x16
-                  RenderMathMLRow {mrow} at (0,0) size 33x12
-                    RenderMathMLToken {mi} at (0,3) size 9x9 [padding: 0 2 0 0]
-                      RenderMathMLBlock (anonymous, flex) at (0,0) size 8x9
-                        RenderBlock (anonymous) at (0,0) size 8x9
-                          RenderText {#text} at (0,-4) size 8x17
-                            text run at (0,-4) width 8: "x"
-                    RenderMathMLOperator {mo} at (8,3) size 17x9
-                      RenderMathMLBlock (anonymous, flex) at (3,0) size 10x9
-                        RenderBlock (anonymous) at (0,0) size 9x9
-                          RenderText at (0,-4) size 9x17
-                            text run at (0,-4) width 9: "+"
-                    RenderMathMLToken {mn} at (24,0) size 9x12
-                      RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
-                        RenderBlock (anonymous) at (0,0) size 8x12
-                          RenderText {#text} at (0,-1) size 8x17
-                            text run at (0,-1) width 8: "1"
-                RenderMathMLBlock (anonymous, flex) at (0,15) size 33x17 [padding: 1 0 0 0]
-                  RenderMathMLRow {mrow} at (0,4) size 33x13
-                    RenderMathMLToken {mi} at (0,3) size 9x9 [padding: 0 2 0 0]
-                      RenderMathMLBlock (anonymous, flex) at (0,0) size 8x9
-                        RenderBlock (anonymous) at (0,0) size 8x9
-                          RenderText {#text} at (0,-4) size 8x17
-                            text run at (0,-4) width 8: "x"
-                    RenderMathMLOperator {mo} at (8,3) size 17x9
-                      RenderMathMLBlock (anonymous, flex) at (3,0) size 10x9
-                        RenderBlock (anonymous) at (0,0) size 9x9
-                          RenderText at (0,-4) size 9x17
-                            text run at (0,-4) width 9: "+"
-                    RenderMathMLToken {mn} at (24,0) size 9x12
-                      RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
-                        RenderBlock (anonymous) at (0,0) size 8x12
-                          RenderText {#text} at (0,-1) size 8x17
-                            text run at (0,-1) width 8: "2"
-      RenderBlock {p} at (0,290) size 784x37
-        RenderText {#text} at (0,17) size 77x19
-          text run at (0,17) width 77: "high index: "
-        RenderMathMLMath {math} at (76,0) size 27x36 [padding: 0 1 0 1]
-          RenderMathMLRoot {mroot} at (1,0) size 25x36
-            RenderMathMLRootWrapper at (4,0) size 10x36
-              RenderMathMLFraction {mfrac} at (1,0) size 7x26
-                RenderMathMLBlock (anonymous, flex) at (0,0) size 7x18
-                  RenderMathMLFraction {mfrac} at (1,0) size 5x16
-                    RenderMathMLBlock (anonymous, flex) at (0,0) size 5x7
-                      RenderMathMLToken {mi} at (0,0) size 5x5 [padding: 0 1 0 0]
-                        RenderMathMLBlock (anonymous, flex) at (0,0) size 4x5
-                          RenderBlock (anonymous) at (0,0) size 4x5
-                            RenderText {#text} at (0,-3) size 4x10
-                              text run at (0,-3) width 4: "x"
-                    RenderMathMLBlock (anonymous, flex) at (0,6) size 5x10 [padding: 1 0 0 0]
-                      RenderMathMLToken {mi} at (0,2) size 5x7 [padding: 0 1 0 0]
-                        RenderMathMLBlock (anonymous, flex) at (0,0) size 4x6
-                          RenderBlock (anonymous) at (0,0) size 4x6
-                            RenderText {#text} at (0,-3) size 4x10
-                              text run at (0,-3) width 4: "y"
-                RenderMathMLBlock (anonymous, flex) at (0,17) size 7x9 [padding: 1 0 0 0]
-                  RenderMathMLToken {mi} at (1,2) size 5x6 [padding: 0 1 0 0]
+            RenderMathMLRootWrapper at (39,3) size 34x35
+              RenderMathMLFraction {mfrac} at (0,0) size 33x32
+                RenderMathMLRow {mrow} at (0,0) size 33x12
+                  RenderMathMLToken {mi} at (0,3) size 9x9 [padding: 0 2 0 0]
+                    RenderMathMLBlock (anonymous, flex) at (0,0) size 8x9
+                      RenderBlock (anonymous) at (0,0) size 8x9
+                        RenderText {#text} at (0,-4) size 8x17
+                          text run at (0,-4) width 8: "x"
+                  RenderMathMLOperator {mo} at (8,3) size 17x9
+                    RenderMathMLBlock (anonymous, flex) at (3,0) size 10x9
+                      RenderBlock (anonymous) at (0,0) size 9x9
+                        RenderText at (0,-4) size 9x17
+                          text run at (0,-4) width 9: "+"
+                  RenderMathMLToken {mn} at (24,0) size 9x12
+                    RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
+                      RenderBlock (anonymous) at (0,0) size 8x12
+                        RenderText {#text} at (0,-1) size 8x17
+                          text run at (0,-1) width 8: "1"
+                RenderMathMLRow {mrow} at (0,19) size 33x13
+                  RenderMathMLToken {mi} at (0,3) size 9x9 [padding: 0 2 0 0]
+                    RenderMathMLBlock (anonymous, flex) at (0,0) size 8x9
+                      RenderBlock (anonymous) at (0,0) size 8x9
+                        RenderText {#text} at (0,-4) size 8x17
+                          text run at (0,-4) width 8: "x"
+                  RenderMathMLOperator {mo} at (8,3) size 17x9
+                    RenderMathMLBlock (anonymous, flex) at (3,0) size 10x9
+                      RenderBlock (anonymous) at (0,0) size 9x9
+                        RenderText at (0,-4) size 9x17
+                          text run at (0,-4) width 9: "+"
+                  RenderMathMLToken {mn} at (24,0) size 9x12
+                    RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
+                      RenderBlock (anonymous) at (0,0) size 8x12
+                        RenderText {#text} at (0,-1) size 8x17
+                          text run at (0,-1) width 8: "2"
+      RenderBlock {p} at (0,290) size 784x36
+        RenderText {#text} at (0,16) size 77x19
+          text run at (0,16) width 77: "high index: "
+        RenderMathMLMath {math} at (76,0) size 23x35 [padding: 0 1 0 1]
+          RenderMathMLRoot {mroot} at (1,0) size 21x35
+            RenderMathMLRootWrapper at (4,0) size 6x35
+              RenderMathMLFraction {mfrac} at (0,0) size 5x25
+                RenderMathMLFraction {mfrac} at (0,0) size 5x16
+                  RenderMathMLToken {mi} at (0,0) size 5x5 [padding: 0 1 0 0]
                     RenderMathMLBlock (anonymous, flex) at (0,0) size 4x5
                       RenderBlock (anonymous) at (0,0) size 4x5
                         RenderText {#text} at (0,-3) size 4x10
-                          text run at (0,-3) width 4: "z"
-            RenderMathMLBlock (anonymous, flex) at (4,0) size 13x36
-              RenderMathMLRadicalOperator (anonymous) at (0,18) size 12x18
+                          text run at (0,-3) width 4: "x"
+                  RenderMathMLToken {mi} at (0,9) size 5x7 [padding: 0 1 0 0]
+                    RenderMathMLBlock (anonymous, flex) at (0,0) size 4x6
+                      RenderBlock (anonymous) at (0,0) size 4x6
+                        RenderText {#text} at (0,-3) size 4x10
+                          text run at (0,-3) width 4: "y"
+                RenderMathMLToken {mi} at (0,19) size 5x6 [padding: 0 1 0 0]
+                  RenderMathMLBlock (anonymous, flex) at (0,0) size 4x5
+                    RenderBlock (anonymous) at (0,0) size 4x5
+                      RenderText {#text} at (0,-3) size 4x10
+                        text run at (0,-3) width 4: "z"
+            RenderMathMLBlock (anonymous, flex) at (0,0) size 13x35
+              RenderMathMLRadicalOperator (anonymous) at (0,17) size 12x18
                 RenderMathMLBlock (anonymous, flex) at (0,0) size 9x18
                   RenderBlock (anonymous) at (0,0) size 9x18
                     RenderText at (0,1) size 9x17
                       text run at (0,1) width 9: "\x{221A}"
-            RenderMathMLRootWrapper at (16,21) size 9x15
+            RenderMathMLRootWrapper at (12,20) size 9x15
               RenderMathMLToken {mn} at (0,0) size 8x12
                 RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
                   RenderBlock (anonymous) at (0,0) size 8x12
                     RenderText {#text} at (0,-1) size 8x17
                       text run at (0,-1) width 8: "2"
-      RenderBlock {p} at (0,343) size 784x59
+      RenderBlock {p} at (0,342) size 784x59
         RenderText {#text} at (0,28) size 160x19
           text run at (0,28) width 160: "Imbricated square roots: "
         RenderMathMLMath {math} at (159,0) size 277x60 [padding: 0 1 0 1]
@@ -460,11 +452,11 @@ layer at (0,0) size 800x518
                                                             RenderText {#text} at (0,-1) size 10x17
                                                               text run at (0,-1) width 10: "A"
         RenderText {#text} at (0,0) size 0x0
-      RenderBlock {p} at (0,418) size 784x68
-        RenderText {#text} at (0,37) size 114x19
-          text run at (0,37) width 114: "Imbricated roots: "
-        RenderMathMLMath {math} at (113,0) size 294x69 [padding: 0 1 0 1]
-          RenderMathMLRoot {mroot} at (1,0) size 292x69
+      RenderBlock {p} at (0,417) size 784x68
+        RenderText {#text} at (0,36) size 114x19
+          text run at (0,36) width 114: "Imbricated roots: "
+        RenderMathMLMath {math} at (113,0) size 292x69 [padding: 0 1 0 1]
+          RenderMathMLRoot {mroot} at (1,0) size 290x69
             RenderMathMLRootWrapper at (4,19) size 5x50
               RenderMathMLToken {mn} at (0,0) size 5x8
                 RenderMathMLBlock (anonymous, flex) at (0,0) size 5x8
@@ -477,19 +469,19 @@ layer at (0,0) size 800x518
                   RenderBlock (anonymous) at (0,0) size 9x68
                     RenderText at (0,1) size 9x17
                       text run at (0,1) width 9: "\x{221A}"
-            RenderMathMLRootWrapper at (12,3) size 280x66
-              RenderMathMLRow {mrow} at (0,0) size 280x63
-                RenderMathMLToken {mn} at (0,37) size 8x12
+            RenderMathMLRootWrapper at (12,3) size 278x66
+              RenderMathMLRow {mrow} at (0,0) size 278x63
+                RenderMathMLToken {mn} at (0,36) size 8x12
                   RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
                     RenderBlock (anonymous) at (0,0) size 8x12
                       RenderText {#text} at (0,-1) size 8x17
                         text run at (0,-1) width 8: "1"
-                RenderMathMLOperator {mo} at (8,40) size 16x9
+                RenderMathMLOperator {mo} at (8,39) size 16x9
                   RenderMathMLBlock (anonymous, flex) at (3,0) size 10x9
                     RenderBlock (anonymous) at (0,0) size 9x9
                       RenderText at (0,-4) size 9x17
                         text run at (0,-4) width 9: "+"
-                RenderMathMLRoot {mroot} at (23,0) size 257x63
+                RenderMathMLRoot {mroot} at (23,0) size 255x63
                   RenderMathMLRootWrapper at (4,17) size 5x46
                     RenderMathMLToken {mn} at (0,0) size 5x8
                       RenderMathMLBlock (anonymous, flex) at (0,0) size 5x8
@@ -498,24 +490,24 @@ layer at (0,0) size 800x518
                             text run at (0,0) width 5: "4"
                   RenderMathMLBlock (anonymous, flex) at (0,0) size 13x63
                     RenderMathMLRadicalOperator (anonymous) at (0,0) size 12x63
-                      RenderMathMLBlock (anonymous, flex) at (0,0) size 9x63
-                        RenderBlock (anonymous) at (0,0) size 9x63
+                      RenderMathMLBlock (anonymous, flex) at (0,0) size 9x62
+                        RenderBlock (anonymous) at (0,0) size 9x62
                           RenderText at (0,1) size 9x17
                             text run at (0,1) width 9: "\x{221A}"
-                  RenderMathMLRootWrapper at (12,3) size 244x60
-                    RenderMathMLRow {mrow} at (0,0) size 244x57
-                      RenderMathMLToken {mn} at (0,33) size 8x12
+                  RenderMathMLRootWrapper at (12,3) size 242x60
+                    RenderMathMLRow {mrow} at (0,0) size 242x57
+                      RenderMathMLToken {mn} at (0,32) size 8x12
                         RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
                           RenderBlock (anonymous) at (0,0) size 8x12
                             RenderText {#text} at (0,-1) size 8x17
                               text run at (0,-1) width 8: "2"
-                      RenderMathMLOperator {mo} at (8,36) size 16x9
+                      RenderMathMLOperator {mo} at (8,35) size 16x9
                         RenderMathMLBlock (anonymous, flex) at (3,0) size 10x9
                           RenderBlock (anonymous) at (0,0) size 9x9
                             RenderText at (0,-4) size 9x17
                               text run at (0,-4) width 9: "+"
-                      RenderMathMLRoot {mroot} at (23,0) size 221x57
-                        RenderMathMLRootWrapper at (4,15) size 5x42
+                      RenderMathMLRoot {mroot} at (23,0) size 219x57
+                        RenderMathMLRootWrapper at (4,14) size 5x43
                           RenderMathMLToken {mn} at (0,0) size 5x8
                             RenderMathMLBlock (anonymous, flex) at (0,0) size 5x8
                               RenderBlock (anonymous) at (0,0) size 5x8
@@ -523,23 +515,23 @@ layer at (0,0) size 800x518
                                   text run at (0,0) width 5: "5"
                         RenderMathMLBlock (anonymous, flex) at (0,0) size 13x57
                           RenderMathMLRadicalOperator (anonymous) at (0,0) size 12x57
-                            RenderMathMLBlock (anonymous, flex) at (0,0) size 9x57
-                              RenderBlock (anonymous) at (0,0) size 9x57
+                            RenderMathMLBlock (anonymous, flex) at (0,0) size 9x56
+                              RenderBlock (anonymous) at (0,0) size 9x56
                                 RenderText at (0,1) size 9x17
                                   text run at (0,1) width 9: "\x{221A}"
-                        RenderMathMLRootWrapper at (12,3) size 208x54
-                          RenderMathMLRow {mrow} at (0,0) size 208x51
-                            RenderMathMLToken {mn} at (0,29) size 8x12
+                        RenderMathMLRootWrapper at (12,3) size 206x54
+                          RenderMathMLRow {mrow} at (0,0) size 206x51
+                            RenderMathMLToken {mn} at (0,28) size 8x12
                               RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
                                 RenderBlock (anonymous) at (0,0) size 8x12
                                   RenderText {#text} at (0,-1) size 8x17
                                     text run at (0,-1) width 8: "3"
-                            RenderMathMLOperator {mo} at (8,32) size 16x9
+                            RenderMathMLOperator {mo} at (8,31) size 16x9
                               RenderMathMLBlock (anonymous, flex) at (3,0) size 10x9
                                 RenderBlock (anonymous) at (0,0) size 9x9
                                   RenderText at (0,-4) size 9x17
                                     text run at (0,-4) width 9: "+"
-                            RenderMathMLRoot {mroot} at (23,0) size 185x51
+                            RenderMathMLRoot {mroot} at (23,0) size 183x51
                               RenderMathMLRootWrapper at (4,12) size 5x39
                                 RenderMathMLToken {mn} at (0,0) size 5x8
                                   RenderMathMLBlock (anonymous, flex) at (0,0) size 5x8
@@ -548,23 +540,23 @@ layer at (0,0) size 800x518
                                         text run at (0,0) width 5: "6"
                               RenderMathMLBlock (anonymous, flex) at (0,0) size 13x51
                                 RenderMathMLRadicalOperator (anonymous) at (0,0) size 12x51
-                                  RenderMathMLBlock (anonymous, flex) at (0,0) size 9x51
-                                    RenderBlock (anonymous) at (0,0) size 9x51
+                                  RenderMathMLBlock (anonymous, flex) at (0,0) size 9x50
+                                    RenderBlock (anonymous) at (0,0) size 9x50
                                       RenderText at (0,1) size 9x17
                                         text run at (0,1) width 9: "\x{221A}"
-                              RenderMathMLRootWrapper at (12,3) size 172x48
-                                RenderMathMLRow {mrow} at (0,0) size 172x45
-                                  RenderMathMLToken {mn} at (0,25) size 8x12
+                              RenderMathMLRootWrapper at (12,3) size 170x48
+                                RenderMathMLRow {mrow} at (0,0) size 170x45
+                                  RenderMathMLToken {mn} at (0,24) size 8x12
                                     RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
                                       RenderBlock (anonymous) at (0,0) size 8x12
                                         RenderText {#text} at (0,-1) size 8x17
                                           text run at (0,-1) width 8: "4"
-                                  RenderMathMLOperator {mo} at (8,28) size 16x9
+                                  RenderMathMLOperator {mo} at (8,27) size 16x9
                                     RenderMathMLBlock (anonymous, flex) at (3,0) size 10x9
                                       RenderBlock (anonymous) at (0,0) size 9x9
                                         RenderText at (0,-4) size 9x17
                                           text run at (0,-4) width 9: "+"
-                                  RenderMathMLRoot {mroot} at (23,0) size 149x45
+                                  RenderMathMLRoot {mroot} at (23,0) size 147x45
                                     RenderMathMLRootWrapper at (4,11) size 5x34
                                       RenderMathMLToken {mn} at (0,0) size 5x7
                                         RenderMathMLBlock (anonymous, flex) at (0,0) size 5x7
@@ -573,24 +565,24 @@ layer at (0,0) size 800x518
                                               text run at (0,-1) width 5: "7"
                                     RenderMathMLBlock (anonymous, flex) at (0,0) size 13x45
                                       RenderMathMLRadicalOperator (anonymous) at (0,0) size 12x45
-                                        RenderMathMLBlock (anonymous, flex) at (0,0) size 9x45
-                                          RenderBlock (anonymous) at (0,0) size 9x45
+                                        RenderMathMLBlock (anonymous, flex) at (0,0) size 9x44
+                                          RenderBlock (anonymous) at (0,0) size 9x44
                                             RenderText at (0,1) size 9x17
                                               text run at (0,1) width 9: "\x{221A}"
-                                    RenderMathMLRootWrapper at (12,3) size 136x42
-                                      RenderMathMLRow {mrow} at (0,0) size 136x39
-                                        RenderMathMLToken {mn} at (0,21) size 8x12
+                                    RenderMathMLRootWrapper at (12,3) size 134x42
+                                      RenderMathMLRow {mrow} at (0,0) size 134x39
+                                        RenderMathMLToken {mn} at (0,20) size 8x12
                                           RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
                                             RenderBlock (anonymous) at (0,0) size 8x12
                                               RenderText {#text} at (0,-1) size 8x17
                                                 text run at (0,-1) width 8: "5"
-                                        RenderMathMLOperator {mo} at (8,24) size 16x9
+                                        RenderMathMLOperator {mo} at (8,23) size 16x9
                                           RenderMathMLBlock (anonymous, flex) at (3,0) size 10x9
                                             RenderBlock (anonymous) at (0,0) size 9x9
                                               RenderText at (0,-4) size 9x17
                                                 text run at (0,-4) width 9: "+"
-                                        RenderMathMLRoot {mroot} at (23,0) size 113x39
-                                          RenderMathMLRootWrapper at (4,8) size 5x31
+                                        RenderMathMLRoot {mroot} at (23,0) size 111x39
+                                          RenderMathMLRootWrapper at (4,7) size 5x32
                                             RenderMathMLToken {mn} at (0,0) size 5x8
                                               RenderMathMLBlock (anonymous, flex) at (0,0) size 5x8
                                                 RenderBlock (anonymous) at (0,0) size 5x8
@@ -598,23 +590,23 @@ layer at (0,0) size 800x518
                                                     text run at (0,0) width 5: "8"
                                           RenderMathMLBlock (anonymous, flex) at (0,0) size 13x39
                                             RenderMathMLRadicalOperator (anonymous) at (0,0) size 12x39
-                                              RenderMathMLBlock (anonymous, flex) at (0,0) size 9x39
-                                                RenderBlock (anonymous) at (0,0) size 9x39
+                                              RenderMathMLBlock (anonymous, flex) at (0,0) size 9x38
+                                                RenderBlock (anonymous) at (0,0) size 9x38
                                                   RenderText at (0,1) size 9x17
                                                     text run at (0,1) width 9: "\x{221A}"
-                                          RenderMathMLRootWrapper at (12,3) size 100x36
-                                            RenderMathMLRow {mrow} at (0,0) size 100x33
-                                              RenderMathMLToken {mn} at (0,17) size 8x12
+                                          RenderMathMLRootWrapper at (12,3) size 98x36
+                                            RenderMathMLRow {mrow} at (0,0) size 98x33
+                                              RenderMathMLToken {mn} at (0,16) size 8x12
                                                 RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
                                                   RenderBlock (anonymous) at (0,0) size 8x12
                                                     RenderText {#text} at (0,-1) size 8x17
                                                       text run at (0,-1) width 8: "6"
-                                              RenderMathMLOperator {mo} at (8,20) size 16x9
+                                              RenderMathMLOperator {mo} at (8,19) size 16x9
                                                 RenderMathMLBlock (anonymous, flex) at (3,0) size 10x9
                                                   RenderBlock (anonymous) at (0,0) size 9x9
                                                     RenderText at (0,-4) size 9x17
                                                       text run at (0,-4) width 9: "+"
-                                              RenderMathMLRoot {mroot} at (23,0) size 77x33
+                                              RenderMathMLRoot {mroot} at (23,0) size 75x33
                                                 RenderMathMLRootWrapper at (4,5) size 5x28
                                                   RenderMathMLToken {mn} at (0,0) size 5x8
                                                     RenderMathMLBlock (anonymous, flex) at (0,0) size 5x8
@@ -623,55 +615,53 @@ layer at (0,0) size 800x518
                                                           text run at (0,0) width 5: "9"
                                                 RenderMathMLBlock (anonymous, flex) at (0,0) size 13x33
                                                   RenderMathMLRadicalOperator (anonymous) at (0,0) size 12x33
-                                                    RenderMathMLBlock (anonymous, flex) at (0,0) size 9x33
-                                                      RenderBlock (anonymous) at (0,0) size 9x33
+                                                    RenderMathMLBlock (anonymous, flex) at (0,0) size 9x32
+                                                      RenderBlock (anonymous) at (0,0) size 9x32
                                                         RenderText at (0,1) size 9x17
                                                           text run at (0,1) width 9: "\x{221A}"
-                                                RenderMathMLRootWrapper at (12,3) size 64x30
-                                                  RenderMathMLRow {mrow} at (0,0) size 64x27
-                                                    RenderMathMLToken {mn} at (0,13) size 8x12
+                                                RenderMathMLRootWrapper at (12,3) size 62x30
+                                                  RenderMathMLRow {mrow} at (0,0) size 62x27
+                                                    RenderMathMLToken {mn} at (0,12) size 8x12
                                                       RenderMathMLBlock (anonymous, flex) at (0,0) size 8x12
                                                         RenderBlock (anonymous) at (0,0) size 8x12
                                                           RenderText {#text} at (0,-1) size 8x17
                                                             text run at (0,-1) width 8: "7"
-                                                    RenderMathMLOperator {mo} at (8,16) size 16x9
+                                                    RenderMathMLOperator {mo} at (8,15) size 16x9
                                                       RenderMathMLBlock (anonymous, flex) at (3,0) size 10x9
                                                         RenderBlock (anonymous) at (0,0) size 9x9
                                                           RenderText at (0,-4) size 9x17
                                                             text run at (0,-4) width 9: "+"
-                                                    RenderMathMLRoot {mroot} at (23,0) size 41x27
-                                                      RenderMathMLRootWrapper at (4,0) size 22x27
-                                                        RenderMathMLFraction {mfrac} at (1,0) size 19x17
-                                                          RenderMathMLBlock (anonymous, flex) at (0,0) size 19x9
-                                                            RenderMathMLRow {mrow} at (0,0) size 19x7
-                                                              RenderMathMLToken {mi} at (0,1) size 5x5 [padding: 0 1 0 0]
-                                                                RenderMathMLBlock (anonymous, flex) at (0,0) size 4x5
-                                                                  RenderBlock (anonymous) at (0,0) size 4x5
-                                                                    RenderText {#text} at (0,-3) size 4x10
-                                                                      text run at (0,-3) width 4: "x"
-                                                              RenderMathMLOperator {mo} at (4,0) size 10x6
-                                                                RenderMathMLBlock (anonymous, flex) at (2,0) size 5x6
-                                                                  RenderBlock (anonymous) at (0,0) size 5x6
-                                                                    RenderText at (0,-2) size 5x10
-                                                                      text run at (0,-2) width 5: "+"
-                                                              RenderMathMLToken {mi} at (13,1) size 6x6 [padding: 0 1 0 0]
-                                                                RenderMathMLBlock (anonymous, flex) at (0,0) size 4x6
-                                                                  RenderBlock (anonymous) at (0,0) size 4x6
-                                                                    RenderText {#text} at (0,-3) size 4x10
-                                                                      text run at (0,-3) width 4: "y"
-                                                          RenderMathMLBlock (anonymous, flex) at (0,8) size 19x9 [padding: 1 0 0 0]
-                                                            RenderMathMLToken {mi} at (7,2) size 5x6 [padding: 0 1 0 0]
+                                                    RenderMathMLRoot {mroot} at (23,0) size 39x27
+                                                      RenderMathMLRootWrapper at (4,0) size 20x27
+                                                        RenderMathMLFraction {mfrac} at (0,0) size 19x17
+                                                          RenderMathMLRow {mrow} at (0,0) size 19x7
+                                                            RenderMathMLToken {mi} at (0,1) size 5x5 [padding: 0 1 0 0]
                                                               RenderMathMLBlock (anonymous, flex) at (0,0) size 4x5
                                                                 RenderBlock (anonymous) at (0,0) size 4x5
                                                                   RenderText {#text} at (0,-3) size 4x10
-                                                                    text run at (0,-3) width 4: "z"
-                                                      RenderMathMLBlock (anonymous, flex) at (16,0) size 13x27
+                                                                    text run at (0,-3) width 4: "x"
+                                                            RenderMathMLOperator {mo} at (4,0) size 10x6
+                                                              RenderMathMLBlock (anonymous, flex) at (2,0) size 5x6
+                                                                RenderBlock (anonymous) at (0,0) size 5x6
+                                                                  RenderText at (0,-2) size 5x10
+                                                                    text run at (0,-2) width 5: "+"
+                                                            RenderMathMLToken {mi} at (13,1) size 6x6 [padding: 0 1 0 0]
+                                                              RenderMathMLBlock (anonymous, flex) at (0,0) size 4x6
+                                                                RenderBlock (anonymous) at (0,0) size 4x6
+                                                                  RenderText {#text} at (0,-3) size 4x10
+                                                                    text run at (0,-3) width 4: "y"
+                                                          RenderMathMLToken {mi} at (7,11) size 5x6 [padding: 0 1 0 0]
+                                                            RenderMathMLBlock (anonymous, flex) at (0,0) size 4x5
+                                                              RenderBlock (anonymous) at (0,0) size 4x5
+                                                                RenderText {#text} at (0,-3) size 4x10
+                                                                  text run at (0,-3) width 4: "z"
+                                                      RenderMathMLBlock (anonymous, flex) at (14,0) size 13x27
                                                         RenderMathMLRadicalOperator (anonymous) at (0,9) size 12x18
                                                           RenderMathMLBlock (anonymous, flex) at (0,0) size 9x18
                                                             RenderBlock (anonymous) at (0,0) size 9x18
                                                               RenderText at (0,1) size 9x17
                                                                 text run at (0,1) width 9: "\x{221A}"
-                                                      RenderMathMLRootWrapper at (28,12) size 12x15
+                                                      RenderMathMLRootWrapper at (26,12) size 12x15
                                                         RenderMathMLToken {mi} at (0,0) size 12x12 [padding: 0 2 0 0]
                                                           RenderMathMLBlock (anonymous, flex) at (0,0) size 10x12
                                                             RenderBlock (anonymous) at (0,0) size 10x12
index 81307ce..a9ed945 100644 (file)
@@ -787,6 +787,10 @@ webkit.org/b/130693 mathml/presentation/tokenElements-background-color.html [ Im
 webkit.org/b/72828 mathml/opentype/horizontal.html [ Failure ]
 webkit.org/b/72828 mathml/opentype/horizontal-munderover.html [ Failure ]
 
+# These tests require the Latin Modern Math font.
+mathml/opentype/fraction-line.html [ Pass ImageOnlyFailure ]
+mathml/presentation/fractions-linethickness.html [ Pass ImageOnlyFailure ]
+
 # Missing references
 webkit.org/b/119038 mathml/presentation/mo-stretch.html [ Failure ]
 webkit.org/b/119038 mathml/presentation/roots.xhtml [ Failure ]
index 1a3095e..66736d7 100644 (file)
@@ -1,3 +1,73 @@
+2016-04-11  Frederic Wang  <fwang@igalia.com>
+
+        Refactor RenderMathMLFraction layout to avoid using flexbox
+        https://bugs.webkit.org/show_bug.cgi?id=153917
+
+        Reviewed by Sergio Villar Senin.
+
+        Based on a patch by Alejandro G. Castro <alex@igalia.com>
+
+        Implement the layoutBlock method to handle the layout calculations
+        directly in the class. This also fixes parsing of absolute values for
+        linethickness attribute (e.g. 10px) and adds support for the AxisHeight
+        and FractionRuleThickness MATH parameters.
+
+        Test: mathml/opentype/fraction-line.html
+
+        * accessibility/AccessibilityRenderObject.cpp:
+        (WebCore::AccessibilityRenderObject::mathLineThickness): Use the thickness relative to the
+        default line thickness since that's really what is expected by mathml-line-fraction.html
+        * css/mathml.css: Remove flexbox properties for mfrac.
+        (mfrac): Deleted.
+        (mfrac > *): Deleted.
+        (mfrac[numalign="left"] > :first-child): Deleted.
+        (mfrac[numalign="right"] > :first-child): Deleted.
+        (mfrac[denomalign="left"] > :last-child): Deleted.
+        (mfrac[denomalign="right"] > :last-child): Deleted.
+        (mfrac > :first-child): Deleted.
+        (mfrac > :last-child): Deleted.
+        (mfrac): Deleted.
+        * rendering/mathml/RenderMathMLBlock.cpp: Introduce a helper function to retrieve the math
+        axis height.
+        (WebCore::RenderMathMLBlock::mathAxisHeight):
+        * rendering/mathml/RenderMathMLBlock.h: Declare mathAxisHeight.
+        * rendering/mathml/RenderMathMLFraction.cpp:
+        (WebCore::RenderMathMLFraction::RenderMathMLFraction):
+        (WebCore::RenderMathMLFraction::parseAlignmentAttribute): Helper function to parse the align
+        attribute.
+        (WebCore::RenderMathMLFraction::isValid): Helper function to verify whether the child list
+        is valid with respect to the MathML specificitation.
+        (WebCore::RenderMathMLFraction::numerator): Helper function to retrieve the numerator.
+        (WebCore::RenderMathMLFraction::denominator): Helper function to retrieve the denominator.
+        (WebCore::RenderMathMLFraction::updateFromElement): Use the FractionRuleThickness parameter
+        when avaiable to calculate the default linethickness.
+        Fix computation of linethickness for absolute values (e.g. 10px), the default linethickness
+        must not be involved for such values.
+        We no longer need to manage style of anonymous wrappers.
+        (WebCore::RenderMathMLFraction::unembellishedOperator): Use the helper function and we no
+        longer care about anonymous wrappers.
+        (WebCore::RenderMathMLFraction::computePreferredLogicalWidths): Implement this function
+        without using flexbox.
+        (WebCore::RenderMathMLFraction::horizontalOffset): Helper function to get the horizontal
+        offsets of children depending of the alignment.
+        (WebCore::RenderMathMLFraction::layoutBlock): Implement this function without using flexbox.
+        (WebCore::RenderMathMLFraction::paint): Do not paint if the fraction is invalid. Use helper
+        function. Use the width of the renderer (instead of the one of the denominator) as the
+        length of the fraction bar.
+        (WebCore::RenderMathMLFraction::firstLineBaseline): Use the helper functions to get children
+        and axis height.
+        (WebCore::RenderMathMLFraction::paintChildren): Temporary function to remove in a
+        follow-up patch.
+        (WebCore::RenderMathMLFraction::fixChildStyle): Deleted. We no longer need to manage style
+        of anonymous wrappers.
+        (WebCore::RenderMathMLFraction::addChild): Deleted. We no longer need to manage
+        anonymous wrappers.
+        (WebCore::RenderMathMLFraction::styleDidChange): We no longer need to manage style of
+        anonymous wrappers.
+        (WebCore::RenderMathMLFraction::layout): Deleted.
+        * rendering/mathml/RenderMathMLFraction.h: Replace lineThickness with relativeLineThickness,
+        as needed by the accessibility code. Update function and members declarations.
+
 2016-04-11  Commit Queue  <commit-queue@webkit.org>
 
         Unreviewed, rolling out r199290.
index e51578d..29f4be5 100644 (file)
@@ -3997,7 +3997,7 @@ int AccessibilityRenderObject::mathLineThickness() const
     if (!is<RenderMathMLFraction>(m_renderer))
         return -1;
     
-    return downcast<RenderMathMLFraction>(*m_renderer).lineThickness();
+    return downcast<RenderMathMLFraction>(*m_renderer).relativeLineThickness();
 }
 
 #endif
index c3038b6..2fb70b1 100644 (file)
@@ -44,36 +44,10 @@ ms, mtext, mi, mn, mo, annotation, mtd {
     white-space: nowrap !important;
 }
 
-mo, mfrac {
+mo {
     flex-direction: column;
 }
 
-mfrac > * {
-    align-self: center;
-}
-mfrac[numalign="left"] > :first-child {
-    align-self: flex-start;
-}
-mfrac[numalign="right"] > :first-child {
-    align-self: flex-end;
-}
-mfrac[denomalign="left"] > :last-child {
-    align-self: flex-start;
-}
-mfrac[denomalign="right"] > :last-child {
-    align-self: flex-end;
-}
-mfrac > :first-child {
-    -webkit-margin-after: 0.2em;
-}
-mfrac > :last-child {
-    -webkit-margin-before: 0.2em;
-}
-mfrac {
-    -webkit-margin-start: 1px;
-    -webkit-margin-end: 1px;
-}
-
 msub > * + *, msup > * + *, msubsup > * + *, mmultiscripts > * + *, munder > * + *, mover > * + *, munderover > * + * {
     font-size: 0.75em; /* FIXME: MathML standard is 0.71em */
 }
index 1f426b8..e375c9a 100644 (file)
@@ -65,6 +65,15 @@ RenderPtr<RenderMathMLBlock> RenderMathMLBlock::createAnonymousMathMLBlock()
     return newBlock;
 }
 
+LayoutUnit RenderMathMLBlock::mathAxisHeight() const
+{
+    const auto& primaryFont = style().fontCascade().primaryFont();
+    if (auto* mathData = primaryFont.mathData())
+        return mathData->getMathConstant(primaryFont, OpenTypeMathData::AxisHeight);
+
+    return style().fontMetrics().xHeight() / 2;
+}
+
 int RenderMathMLBlock::baselinePosition(FontBaseline baselineType, bool firstLine, LineDirectionMode direction, LinePositionMode linePositionMode) const
 {
     // mathml.css sets math { -webkit-line-box-contain: glyphs replaced; line-height: 0; }, so when linePositionMode == PositionOfInteriorLineBoxes we want to
index 550704c..1f2e8a3 100644 (file)
@@ -63,6 +63,8 @@ public:
     
     // Create a new RenderMathMLBlock, with a new style inheriting from this->style().
     RenderPtr<RenderMathMLBlock> createAnonymousMathMLBlock();
+
+    LayoutUnit mathAxisHeight() const;
     
 protected:
     static LayoutUnit ascentForChild(const RenderBox& child)
index 40d1300..ab83260 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2009 Alex Milowski (alex@milowski.com). All rights reserved.
  * Copyright (C) 2010 Fran├žois Sausset (sausset@gmail.com). All rights reserved.
+ * Copyright (C) 2016 Igalia S.L.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -38,133 +39,202 @@ namespace WebCore {
     
 using namespace MathMLNames;
 
+// FIXME: The "MathML in HTML5" implementation note suggests the values 50% for "thin" and 200% for "thick" (http://webkit.org/b/155639).
 static const float gLineThin = 0.33f;
 static const float gLineMedium = 1.f;
 static const float gLineThick = 3.f;
 static const float gFractionBarWidth = 0.05f;
 
+// FIXME: We should read the gaps and shifts from the MATH table (http://webkit.org/b/155639).
+static const float gNumeratorGap = 0.2f;
+static const float gDenominatorGap = 0.2f;
+
 RenderMathMLFraction::RenderMathMLFraction(MathMLInlineContainerElement& element, Ref<RenderStyle>&& style)
     : RenderMathMLBlock(element, WTFMove(style))
-    , m_lineThickness(gLineMedium)
+    , m_defaultLineThickness(1)
+    , m_lineThickness(0)
+    , m_numeratorAlign(FractionAlignmentCenter)
+    , m_denominatorAlign(FractionAlignmentCenter)
+{
+}
+
+RenderMathMLFraction::FractionAlignment RenderMathMLFraction::parseAlignmentAttribute(const String& value)
+{
+    if (equalLettersIgnoringASCIICase(value, "left"))
+        return FractionAlignmentLeft;
+    if (equalLettersIgnoringASCIICase(value, "right"))
+        return FractionAlignmentRight;
+    return FractionAlignmentCenter;
+}
+
+bool RenderMathMLFraction::isValid() const
 {
+    // Verify whether the list of children is valid:
+    // <mfrac> numerator denominator </mfrac>
+    RenderBox* child = firstChildBox();
+    if (!child)
+        return false;
+    child = child->nextSiblingBox();
+    return child && !child->nextSiblingBox();
 }
 
-void RenderMathMLFraction::fixChildStyle(RenderObject* child)
+RenderBox& RenderMathMLFraction::numerator() const
 {
-    ASSERT(child->isAnonymous() && child->style().refCount() == 1);
-    child->style().setFlexDirection(FlowColumn);
+    ASSERT(isValid());
+    return *firstChildBox();
+}
+
+RenderBox& RenderMathMLFraction::denominator() const
+{
+    ASSERT(isValid());
+    return *firstChildBox()->nextSiblingBox();
 }
 
-// FIXME: It's cleaner to only call updateFromElement when an attribute has changed. Move parts
-// of this to fixChildStyle or other methods, and call them when needed.
 void RenderMathMLFraction::updateFromElement()
 {
-    // FIXME: mfrac where bevelled=true will need to reorganize the descendants
-    if (isEmpty()) 
+    if (isEmpty())
         return;
 
-    RenderObject* numeratorWrapper = firstChild();
-    RenderObject* denominatorWrapper = numeratorWrapper->nextSibling();
-    if (!denominatorWrapper)
-        return;
+    // We first determine the default line thickness.
+    const auto& primaryFont = style().fontCascade().primaryFont();
+    if (auto* mathData = style().fontCascade().primaryFont().mathData())
+        m_defaultLineThickness = mathData->getMathConstant(primaryFont, OpenTypeMathData::FractionRuleThickness);
+    else
+        m_defaultLineThickness = gFractionBarWidth * style().fontSize();
 
+    // Next, we parse the linethickness attribute.
     String thickness = element().getAttribute(MathMLNames::linethicknessAttr);
-    m_lineThickness = gLineMedium;
     if (equalLettersIgnoringASCIICase(thickness, "thin"))
-        m_lineThickness = gLineThin;
+        m_lineThickness = m_defaultLineThickness * gLineThin;
     else if (equalLettersIgnoringASCIICase(thickness, "medium"))
-        m_lineThickness = gLineMedium;
+        m_lineThickness = m_defaultLineThickness * gLineMedium;
     else if (equalLettersIgnoringASCIICase(thickness, "thick"))
-        m_lineThickness = gLineThick;
+        m_lineThickness = m_defaultLineThickness * gLineThick;
     else {
-        // This function parses the thickness attribute using gLineMedium as
-        // the default value. If the parsing fails, m_lineThickness will not be
-        // modified i.e. the default value will be used.
+        // Parse the thickness using m_defaultLineThickness as the default value.
+        m_lineThickness = m_defaultLineThickness;
         parseMathMLLength(thickness, m_lineThickness, &style(), false);
     }
 
-    // Update the style for the padding of the denominator for the line thickness
-    lastChild()->style().setPaddingTop(Length(static_cast<int>(m_lineThickness), Fixed));
-}
-
-void RenderMathMLFraction::addChild(RenderObject* child, RenderObject* /* beforeChild */)
-{
-    if (isEmpty()) {
-        RenderPtr<RenderMathMLBlock> numeratorWrapper = createAnonymousMathMLBlock();
-        fixChildStyle(numeratorWrapper.get());
-        RenderMathMLBlock::addChild(numeratorWrapper.leakPtr());
-        
-        RenderPtr<RenderMathMLBlock> denominatorWrapper = createAnonymousMathMLBlock();
-        fixChildStyle(denominatorWrapper.get());
-        RenderMathMLBlock::addChild(denominatorWrapper.leakPtr());
-    }
-    
-    if (firstChild()->isEmpty())
-        downcast<RenderElement>(*firstChild()).addChild(child);
-    else
-        downcast<RenderElement>(*lastChild()).addChild(child);
-    
-    updateFromElement();
+    m_numeratorAlign = parseAlignmentAttribute(element().getAttribute(MathMLNames::numalignAttr));
+    m_denominatorAlign = parseAlignmentAttribute(element().getAttribute(MathMLNames::denomalignAttr));
 }
 
 void RenderMathMLFraction::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
 {
     RenderMathMLBlock::styleDidChange(diff, oldStyle);
     
-    for (RenderObject* child = firstChild(); child; child = child->nextSibling())
-        fixChildStyle(child);
     updateFromElement();
 }
 
 RenderMathMLOperator* RenderMathMLFraction::unembellishedOperator()
 {
-    RenderObject* numeratorWrapper = firstChild();
-    if (!numeratorWrapper)
-        return nullptr;
-    RenderObject* numerator = numeratorWrapper->firstChildSlow();
-    if (!is<RenderMathMLBlock>(numerator))
+    if (!isValid() || !is<RenderMathMLBlock>(numerator()))
         return nullptr;
-    return downcast<RenderMathMLBlock>(*numerator).unembellishedOperator();
+
+    return downcast<RenderMathMLBlock>(numerator()).unembellishedOperator();
 }
 
-void RenderMathMLFraction::layout()
+void RenderMathMLFraction::computePreferredLogicalWidths()
 {
+    ASSERT(preferredLogicalWidthsDirty());
+
+    m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = 0;
+
+    if (isValid()) {
+        LayoutUnit numeratorWidth = numerator().maxPreferredLogicalWidth();
+        LayoutUnit denominatorWidth = denominator().maxPreferredLogicalWidth();
+        m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = std::max(numeratorWidth, denominatorWidth);
+    }
+
+    setPreferredLogicalWidthsDirty(false);
+}
+
+LayoutUnit RenderMathMLFraction::horizontalOffset(RenderBox& child, FractionAlignment align)
+{
+    switch (align) {
+    case FractionAlignmentRight:
+        return LayoutUnit(logicalWidth() - child.logicalWidth());
+    case FractionAlignmentCenter:
+        return LayoutUnit((logicalWidth() - child.logicalWidth()) / 2);
+    case FractionAlignmentLeft:
+        return LayoutUnit(0);
+    }
+
+    ASSERT_NOT_REACHED();
+    return LayoutUnit(0);
+}
+
+void RenderMathMLFraction::layoutBlock(bool relayoutChildren, LayoutUnit)
+{
+    ASSERT(needsLayout());
+
+    // FIXME: We should be able to remove this.
     updateFromElement();
 
-    // Adjust the fraction line thickness for the zoom
-    if (lastChild() && lastChild()->isRenderBlock())
-        m_lineThickness *= ceilf(gFractionBarWidth * style().fontSize());
+    if (!relayoutChildren && simplifiedLayout())
+        return;
+
+    if (!isValid()) {
+        setLogicalWidth(0);
+        setLogicalHeight(0);
+        clearNeedsLayout();
+        return;
+    }
+
+    LayoutUnit verticalOffset = 0;
 
-    RenderMathMLBlock::layout();
+    numerator().layoutIfNeeded();
+    denominator().layoutIfNeeded();
+
+    setLogicalWidth(std::max<LayoutUnit>(numerator().logicalWidth(), denominator().logicalWidth()));
+
+    LayoutPoint numeratorLocation(horizontalOffset(numerator(), m_numeratorAlign), verticalOffset);
+    numerator().setLocation(numeratorLocation);
+
+    verticalOffset += numerator().logicalHeight() + gNumeratorGap * style().fontSize() + m_lineThickness + gDenominatorGap * style().fontSize();
+
+    LayoutPoint denominatorLocation(horizontalOffset(denominator(), m_denominatorAlign), verticalOffset);
+    denominator().setLocation(denominatorLocation);
+
+    setLogicalHeight(verticalOffset + denominator().logicalHeight());
+
+    clearNeedsLayout();
 }
 
 void RenderMathMLFraction::paint(PaintInfo& info, const LayoutPoint& paintOffset)
 {
     RenderMathMLBlock::paint(info, paintOffset);
-    if (info.context().paintingDisabled() || info.phase != PaintPhaseForeground || style().visibility() != VISIBLE)
-        return;
-    
-    RenderBox* denominatorWrapper = lastChildBox();
-    if (!denominatorWrapper || !m_lineThickness)
+    if (info.context().paintingDisabled() || info.phase != PaintPhaseForeground || style().visibility() != VISIBLE || !isValid())
         return;
 
-    IntPoint adjustedPaintOffset = roundedIntPoint(paintOffset + location() + denominatorWrapper->location() + LayoutPoint(0, m_lineThickness / 2));
+    IntPoint adjustedPaintOffset = roundedIntPoint(paintOffset + location() + LayoutPoint(0, numerator().logicalHeight() + gNumeratorGap * style().fontSize() + m_lineThickness / 2));
     
     GraphicsContextStateSaver stateSaver(info.context());
     
     info.context().setStrokeThickness(m_lineThickness);
     info.context().setStrokeStyle(SolidStroke);
     info.context().setStrokeColor(style().visitedDependentColor(CSSPropertyColor));
-    info.context().drawLine(adjustedPaintOffset, roundedIntPoint(LayoutPoint(adjustedPaintOffset.x() + denominatorWrapper->offsetWidth(), adjustedPaintOffset.y())));
+    info.context().drawLine(adjustedPaintOffset, roundedIntPoint(LayoutPoint(adjustedPaintOffset.x() + logicalWidth(), adjustedPaintOffset.y())));
 }
 
 Optional<int> RenderMathMLFraction::firstLineBaseline() const
 {
-    if (RenderBox* denominatorWrapper = lastChildBox())
-        return Optional<int>(denominatorWrapper->logicalTop() + static_cast<int>(lroundf((m_lineThickness + style().fontMetrics().xHeight()) / 2)));
+    if (isValid()) {
+        LayoutUnit axisHeight = mathAxisHeight();
+        return Optional<int>(numerator().logicalHeight() + gNumeratorGap * style().fontSize() + static_cast<int>(lroundf(m_lineThickness / 2 + axisHeight)));
+    }
     return RenderMathMLBlock::firstLineBaseline();
 }
 
+void RenderMathMLFraction::paintChildren(PaintInfo& paintInfo, const LayoutPoint& paintOffset, PaintInfo& paintInfoForChild, bool usePrintRect)
+{
+    for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) {
+        if (!paintChild(*child, paintInfo, paintOffset, paintInfoForChild, usePrintRect, PaintAsInlineBlock))
+            return;
+    }
+}
+
 }
 
 #endif // ENABLE(MATHML)
index 636bfc2..c63ca3b 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2009 Alex Milowski (alex@milowski.com). All rights reserved.
  * Copyright (C) 2010 Fran├žois Sausset (sausset@gmail.com). All rights reserved.
+ * Copyright (C) 2016 Igalia S.L.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -39,23 +40,39 @@ public:
     RenderMathMLFraction(MathMLInlineContainerElement&, Ref<RenderStyle>&&);
 
     MathMLInlineContainerElement& element() { return static_cast<MathMLInlineContainerElement&>(nodeForNonAnonymous()); }
-    float lineThickness() const { return m_lineThickness; }
+    float relativeLineThickness() const { return m_defaultLineThickness ? m_lineThickness / m_defaultLineThickness : LayoutUnit(0); }
 
-private:
-    bool isRenderMathMLFraction() const override { return true; }
-    const char* renderName() const override { return "RenderMathMLFraction"; }
+    void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) final;
+    void paintChildren(PaintInfo& forSelf, const LayoutPoint&, PaintInfo& forChild, bool usePrintRect) final;
+
+protected:
+    void computePreferredLogicalWidths() final;
 
-    void addChild(RenderObject* child, RenderObject* beforeChild) override;
-    void updateFromElement() override;
-    Optional<int> firstLineBaseline() const override;
-    void paint(PaintInfo&, const LayoutPoint&) override;
-    RenderMathMLOperator* unembellishedOperator() override;
-    void layout() override;
-    void styleDidChange(StyleDifference, const RenderStyle* oldStyle) override;
+private:
+    bool isRenderMathMLFraction() const final { return true; }
+    const char* renderName() const final { return "RenderMathMLFraction"; }
 
-    void fixChildStyle(RenderObject*);
+    void updateFromElement() final;
+    Optional<int> firstLineBaseline() const final;
+    void paint(PaintInfo&, const LayoutPoint&) final;
+    RenderMathMLOperator* unembellishedOperator() final;
+    void styleDidChange(StyleDifference, const RenderStyle* oldStyle) final;
     
+    bool isValid() const;
+    RenderBox& numerator() const;
+    RenderBox& denominator() const;
+    enum FractionAlignment {
+        FractionAlignmentCenter,
+        FractionAlignmentLeft,
+        FractionAlignmentRight
+    };
+    FractionAlignment parseAlignmentAttribute(const String& value);
+    LayoutUnit horizontalOffset(RenderBox&, FractionAlignment);
+
+    LayoutUnit m_defaultLineThickness;
     LayoutUnit m_lineThickness;
+    FractionAlignment m_numeratorAlign;
+    FractionAlignment m_denominatorAlign;
 };
 
 } // namespace WebCore