Simple line layout: Add word-spacing support.
authorzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 19 Nov 2015 22:29:21 +0000 (22:29 +0000)
committerzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 19 Nov 2015 22:29:21 +0000 (22:29 +0000)
https://bugs.webkit.org/show_bug.cgi?id=151420

Reviewed by Antti Koivisto.

Source/WebCore:

This enables us to use simple line layout on word-spacing content.

Test: fast/text/simple-line-wordspacing.html

* rendering/SimpleLineLayout.cpp:
(WebCore::SimpleLineLayout::createLineRuns):
(WebCore::SimpleLineLayout::canUseForStyle): Deleted.
* rendering/SimpleLineLayoutTextFragmentIterator.cpp:
(WebCore::SimpleLineLayout::TextFragmentIterator::Style::Style):
(WebCore::SimpleLineLayout::TextFragmentIterator::skipToNextPosition):
(WebCore::SimpleLineLayout::TextFragmentIterator::runWidth):
* rendering/SimpleLineLayoutTextFragmentIterator.h:

LayoutTests:

Some rebaselining is needed since inline box layout does not compute text run width properly (see webkit.org/b/151452)

* fast/text/simple-line-wordspacing-expected.html: Added.
* fast/text/simple-line-wordspacing.html: Added.
* platform/mac/css1/text_properties/word_spacing-expected.txt:
* platform/mac/fast/css/word-space-extra-expected.txt:
* platform/mac/fast/text/atsui-negative-spacing-features-expected.txt:
* platform/mac/fast/text/atsui-spacing-features-expected.txt:
* platform/mac/fast/text/basic/004-expected.txt:
* platform/mac/fast/text/basic/005-expected.txt:
* platform/mac/fast/text/word-space-expected.txt:
* platform/mac/svg/custom/svg-fonts-word-spacing-expected.txt:

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

15 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/text/simple-line-wordspacing-expected.html [new file with mode: 0644]
LayoutTests/fast/text/simple-line-wordspacing.html [new file with mode: 0644]
LayoutTests/platform/mac/css1/text_properties/word_spacing-expected.txt
LayoutTests/platform/mac/fast/css/word-space-extra-expected.txt
LayoutTests/platform/mac/fast/text/atsui-negative-spacing-features-expected.txt
LayoutTests/platform/mac/fast/text/atsui-spacing-features-expected.txt
LayoutTests/platform/mac/fast/text/basic/004-expected.txt
LayoutTests/platform/mac/fast/text/basic/005-expected.txt
LayoutTests/platform/mac/fast/text/word-space-expected.txt
LayoutTests/platform/mac/svg/custom/svg-fonts-word-spacing-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/rendering/SimpleLineLayout.cpp
Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.cpp
Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.h

index 6d402a2..0042798 100644 (file)
@@ -1,3 +1,23 @@
+2015-11-19  Zalan Bujtas  <zalan@apple.com>
+
+        Simple line layout: Add word-spacing support.
+        https://bugs.webkit.org/show_bug.cgi?id=151420
+
+        Reviewed by Antti Koivisto.
+
+        Some rebaselining is needed since inline box layout does not compute text run width properly (see webkit.org/b/151452)
+
+        * fast/text/simple-line-wordspacing-expected.html: Added.
+        * fast/text/simple-line-wordspacing.html: Added.
+        * platform/mac/css1/text_properties/word_spacing-expected.txt:
+        * platform/mac/fast/css/word-space-extra-expected.txt:
+        * platform/mac/fast/text/atsui-negative-spacing-features-expected.txt:
+        * platform/mac/fast/text/atsui-spacing-features-expected.txt:
+        * platform/mac/fast/text/basic/004-expected.txt:
+        * platform/mac/fast/text/basic/005-expected.txt:
+        * platform/mac/fast/text/word-space-expected.txt:
+        * platform/mac/svg/custom/svg-fonts-word-spacing-expected.txt:
+
 2015-11-19  Ryan Haddad  <ryanhaddad@apple.com>
 
         Marking storage/indexeddb/modern/cursor-4.html as flaky on mac-wk1
