Refactor layout functions to avoid using flexbox in MathML
authorfred.wang@free.fr <fred.wang@free.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 7 Jul 2016 21:48:12 +0000 (21:48 +0000)
committerfred.wang@free.fr <fred.wang@free.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 7 Jul 2016 21:48:12 +0000 (21:48 +0000)
https://bugs.webkit.org/show_bug.cgi?id=153991

Patch by Frederic Wang <fwang@igalia.com> on 2016-07-07
Reviewed by Brent Fulgham.

Source/WebCore:

No new tests, already covered by existing tests.

* css/mathml.css:
(math): Change inline mathematical formulas from inline-flex to inline.
(math[display="block"]): Change display mathematical formulas from flex to block and
remove flexbox property justify-content.
(ms, mspace, mtext, mi, mn, mo, mrow, mfenced, mfrac, msub, msup, msubsup, mmultiscripts,
 mprescripts, none, munder, mover, munderover, msqrt, mroot, merror, mphantom, mstyle)
 menclose, semantics, mpadded, maction): In order to render properly, all children of the
 classes derived from RenderMathMLBlock must now be block-level. So we add more elements in
 this list and update the display property.
(mtd > *): However, we use inline-block for children of the cell so that the text-align
 property is taken into account.
* rendering/RenderBox.cpp:
(WebCore::RenderBox::computeLogicalWidthInRegion): Add a special case for RenderMathMLBlock
to preserve the old behavior.
(WebCore::RenderBox::sizesLogicalWidthToFitContent): Ditto.
* rendering/RenderFlexibleBox.h: No need to override layoutBlock anymore.
* rendering/mathml/RenderMathMLBlock.cpp: Include LayoutRepainter header for use in layoutBlock.
(WebCore::RenderMathMLBlock::RenderMathMLBlock): Inherit from RenderBlock and ensure that
our children are block-level.
(WebCore::RenderMathMLBlock::~RenderMathMLBlock): Added.
(WebCore::RenderMathMLBlock::baselinePosition): If the baselinefirstLineBaseline() is
undefined, just returns 0.
(WebCore::RenderMathMLBlock::paint): Call RenderBlock::paint.
(WebCore::RenderMathMLBlock::layoutItems): Implement a simplified version of
RenderFlexibleBox::layoutItems where we assume horizontal layout for all children.
(WebCore::RenderMathMLBlock::layoutBlock): Add a basic implementation based on
RenderFlexibleBox::layoutBlock.
(WebCore::RenderMathMLBlock::renderName): Deleted. There is now a simple implementation in the header.
* rendering/mathml/RenderMathMLBlock.h: Use RenderBlock instead of RenderFlexibleBox and
define layout functions. Define avoidsFloats and canDropAnonymousBlockChild to preserve
the old behavior and remove isFlexibleBoxImpl.
* rendering/mathml/RenderMathMLFenced.cpp:
(WebCore::RenderMathMLFenced::createMathMLOperator): Use block for anonymous RenderMathMLOperator.
* rendering/mathml/RenderMathMLRow.cpp:
(WebCore::RenderMathMLRow::layoutRowItems): No need to handle the flexbox case anymore.
(WebCore::RenderMathMLRow::paintChildren): Deleted. We now just use RenderBlock::paintChildren.
* rendering/mathml/RenderMathMLRow.h:
* rendering/mathml/RenderMathMLFraction.cpp:
(WebCore::RenderMathMLFraction::paintChildren): Deleted. We now just use RenderBlock::paintChildren.
* rendering/mathml/RenderMathMLFraction.h:
* rendering/mathml/RenderMathMLRoot.cpp:
(WebCore::RenderMathMLRoot::paintChildren): Deleted. We now just use RenderBlock::paintChildren.
* rendering/mathml/RenderMathMLRoot.h:
* rendering/mathml/RenderMathMLScripts.cpp:
(WebCore::RenderMathMLScripts::paintChildren): Deleted. We now just use RenderBlock::paintChildren.
* rendering/mathml/RenderMathMLScripts.h:
* rendering/mathml/RenderMathMLUnderOver.cpp:
(WebCore::RenderMathMLUnderOver::paintChildren): Deleted. We now just use RenderBlock::paintChildren.
* rendering/mathml/RenderMathMLUnderOver.h:

LayoutTests:

Update expectations of some MathML tests to take into account the
removal of some line breaks and a better computation of the width of
MathML expressions with vertical stretchy operators.

* mathml/presentation/stretchy-depth-height-expected.txt:
* platform/gtk/mathml/opentype/opentype-stretchy-expected.png:
* platform/gtk/mathml/opentype/opentype-stretchy-expected.txt:
* platform/gtk/mathml/opentype/vertical-expected.png:
* platform/gtk/mathml/opentype/vertical-expected.txt:
* platform/gtk/mathml/presentation/mo-stretch-expected.png:
* platform/gtk/mathml/presentation/mo-stretch-expected.txt:
* platform/gtk/mathml/presentation/roots-expected.png:
* platform/gtk/mathml/presentation/roots-expected.txt:
* platform/ios-simulator/mathml/opentype/opentype-stretchy-expected.png:
* platform/ios-simulator/mathml/opentype/opentype-stretchy-expected.txt:
* platform/ios-simulator/mathml/presentation/mo-stretch-expected.txt:
* platform/mac/mathml/opentype/opentype-stretchy-expected.png:
* platform/mac/mathml/opentype/opentype-stretchy-expected.txt:
* platform/mac/mathml/presentation/mo-stretch-expected.png:
* platform/mac/mathml/presentation/mo-stretch-expected.txt:
* accessibility/mac/mathml-elements-expected.txt:
* imported/blink/fast/text/output-isolate-at-end-of-line-crash-expected.txt:

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

36 files changed:
LayoutTests/ChangeLog
LayoutTests/accessibility/mac/mathml-elements-expected.txt
LayoutTests/imported/blink/fast/text/output-isolate-at-end-of-line-crash-expected.txt
LayoutTests/mathml/presentation/stretchy-depth-height-expected.txt
LayoutTests/platform/gtk/mathml/opentype/opentype-stretchy-expected.png
LayoutTests/platform/gtk/mathml/opentype/opentype-stretchy-expected.txt
LayoutTests/platform/gtk/mathml/opentype/vertical-expected.png
LayoutTests/platform/gtk/mathml/opentype/vertical-expected.txt
LayoutTests/platform/gtk/mathml/presentation/mo-stretch-expected.png
LayoutTests/platform/gtk/mathml/presentation/mo-stretch-expected.txt
LayoutTests/platform/gtk/mathml/presentation/roots-expected.png
LayoutTests/platform/gtk/mathml/presentation/roots-expected.txt
LayoutTests/platform/ios-simulator/mathml/opentype/opentype-stretchy-expected.png
LayoutTests/platform/ios-simulator/mathml/opentype/opentype-stretchy-expected.txt
LayoutTests/platform/ios-simulator/mathml/presentation/mo-stretch-expected.txt
LayoutTests/platform/mac/mathml/opentype/opentype-stretchy-expected.png
LayoutTests/platform/mac/mathml/opentype/opentype-stretchy-expected.txt
LayoutTests/platform/mac/mathml/presentation/mo-stretch-expected.png
LayoutTests/platform/mac/mathml/presentation/mo-stretch-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/css/mathml.css
Source/WebCore/rendering/RenderBox.cpp
Source/WebCore/rendering/RenderFlexibleBox.h
Source/WebCore/rendering/mathml/RenderMathMLBlock.cpp
Source/WebCore/rendering/mathml/RenderMathMLBlock.h
Source/WebCore/rendering/mathml/RenderMathMLFenced.cpp
Source/WebCore/rendering/mathml/RenderMathMLFraction.cpp
Source/WebCore/rendering/mathml/RenderMathMLFraction.h
Source/WebCore/rendering/mathml/RenderMathMLRoot.cpp
Source/WebCore/rendering/mathml/RenderMathMLRoot.h
Source/WebCore/rendering/mathml/RenderMathMLRow.cpp
Source/WebCore/rendering/mathml/RenderMathMLRow.h
Source/WebCore/rendering/mathml/RenderMathMLScripts.cpp
Source/WebCore/rendering/mathml/RenderMathMLScripts.h
Source/WebCore/rendering/mathml/RenderMathMLUnderOver.cpp
Source/WebCore/rendering/mathml/RenderMathMLUnderOver.h

