Text bounding box computation for simple line layout is wrong
authorantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 20 Apr 2014 17:43:54 +0000 (17:43 +0000)
committerantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 20 Apr 2014 17:43:54 +0000 (17:43 +0000)
https://bugs.webkit.org/show_bug.cgi?id=131912

Reviewed by Andreas Kling.

Source/WebCore:

Top-left is currently the first line top-left which is not always correct.

* WebCore.exp.in:
* rendering/RenderText.cpp:
(WebCore::RenderText::firstRunLocation):
(WebCore::RenderText::firstRunOrigin): Deleted.
(WebCore::RenderText::firstRunX): Deleted.
(WebCore::RenderText::firstRunY): Deleted.

    Keep just one accessor and rename it.
    Encapsulate the line box and simple line versions.

* rendering/RenderText.h:
* rendering/RenderTextLineBoxes.cpp:
(WebCore::RenderTextLineBoxes::firstRunLocation):

    Line box version.

* rendering/RenderTextLineBoxes.h:
* rendering/RenderTreeAsText.cpp:

    Simplify RenderText dumping.

(WebCore::RenderTreeAsText::writeRenderObject):
* rendering/SimpleLineLayoutFunctions.cpp:
(WebCore::SimpleLineLayout::computeTextBoundingBox):

    Return the correct x position.

(WebCore::SimpleLineLayout::computeTextFirstRunLocation):

    Simple line version.

* rendering/SimpleLineLayoutFunctions.h:
* rendering/svg/SVGRenderTreeAsText.cpp:
(WebCore::writeSVGInlineText):

LayoutTests:

Some dumped RenderText sizes change in table related test. These are progressions,
the new results match the contained lines. There are no visual changes.

* platform/mac/fast/table/dynamic-caption-add-remove-before-child-expected.txt:
* platform/mac/fast/table/multiple-captions-display-expected.txt:
* platform/mac/tables/mozilla/marvin/body_col-expected.txt:
* platform/mac/tables/mozilla/marvin/x_th_valign_baseline-expected.txt:
* platform/mac/tables/mozilla/other/body_col-expected.txt:
* platform/mac/tables/mozilla_expected_failures/bugs/bug10140-expected.txt:
* platform/mac/tables/mozilla_expected_failures/bugs/bug10216-expected.txt:
* platform/mac/tables/mozilla_expected_failures/core/captions3-expected.txt:
* platform/mac/tables/mozilla_expected_failures/other/test4-expected.txt:

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

23 files changed:
LayoutTests/ChangeLog
LayoutTests/platform/mac/fast/repaint/reflection-redraw-expected.txt
LayoutTests/platform/mac/fast/table/dynamic-caption-add-remove-before-child-expected.txt
LayoutTests/platform/mac/fast/table/multiple-captions-display-expected.txt
LayoutTests/platform/mac/tables/mozilla/marvin/body_col-expected.txt
LayoutTests/platform/mac/tables/mozilla/marvin/x_th_valign_baseline-expected.txt
LayoutTests/platform/mac/tables/mozilla/other/body_col-expected.txt
LayoutTests/platform/mac/tables/mozilla_expected_failures/bugs/bug10140-expected.txt
LayoutTests/platform/mac/tables/mozilla_expected_failures/bugs/bug10216-expected.txt
LayoutTests/platform/mac/tables/mozilla_expected_failures/core/captions3-expected.txt
LayoutTests/platform/mac/tables/mozilla_expected_failures/other/test4-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/WebCore.exp.in
Source/WebCore/rendering/RenderText.cpp
Source/WebCore/rendering/RenderText.h
Source/WebCore/rendering/RenderTextLineBoxes.cpp
Source/WebCore/rendering/RenderTextLineBoxes.h
Source/WebCore/rendering/RenderTreeAsText.cpp
Source/WebCore/rendering/SimpleLineLayoutFunctions.cpp
Source/WebCore/rendering/SimpleLineLayoutFunctions.h
Source/WebCore/rendering/svg/SVGRenderTreeAsText.cpp
Source/WebKit/mac/WebView/WebRenderNode.mm
Source/WebKit2/Shared/WebRenderObject.cpp

index 676cf59..606eca3 100644 (file)
@@ -1,3 +1,23 @@
+2014-04-20  Antti Koivisto  <antti@apple.com>
+
+        Text bounding box computation for simple line layout is wrong
+        https://bugs.webkit.org/show_bug.cgi?id=131912
+
+        Reviewed by Andreas Kling.
+        
+        Some dumped RenderText sizes change in table related test. These are progressions,
+        the new results match the contained lines. There are no visual changes.
+
+        * platform/mac/fast/table/dynamic-caption-add-remove-before-child-expected.txt:
+        * platform/mac/fast/table/multiple-captions-display-expected.txt:
+        * platform/mac/tables/mozilla/marvin/body_col-expected.txt:
+        * platform/mac/tables/mozilla/marvin/x_th_valign_baseline-expected.txt:
+        * platform/mac/tables/mozilla/other/body_col-expected.txt:
+        * platform/mac/tables/mozilla_expected_failures/bugs/bug10140-expected.txt:
+        * platform/mac/tables/mozilla_expected_failures/bugs/bug10216-expected.txt:
+        * platform/mac/tables/mozilla_expected_failures/core/captions3-expected.txt:
+        * platform/mac/tables/mozilla_expected_failures/other/test4-expected.txt:
+
 2014-04-20  Commit Queue  <commit-queue@webkit.org>
 
         Unreviewed, rolling out r167501.
 2014-04-20  Commit Queue  <commit-queue@webkit.org>
 
         Unreviewed, rolling out r167501.
