Source/WebCore: <rdar://problem/10561285> REGRESSION (r80438): First word on a line...
authormitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 11 Dec 2011 19:06:56 +0000 (19:06 +0000)
committermitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 11 Dec 2011 19:06:56 +0000 (19:06 +0000)
https://bugs.webkit.org/show_bug.cgi?id=74239

Reviewed by Anders Carlsson.

Tests: fast/text/hyphenate-first-word-after-skipped-space-expected.html
       fast/text/hyphenate-first-word-after-skipped-space.html

* rendering/RenderBlockLineLayout.cpp:
(WebCore::tryHyphenating): Replaced the assumption that the character at lastSpace is a space
iff lastSpace is non-zero with a test of whether it is a space, in the sense that it should
not be counted as part of the prefix when comparing it to the value of hyphenate-limit-before.

LayoutTests: Test and updated results for <rdar://problem/10561285> REGRESSION (r80438): First word on a line or after collapsed space may not be hyphenated even though it should
https://bugs.webkit.org/show_bug.cgi?id=74239

Reviewed by Anders Carlsson.

* fast/text/hyphenate-first-word-after-skipped-space-expected.html: Added.
* fast/text/hyphenate-first-word-after-skipped-space.html: Added.
* platform/mac/fast/text/hyphenate-limit-lines-expected.txt:

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

LayoutTests/ChangeLog
LayoutTests/fast/text/hyphenate-first-word-after-skipped-space-expected.html [new file with mode: 0644]
LayoutTests/fast/text/hyphenate-first-word-after-skipped-space.html [new file with mode: 0644]
LayoutTests/platform/mac/fast/text/hyphenate-limit-lines-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/rendering/RenderBlockLineLayout.cpp

index 8a74e658c8f7300e7719be3fa3031f32b8d71c5a..410e70167aa44df8641637abd845cce85c1c2c18 100644 (file)
@@ -1,3 +1,14 @@
+2011-12-11  Dan Bernstein  <mitz@apple.com>
+
+        Test and updated results for <rdar://problem/10561285> REGRESSION (r80438): First word on a line or after collapsed space may not be hyphenated even though it should
+        https://bugs.webkit.org/show_bug.cgi?id=74239
+
+        Reviewed by Anders Carlsson.
+
+        * fast/text/hyphenate-first-word-after-skipped-space-expected.html: Added.
+        * fast/text/hyphenate-first-word-after-skipped-space.html: Added.
+        * platform/mac/fast/text/hyphenate-limit-lines-expected.txt:
+
 2011-12-09  Robert Hogan  <robert@webkit.org>
 
         CSS 2.1 failure: numerous counter-increment-* tests fail
diff --git a/LayoutTests/fast/text/hyphenate-first-word-after-skipped-space-expected.html b/LayoutTests/fast/text/hyphenate-first-word-after-skipped-space-expected.html
new file mode 100644 (file)
index 0000000..3c33a51
--- /dev/null
@@ -0,0 +1,14 @@
+<style>
+    div {
+        -webkit-locale: "en_US";
+        -webkit-hyphens: auto;
+        -webkit-hyphenate-limit-before: 2;
+        width: 40px;
+        border: solid;
+        margin: 8px;
+    }
+</style>
+<div>Undone.</div>
+<div>Undone.</div>
+<div>Simply <!-- -->undone.</div>
+<div>I undid it.</div>
diff --git a/LayoutTests/fast/text/hyphenate-first-word-after-skipped-space.html b/LayoutTests/fast/text/hyphenate-first-word-after-skipped-space.html
new file mode 100644 (file)
index 0000000..098811a
--- /dev/null
@@ -0,0 +1,16 @@
+<style>
+    div {
+        -webkit-locale: "en_US";
+        -webkit-hyphens: auto;
+        -webkit-hyphenate-limit-before: 2;
+        width: 40px;
+        border: solid;
+        margin: 8px;
+    }
+</style>
+<div>Undone.</div>
+<div>
+    Undone.
+</div>
+<div>Simply undone.</div>
+<div>I  undid it.</div>
index f0fe6c5c02c930001f71d141deb8a49bd651ff53..aa8a01fd1efb71d1a52d895d855266ee49214caf 100644 (file)
@@ -78,15 +78,16 @@ layer at (0,0) size 785x1066
           text run at (1,125) width 200: "elements, or of"
           text run at (1,156) width 200: "pleasures and de" + hyphen string "-"
           text run at (1,187) width 200: "sires into"