index 1eae96b..ee87f74 100644 (file)
@@ -1,3 +1,33 @@
+2016-07-07  Frederic Wang  <fwang@igalia.com>
+
+        Refactor layout functions to avoid using flexbox in MathML
+        https://bugs.webkit.org/show_bug.cgi?id=153991
+
+        Reviewed by Brent Fulgham.
+
+        Update expectations of some MathML tests to take into account the
+        removal of some line breaks and a better computation of the width of
+        MathML expressions with vertical stretchy operators.
+
+        * mathml/presentation/stretchy-depth-height-expected.txt:
+        * platform/gtk/mathml/opentype/opentype-stretchy-expected.png:
+        * platform/gtk/mathml/opentype/opentype-stretchy-expected.txt:
+        * platform/gtk/mathml/opentype/vertical-expected.png:
+        * platform/gtk/mathml/opentype/vertical-expected.txt:
+        * platform/gtk/mathml/presentation/mo-stretch-expected.png:
+        * platform/gtk/mathml/presentation/mo-stretch-expected.txt:
+        * platform/gtk/mathml/presentation/roots-expected.png:
+        * platform/gtk/mathml/presentation/roots-expected.txt:
+        * platform/ios-simulator/mathml/opentype/opentype-stretchy-expected.png:
+        * platform/ios-simulator/mathml/opentype/opentype-stretchy-expected.txt:
+        * platform/ios-simulator/mathml/presentation/mo-stretch-expected.txt:
+        * platform/mac/mathml/opentype/opentype-stretchy-expected.png:
+        * platform/mac/mathml/opentype/opentype-stretchy-expected.txt:
+        * platform/mac/mathml/presentation/mo-stretch-expected.png:
+        * platform/mac/mathml/presentation/mo-stretch-expected.txt:
+        * accessibility/mac/mathml-elements-expected.txt:
+        * imported/blink/fast/text/output-isolate-at-end-of-line-crash-expected.txt:
+
 2016-07-07  Joseph Pecoraro  <pecoraro@apple.com>
 
         Web Inspector, regression: JS/JSON pretty-printing sporadically broken in STP8
index 25b0419..29aad5b 100644 (file)
@@ -33,9 +33,7 @@ over
 under
 over
 
-3
-2
-1
+3      2       1
 This tests ensures that Mac specific attributes and roles for MathML elements work as expected.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