index 8aa741e..3d2380b 100644 (file)
@@ -7,28 +7,28 @@ layer at (0,0) size 800x8
 layer at (293,130) size 150x100
   RenderBlock (positioned) {DIV} at (285,10) size 150x100 [bgcolor=#808080] [border: (1px solid #000000)]
     RenderBlock {P} at (11,27) size 128x54 [color=#008000]
 layer at (293,130) size 150x100
   RenderBlock (positioned) {DIV} at (285,10) size 150x100 [bgcolor=#808080] [border: (1px solid #000000)]
     RenderBlock {P} at (11,27) size 128x54 [color=#008000]
-      RenderText {#text} at (12,0) size 125x54
+      RenderText {#text} at (12,0) size 126x54
         text run at (12,0) width 104: "The color of this"
         text run at (1,18) width 126: "text in the reflection"
         text run at (14,36) width 100: "should be green"
 layer at (218,240) size 150x100
   RenderBlock (positioned) {DIV} at (210,120) size 150x100 [bgcolor=#808080] [border: (1px solid #000000)]
     RenderBlock {P} at (11,27) size 128x54 [color=#008000]
         text run at (12,0) width 104: "The color of this"
         text run at (1,18) width 126: "text in the reflection"
         text run at (14,36) width 100: "should be green"
 layer at (218,240) size 150x100
   RenderBlock (positioned) {DIV} at (210,120) size 150x100 [bgcolor=#808080] [border: (1px solid #000000)]
     RenderBlock {P} at (11,27) size 128x54 [color=#008000]
-      RenderText {#text} at (12,0) size 125x54
+      RenderText {#text} at (12,0) size 126x54
         text run at (12,0) width 104: "The color of this"
         text run at (1,18) width 126: "text in the reflection"
         text run at (14,36) width 100: "should be green"
 layer at (368,240) size 150x100
   RenderBlock (positioned) {DIV} at (360,120) size 150x100 [bgcolor=#808080] [border: (1px solid #000000)]
     RenderBlock {P} at (11,27) size 128x54 [color=#008000]
         text run at (12,0) width 104: "The color of this"
         text run at (1,18) width 126: "text in the reflection"
         text run at (14,36) width 100: "should be green"
 layer at (368,240) size 150x100
   RenderBlock (positioned) {DIV} at (360,120) size 150x100 [bgcolor=#808080] [border: (1px solid #000000)]
     RenderBlock {P} at (11,27) size 128x54 [color=#008000]
-      RenderText {#text} at (12,0) size 125x54
+      RenderText {#text} at (12,0) size 126x54
         text run at (12,0) width 104: "The color of this"
         text run at (1,18) width 126: "text in the reflection"
         text run at (14,36) width 100: "should be green"
 layer at (293,350) size 150x100
   RenderBlock (positioned) {DIV} at (285,230) size 150x100 [bgcolor=#808080] [border: (1px solid #000000)]
     RenderBlock {P} at (11,27) size 128x54 [color=#008000]
         text run at (12,0) width 104: "The color of this"
         text run at (1,18) width 126: "text in the reflection"
         text run at (14,36) width 100: "should be green"
 layer at (293,350) size 150x100
   RenderBlock (positioned) {DIV} at (285,230) size 150x100 [bgcolor=#808080] [border: (1px solid #000000)]
     RenderBlock {P} at (11,27) size 128x54 [color=#008000]
-      RenderText {#text} at (12,0) size 125x54
+      RenderText {#text} at (12,0) size 126x54
         text run at (12,0) width 104: "The color of this"
         text run at (1,18) width 126: "text in the reflection"
         text run at (14,36) width 100: "should be green"
         text run at (12,0) width 104: "The color of this"
         text run at (1,18) width 126: "text in the reflection"
         text run at (14,36) width 100: "should be green"
index 128b00c..212cb30 100644 (file)
@@ -5,7 +5,7 @@ layer at (0,0) size 800x88
     RenderBody {body} at (8,8) size 784x72
       RenderTable {table} at (0,0) size 46x72
         RenderBlock {caption} at (0,0) size 46x72
     RenderBody {body} at (8,8) size 784x72
       RenderTable {table} at (0,0) size 46x72
         RenderBlock {caption} at (0,0) size 46x72
-          RenderText {#text} at (1,0) size 47x72
+          RenderText {#text} at (1,0) size 46x72
             text run at (1,0) width 44: "PASS:"
             text run at (0,18) width 46: "Text in"
             text run at (0,36) width 46: "caption"
             text run at (1,0) width 44: "PASS:"
             text run at (0,18) width 46: "Text in"
             text run at (0,36) width 46: "caption"
index 5d9a174..a99d136 100644 (file)
@@ -36,7 +36,7 @@ layer at (0,0) size 800x280
         RenderBlock {caption} at (0,126) size 126x0
 layer at (8,218) size 126x54
   RenderBlock {caption} at (0,210) size 126x54
         RenderBlock {caption} at (0,126) size 126x0
 layer at (8,218) size 126x54
   RenderBlock {caption} at (0,210) size 126x54
-    RenderText {#text} at (25,0) size 117x54
+    RenderText {#text} at (25,0) size 116x54
       text run at (25,0) width 76: "PASS: First"
       text run at (5,18) width 116: "Caption aligned to"
       text run at (29,36) width 68: "the bottom"
       text run at (25,0) width 76: "PASS: First"
       text run at (5,18) width 116: "Caption aligned to"
       text run at (29,36) width 68: "the bottom"
@@ -46,7 +46,7 @@ layer at (10,156) size 230x18
       text run at (0,0) width 230: "PASS: Caption with a fixed position"
 layer at (8,8) size 126x36
   RenderBlock {caption} at (0,0) size 126x36
       text run at (0,0) width 230: "PASS: Caption with a fixed position"
 layer at (8,8) size 126x36
   RenderBlock {caption} at (0,0) size 126x36
-    RenderText {#text} at (14,0) size 103x36
+    RenderText {#text} at (14,0) size 102x36
       text run at (14,0) width 98: "PASS: Caption"
       text run at (12,18) width 102: "with opacity 0.7"
 layer at (10,196) size 331x18
       text run at (14,0) width 98: "PASS: Caption"
       text run at (12,18) width 102: "with opacity 0.7"
 layer at (10,196) size 331x18
index 51981fd..6624f4b 100644 (file)
@@ -10,7 +10,7 @@ layer at (0,0) size 800x600
         RenderTableSection {TBODY} at (2,2) size 155x152
           RenderTableRow {TR} at (0,2) size 155x40
             RenderTableCell {TH} at (2,2) size 49x40 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1]
         RenderTableSection {TBODY} at (2,2) size 155x152
           RenderTableRow {TR} at (0,2) size 155x40
             RenderTableCell {TH} at (2,2) size 49x40 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1]
-              RenderText {#text} at (15,2) size 36x36
+              RenderText {#text} at (15,2) size 37x36
                 text run at (15,2) width 19: "La"
                 text run at (6,20) width 37: "Mesa"
             RenderTableCell {TD} at (53,11) size 100x22 [border: (1px inset #808080)] [r=0 c=1 rs=1 cs=1]
                 text run at (15,2) width 19: "La"
                 text run at (6,20) width 37: "Mesa"
             RenderTableCell {TD} at (53,11) size 100x22 [border: (1px inset #808080)] [r=0 c=1 rs=1 cs=1]
@@ -18,7 +18,7 @@ layer at (0,0) size 800x600
                 text run at (2,2) width 12: "X"
           RenderTableRow {TR} at (0,44) size 155x40
             RenderTableCell {TH} at (2,44) size 49x40 [border: (1px inset #808080)] [r=1 c=0 rs=1 cs=1]
                 text run at (2,2) width 12: "X"
           RenderTableRow {TR} at (0,44) size 155x40
             RenderTableCell {TH} at (2,44) size 49x40 [border: (1px inset #808080)] [r=1 c=0 rs=1 cs=1]
-              RenderText {#text} at (17,2) size 42x36
+              RenderText {#text} at (17,2) size 43x36
                 text run at (17,2) width 15: "El"
                 text run at (3,20) width 43: "Cajon"
             RenderTableCell {TD} at (53,53) size 100x22 [border: (1px inset #808080)] [r=1 c=1 rs=1 cs=1]
                 text run at (17,2) width 15: "El"
                 text run at (3,20) width 43: "Cajon"
             RenderTableCell {TD} at (53,53) size 100x22 [border: (1px inset #808080)] [r=1 c=1 rs=1 cs=1]
index efb06a8..2d57795 100644 (file)
@@ -10,7 +10,7 @@ layer at (0,0) size 800x298
         RenderTableSection (anonymous) at (1,1) size 782x238
           RenderTableRow {tr} at (0,2) size 782x234
             RenderTableCell {th} at (2,24) size 214x94 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1]
         RenderTableSection (anonymous) at (1,1) size 782x238
           RenderTableRow {tr} at (0,2) size 782x234
             RenderTableCell {th} at (2,24) size 214x94 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1]
-              RenderText {#text} at (12,2) size 207x90
+              RenderText {#text} at (12,2) size 206x90
                 text run at (12,2) width 190: "Compare the baseline of the"
                 text run at (4,20) width 76: "first line of "
                 text run at (80,20) width 130: "text in this cell with"
                 text run at (12,2) width 190: "Compare the baseline of the"
                 text run at (4,20) width 76: "first line of "
                 text run at (80,20) width 130: "text in this cell with"
index 51981fd..6624f4b 100644 (file)
@@ -10,7 +10,7 @@ layer at (0,0) size 800x600
         RenderTableSection {TBODY} at (2,2) size 155x152
           RenderTableRow {TR} at (0,2) size 155x40
             RenderTableCell {TH} at (2,2) size 49x40 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1]
         RenderTableSection {TBODY} at (2,2) size 155x152
           RenderTableRow {TR} at (0,2) size 155x40
             RenderTableCell {TH} at (2,2) size 49x40 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1]
-              RenderText {#text} at (15,2) size 36x36
+              RenderText {#text} at (15,2) size 37x36
                 text run at (15,2) width 19: "La"
                 text run at (6,20) width 37: "Mesa"
             RenderTableCell {TD} at (53,11) size 100x22 [border: (1px inset #808080)] [r=0 c=1 rs=1 cs=1]
                 text run at (15,2) width 19: "La"
                 text run at (6,20) width 37: "Mesa"
             RenderTableCell {TD} at (53,11) size 100x22 [border: (1px inset #808080)] [r=0 c=1 rs=1 cs=1]
@@ -18,7 +18,7 @@ layer at (0,0) size 800x600
                 text run at (2,2) width 12: "X"
           RenderTableRow {TR} at (0,44) size 155x40
             RenderTableCell {TH} at (2,44) size 49x40 [border: (1px inset #808080)] [r=1 c=0 rs=1 cs=1]
                 text run at (2,2) width 12: "X"
           RenderTableRow {TR} at (0,44) size 155x40
             RenderTableCell {TH} at (2,44) size 49x40 [border: (1px inset #808080)] [r=1 c=0 rs=1 cs=1]
-              RenderText {#text} at (17,2) size 42x36
+              RenderText {#text} at (17,2) size 43x36
                 text run at (17,2) width 15: "El"
                 text run at (3,20) width 43: "Cajon"
             RenderTableCell {TD} at (53,53) size 100x22 [border: (1px inset #808080)] [r=1 c=1 rs=1 cs=1]
                 text run at (17,2) width 15: "El"
                 text run at (3,20) width 43: "Cajon"
             RenderTableCell {TD} at (53,53) size 100x22 [border: (1px inset #808080)] [r=1 c=1 rs=1 cs=1]
index 3f5da90..74c0d61 100644 (file)
@@ -185,7 +185,7 @@ layer at (0,0) size 785x2817
                 text run at (1,1) width 30: "Data"
       RenderTable {TABLE} at (0,1196) size 90x127 [border: (10px solid #008000)]
         RenderBlock {CAPTION} at (20,0) size 70x60 [border: (3px solid #800080)]
                 text run at (1,1) width 30: "Data"
       RenderTable {TABLE} at (0,1196) size 90x127 [border: (10px solid #008000)]
         RenderBlock {CAPTION} at (20,0) size 70x60 [border: (3px solid #800080)]
-          RenderText {#text} at (22,3) size 51x54
+          RenderText {#text} at (22,3) size 50x54
             text run at (22,3) width 26: "The"
             text run at (15,21) width 40: "table's"
             text run at (10,39) width 50: "caption."
             text run at (22,3) width 26: "The"
             text run at (15,21) width 40: "table's"
             text run at (10,39) width 50: "caption."
@@ -206,7 +206,7 @@ layer at (0,0) size 785x2817
                 text run at (1,1) width 30: "Data"
       RenderTable {TABLE} at (0,1322) size 90x127 [border: (10px solid #008000)]
         RenderBlock {CAPTION} at (20,0) size 70x60 [border: (3px solid #800080)]
                 text run at (1,1) width 30: "Data"
       RenderTable {TABLE} at (0,1322) size 90x127 [border: (10px solid #008000)]
         RenderBlock {CAPTION} at (20,0) size 70x60 [border: (3px solid #800080)]
-          RenderText {#text} at (22,3) size 51x54
+          RenderText {#text} at (22,3) size 50x54
             text run at (22,3) width 26: "The"
             text run at (15,21) width 40: "table's"
             text run at (10,39) width 50: "caption."
             text run at (22,3) width 26: "The"
             text run at (15,21) width 40: "table's"
             text run at (10,39) width 50: "caption."
@@ -355,7 +355,7 @@ layer at (0,0) size 785x2817
                 text run at (1,1) width 30: "Data"
       RenderTable {TABLE} at (0,2290) size 90x127 [border: (10px solid #008000)]
         RenderBlock {CAPTION} at (0,0) size 70x60 [border: (3px solid #800080)]
                 text run at (1,1) width 30: "Data"
       RenderTable {TABLE} at (0,2290) size 90x127 [border: (10px solid #008000)]
         RenderBlock {CAPTION} at (0,0) size 70x60 [border: (3px solid #800080)]
-          RenderText {#text} at (22,3) size 51x54
+          RenderText {#text} at (22,3) size 50x54
             text run at (22,3) width 26: "The"
             text run at (15,21) width 40: "table's"
             text run at (10,39) width 50: "caption."
             text run at (22,3) width 26: "The"
             text run at (15,21) width 40: "table's"
             text run at (10,39) width 50: "caption."
@@ -376,7 +376,7 @@ layer at (0,0) size 785x2817
                 text run at (1,1) width 30: "Data"
       RenderTable {TABLE} at (15,2416) size 90x127 [border: (10px solid #008000)]
         RenderBlock {CAPTION} at (0,0) size 70x60 [border: (3px solid #800080)]
                 text run at (1,1) width 30: "Data"
       RenderTable {TABLE} at (15,2416) size 90x127 [border: (10px solid #008000)]
         RenderBlock {CAPTION} at (0,0) size 70x60 [border: (3px solid #800080)]
-          RenderText {#text} at (22,3) size 51x54
+          RenderText {#text} at (22,3) size 50x54
             text run at (22,3) width 26: "The"
             text run at (15,21) width 40: "table's"
             text run at (10,39) width 50: "caption."
             text run at (22,3) width 26: "The"
             text run at (15,21) width 40: "table's"
             text run at (10,39) width 50: "caption."
index 5cbcbcd..2e218b3 100644 (file)
@@ -97,7 +97,7 @@ layer at (0,0) size 785x708
                 text run at (2,2) width 30: "Data"
       RenderTable {TABLE} at (0,572) size 87x107 [border: (1px outset #808080)]
         RenderBlock {CAPTION} at (0,0) size 87x54
                 text run at (2,2) width 30: "Data"
       RenderTable {TABLE} at (0,572) size 87x107 [border: (1px outset #808080)]
         RenderBlock {CAPTION} at (0,0) size 87x54
-          RenderText {#text} at (9,0) size 88x54
+          RenderText {#text} at (9,0) size 87x54
             text run at (9,0) width 69: "The table's"
             text run at (2,18) width 83: "caption, with"
             text run at (0,36) width 87: "align=\"right\"."
             text run at (9,0) width 69: "The table's"
             text run at (2,18) width 83: "caption, with"
             text run at (0,36) width 87: "align=\"right\"."
index d81d84c..2277ecb 100644 (file)
@@ -185,7 +185,7 @@ layer at (0,0) size 785x2766
                 text run at (1,1) width 30: "Data"
       RenderTable {TABLE} at (0,1196) size 90x127 [border: (10px solid #008000)]
         RenderBlock {CAPTION} at (20,0) size 70x60 [border: (3px solid #800080)]
                 text run at (1,1) width 30: "Data"
       RenderTable {TABLE} at (0,1196) size 90x127 [border: (10px solid #008000)]
         RenderBlock {CAPTION} at (20,0) size 70x60 [border: (3px solid #800080)]
-          RenderText {#text} at (22,3) size 51x54
+          RenderText {#text} at (22,3) size 50x54
             text run at (22,3) width 26: "The"
             text run at (15,21) width 40: "table's"
             text run at (10,39) width 50: "caption."
             text run at (22,3) width 26: "The"
             text run at (15,21) width 40: "table's"
             text run at (10,39) width 50: "caption."
@@ -206,7 +206,7 @@ layer at (0,0) size 785x2766
                 text run at (1,1) width 30: "Data"
       RenderTable {TABLE} at (0,1322) size 90x127 [border: (10px solid #008000)]
         RenderBlock {CAPTION} at (20,0) size 70x60 [border: (3px solid #800080)]
                 text run at (1,1) width 30: "Data"
       RenderTable {TABLE} at (0,1322) size 90x127 [border: (10px solid #008000)]
         RenderBlock {CAPTION} at (20,0) size 70x60 [border: (3px solid #800080)]
-          RenderText {#text} at (22,3) size 51x54
+          RenderText {#text} at (22,3) size 50x54
             text run at (22,3) width 26: "The"
             text run at (15,21) width 40: "table's"
             text run at (10,39) width 50: "caption."
             text run at (22,3) width 26: "The"
             text run at (15,21) width 40: "table's"
             text run at (10,39) width 50: "caption."
@@ -355,7 +355,7 @@ layer at (0,0) size 785x2766
                 text run at (1,1) width 30: "Data"
       RenderTable {TABLE} at (0,2290) size 90x127 [border: (10px solid #008000)]
         RenderBlock {CAPTION} at (0,0) size 70x60 [border: (3px solid #800080)]
                 text run at (1,1) width 30: "Data"
       RenderTable {TABLE} at (0,2290) size 90x127 [border: (10px solid #008000)]
         RenderBlock {CAPTION} at (0,0) size 70x60 [border: (3px solid #800080)]
-          RenderText {#text} at (22,3) size 51x54
+          RenderText {#text} at (22,3) size 50x54
             text run at (22,3) width 26: "The"
             text run at (15,21) width 40: "table's"
             text run at (10,39) width 50: "caption."
             text run at (22,3) width 26: "The"
             text run at (15,21) width 40: "table's"
             text run at (10,39) width 50: "caption."
@@ -376,7 +376,7 @@ layer at (0,0) size 785x2766
                 text run at (1,1) width 30: "Data"
       RenderTable {TABLE} at (15,2416) size 90x127 [border: (10px solid #008000)]
         RenderBlock {CAPTION} at (0,0) size 70x60 [border: (3px solid #800080)]
                 text run at (1,1) width 30: "Data"
       RenderTable {TABLE} at (15,2416) size 90x127 [border: (10px solid #008000)]
         RenderBlock {CAPTION} at (0,0) size 70x60 [border: (3px solid #800080)]
-          RenderText {#text} at (22,3) size 51x54
+          RenderText {#text} at (22,3) size 50x54
             text run at (22,3) width 26: "The"
             text run at (15,21) width 40: "table's"
             text run at (10,39) width 50: "caption."
             text run at (22,3) width 26: "The"
             text run at (15,21) width 40: "table's"
             text run at (10,39) width 50: "caption."
index 5225634..79bf638 100644 (file)
@@ -141,7 +141,7 @@ layer at (0,0) size 785x2466
           text run at (0,18) width 4: " "
       RenderTable {TABLE} at (0,602) size 252x175 [border: (1px none #808080)]
         RenderBlock {CAPTION} at (0,120) size 252x54
           text run at (0,18) width 4: " "
       RenderTable {TABLE} at (0,602) size 252x175 [border: (1px none #808080)]
         RenderBlock {CAPTION} at (0,120) size 252x54
-          RenderText {#text} at (11,0) size 239x54
+          RenderText {#text} at (11,0) size 240x54
             text run at (11,0) width 230: "Table 4 has this bottom caption. The"
             text run at (6,18) width 240: "table has specified column widths and"
             text run at (66,36) width 120: "collapsing borders."
             text run at (11,0) width 230: "Table 4 has this bottom caption. The"
             text run at (6,18) width 240: "table has specified column widths and"
             text run at (66,36) width 120: "collapsing borders."
index e11eb60..5d8865e 100644 (file)
@@ -1,3 +1,47 @@
+2014-04-20  Antti Koivisto  <antti@apple.com>
+
+        Text bounding box computation for simple line layout is wrong
+        https://bugs.webkit.org/show_bug.cgi?id=131912
+
+        Reviewed by Andreas Kling.
+
+        Top-left is currently the first line top-left which is not always correct.
+
+        * WebCore.exp.in:
+        * rendering/RenderText.cpp:
+        (WebCore::RenderText::firstRunLocation):
+        (WebCore::RenderText::firstRunOrigin): Deleted.
+        (WebCore::RenderText::firstRunX): Deleted.
+        (WebCore::RenderText::firstRunY): Deleted.
+        
+            Keep just one accessor and rename it.
+            Encapsulate the line box and simple line versions.
+
+        * rendering/RenderText.h:
+        * rendering/RenderTextLineBoxes.cpp:
+        (WebCore::RenderTextLineBoxes::firstRunLocation):
+
+            Line box version.
+
+        * rendering/RenderTextLineBoxes.h:
+        * rendering/RenderTreeAsText.cpp:
+        
+            Simplify RenderText dumping.
+
+        (WebCore::RenderTreeAsText::writeRenderObject):
+        * rendering/SimpleLineLayoutFunctions.cpp:
+        (WebCore::SimpleLineLayout::computeTextBoundingBox):
+        
+            Return the correct x position.
+
+        (WebCore::SimpleLineLayout::computeTextFirstRunLocation):
+        
+            Simple line version.
+
+        * rendering/SimpleLineLayoutFunctions.h:
+        * rendering/svg/SVGRenderTreeAsText.cpp:
+        (WebCore::writeSVGInlineText):
+
 2014-04-19  Zalan Bujtas  <zalan@apple.com>
 
         Subpixel rendering: RenderLayer's clipping should snap to device pixel boundaries.
 2014-04-19  Zalan Bujtas  <zalan@apple.com>
 
         Subpixel rendering: RenderLayer's clipping should snap to device pixel boundaries.
index 8aa9b90..3417ee6 100644 (file)
@@ -1479,9 +1479,8 @@ __ZNK7WebCore10Credential8passwordEv
 __ZNK7WebCore10FloatPointcv7CGPointEv
 __ZNK7WebCore10FontGlyphs17realizeFontDataAtERKNS_15FontDescriptionEj
 __ZNK7WebCore10PluginData16supportsMimeTypeERKN3WTF6StringENS0_18AllowedPluginTypesE
 __ZNK7WebCore10FloatPointcv7CGPointEv
 __ZNK7WebCore10FontGlyphs17realizeFontDataAtERKNS_15FontDescriptionEj
 __ZNK7WebCore10PluginData16supportsMimeTypeERKN3WTF6StringENS0_18AllowedPluginTypesE
+__ZNK7WebCore10RenderText16firstRunLocationEv
 __ZNK7WebCore10RenderText16linesBoundingBoxEv
 __ZNK7WebCore10RenderText16linesBoundingBoxEv
-__ZNK7WebCore10RenderText9firstRunXEv
-__ZNK7WebCore10RenderText9firstRunYEv
 __ZNK7WebCore10RenderView12documentRectEv
 __ZNK7WebCore10RenderView20unscaledDocumentRectEv
 __ZNK7WebCore10ScrollView12contentsSizeEv
 __ZNK7WebCore10RenderView12documentRectEv
 __ZNK7WebCore10RenderView20unscaledDocumentRectEv
 __ZNK7WebCore10ScrollView12contentsSizeEv
index 53cd444..4797930 100644 (file)
@@ -937,21 +937,14 @@ bool RenderText::containsOnlyWhitespace(unsigned from, unsigned len) const
     return currPos >= (from + len);
 }
 
     return currPos >= (from + len);
 }
 
-FloatPoint RenderText::firstRunOrigin() const
+IntPoint RenderText::firstRunLocation() const
 {
 {
-    return IntPoint(firstRunX(), firstRunY());
-}
+    if (auto* layout = simpleLineLayout())
+        return SimpleLineLayout::computeTextFirstRunLocation(*this, *layout);
 
 
-float RenderText::firstRunX() const
-{
-    return firstTextBox() ? firstTextBox()->x() : 0;
+    return m_lineBoxes.firstRunLocation();
 }
 
 }
 
-float RenderText::firstRunY() const
-{
-    return firstTextBox() ? firstTextBox()->y() : 0;
-}
-    
 void RenderText::setSelectionState(SelectionState state)
 {
     if (state != SelectionNone)
 void RenderText::setSelectionState(SelectionState state)
 {
     if (state != SelectionNone)
index c5fb343..53fbfef 100644 (file)
@@ -99,9 +99,7 @@ public:
     virtual IntRect linesBoundingBox() const;
     LayoutRect linesVisualOverflowBoundingBox() const;
 
     virtual IntRect linesBoundingBox() const;
     LayoutRect linesVisualOverflowBoundingBox() const;
 
-    FloatPoint firstRunOrigin() const;
-    float firstRunX() const;
-    float firstRunY() const;
+    IntPoint firstRunLocation() const;
 
     virtual void setText(const String&, bool force = false);
     void setTextWithOffset(const String&, unsigned offset, unsigned len, bool force = false);
 
     virtual void setText(const String&, bool force = false);
     void setTextWithOffset(const String&, unsigned offset, unsigned len, bool force = false);
index 45d5183..8ae0d60 100644 (file)
@@ -169,6 +169,13 @@ IntRect RenderTextLineBoxes::boundingBox(const RenderText& renderer) const
     return enclosingIntRect(FloatRect(x, y, width, height));
 }
 
     return enclosingIntRect(FloatRect(x, y, width, height));
 }
 
+IntPoint RenderTextLineBoxes::firstRunLocation() const
+{
+    if (!m_first)
+        return IntPoint();
+    return IntPoint(m_first->topLeft());
+}
+
 LayoutRect RenderTextLineBoxes::visualOverflowBoundingBox(const RenderText& renderer) const
 {
     if (!m_first)
 LayoutRect RenderTextLineBoxes::visualOverflowBoundingBox(const RenderText& renderer) const
 {
     if (!m_first)
index d0b570f..d87c6b1 100644 (file)
@@ -70,6 +70,7 @@ public:
     LayoutRect selectionRectForRange(unsigned start, unsigned end);
 
     IntRect boundingBox(const RenderText&) const;
     LayoutRect selectionRectForRange(unsigned start, unsigned end);
 
     IntRect boundingBox(const RenderText&) const;
+    IntPoint firstRunLocation() const;
     LayoutRect visualOverflowBoundingBox(const RenderText&) const;
 
     Vector<IntRect> absoluteRects(const LayoutPoint& accumulatedOffset) const;
     LayoutRect visualOverflowBoundingBox(const RenderText&) const;
 
     Vector<IntRect> absoluteRects(const LayoutPoint& accumulatedOffset) const;
index c7a7509..b841e05 100644 (file)
@@ -200,15 +200,8 @@ void RenderTreeAsText::writeRenderObject(TextStream& ts, const RenderObject& o,
         // FIXME: Would be better to dump the bounding box x and y rather than the first run's x and y, but that would involve updating
         // many test results.
         const RenderText& text = toRenderText(o);
         // FIXME: Would be better to dump the bounding box x and y rather than the first run's x and y, but that would involve updating
         // many test results.
         const RenderText& text = toRenderText(o);
-        IntRect linesBox = text.linesBoundingBox();
-        if (text.simpleLineLayout()) {
-            int y = linesBox.y();
-            if (text.containingBlock()->isTableCell())
-                y -= toRenderTableCell(o.containingBlock())->intrinsicPaddingBefore();
-            r = IntRect(linesBox.x(), y, linesBox.width(), linesBox.height());
-        } else
-            r = IntRect(text.firstRunX(), text.firstRunY(), linesBox.width(), linesBox.height());
-        if (adjustForTableCells && !text.firstTextBox())
+        r = IntRect(text.firstRunLocation(), text.linesBoundingBox().size());
+        if (!text.firstTextBox() && !text.simpleLineLayout())
             adjustForTableCells = false;
     } else if (o.isBR()) {
         const RenderLineBreak& br = toRenderLineBreak(o);
             adjustForTableCells = false;
     } else if (o.isBR()) {
         const RenderLineBreak& br = toRenderLineBreak(o);
index d454bfa..e050049 100644 (file)
@@ -160,13 +160,22 @@ IntRect computeTextBoundingBox(const RenderText& textRenderer, const Layout& lay
         if (rect.maxY() > bottom)
             bottom = rect.maxY();
     }
         if (rect.maxY() > bottom)
             bottom = rect.maxY();
     }
-    float x = firstLineRect.x();
+    float x = left;
     float y = firstLineRect.y();
     float width = right - left;
     float height = bottom - y;
     return enclosingIntRect(FloatRect(x, y, width, height));
 }
 
     float y = firstLineRect.y();
     float width = right - left;
     float height = bottom - y;
     return enclosingIntRect(FloatRect(x, y, width, height));
 }
 
+IntPoint computeTextFirstRunLocation(const RenderText& textRenderer, const Layout& layout)
+{
+    auto resolver = runResolver(toRenderBlockFlow(*textRenderer.parent()), layout);
+    auto begin = resolver.begin();
+    if (begin == resolver.end())
+        return IntPoint();
+    return flooredIntPoint((*begin).rect().location());
+}
+
 Vector<IntRect> collectTextAbsoluteRects(const RenderText& textRenderer, const Layout& layout, const LayoutPoint& accumulatedOffset)
 {
     Vector<IntRect> rects;
 Vector<IntRect> collectTextAbsoluteRects(const RenderText& textRenderer, const Layout& layout, const LayoutPoint& accumulatedOffset)
 {
     Vector<IntRect> rects;
index 8444f2f..99d1aaf 100644 (file)
@@ -55,6 +55,7 @@ bool containsTextCaretOffset(const RenderText&, const Layout&, unsigned);
 unsigned findTextCaretMinimumOffset(const RenderText&, const Layout&);
 unsigned findTextCaretMaximumOffset(const RenderText&, const Layout&);
 IntRect computeTextBoundingBox(const RenderText&, const Layout&);
 unsigned findTextCaretMinimumOffset(const RenderText&, const Layout&);
 unsigned findTextCaretMaximumOffset(const RenderText&, const Layout&);
 IntRect computeTextBoundingBox(const RenderText&, const Layout&);
+IntPoint computeTextFirstRunLocation(const RenderText&, const Layout&);
 
 Vector<IntRect> collectTextAbsoluteRects(const RenderText&, const Layout&, const LayoutPoint& accumulatedOffset);
 Vector<FloatQuad> collectTextAbsoluteQuads(const RenderText&, const Layout&, bool* wasFixed);
 
 Vector<IntRect> collectTextAbsoluteRects(const RenderText&, const Layout&, const LayoutPoint& accumulatedOffset);
 Vector<FloatQuad> collectTextAbsoluteQuads(const RenderText&, const Layout&, bool* wasFixed);
index 874f367..cfeee9b 100644 (file)
@@ -582,7 +582,7 @@ void writeSVGText(TextStream& ts, const RenderSVGText& text, int indent)
 void writeSVGInlineText(TextStream& ts, const RenderSVGInlineText& text, int indent)
 {
     writeStandardPrefix(ts, text, indent);
 void writeSVGInlineText(TextStream& ts, const RenderSVGInlineText& text, int indent)
 {
     writeStandardPrefix(ts, text, indent);
-    ts << " " << enclosingIntRect(FloatRect(text.firstRunOrigin(), text.floatLinesBoundingBox().size())) << "\n";
+    ts << " " << enclosingIntRect(FloatRect(text.firstRunLocation(), text.floatLinesBoundingBox().size())) << "\n";
     writeResources(ts, text, indent);
     writeSVGInlineTextBoxes(ts, text, indent);
 }
     writeResources(ts, text, indent);
     writeSVGInlineTextBoxes(ts, text, indent);
 }
index aa66d7a..a68e6cb 100644 (file)
@@ -114,8 +114,9 @@ static WebRenderNode *copyRenderNode(RenderObject* node)
     } else if (node->isText()) {
         // FIXME: Preserve old behavior even though it's strange.
         RenderText* text = toRenderText(node);
     } else if (node->isText()) {
         // FIXME: Preserve old behavior even though it's strange.
         RenderText* text = toRenderText(node);
-        x = text->firstRunX();
-        y = text->firstRunY();
+        IntPoint firstRunLocation = text->firstRunLocation();
+        x = firstRunLocation.x();
+        y = firstRunLocation.y();
         IntRect box = text->linesBoundingBox();
         width = box.width();
         height = box.height();
         IntRect box = text->linesBoundingBox();
         width = box.width();
         height = box.height();
index 3b44988..d4646cd 100644 (file)
@@ -90,8 +90,7 @@ WebRenderObject::WebRenderObject(RenderObject* renderer, bool shouldIncludeDesce
         m_frameRect = toRenderBox(renderer)->pixelSnappedFrameRect();
     else if (renderer->isText()) {
         m_frameRect = toRenderText(renderer)->linesBoundingBox();
         m_frameRect = toRenderBox(renderer)->pixelSnappedFrameRect();
     else if (renderer->isText()) {
         m_frameRect = toRenderText(renderer)->linesBoundingBox();
-        m_frameRect.setX(toRenderText(renderer)->firstRunX());
-        m_frameRect.setY(toRenderText(renderer)->firstRunY());
+        m_frameRect.setLocation(toRenderText(renderer)->firstRunLocation());
     } else if (renderer->isRenderInline())
         m_frameRect = toRenderBoxModelObject(renderer)->borderBoundingBox();
 
     } else if (renderer->isRenderInline())
         m_frameRect = toRenderBoxModelObject(renderer)->borderBoundingBox();