diff --git a/LayoutTests/fast/text/simple-line-wordspacing-expected.html b/LayoutTests/fast/text/simple-line-wordspacing-expected.html
new file mode 100644 (file)
index 0000000..fa84317
--- /dev/null
@@ -0,0 +1,23 @@
+<html>
+<head>
+<title>This tests that simple line layout renders word-spacing properly.</title>
+<body>
+<script>
+if (window.internals)
+       internals.settings.setSimpleLineLayoutEnabled(false);
+for (var i = -6; i < 15; ++i) {
+    var element = document.createElement("div");
+    element.innerHTML = "a b   c d     e f     g";
+    element.style.wordSpacing = i;
+       document.body.appendChild(element);
+}
+for (var i = -6; i < 15; ++i) {
+    var element = document.createElement("div");
+    element.innerHTML = "a b   c  d            e   f                   g    h                          j";
+    element.style.wordSpacing = i;
+    element.style.whiteSpace = "pre-wrap";
+       document.body.appendChild(element);
+}
+</script>
+</body>
+</html>
diff --git a/LayoutTests/fast/text/simple-line-wordspacing.html b/LayoutTests/fast/text/simple-line-wordspacing.html
new file mode 100644 (file)
index 0000000..ae94435
--- /dev/null
@@ -0,0 +1,21 @@
+<html>
+<head>
+<title>This tests that simple line layout renders word-spacing properly.</title>
+<body>
+<script>
+for (var i = -6; i < 15; ++i) {
+    var element = document.createElement("div");
+    element.innerHTML = "a b   c d     e f     g";
+    element.style.wordSpacing = i;
+       document.body.appendChild(element);
+}
+for (var i = -6; i < 15; ++i) {
+    var element = document.createElement("div");
+    element.innerHTML = "a b   c  d            e   f                   g    h                          j";
+    element.style.wordSpacing = i;
+    element.style.whiteSpace = "pre-wrap";
+       document.body.appendChild(element);
+}
+</script>
+</body>
+</html>
index b896fa0..cf22368 100644 (file)
@@ -21,26 +21,26 @@ layer at (0,0) size 785x914
           text run at (0,150) width 0: " "
       RenderBlock {HR} at (0,212) size 769x2 [border: (1px inset #000000)]
       RenderBlock {P} at (0,230) size 769x18
-        RenderText {#text} at (0,0) size 688x18
-          text run at (0,0) width 688: "This words in this sentence should have extra space between them."
+        RenderText {#text} at (0,0) size 716x18
+          text run at (0,0) width 716: "This words in this sentence should have extra space between them."
       RenderBlock {P} at (0,264) size 769x18
-        RenderText {#text} at (0,0) size 598x18
-          text run at (0,0) width 598: "This words in this sentence should have extra space between them."
+        RenderText {#text} at (0,0) size 617x18
+          text run at (0,0) width 617: "This words in this sentence should have extra space between them."
       RenderBlock {P} at (0,298) size 769x18
-        RenderText {#text} at (0,0) size 598x18
-          text run at (0,0) width 598: "This words in this sentence should have extra space between them."
+        RenderText {#text} at (0,0) size 617x18
+          text run at (0,0) width 617: "This words in this sentence should have extra space between them."
       RenderBlock {P} at (0,332) size 769x18
-        RenderText {#text} at (0,0) size 464x18
-          text run at (0,0) width 464: "This words in this sentence should have extra space between them."
+        RenderText {#text} at (0,0) size 468x18
+          text run at (0,0) width 468: "This words in this sentence should have extra space between them."
       RenderBlock {P} at (0,366) size 769x18
-        RenderText {#text} at (0,0) size 464x18
-          text run at (0,0) width 464: "This words in this sentence should have extra space between them."
+        RenderText {#text} at (0,0) size 468x18
+          text run at (0,0) width 468: "This words in this sentence should have extra space between them."
       RenderBlock {P} at (0,400) size 769x18
-        RenderText {#text} at (0,0) size 572x18
-          text run at (0,0) width 572: "This words in this sentence should have extra space between them."
+        RenderText {#text} at (0,0) size 588x18
+          text run at (0,0) width 588: "This words in this sentence should have extra space between them."
       RenderBlock {P} at (0,434) size 769x18
-        RenderText {#text} at (0,0) size 493x18
-          text run at (0,0) width 493: "This words in this sentence should have extra space between them."
+        RenderText {#text} at (0,0) size 500x18
+          text run at (0,0) width 500: "This words in this sentence should have extra space between them."
       RenderBlock {P} at (0,468) size 769x36
         RenderText {#text} at (0,0) size 758x18
           text run at (0,0) width 758: "This words in this sentence should have extra space between them, but the last few words in the sentence"
@@ -50,8 +50,8 @@ layer at (0,0) size 785x914
         RenderText {#text} at (179,18) size 5x18
           text run at (179,18) width 5: "."
       RenderBlock {P} at (0,520) size 769x18
-        RenderText {#text} at (0,0) size 719x18
-          text run at (0,0) width 719: "This words in this sentence should have reduced space between them, since negative values are allowed on this property."
+        RenderText {#text} at (0,0) size 716x18
+          text run at (0,0) width 716: "This words in this sentence should have reduced space between them, since negative values are allowed on this property."
       RenderTable {TABLE} at (0,554) size 769x344 [border: (1px outset #808080)]
         RenderTableSection {TBODY} at (1,1) size 767x342
           RenderTableRow {TR} at (0,0) size 767x26
@@ -65,26 +65,26 @@ layer at (0,0) size 785x914
                 text run at (4,4) width 4: " "
             RenderTableCell {TD} at (12,26) size 755x316 [border: (1px inset #808080)] [r=1 c=1 rs=1 cs=1]
               RenderBlock {P} at (4,4) size 747x18
-                RenderText {#text} at (0,0) size 688x18
-                  text run at (0,0) width 688: "This words in this sentence should have extra space between them."
+                RenderText {#text} at (0,0) size 716x18
+                  text run at (0,0) width 716: "This words in this sentence should have extra space between them."
               RenderBlock {P} at (4,38) size 747x18
-                RenderText {#text} at (0,0) size 598x18
-                  text run at (0,0) width 598: "This words in this sentence should have extra space between them."
+                RenderText {#text} at (0,0) size 617x18
+                  text run at (0,0) width 617: "This words in this sentence should have extra space between them."
               RenderBlock {P} at (4,72) size 747x18
-                RenderText {#text} at (0,0) size 598x18
-                  text run at (0,0) width 598: "This words in this sentence should have extra space between them."
+                RenderText {#text} at (0,0) size 617x18
+                  text run at (0,0) width 617: "This words in this sentence should have extra space between them."
               RenderBlock {P} at (4,106) size 747x18
-                RenderText {#text} at (0,0) size 464x18
-                  text run at (0,0) width 464: "This words in this sentence should have extra space between them."
+                RenderText {#text} at (0,0) size 468x18
+                  text run at (0,0) width 468: "This words in this sentence should have extra space between them."
               RenderBlock {P} at (4,140) size 747x18
-                RenderText {#text} at (0,0) size 464x18
-                  text run at (0,0) width 464: "This words in this sentence should have extra space between them."
+                RenderText {#text} at (0,0) size 468x18
+                  text run at (0,0) width 468: "This words in this sentence should have extra space between them."
               RenderBlock {P} at (4,174) size 747x18
-                RenderText {#text} at (0,0) size 572x18
-                  text run at (0,0) width 572: "This words in this sentence should have extra space between them."
+                RenderText {#text} at (0,0) size 588x18
+                  text run at (0,0) width 588: "This words in this sentence should have extra space between them."
               RenderBlock {P} at (4,208) size 747x18
-                RenderText {#text} at (0,0) size 493x18
-                  text run at (0,0) width 493: "This words in this sentence should have extra space between them."
+                RenderText {#text} at (0,0) size 500x18
+                  text run at (0,0) width 500: "This words in this sentence should have extra space between them."
               RenderBlock {P} at (4,242) size 747x36
                 RenderText {#text} at (0,0) size 694x36
                   text run at (0,0) width 694: "This words in this sentence should have extra space between them, but the last few words in the"
@@ -95,5 +95,5 @@ layer at (0,0) size 785x914
                 RenderText {#text} at (243,18) size 5x18
                   text run at (243,18) width 5: "."
               RenderBlock {P} at (4,294) size 747x18
-                RenderText {#text} at (0,0) size 719x18
-                  text run at (0,0) width 719: "This words in this sentence should have reduced space between them, since negative values are allowed on this property."
+                RenderText {#text} at (0,0) size 716x18
+                  text run at (0,0) width 716: "This words in this sentence should have reduced space between them, since negative values are allowed on this property."
index c06b97d..f3cffc8 100644 (file)
@@ -8,8 +8,8 @@ layer at (0,0) size 785x2404
           text run at (0,0) width 139: "word-spacing"
       RenderBlock (floating) {PRE} at (0,60) size 986x169
         RenderBlock {H3} at (0,15) size 986x18
-          RenderText {#text} at (0,0) size 205x17
-            text run at (0,0) width 205: "In a floated pre"
+          RenderText {#text} at (0,0) size 145x17
+            text run at (0,0) width 145: "In a floated pre"
         RenderBlock (anonymous) at (0,47) size 986x121
           RenderText {#text} at (0,0) size 257x30
             text run at (0,0) width 0: " "
@@ -148,8 +148,8 @@ layer at (0,0) size 785x2404
         RenderBR {BR} at (985,0) size 1x18
       RenderBlock {PRE} at (0,256) size 769x153
         RenderBlock {H3} at (0,0) size 769x17
-          RenderText {#text} at (0,0) size 241x17
-            text run at (0,0) width 241: "In an un-floated pre"
+          RenderText {#text} at (0,0) size 181x17
+            text run at (0,0) width 181: "In an un-floated pre"
         RenderBlock (anonymous) at (0,32) size 769x121
           RenderText {#text} at (0,0) size 257x30
             text run at (0,0) width 0: " "
@@ -289,8 +289,8 @@ layer at (0,0) size 785x2404
           RenderText {#text} at (0,0) size 0x0
       RenderBlock (anonymous) at (0,427) size 769x23
         RenderBlock {H3} at (0,0) size 769x22
-          RenderText {#text} at (0,0) size 95x22
-            text run at (0,0) width 95: "In a span"
+          RenderText {#text} at (0,0) size 115x22
+            text run at (0,0) width 115: "In a span"
       RenderBlock (anonymous) at (0,468) size 769x271
         RenderInline {SPAN} at (0,0) size 868x234
           RenderText {#text} at (0,0) size 179x18
@@ -895,8 +895,8 @@ layer at (0,0) size 785x2404
           text run at (0,0) width 133: "both-spacing"
       RenderBlock (floating) {PRE} at (0,1608) size 1451x168
         RenderBlock {H3} at (0,15) size 1451x18
-          RenderText {#text} at (0,0) size 285x17
-            text run at (0,0) width 285: "In a floated pre"
+          RenderText {#text} at (0,0) size 225x17
+            text run at (0,0) width 225: "In a floated pre"
         RenderBlock (anonymous) at (0,47) size 1451x121
           RenderText {#text} at (0,0) size 537x30
             text run at (0,0) width 0: " "
@@ -1035,8 +1035,8 @@ layer at (0,0) size 785x2404
         RenderBR {BR} at (1450,0) size 1x18
       RenderBlock {PRE} at (0,1803) size 769x153
         RenderBlock {H3} at (0,0) size 769x17
-          RenderText {#text} at (0,0) size 341x17
-            text run at (0,0) width 341: "In an un-floated pre"
+          RenderText {#text} at (0,0) size 281x17
+            text run at (0,0) width 281: "In an un-floated pre"
         RenderBlock (anonymous) at (0,32) size 769x121
           RenderText {#text} at (0,0) size 537x30
             text run at (0,0) width 0: " "
@@ -1177,8 +1177,8 @@ layer at (0,0) size 785x2404
           RenderText {#text} at (0,0) size 0x0
       RenderBlock (anonymous) at (0,2005) size 769x23
         RenderBlock {H3} at (0,0) size 769x22
-          RenderText {#text} at (0,0) size 140x22
-            text run at (0,0) width 140: "In a span"
+          RenderText {#text} at (0,0) size 160x22
+            text run at (0,0) width 160: "In a span"
       RenderBlock (anonymous) at (0,2046) size 769x343
         RenderInline {SPAN} at (0,0) size 862x342
           RenderText {#text} at (0,0) size 428x18
index e14a864..9c93de5 100644 (file)
@@ -32,9 +32,9 @@ layer at (0,0) size 800x246
                     text run at (1,1) width 174: "Lore\x{300}m ipsum dolor sit ame\x{300}t,"
                     text run at (1,19) width 175: "consectetuer adipiscing e\x{300}lit."
                 RenderBlock {DIV} at (0,86) size 202x38 [border: (1px solid #008000)]
-                  RenderText {#text} at (1,1) size 177x36
-                    text run at (1,1) width 176: "Lorem ipsum dolor sit amet,"
-                    text run at (1,19) width 177: "consectetuer adipiscing elit."
+                  RenderText {#text} at (1,1) size 175x36
+                    text run at (1,1) width 174: "Lorem ipsum dolor sit amet,"
+                    text run at (1,19) width 175: "consectetuer adipiscing elit."
             RenderTableCell {TD} at (208,24) size 205x126 [r=1 c=1 rs=1 cs=1]
               RenderBlock {DIV} at (1,1) size 203x124
                 RenderBlock {DIV} at (0,0) size 202x38 [border: (1px solid #0000FF)]
index 91f2cb5..006e4da 100644 (file)
@@ -46,10 +46,10 @@ layer at (0,0) size 800x372
                     text run at (1,19) width 130: "ame\x{300}t, consectetuer"
                     text run at (1,37) width 105: "adipiscing e\x{300}lit."
                 RenderBlock {DIV} at (0,122) size 202x56 [border: (1px solid #008000)]
-                  RenderText {#text} at (1,1) size 163x54
-                    text run at (1,1) width 163: "Lorem ipsum dolor sit"
-                    text run at (1,19) width 120: "amet, consectetuer"
-                    text run at (1,37) width 95: "adipiscing elit."
+                  RenderText {#text} at (1,1) size 173x54
+                    text run at (1,1) width 173: "Lorem ipsum dolor sit"
+                    text run at (1,19) width 130: "amet, consectetuer"
+                    text run at (1,37) width 105: "adipiscing elit."
             RenderTableCell {TD} at (208,24) size 205x234 [r=1 c=1 rs=1 cs=1]
               RenderBlock {DIV} at (1,1) size 203x232
                 RenderBlock {DIV} at (0,0) size 202x74 [border: (1px solid #0000FF)]
index 8fb1b9d..dc68a06 100644 (file)
@@ -4,19 +4,19 @@ layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
       RenderBlock (floating) {P} at (0,16) size 652x22 [border: (2px solid #008000)]
-        RenderText {#text} at (2,2) size 618x18
-          text run at (2,2) width 618: "There should be 30px of word spacing between each word."
+        RenderText {#text} at (2,2) size 648x18
+          text run at (2,2) width 648: "There should be 30px of word spacing between each word."
       RenderBlock {DIV} at (0,0) size 784x100
       RenderTable {TABLE} at (0,100) size 100x130
         RenderTableSection {TBODY} at (0,0) size 100x130
           RenderTableRow {TR} at (0,0) size 100x130
             RenderTableCell {TD} at (0,0) size 100x130 [r=0 c=0 rs=1 cs=1]
               RenderBlock {P} at (0,0) size 100x130 [border: (2px solid #008000)]
-                RenderText {#text} at (2,2) size 71x126
+                RenderText {#text} at (2,2) size 86x126
                   text run at (2,2) width 38: "There"
-                  text run at (2,20) width 62: "should be"
-                  text run at (2,38) width 50: "15px of"
+                  text run at (2,20) width 77: "should be"
+                  text run at (2,38) width 65: "15px of"
                   text run at (2,56) width 33: "word"
                   text run at (2,74) width 49: "spacing"
                   text run at (2,92) width 54: "between"
-                  text run at (2,110) width 71: "each word."
+                  text run at (2,110) width 86: "each word."
index c013f8d..9d24ee8 100644 (file)
@@ -4,5 +4,5 @@ layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
       RenderBlock (floating) {DIV} at (0,0) size 263x22 [border: (2px solid #008000)]
-        RenderText {#text} at (2,2) size 264x18
-          text run at (2,2) width 264: "Words should have a negative spacing of 5px."
+        RenderText {#text} at (2,2) size 259x18
+          text run at (2,2) width 259: "Words should have a negative spacing of 5px."
index 3f9e973..28880f7 100644 (file)
@@ -20,11 +20,11 @@ layer at (0,0) size 800x600
         RenderText {#text} at (0,0) size 267x18
           text run at (0,0) width 267: "The next 7 lines should all look the same."
       RenderBlock (floating) {DIV} at (0,86) size 82x24 [border: (3px solid #000000)]
-        RenderText {#text} at (3,3) size 26x18
-          text run at (3,3) width 26: "A B"
+        RenderText {#text} at (3,3) size 76x18
+          text run at (3,3) width 76: "A B"
       RenderBlock (floating) {DIV} at (0,110) size 82x24 [border: (3px solid #000000)]
-        RenderText {#text} at (3,3) size 26x18
-          text run at (3,3) width 26: "A B"
+        RenderText {#text} at (3,3) size 76x18
+          text run at (3,3) width 76: "A B"
       RenderBlock (floating) {DIV} at (0,134) size 83x24 [border: (3px solid #000000)]
         RenderInline {SPAN} at (0,0) size 12x18
           RenderText {#text} at (3,3) size 12x18
index 520e948..c2cdd04 100644 (file)
@@ -13,8 +13,8 @@ layer at (0,0) size 800x600
         RenderText {#text} at (0,0) size 300x18
           text run at (0,0) width 300: "word-spacing: 100px, all should look the same"
       RenderBlock {P} at (0,110) size 784x20
-        RenderText {#text} at (0,1) size 170x18
-          text run at (0,1) width 170: "abc abc abc"
+        RenderText {#text} at (0,1) size 270x18
+          text run at (0,1) width 270: "abc abc abc"
       RenderBlock {P} at (0,148) size 784x20
         RenderText {#text} at (0,1) size 126x18
           text run at (0,1) width 126: "abc "
index f0e64ba..06d9108 100644 (file)
@@ -1,3 +1,23 @@
+2015-11-19  Zalan Bujtas  <zalan@apple.com>
+
+        Simple line layout: Add word-spacing support.
+        https://bugs.webkit.org/show_bug.cgi?id=151420
+
+        Reviewed by Antti Koivisto.
+
+        This enables us to use simple line layout on word-spacing content.
+
+        Test: fast/text/simple-line-wordspacing.html
+
+        * rendering/SimpleLineLayout.cpp:
+        (WebCore::SimpleLineLayout::createLineRuns):
+        (WebCore::SimpleLineLayout::canUseForStyle): Deleted.
+        * rendering/SimpleLineLayoutTextFragmentIterator.cpp:
+        (WebCore::SimpleLineLayout::TextFragmentIterator::Style::Style):
+        (WebCore::SimpleLineLayout::TextFragmentIterator::skipToNextPosition):
+        (WebCore::SimpleLineLayout::TextFragmentIterator::runWidth):
+        * rendering/SimpleLineLayoutTextFragmentIterator.h:
+
 2015-11-19  Brady Eidson  <beidson@apple.com>
 
         Modern IDB: IDBObjectStore.deleteIndex() support.
index 816e128..d4c9ab9 100644 (file)
@@ -122,8 +122,6 @@ static bool canUseForStyle(const RenderStyle& style)
         return false;
     if (!style.textIndent().isZero())
         return false;
-    if (!style.wordSpacing().isZero())
-        return false;
     if (!style.isLeftToRightDirection())
         return false;
     if (style.lineBoxContain() != RenderStyle::initialLineBoxContain())
@@ -541,7 +539,7 @@ static void forceFragmentToLine(LineState& line, TextFragmentIterator& textFragm
 static bool createLineRuns(LineState& line, const LineState& previousLine, Layout::RunVector& runs, TextFragmentIterator& textFragmentIterator)
 {
     const auto& style = textFragmentIterator.style();
-    line.setCollapedWhitespaceWidth(style.spaceWidth);
+    line.setCollapedWhitespaceWidth(style.spaceWidth + style.wordSpacing);
     bool lineCanBeWrapped = style.wrapLines || style.breakWordOnOverflow;
     auto fragment = firstFragment(textFragmentIterator, line, previousLine, runs);
     while (fragment.type() != TextFragmentIterator::TextFragment::ContentEnd) {
index 49a1adf..1cd7d6f 100644 (file)
@@ -41,6 +41,7 @@ TextFragmentIterator::Style::Style(const RenderStyle& style)
     , wrapLines(style.autoWrap())
     , breakWordOnOverflow(style.overflowWrap() == BreakOverflowWrap && (wrapLines || preserveNewline))
     , spaceWidth(font.width(TextRun(StringView(&space, 1))))
+    , wordSpacing(font.wordSpacing())
     , tabWidth(collapseWhitespace ? 0 : style.tabSize())
     , locale(style.locale())
 {
@@ -182,12 +183,12 @@ unsigned TextFragmentIterator::skipToNextPosition(PositionType positionType, uns
     width = 0;
     if (nextPosition == currentPosition)
         return currentPosition;
+    // Both non-collapsed whitespace and non-whitespace runs need to be measured.
     bool measureText = positionType != NonWhitespace || !m_style.collapseWhitespace;
-    if (measureText) {
-        float textWidth = this->textWidth(currentPosition, nextPosition, xPosition);
-        width += textWidth;
-    } else if (startPosition < nextPosition)
-        width = m_style.spaceWidth;
+    if (measureText)
+        width = this->textWidth(currentPosition, nextPosition, xPosition);
+    else if (startPosition < nextPosition)
+        width = m_style.spaceWidth + m_style.wordSpacing;
     return nextPosition;
 }
 
@@ -207,7 +208,7 @@ float TextFragmentIterator::runWidth(const FlowContents::Segment& segment, unsig
     run.setTabSize(!!m_style.tabWidth, m_style.tabWidth);
     float width = m_style.font.width(run);
     if (measureWithEndSpace)
-        width -= m_style.spaceWidth;
+        width -= (m_style.spaceWidth + m_style.wordSpacing);
     return std::max<float>(0, width);
 }
 
index 72cbe85..9275a99 100644 (file)
@@ -108,6 +108,7 @@ public:
         bool wrapLines;
         bool breakWordOnOverflow;
         float spaceWidth;
+        float wordSpacing;
         unsigned tabWidth;
         AtomicString locale;
     };