-          text run at (1,218) width 200: "necessary and"
-          text run at (1,249) width 155: "unnecessary\x{2014}"
-          text run at (1,280) width 200: "these and other"
-          text run at (1,311) width 200: "great forms of"
-          text run at (1,342) width 200: "thought are all of"
-          text run at (1,373) width 66: "them "
-          text run at (67,373) width 134: "to be found"
-          text run at (1,404) width 200: "in the Republic,"
-          text run at (1,435) width 200: "and were probably"
+          text run at (1,218) width 165: "necessary and "
+          text run at (166,218) width 35: "un" + hyphen string "-"
+          text run at (1,249) width 183: "necessary\x{2014}these"
+          text run at (1,280) width 200: "and other great"
+          text run at (1,311) width 200: "forms of thought"
+          text run at (1,342) width 180: "are all of them "
+          text run at (181,342) width 20: "to"
+          text run at (1,373) width 200: "be found in the"
+          text run at (1,404) width 200: "Republic, and"
+          text run at (1,435) width 200: "were probably"
           text run at (1,466) width 200: "first invented by"
           text run at (1,497) width 60: "Plato."
       RenderBlock (floating) {DIV} at (214,529) size 202x529 [border: (1px solid #ADD8E6)]
index 28541758a4b7ed0990e0de9312a501ad31b438d5..2de6a6e8520df1b985f0b24a9c27016a2fc4c40c 100644 (file)
@@ -1,3 +1,18 @@
+2011-12-11  Dan Bernstein  <mitz@apple.com>
+
+        <rdar://problem/10561285> REGRESSION (r80438): First word on a line or after collapsed space may not be hyphenated even though it should
+        https://bugs.webkit.org/show_bug.cgi?id=74239
+
+        Reviewed by Anders Carlsson.
+
+        Tests: fast/text/hyphenate-first-word-after-skipped-space-expected.html
+               fast/text/hyphenate-first-word-after-skipped-space.html
+
+        * rendering/RenderBlockLineLayout.cpp:
+        (WebCore::tryHyphenating): Replaced the assumption that the character at lastSpace is a space
+        iff lastSpace is non-zero with a test of whether it is a space, in the sense that it should
+        not be counted as part of the prefix when comparing it to the value of hyphenate-limit-before.
+
 2011-12-10  Benjamin Poulain  <bpoulain@apple.com>
 
         #ifdef the parts of the Mac platform which should not be used on iOS
index 84780fa6be3f6696f081cecc35fa8c9123552266..3c35ee2f85ac5181692073e364325a96708b31e2 100644 (file)
@@ -1940,12 +1940,17 @@ static void tryHyphenating(RenderText* text, const Font& font, const AtomicStrin
         return;
 
     prefixLength = lastHyphenLocation(text->characters() + lastSpace, pos - lastSpace, min(prefixLength, static_cast<unsigned>(pos - lastSpace - minimumSuffixLength)) + 1, localeIdentifier);
-    // FIXME: The following assumes that the character at lastSpace is a space (and therefore should not factor
-    // into hyphenate-limit-before) unless lastSpace is 0. This is wrong in the rare case of hyphenating
-    // the first word in a text node which has leading whitespace.
-    if (!prefixLength || prefixLength - (lastSpace ? 1 : 0) < static_cast<unsigned>(minimumPrefixLength))
+    if (!prefixLength || prefixLength < static_cast<unsigned>(minimumPrefixLength))
         return;
 
+    // When lastSapce is a space, which it always is except sometimes at the beginning of a line or after collapsed
+    // space, it should not count towards hyphenate-limit-before.
+    if (prefixLength == static_cast<unsigned>(minimumPrefixLength)) {
+        UChar characterAtLastSpace = text->characters()[lastSpace];
+        if (characterAtLastSpace == ' ' || characterAtLastSpace == '\n' || characterAtLastSpace == '\t' || characterAtLastSpace == noBreakSpace)
+            return;
+    }
+
     ASSERT(pos - lastSpace - prefixLength >= static_cast<unsigned>(minimumSuffixLength));
 
 #if !ASSERT_DISABLED