index 36d8526..b01d7c2 100644 (file)
@@ -7,12 +7,7 @@ This test passes if the depth and height of braces match the maximum depth and h
 {
  
 {
-x      y       z
-x      y       z
-x      y       z
-x      y       z
-x      y       z
+x      y       z       x       y       z       x       y       z       x       y       z       x       y       z 
 {
 1
 2
index 0ff9d38..5f21599 100644 (file)
Binary files a/LayoutTests/platform/gtk/mathml/opentype/opentype-stretchy-expected.png and b/LayoutTests/platform/gtk/mathml/opentype/opentype-stretchy-expected.png differ
index 59e5d99..6ebaf76 100644 (file)
@@ -4,23 +4,23 @@ layer at (0,0) size 800x347
   RenderBlock {HTML} at (0,0) size 800x347
     RenderBody {BODY} at (8,16) size 784x315
       RenderBlock {P} at (0,0) size 784x34
-        RenderMathMLMath {math} at (0,20) size 49x11 [padding: 0 1 0 1]
+        RenderMathMLMath {math} at (0,20) size 28x11 [padding: 0 1 0 1]
           RenderMathMLRow {mrow} at (1,0) size 26x11
             RenderMathMLOperator {mo} at (0,0) size 26x11
               RenderBlock (anonymous) at (0,0) size 2x3
                 RenderText {#text} at (0,-3) size 2x0
                   text run at (0,-3) width 2: "\x{219F}"
-        RenderText {#text} at (48,17) size 5x17
-          text run at (48,17) width 5: " "
-        RenderMathMLMath {math} at (52,10) size 50x21 [padding: 0 1 0 1]
+        RenderText {#text} at (27,17) size 5x17
+          text run at (27,17) width 5: " "
+        RenderMathMLMath {math} at (31,10) size 29x21 [padding: 0 1 0 1]
           RenderMathMLRow {mrow} at (1,0) size 26x21
             RenderMathMLOperator {mo} at (0,0) size 26x21
               RenderBlock (anonymous) at (0,0) size 2x3
                 RenderText {#text} at (0,-3) size 2x0
                   text run at (0,-3) width 2: "\x{219F}"
-        RenderText {#text} at (101,17) size 5x17
-          text run at (101,17) width 5: " "
-        RenderMathMLMath {math} at (105,0) size 49x31 [padding: 0 1 0 1]
+        RenderText {#text} at (59,17) size 5x17
+          text run at (59,17) width 5: " "
+        RenderMathMLMath {math} at (63,0) size 28x31 [padding: 0 1 0 1]
           RenderMathMLRow {mrow} at (1,0) size 26x31
             RenderMathMLOperator {mo} at (0,0) size 26x31
               RenderBlock (anonymous) at (0,0) size 2x3
index cbede10..1cf7405 100644 (file)
Binary files a/LayoutTests/platform/gtk/mathml/opentype/vertical-expected.png and b/LayoutTests/platform/gtk/mathml/opentype/vertical-expected.png differ
index 034def7..4b0e6c4 100644 (file)
@@ -4,7 +4,7 @@ layer at (0,0) size 800x371
   RenderBlock {HTML} at (0,0) size 800x371
     RenderBody {BODY} at (8,16) size 784x339
       RenderBlock {P} at (0,0) size 784x18
-        RenderMathMLMath {math} at (0,2) size 194x16 [padding: 0 1 0 1]
+        RenderMathMLMath {math} at (0,2) size 100x16 [padding: 0 1 0 1]
           RenderMathMLOperator {mo} at (1,0) size 4x16
             RenderBlock (anonymous) at (0,0) size 4x16
               RenderText {#text} at (0,-45) size 4x106
@@ -68,7 +68,7 @@ layer at (0,0) size 800x371
           RenderMathMLSpace {mspace} at (98,4) size 0x8
         RenderText {#text} at (0,0) size 0x0
       RenderBlock {P} at (0,34) size 784x30
-        RenderMathMLMath {math} at (0,0) size 194x30 [padding: 0 1 0 1]
+        RenderMathMLMath {math} at (0,0) size 142x30 [padding: 0 1 0 1]
           RenderMathMLOperator {mo} at (1,0) size 8x30
             RenderBlock (anonymous) at (0,0) size 4x16
               RenderText {#text} at (0,-45) size 4x106
@@ -130,9 +130,9 @@ layer at (0,0) size 800x371
               RenderText {#text} at (0,-45) size 6x106
                 text run at (0,-45) width 6: "\x{27E9}"
           RenderMathMLSpace {mspace} at (140,3) size 0x16
-        RenderText {#text} at (193,5) size 5x17
-          text run at (193,5) width 5: " "
-        RenderMathMLMath {math} at (197,3) size 213x23 [padding: 0 1 0 1]
+        RenderText {#text} at (141,5) size 5x17
+          text run at (141,5) width 5: " "
+        RenderMathMLMath {math} at (145,3) size 212x23 [padding: 0 1 0 1]
           RenderMathMLOperator {mo} at (1,1) size 17x22
             RenderBlock (anonymous) at (0,0) size 8x15
               RenderText {#text} at (0,-46) size 8x106
@@ -184,7 +184,7 @@ layer at (0,0) size 800x371
           RenderMathMLSpace {mspace} at (209,0) size 0x16
         RenderText {#text} at (0,0) size 0x0
       RenderBlock {P} at (0,80) size 784x48
-        RenderMathMLMath {math} at (0,0) size 194x48 [padding: 0 1 0 1]
+        RenderMathMLMath {math} at (0,0) size 190x48 [padding: 0 1 0 1]
           RenderMathMLOperator {mo} at (1,0) size 11x48
             RenderBlock (anonymous) at (0,0) size 4x16
               RenderText {#text} at (0,-45) size 4x106
index 36462dc..31a1c60 100644 (file)
Binary files a/LayoutTests/platform/gtk/mathml/presentation/mo-stretch-expected.png and b/LayoutTests/platform/gtk/mathml/presentation/mo-stretch-expected.png differ
index 8207f14..a8d6bf0 100644 (file)
@@ -3,7 +3,7 @@ layer at (0,0) size 800x600
 layer at (0,0) size 800x270
   RenderBlock {HTML} at (0,0) size 800x270
     RenderBody {BODY} at (8,8) size 784x254
-      RenderMathMLMath {math} at (0,0) size 173x36 [padding: 0 1 0 1]
+      RenderMathMLMath {math} at (0,0) size 140x36 [padding: 0 1 0 1]
         RenderMathMLRow {mrow} at (1,0) size 138x36
           RenderMathMLOperator {mo} at (0,3) size 10x30
             RenderBlock (anonymous) at (0,0) size 6x16
@@ -61,10 +61,10 @@ layer at (0,0) size 800x270
             RenderBlock (anonymous) at (0,0) size 8x16
               RenderText {#text} at (0,-45) size 8x106
                 text run at (0,-45) width 8: "\x{2225}"
-      RenderText {#text} at (172,8) size 5x17
-        text run at (172,8) width 5: " "
+      RenderText {#text} at (139,8) size 5x17
+        text run at (139,8) width 5: " "
       RenderBR {BR} at (0,0) size 0x0
-      RenderMathMLMath {math} at (0,36) size 173x143 [padding: 0 1 0 1]
+      RenderMathMLMath {math} at (0,36) size 172x143 [padding: 0 1 0 1]
         RenderMathMLRow {mrow} at (1,0) size 170x143
           RenderMathMLOperator {mo} at (0,0) size 14x143
             RenderBlock (anonymous) at (0,0) size 6x16
@@ -123,9 +123,9 @@ layer at (0,0) size 800x270
               RenderText {#text} at (0,-45) size 8x106
                 text run at (0,-45) width 8: "\x{2225}"
           RenderMathMLSpace {mspace} at (169,0) size 0x76
-      RenderText {#text} at (172,97) size 5x17
-        text run at (172,97) width 5: " "
-      RenderMathMLMath {math} at (176,61) size 173x93 [padding: 0 1 0 1]
+      RenderText {#text} at (171,97) size 5x17
+        text run at (171,97) width 5: " "
+      RenderMathMLMath {math} at (175,61) size 172x93 [padding: 0 1 0 1]
         RenderMathMLRow {mrow} at (1,0) size 170x93
           RenderMathMLOperator {mo} at (0,0) size 14x93
             RenderBlock (anonymous) at (0,0) size 6x16
@@ -184,9 +184,9 @@ layer at (0,0) size 800x270
               RenderText {#text} at (0,-45) size 8x106
                 text run at (0,-45) width 8: "\x{2225}"
           RenderMathMLSpace {mspace} at (169,0) size 0x51
-      RenderText {#text} at (348,97) size 5x17
-        text run at (348,97) width 5: " "
-      RenderMathMLMath {math} at (352,89) size 173x36 [padding: 0 1 0 1]
+      RenderText {#text} at (346,97) size 5x17
+        text run at (346,97) width 5: " "
+      RenderMathMLMath {math} at (350,89) size 144x36 [padding: 0 1 0 1]
         RenderMathMLRow {mrow} at (1,0) size 142x36
           RenderMathMLOperator {mo} at (0,1) size 11x34
             RenderBlock (anonymous) at (0,0) size 6x16
@@ -245,10 +245,10 @@ layer at (0,0) size 800x270
               RenderText {#text} at (0,-45) size 8x106
                 text run at (0,-45) width 8: "\x{2225}"
           RenderMathMLSpace {mspace} at (141,2) size 0x21
-      RenderText {#text} at (524,97) size 5x17
-        text run at (524,97) width 5: " "
+      RenderText {#text} at (493,97) size 5x17
+        text run at (493,97) width 5: " "
       RenderBR {BR} at (0,0) size 0x0
-      RenderMathMLMath {math} at (0,179) size 190x76 [padding: 0 1 0 1]
+      RenderMathMLMath {math} at (0,179) size 187x76 [padding: 0 1 0 1]
         RenderMathMLRoot {msqrt} at (1,0) size 185x76
           RenderMathMLOperator {mo} at (17,2) size 14x74
             RenderBlock (anonymous) at (0,0) size 6x16
index cdd823a..4066917 100644 (file)
Binary files a/LayoutTests/platform/gtk/mathml/presentation/roots-expected.png and b/LayoutTests/platform/gtk/mathml/presentation/roots-expected.png differ
index 3ef410a..9493d89 100644 (file)
@@ -6,7 +6,7 @@ layer at (0,0) size 800x563
       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): "
-        RenderMathMLMath {math} at (177,1) size 27x18 [padding: 0 1 0 1]
+        RenderMathMLMath {math} at (177,1) size 23x18 [padding: 0 1 0 1]
           RenderMathMLRoot {msqrt} at (1,0) size 21x18 [color=#FF0000]
             RenderMathMLToken {mn} at (13,2) size 8x13
               RenderBlock (anonymous) at (0,0) size 8x12
@@ -15,7 +15,7 @@ layer at (0,0) size 800x563
       RenderBlock {p} at (0,34) size 784x18
         RenderText {#text} at (0,0) size 110x17
           text run at (0,0) width 110: "long square root: "
-        RenderMathMLMath {math} at (110,1) size 56x18 [padding: 0 1 0 1]
+        RenderMathMLMath {math} at (110,1) size 52x18 [padding: 0 1 0 1]
           RenderMathMLRoot {msqrt} at (1,0) size 50x18
             RenderMathMLRow {mrow} at (13,2) size 37x14
               RenderMathMLToken {mi} at (0,3) size 9x9 [padding: 0 2 0 0]
@@ -33,7 +33,7 @@ layer at (0,0) size 800x563
       RenderBlock {p} at (0,68) size 784x19
         RenderText {#text} at (0,2) size 222x17
           text run at (0,2) width 222: "long square root with implied row: "
-        RenderMathMLMath {math} at (222,0) size 62x19 [padding: 0 1 0 1]
+        RenderMathMLMath {math} at (222,0) size 58x19 [padding: 0 1 0 1]
           RenderMathMLRoot {msqrt} at (1,0) size 56x19
             RenderMathMLScripts {msup} at (13,2) size 16x15
               RenderMathMLToken {mi} at (0,5) size 9x10 [padding: 0 2 0 0]
@@ -55,7 +55,7 @@ layer at (0,0) size 800x563
       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 56x41 [padding: 0 1 0 1]
+        RenderMathMLMath {math} at (113,0) size 55x41 [padding: 0 1 0 1]
           RenderMathMLRoot {msqrt} at (1,0) size 53x41
             RenderMathMLFraction {mfrac} at (16,2) size 37x34
               RenderMathMLRow {mrow} at (0,0) size 37x13
@@ -87,7 +87,7 @@ layer at (0,0) size 800x563
       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): "
-        RenderMathMLMath {math} at (173,1) size 28x18 [color=#0000FF] [padding: 0 1 0 1]
+        RenderMathMLMath {math} at (173,1) size 24x18 [color=#0000FF] [padding: 0 1 0 1]
           RenderMathMLRoot {mroot} at (1,0) size 22x18
             RenderMathMLToken {mn} at (13,2) size 9x13
               RenderBlock (anonymous) at (0,0) size 8x12
@@ -100,7 +100,7 @@ layer at (0,0) size 800x563
       RenderBlock {p} at (0,193) size 784x18
         RenderText {#text} at (0,0) size 75x17
           text run at (0,0) width 75: "long index: "
-        RenderMathMLMath {math} at (75,0) size 58x19 [padding: 0 1 0 1]
+        RenderMathMLMath {math} at (75,0) size 54x19 [padding: 0 1 0 1]
           RenderMathMLRoot {mroot} at (1,0) size 52x19
             RenderMathMLToken {mn} at (43,2) size 9x13
               RenderBlock (anonymous) at (0,0) size 8x12
@@ -130,7 +130,7 @@ layer at (0,0) size 800x563
       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 86x41 [padding: 0 1 0 1]
+        RenderMathMLMath {math} at (185,0) size 85x41 [padding: 0 1 0 1]
           RenderMathMLRoot {mroot} at (1,0) size 83x41
             RenderMathMLFraction {mfrac} at (46,2) size 37x34
               RenderMathMLRow {mrow} at (0,0) size 37x13
@@ -183,7 +183,7 @@ layer at (0,0) size 800x563
       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 28x35 [padding: 0 1 0 1]
+        RenderMathMLMath {math} at (75,0) size 24x35 [padding: 0 1 0 1]
           RenderMathMLRoot {mroot} at (1,0) size 22x35
             RenderMathMLToken {mn} at (13,18) size 9x13
               RenderBlock (anonymous) at (0,0) size 8x12
@@ -206,7 +206,7 @@ layer at (0,0) size 800x563
       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 340x55 [padding: 0 1 0 1]
+        RenderMathMLMath {math} at (155,0) size 332x55 [padding: 0 1 0 1]
           RenderMathMLRoot {msqrt} at (1,0) size 330x55
             RenderMathMLToken {mn} at (17,17) size 8x13
               RenderBlock (anonymous) at (0,0) size 8x12
@@ -285,7 +285,7 @@ layer at (0,0) size 800x563
       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 360x57 [padding: 0 1 0 1]
+        RenderMathMLMath {math} at (110,0) size 353x57 [padding: 0 1 0 1]
           RenderMathMLRoot {mroot} at (1,0) size 351x57
             RenderMathMLRow {mrow} at (17,2) size 334x55
               RenderMathMLToken {mn} at (0,25) size 8x12
@@ -411,8 +411,8 @@ layer at (0,0) size 800x563
       RenderBlock {p} at (0,475) size 784x56
         RenderText {#text} at (0,24) size 74x17
           text run at (0,24) width 74: "RTL roots: "
-        RenderMathMLMath {math} at (74,0) size 360x57 [padding: 0 1 0 1]
-          RenderMathMLRoot {mroot} at (8,0) size 351x57
+        RenderMathMLMath {math} at (74,0) size 353x57 [padding: 0 1 0 1]
+          RenderMathMLRoot {mroot} at (1,0) size 351x57
             RenderMathMLRow {mrow} at (0,2) size 333x55
               RenderMathMLToken {mn} at (324,25) size 9x12
                 RenderBlock (anonymous) at (0,0) size 8x12
index da31612..cb0cbb3 100644 (file)
Binary files a/LayoutTests/platform/ios-simulator/mathml/opentype/opentype-stretchy-expected.png and b/LayoutTests/platform/ios-simulator/mathml/opentype/opentype-stretchy-expected.png differ
index 0b61b5c..c34e13b 100644 (file)
@@ -4,23 +4,23 @@ layer at (0,0) size 800x342
   RenderBlock {HTML} at (0,0) size 800x342
     RenderBody {BODY} at (8,16) size 784x310
       RenderBlock {P} at (0,0) size 784x36
-        RenderMathMLMath {math} at (0,21) size 49x11 [padding: 0 1 0 1]
+        RenderMathMLMath {math} at (0,21) size 28x11 [padding: 0 1 0 1]
           RenderMathMLRow {mrow} at (1,0) size 26x11
             RenderMathMLOperator {mo} at (0,0) size 26x11
               RenderBlock (anonymous) at (0,0) size 3x3
                 RenderText {#text} at (0,-3) size 3x0
                   text run at (0,-3) width 3: "\x{219F}"
-        RenderText {#text} at (48,16) size 5x19
-          text run at (48,16) width 5: " "
-        RenderMathMLMath {math} at (52,11) size 49x21 [padding: 0 1 0 1]
+        RenderText {#text} at (28,16) size 4x19
+          text run at (28,16) width 4: " "
+        RenderMathMLMath {math} at (32,11) size 28x21 [padding: 0 1 0 1]
           RenderMathMLRow {mrow} at (1,0) size 26x21
             RenderMathMLOperator {mo} at (0,0) size 26x21
               RenderBlock (anonymous) at (0,0) size 3x3
                 RenderText {#text} at (0,-3) size 3x0
                   text run at (0,-3) width 3: "\x{219F}"
-        RenderText {#text} at (100,16) size 5x19
-          text run at (100,16) width 5: " "
-        RenderMathMLMath {math} at (104,0) size 50x31 [padding: 0 1 0 1]
+        RenderText {#text} at (60,16) size 4x19
+          text run at (60,16) width 4: " "
+        RenderMathMLMath {math} at (64,0) size 28x31 [padding: 0 1 0 1]
           RenderMathMLRow {mrow} at (1,0) size 26x31
             RenderMathMLOperator {mo} at (0,0) size 26x31
               RenderBlock (anonymous) at (0,0) size 3x3
index a01c16c..d053303 100644 (file)
@@ -3,7 +3,7 @@ layer at (0,0) size 800x600
 layer at (0,0) size 800x254
   RenderBlock {HTML} at (0,0) size 800x254
     RenderBody {BODY} at (8,8) size 784x238
-      RenderMathMLMath {math} at (0,2) size 70x18 [padding: 0 1 0 1]
+      RenderMathMLMath {math} at (0,2) size 60x18 [padding: 0 1 0 1]
         RenderMathMLRow {mrow} at (1,0) size 58x18
           RenderMathMLOperator {mo} at (0,1) size 6x15
             RenderBlock (anonymous) at (0,0) size 6x16
@@ -61,8 +61,8 @@ layer at (0,0) size 800x254
             RenderBlock (anonymous) at (0,0) size 11x13
               RenderText {#text} at (0,0) size 11x17
                 text run at (0,0) width 11: "\x{2225}"
-      RenderText {#text} at (69,0) size 5x19
-        text run at (69,0) width 5: " "
+      RenderText {#text} at (59,0) size 5x19
+        text run at (59,0) width 5: " "
       RenderBR {BR} at (0,0) size 0x0
       RenderMathMLMath {math} at (0,20) size 70x143 [padding: 0 1 0 1]
         RenderMathMLRow {mrow} at (1,0) size 68x143
index 82916b9..1affd86 100644 (file)
Binary files a/LayoutTests/platform/mac/mathml/opentype/opentype-stretchy-expected.png and b/LayoutTests/platform/mac/mathml/opentype/opentype-stretchy-expected.png differ
index d91c46f..f92684f 100644 (file)
@@ -4,23 +4,23 @@ layer at (0,0) size 800x339
   RenderBlock {HTML} at (0,0) size 800x339
     RenderBody {BODY} at (8,16) size 784x307
       RenderBlock {P} at (0,0) size 784x35
-        RenderMathMLMath {math} at (0,21) size 49x11 [padding: 0 1 0 1]
+        RenderMathMLMath {math} at (0,21) size 28x11 [padding: 0 1 0 1]
           RenderMathMLRow {mrow} at (1,0) size 26x11
             RenderMathMLOperator {mo} at (0,0) size 26x11
               RenderBlock (anonymous) at (0,0) size 3x3
                 RenderText {#text} at (0,-3) size 3x0
                   text run at (0,-3) width 3: "\x{219F}"
-        RenderText {#text} at (48,17) size 5x18
-          text run at (48,17) width 5: " "
-        RenderMathMLMath {math} at (52,11) size 49x21 [padding: 0 1 0 1]
+        RenderText {#text} at (28,17) size 4x18
+          text run at (28,17) width 4: " "
+        RenderMathMLMath {math} at (32,11) size 28x21 [padding: 0 1 0 1]
           RenderMathMLRow {mrow} at (1,0) size 26x21
             RenderMathMLOperator {mo} at (0,0) size 26x21
               RenderBlock (anonymous) at (0,0) size 3x3
                 RenderText {#text} at (0,-3) size 3x0
                   text run at (0,-3) width 3: "\x{219F}"
-        RenderText {#text} at (100,17) size 5x18
-          text run at (100,17) width 5: " "
-        RenderMathMLMath {math} at (104,0) size 50x31 [padding: 0 1 0 1]
+        RenderText {#text} at (60,17) size 4x18
+          text run at (60,17) width 4: " "
+        RenderMathMLMath {math} at (64,0) size 28x31 [padding: 0 1 0 1]
           RenderMathMLRow {mrow} at (1,0) size 26x31
             RenderMathMLOperator {mo} at (0,0) size 26x31
               RenderBlock (anonymous) at (0,0) size 3x3
index a699f4e..dcce32b 100644 (file)
Binary files a/LayoutTests/platform/mac/mathml/presentation/mo-stretch-expected.png and b/LayoutTests/platform/mac/mathml/presentation/mo-stretch-expected.png differ
index a7b9ca3..cef866c 100644 (file)
@@ -3,7 +3,7 @@ layer at (0,0) size 800x600
 layer at (0,0) size 800x258
   RenderBlock {HTML} at (0,0) size 800x258
     RenderBody {BODY} at (8,8) size 784x242
-      RenderMathMLMath {math} at (0,0) size 126x25 [padding: 0 1 0 1]
+      RenderMathMLMath {math} at (0,0) size 110x25 [padding: 0 1 0 1]
         RenderMathMLRow {mrow} at (1,0) size 108x25
           RenderMathMLOperator {mo} at (0,5) size 6x14
             RenderBlock (anonymous) at (0,0) size 6x14
@@ -61,10 +61,10 @@ layer at (0,0) size 800x258
             RenderBlock (anonymous) at (0,0) size 9x16
               RenderText {#text} at (0,-5) size 9x24
                 text run at (0,-5) width 9: "\x{2225}"
-      RenderText {#text} at (125,2) size 5x18
-        text run at (125,2) width 5: " "
+      RenderText {#text} at (109,2) size 5x18
+        text run at (109,2) width 5: " "
       RenderBR {BR} at (0,0) size 0x0
-      RenderMathMLMath {math} at (0,24) size 126x143 [padding: 0 1 0 1]
+      RenderMathMLMath {math} at (0,24) size 125x143 [padding: 0 1 0 1]
         RenderMathMLRow {mrow} at (1,0) size 123x143
           RenderMathMLOperator {mo} at (0,0) size 8x143
             RenderBlock (anonymous) at (0,0) size 6x14
@@ -123,9 +123,9 @@ layer at (0,0) size 800x258
               RenderText {#text} at (0,-5) size 9x24
                 text run at (0,-5) width 9: "\x{2225}"
           RenderMathMLSpace {mspace} at (122,0) size 0x76
-      RenderText {#text} at (125,85) size 5x18
-        text run at (125,85) width 5: " "
-      RenderMathMLMath {math} at (129,49) size 126x93 [padding: 0 1 0 1]
+      RenderText {#text} at (124,85) size 5x18
+        text run at (124,85) width 5: " "
+      RenderMathMLMath {math} at (128,49) size 125x93 [padding: 0 1 0 1]
         RenderMathMLRow {mrow} at (1,0) size 123x93
           RenderMathMLOperator {mo} at (0,0) size 8x93
             RenderBlock (anonymous) at (0,0) size 6x14
@@ -184,9 +184,9 @@ layer at (0,0) size 800x258
               RenderText {#text} at (0,-5) size 9x24
                 text run at (0,-5) width 9: "\x{2225}"
           RenderMathMLSpace {mspace} at (122,0) size 0x51
-      RenderText {#text} at (254,85) size 5x18
-        text run at (254,85) width 5: " "
-      RenderMathMLMath {math} at (258,79) size 127x33 [padding: 0 1 0 1]
+      RenderText {#text} at (252,85) size 5x18
+        text run at (252,85) width 5: " "
+      RenderMathMLMath {math} at (256,79) size 116x33 [padding: 0 1 0 1]
         RenderMathMLRow {mrow} at (1,0) size 114x33
           RenderMathMLOperator {mo} at (0,0) size 8x33
             RenderBlock (anonymous) at (0,0) size 6x14
@@ -245,10 +245,10 @@ layer at (0,0) size 800x258
               RenderText {#text} at (0,-5) size 9x24
                 text run at (0,-5) width 9: "\x{2225}"
           RenderMathMLSpace {mspace} at (113,0) size 0x21
-      RenderText {#text} at (384,85) size 5x18
-        text run at (384,85) width 5: " "
+      RenderText {#text} at (371,85) size 5x18
+        text run at (371,85) width 5: " "
       RenderBR {BR} at (0,0) size 0x0
-      RenderMathMLMath {math} at (0,166) size 141x77 [padding: 0 1 0 1]
+      RenderMathMLMath {math} at (0,166) size 139x77 [padding: 0 1 0 1]
         RenderMathMLRoot {msqrt} at (1,0) size 137x77
           RenderMathMLOperator {mo} at (14,3) size 9x74
             RenderBlock (anonymous) at (0,0) size 6x14
index c1b5940..4762627 100644 (file)
@@ -1,3 +1,62 @@
+2016-07-07  Frederic Wang  <fwang@igalia.com>
+
+        Refactor layout functions to avoid using flexbox in MathML
+        https://bugs.webkit.org/show_bug.cgi?id=153991
+
+        Reviewed by Brent Fulgham.
+
+        No new tests, already covered by existing tests.
+
+        * css/mathml.css:
+        (math): Change inline mathematical formulas from inline-flex to inline.
+        (math[display="block"]): Change display mathematical formulas from flex to block and
+        remove flexbox property justify-content.
+        (ms, mspace, mtext, mi, mn, mo, mrow, mfenced, mfrac, msub, msup, msubsup, mmultiscripts,
+         mprescripts, none, munder, mover, munderover, msqrt, mroot, merror, mphantom, mstyle)
+         menclose, semantics, mpadded, maction): In order to render properly, all children of the
+         classes derived from RenderMathMLBlock must now be block-level. So we add more elements in
+         this list and update the display property.
+        (mtd > *): However, we use inline-block for children of the cell so that the text-align
+         property is taken into account.
+        * rendering/RenderBox.cpp:
+        (WebCore::RenderBox::computeLogicalWidthInRegion): Add a special case for RenderMathMLBlock
+        to preserve the old behavior.
+        (WebCore::RenderBox::sizesLogicalWidthToFitContent): Ditto.
+        * rendering/RenderFlexibleBox.h: No need to override layoutBlock anymore.
+        * rendering/mathml/RenderMathMLBlock.cpp: Include LayoutRepainter header for use in layoutBlock.
+        (WebCore::RenderMathMLBlock::RenderMathMLBlock): Inherit from RenderBlock and ensure that
+        our children are block-level.
+        (WebCore::RenderMathMLBlock::~RenderMathMLBlock): Added.
+        (WebCore::RenderMathMLBlock::baselinePosition): If the baselinefirstLineBaseline() is
+        undefined, just returns 0.
+        (WebCore::RenderMathMLBlock::paint): Call RenderBlock::paint.
+        (WebCore::RenderMathMLBlock::layoutItems): Implement a simplified version of
+        RenderFlexibleBox::layoutItems where we assume horizontal layout for all children.
+        (WebCore::RenderMathMLBlock::layoutBlock): Add a basic implementation based on
+        RenderFlexibleBox::layoutBlock.
+        (WebCore::RenderMathMLBlock::renderName): Deleted. There is now a simple implementation in the header.
+        * rendering/mathml/RenderMathMLBlock.h: Use RenderBlock instead of RenderFlexibleBox and
+        define layout functions. Define avoidsFloats and canDropAnonymousBlockChild to preserve
+        the old behavior and remove isFlexibleBoxImpl.
+        * rendering/mathml/RenderMathMLFenced.cpp:
+        (WebCore::RenderMathMLFenced::createMathMLOperator): Use block for anonymous RenderMathMLOperator.
+        * rendering/mathml/RenderMathMLRow.cpp:
+        (WebCore::RenderMathMLRow::layoutRowItems): No need to handle the flexbox case anymore.
+        (WebCore::RenderMathMLRow::paintChildren): Deleted. We now just use RenderBlock::paintChildren.
+        * rendering/mathml/RenderMathMLRow.h:
+        * rendering/mathml/RenderMathMLFraction.cpp:
+        (WebCore::RenderMathMLFraction::paintChildren): Deleted. We now just use RenderBlock::paintChildren.
+        * rendering/mathml/RenderMathMLFraction.h:
+        * rendering/mathml/RenderMathMLRoot.cpp:
+        (WebCore::RenderMathMLRoot::paintChildren): Deleted. We now just use RenderBlock::paintChildren.
+        * rendering/mathml/RenderMathMLRoot.h:
+        * rendering/mathml/RenderMathMLScripts.cpp:
+        (WebCore::RenderMathMLScripts::paintChildren): Deleted. We now just use RenderBlock::paintChildren.
+        * rendering/mathml/RenderMathMLScripts.h:
+        * rendering/mathml/RenderMathMLUnderOver.cpp:
+        (WebCore::RenderMathMLUnderOver::paintChildren): Deleted. We now just use RenderBlock::paintChildren.
+        * rendering/mathml/RenderMathMLUnderOver.h:
+
 2016-07-07  Antti Koivisto  <antti@apple.com>
 
         REGRESSION (r199054): CrashTracer: [USER] parseWebKit at WebCore: WebCore::RenderBlockFlow::checkFloatsInCleanLine + 107
index 453f5e2..4c3fb02 100644 (file)
@@ -95,21 +95,20 @@ math {
 }
 
 math {
-    display: -webkit-inline-flex !important;
+    display: inline !important;
     padding-left: 1px;
     padding-right: 1px;
 }
 
 math[display="block"] {
-    display: flex !important;
-    justify-content: center;
+    display: block !important;
     page-break-inside: avoid;
     /* -webkit-margin-before: 1em; -- FIXME: Ask www-math for a default MathML stylesheet, including this (or margin-top). */
     -webkit-margin-after: 1em;
 }
 
-ms, mi, mo, mrow, mfenced, mfrac, msub, msup, msubsup, mmultiscripts, mprescripts, none, munder, mover, munderover, msqrt, mroot, merror, mphantom, mstyle, menclose {
-    display: -webkit-inline-flex !important;
+ms, mspace, mtext, mi, mn, mo, mrow, mfenced, mfrac, msub, msup, msubsup, mmultiscripts, mprescripts, none, munder, mover, munderover, msqrt, mroot, merror, mphantom, mstyle, menclose, semantics, mpadded, maction {
+    display: block !important;
 }
 
 ms, mtext, mi, mn, mo, annotation, mtd {
@@ -190,6 +189,10 @@ mtd {
     display: table-cell;
     padding: 0.5ex;
 }
+/* Use inline-block for children so that the text-align property is taken into account */
+mtd > * {
+    display: inline-block !important;
+}
 
 mtable[columnalign="left"], mtr[columnalign="left"], mtd[columnalign="left"] {
     text-align: left;
index 4d33cb7..ea60f2c 100644 (file)
@@ -2441,6 +2441,10 @@ void RenderBox::computeLogicalWidthInRegion(LogicalExtentComputedValues& compute
     
     if (!hasPerpendicularContainingBlock && containerLogicalWidth && containerLogicalWidth != (computedValues.m_extent + computedValues.m_margins.m_start + computedValues.m_margins.m_end)
         && !isFloating() && !isInline() && !cb.isFlexibleBoxIncludingDeprecated()
+#if ENABLE(MATHML)
+        // RenderMathMLBlocks take the size of their content so we must not adjust the margin to fill the container size.
+        && !cb.isRenderMathMLBlock()
+#endif
 #if ENABLE(CSS_GRID_LAYOUT)
         && !cb.isRenderGrid()
 #endif
@@ -2588,6 +2592,12 @@ bool RenderBox::sizesLogicalWidthToFitContent(SizeType widthType) const
             return true;
     }
 
+#if ENABLE(MATHML)
+    // RenderMathMLBlocks take the size of their content, not of their container.
+    if (parent()->isRenderMathMLBlock())
+        return true;
+#endif
+
     // Flexible box items should shrink wrap, so we lay them out at their intrinsic widths.
     // In the case of columns that have a stretch alignment, we layout at the stretched size
     // to avoid an extra layout when applying alignment.
index c3d48ca..eed2575 100644 (file)
@@ -46,7 +46,7 @@ public:
 
     bool avoidsFloats() const final { return true; }
     bool canDropAnonymousBlockChild() const final { return false; }
-    void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) override;
+    void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) final;
 
     int baselinePosition(FontBaseline, bool firstLine, LineDirectionMode, LinePositionMode = PositionOnContainingLine) const override;
     Optional<int> firstLineBaseline() const override;
index 6707d76..b3188a8 100644 (file)
@@ -31,6 +31,7 @@
 #include "RenderMathMLBlock.h"
 
 #include "GraphicsContext.h"
+#include "LayoutRepainter.h"
 #include "MathMLNames.h"
 #include "RenderView.h"
 #include <wtf/text/StringBuilder.h>
@@ -44,12 +45,18 @@ namespace WebCore {
 using namespace MathMLNames;
 
 RenderMathMLBlock::RenderMathMLBlock(Element& container, RenderStyle&& style)
-    : RenderFlexibleBox(container, WTFMove(style))
+    : RenderBlock(container, WTFMove(style), 0)
 {
+    setChildrenInline(false); // All of our children must be block-level.
 }
 
 RenderMathMLBlock::RenderMathMLBlock(Document& document, RenderStyle&& style)
-    : RenderFlexibleBox(document, WTFMove(style))
+    : RenderBlock(document, WTFMove(style), 0)
+{
+    setChildrenInline(false); // All of our children must be block-level.
+}
+
+RenderMathMLBlock::~RenderMathMLBlock()
 {
 }
 
@@ -82,28 +89,13 @@ int RenderMathMLBlock::baselinePosition(FontBaseline baselineType, bool firstLin
     if (linePositionMode == PositionOfInteriorLineBoxes)
         return 0;
 
-    // FIXME: This may be unnecessary after flex baselines are implemented (https://bugs.webkit.org/show_bug.cgi?id=96188).
-    return firstLineBaseline().valueOrCompute([&] {
-        return RenderFlexibleBox::baselinePosition(baselineType, firstLine, direction, linePositionMode);
-    });
-}
-
-const char* RenderMathMLBlock::renderName() const
-{
-    EDisplay display = style().display();
-    if (display == FLEX)
-        return isAnonymous() ? "RenderMathMLBlock (anonymous, flex)" : "RenderMathMLBlock (flex)";
-    if (display == INLINE_FLEX)
-        return isAnonymous() ? "RenderMathMLBlock (anonymous, inline-flex)" : "RenderMathMLBlock (inline-flex)";
-    // |display| should be one of the above.
-    ASSERT_NOT_REACHED();
-    return isAnonymous() ? "RenderMathMLBlock (anonymous)" : "RenderMathMLBlock";
+    return firstLineBaseline().valueOr(RenderBlock::baselinePosition(baselineType, firstLine, direction, linePositionMode));
 }
 
 #if ENABLE(DEBUG_MATH_LAYOUT)
 void RenderMathMLBlock::paint(PaintInfo& info, const LayoutPoint& paintOffset)
 {
-    RenderFlexibleBox::paint(info, paintOffset);
+    RenderBlock::paint(info, paintOffset);
 
     if (info.context().paintingDisabled() || info.phase != PaintPhaseForeground)
         return;
@@ -316,6 +308,74 @@ Optional<int> RenderMathMLTable::firstLineBaseline() const
     return (logicalHeight() + style().fontMetrics().xHeight()) / 2;
 }
 
+void RenderMathMLBlock::layoutItems(bool relayoutChildren)
+{
+    LayoutUnit verticalOffset = borderBefore() + paddingBefore();
+    LayoutUnit horizontalOffset = borderStart() + paddingStart();
+
+    LayoutUnit preferredHorizontalExtent = 0;
+    for (auto* child = firstChildBox(); child; child = child->nextSiblingBox()) {
+        LayoutUnit childHorizontalExtent = child->maxPreferredLogicalWidth() - child->horizontalBorderAndPaddingExtent();
+        LayoutUnit childHorizontalMarginBoxExtent = child->horizontalBorderAndPaddingExtent() + childHorizontalExtent;
+        childHorizontalMarginBoxExtent += child->horizontalMarginExtent();
+
+        preferredHorizontalExtent += childHorizontalMarginBoxExtent;
+    }
+
+    LayoutUnit currentHorizontalExtent = contentLogicalWidth();
+    for (auto* child = firstChildBox(); child; child = child->nextSiblingBox()) {
+        LayoutUnit childSize = child->maxPreferredLogicalWidth() - child->horizontalBorderAndPaddingExtent();
+
+        if (preferredHorizontalExtent > currentHorizontalExtent)
+            childSize = currentHorizontalExtent;
+
+        LayoutUnit childPreferredSize = childSize + child->horizontalBorderAndPaddingExtent();
+
+        if (childPreferredSize != child->width())
+            child->setChildNeedsLayout(MarkOnlyThis);
+
+        updateBlockChildDirtyBitsBeforeLayout(relayoutChildren, *child);
+        child->layoutIfNeeded();
+
+        LayoutUnit childVerticalMarginBoxExtent;
+        childVerticalMarginBoxExtent = child->height() + child->verticalMarginExtent();
+
+        setLogicalHeight(std::max(logicalHeight(), verticalOffset + borderAfter() + paddingAfter() + childVerticalMarginBoxExtent + horizontalScrollbarHeight()));
+
+        horizontalOffset += child->marginStart();
+
+        LayoutUnit childHorizontalExtent = child->width();
+        LayoutPoint childLocation(style().isLeftToRightDirection() ? horizontalOffset : width() - horizontalOffset - childHorizontalExtent,
+            verticalOffset + child->marginBefore());
+
+        child->setLocation(childLocation);
+        horizontalOffset += childHorizontalExtent + child->marginEnd();
+    }
+}
+
+void RenderMathMLBlock::layoutBlock(bool relayoutChildren, LayoutUnit)
+{
+    ASSERT(needsLayout());
+
+    if (!relayoutChildren && simplifiedLayout())
+        return;
+
+    LayoutRepainter repainter(*this, checkForRepaintDuringLayout());
+
+    if (recomputeLogicalWidth())
+        relayoutChildren = true;
+
+    setLogicalHeight(borderAndPaddingLogicalHeight() + scrollbarLogicalHeight());
+
+    layoutItems(relayoutChildren);
+
+    updateLogicalHeight();
+
+    repainter.repaintAfterLayout();
+
+    clearNeedsLayout();
+}
+
 }
 
 #endif
index 756dba9..6e249ae 100644 (file)
@@ -29,7 +29,7 @@
 
 #if ENABLE(MATHML)
 
-#include "RenderFlexibleBox.h"
+#include "RenderBlock.h"
 #include "RenderTable.h"
 #include "StyleInheritedData.h"
 
@@ -39,10 +39,11 @@ namespace WebCore {
 
 class RenderMathMLOperator;
 
-class RenderMathMLBlock : public RenderFlexibleBox {
+class RenderMathMLBlock : public RenderBlock {
 public:
     RenderMathMLBlock(Element&, RenderStyle&&);
     RenderMathMLBlock(Document&, RenderStyle&&);
+    virtual ~RenderMathMLBlock();
 
     bool isChildAllowed(const RenderObject&, const RenderStyle&) const override;
 
@@ -71,10 +72,14 @@ protected:
         return child.firstLineBaseline().valueOr(child.logicalHeight());
     }
 
+    void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) override;
+
 private:
     bool isRenderMathMLBlock() const final { return true; }
-    const char* renderName() const override;
-    bool isFlexibleBoxImpl() const override { return true; }
+    const char* renderName() const override { return "RenderMathMLBlock"; }
+    bool avoidsFloats() const final { return true; }
+    bool canDropAnonymousBlockChild() const final { return false; }
+    void layoutItems(bool relayoutChildren);
 };
 
 class RenderMathMLTable final : public RenderTable {
index 148f7aa..39ab4d3 100644 (file)
@@ -85,7 +85,7 @@ void RenderMathMLFenced::updateFromElement()
 
 RenderPtr<RenderMathMLOperator> RenderMathMLFenced::createMathMLOperator(const String& operatorString, MathMLOperatorDictionary::Form form, MathMLOperatorDictionary::Flag flag)
 {
-    RenderPtr<RenderMathMLOperator> newOperator = createRenderer<RenderMathMLOperator>(document(), RenderStyle::createAnonymousStyleWithDisplay(style(), FLEX), operatorString, form, flag);
+    RenderPtr<RenderMathMLOperator> newOperator = createRenderer<RenderMathMLOperator>(document(), RenderStyle::createAnonymousStyleWithDisplay(style(), BLOCK), operatorString, form, flag);
     newOperator->initializeStyle();
     return newOperator;
 }
index fb0c963..719978b 100644 (file)
@@ -227,14 +227,6 @@ Optional<int> RenderMathMLFraction::firstLineBaseline() const
     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 a666d07..3a424a3 100644 (file)
@@ -43,7 +43,6 @@ public:
     float relativeLineThickness() const { return m_defaultLineThickness ? m_lineThickness / m_defaultLineThickness : LayoutUnit(0); }
 
     void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) final;
-    void paintChildren(PaintInfo& forSelf, const LayoutPoint&, PaintInfo& forChild, bool usePrintRect) final;
 
 protected:
     void computePreferredLogicalWidths() final;
index 0ca289b..de520a2 100644 (file)
@@ -238,14 +238,6 @@ void RenderMathMLRoot::layoutBlock(bool relayoutChildren, LayoutUnit)
     clearNeedsLayout();
 }
 
-void RenderMathMLRoot::paintChildren(PaintInfo& paintInfo, const LayoutPoint& paintOffset, PaintInfo& paintInfoForChild, bool usePrintRect)
-{
-    for (auto* child = firstChildBox(); child; child = child->nextSiblingBox()) {
-        if (!paintChild(*child, paintInfo, paintOffset, paintInfoForChild, usePrintRect, PaintAsInlineBlock))
-            return;
-    }
-}
-
 void RenderMathMLRoot::paint(PaintInfo& info, const LayoutPoint& paintOffset)
 {
     RenderMathMLRow::paint(info, paintOffset);
index 24c1cd8..7302f9f 100644 (file)
@@ -49,7 +49,6 @@ public:
 
     void computePreferredLogicalWidths() final;
     void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) final;
-    void paintChildren(PaintInfo& forSelf, const LayoutPoint&, PaintInfo& forChild, bool usePrintRect) final;
 
 protected:
     void paint(PaintInfo&, const LayoutPoint&) final;
index 688f3b7..e3e5d0c 100644 (file)
@@ -161,8 +161,7 @@ void RenderMathMLRow::layoutRowItems(LayoutUnit& ascent, LayoutUnit& descent)
     }
 
     LayoutUnit centerBlockOffset = 0;
-    // FIXME: Remove the FLEX when it is not required by the css.
-    if (style().display() == BLOCK || style().display() == FLEX)
+    if (style().display() == BLOCK)
         centerBlockOffset = std::max<LayoutUnit>(0, (logicalWidth() - (horizontalOffset + borderEnd() + paddingEnd())) / 2);
 
     if (shouldFlipHorizontal && centerBlockOffset > 0)
@@ -200,14 +199,6 @@ void RenderMathMLRow::layoutBlock(bool relayoutChildren, LayoutUnit)
     clearNeedsLayout();
 }
 
-void RenderMathMLRow::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 24a6d56..01e6c95 100644 (file)
@@ -43,7 +43,6 @@ public:
     void updateOperatorProperties();
 
     void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) override;
-    void paintChildren(PaintInfo& forSelf, const LayoutPoint&, PaintInfo& forChild, bool usePrintRect) override;
     Optional<int> firstLineBaseline() const override;
 
 protected:
index 10cd98b..a2f3161 100644 (file)
@@ -426,14 +426,6 @@ Optional<int> RenderMathMLScripts::firstLineBaseline() const
     return Optional<int>(static_cast<int>(lroundf(ascentForChild(*base) + base->logicalTop())));
 }
 
-void RenderMathMLScripts::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 80e3e0d..0157e0d 100644 (file)
@@ -40,7 +40,6 @@ public:
     RenderMathMLOperator* unembellishedOperator() final;
     Optional<int> firstLineBaseline() const final;
     void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) final;
-    void paintChildren(PaintInfo& forSelf, const LayoutPoint&, PaintInfo& forChild, bool usePrintRect) final;
 
 private:
     bool isRenderMathMLScripts() const final { return true; }
index c11d050..e05a99b 100644 (file)
@@ -222,14 +222,6 @@ void RenderMathMLUnderOver::layoutBlock(bool relayoutChildren, LayoutUnit)
     clearNeedsLayout();
 }
 
-void RenderMathMLUnderOver::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 e047d1b..22dec8d 100644 (file)
@@ -43,7 +43,6 @@ public:
 
     void computePreferredLogicalWidths() final;
     void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) final;
-    void paintChildren(PaintInfo& forSelf, const LayoutPoint&, PaintInfo& forChild, bool usePrintRect) final;
 
 private:
     bool isRenderMathMLUnderOver() const override { return true; }