2011-06-13 Ryosuke Niwa <rniwa@webkit.org>
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 15 Jun 2011 00:19:39 +0000 (00:19 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 15 Jun 2011 00:19:39 +0000 (00:19 +0000)
        Reviewed by David Hyatt.

        Trailing tabs in a textarea become unselectable under certain conditions
        https://bugs.webkit.org/show_bug.cgi?id=54598

        The bug was caused by WebKit's erroneously collapsing leading whitespace when white-space is
        set to pre-wrap. Per CSS 2.1 spec section 16.1.1, leading whitespace should not be removed
        in this case.

        See also: http://www.w3.org/TR/CSS2/text.html#white-space-model

        Fixed the bug by adding an extra argument to shouldCollapseWhiteSpace, indicating whether
        whitespace is leading or trailing. It defaults to leading because 16.1.1 does not allow allow
        collapsing of whitespace anywhere but at the end of each line.

        Test: fast/text/pre-wrap-trailing-tab.html

        * rendering/RenderBlockLineLayout.cpp:
        (WebCore::shouldCollapseWhiteSpace): Added WhitespacePosition as an argument. Returns false
        when whitespacePosition is not TrailingWhitespace even if white-space is pre-wrap.
        (WebCore::requiresLineBox): Takes WhitespacePosition as an argument and passes it to
        shouldCollapseWhiteSpace.
        (WebCore::RenderBlock::generatesLineBoxesForInlineChild): Calls requiresLineBox.
        (WebCore::RenderBlock::LineBreaker::skipTrailingWhitespace): Ditto.
        (WebCore::RenderBlock::LineBreaker::skipLeadingWhitespace): Ditto.
2011-06-13  Ryosuke Niwa  <rniwa@webkit.org>

        Reviewed by David Hyatt.

        Trailing tabs in a textarea become unselectable under certain conditions
        https://bugs.webkit.org/show_bug.cgi?id=54598

        Added a test to ensure Webkit renders leading whitespace when white-space is set to pre-wrap
        and word-wrap is set to break-word.

        Also rebaselined few tests because WebKit now renders leading whitespace in those tests.

        * fast/text/pre-wrap-trailing-tab-expected.txt: Added.
        * fast/text/pre-wrap-trailing-tab.html: Added.
        * http/tests/misc/acid3-expected.txt:
        * platform/mac/fast/forms/basic-textareas-expected.txt:
        * platform/mac/fast/forms/basic-textareas-quirks-expected.txt

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

LayoutTests/ChangeLog
LayoutTests/fast/text/pre-wrap-trailing-tab-expected.txt [new file with mode: 0644]
LayoutTests/fast/text/pre-wrap-trailing-tab.html [new file with mode: 0644]
LayoutTests/http/tests/misc/acid3-expected.txt
LayoutTests/platform/mac/fast/forms/basic-textareas-expected.txt
LayoutTests/platform/mac/fast/forms/basic-textareas-quirks-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/rendering/RenderBlockLineLayout.cpp

index 52b26c1..ce8dddf 100644 (file)
@@ -1,3 +1,21 @@
+2011-06-13  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Reviewed by David Hyatt.
+
+        Trailing tabs in a textarea become unselectable under certain conditions
+        https://bugs.webkit.org/show_bug.cgi?id=54598
+
+        Added a test to ensure Webkit renders leading whitespace when white-space is set to pre-wrap
+        and word-wrap is set to break-word.
+
+        Also rebaselined few tests because WebKit now renders leading whitespace in those tests.
+
+        * fast/text/pre-wrap-trailing-tab-expected.txt: Added.
+        * fast/text/pre-wrap-trailing-tab.html: Added.
+        * http/tests/misc/acid3-expected.txt:
+        * platform/mac/fast/forms/basic-textareas-expected.txt:
+        * platform/mac/fast/forms/basic-textareas-quirks-expected.txt
+
 2011-06-14  Ryosuke Niwa  <rniwa@webkit.org>
 
         Qt rebaseline after r88757.
diff --git a/LayoutTests/fast/text/pre-wrap-trailing-tab-expected.txt b/LayoutTests/fast/text/pre-wrap-trailing-tab-expected.txt
new file mode 100644 (file)
index 0000000..b31eea5
--- /dev/null
@@ -0,0 +1,5 @@
+This test ensures WebKit renders the trailing whitespace properly. You should see PASS thrice below.
+
+test 0: PASS
+test 1: PASS
+test 2: PASS
diff --git a/LayoutTests/fast/text/pre-wrap-trailing-tab.html b/LayoutTests/fast/text/pre-wrap-trailing-tab.html
new file mode 100644 (file)
index 0000000..0747a64
--- /dev/null
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+<body><div id="tests"><div style="width: 1ex; font-size: 1em; white-space: pre-wrap;"
+></div><div style="width: 1ex; font-size: 1em; white-space: pre-wrap; word-wrap: break-word;"
+></div><textarea style="width: 1ex; font-size: 1em;"
+></textarea></div><pre id="log"></pre><script>
+
+function assertEqual(name, length, endOffset)
+{
+    log.textContent += '\n' + name + ': ';
+    if (length != endOffset)
+        log.textContent += 'FAIL - length was ' + length + ' but selection end was ' + endOffset + ' after selecting all text';
+    else
+        log.textContent += 'PASS';
+}
+
+var tests = document.getElementById('tests').childNodes;
+var log = document.getElementById('log');
+log.textContent = 'This test ensures WebKit renders the trailing whitespace properly. You should see PASS thrice below.\n';
+
+var letter = 'a';
+for (var i = 0; i < tests.length; i++, letter = String.fromCharCode(letter.charCodeAt(0) + 1)) {
+    if (tests[i].select) {
+        tests[i].value = letter + '\t';
+        tests[i].focus();
+        tests[i].select();
+        var endOffset = tests[i].selectionEnd;
+    } else {
+        tests[i].textContent = letter + '\t';
+        window.getSelection().selectAllChildren(tests[i]);
+        var endOffset = window.getSelection().getRangeAt(0).endOffset;
+    }
+    assertEqual('test ' + i, 2, endOffset);
+}
+
+if (window.layoutTestController) {
+    layoutTestController.dumpAsText();
+    document.getElementById('tests').style.display = 'none';
+}
+
+</script></pre></body>
+</html>
index 21fef8b..cd53c8e 100644 (file)
@@ -34,13 +34,13 @@ layer at (20,20) size 644x433
                 RenderBody {BODY} at (0,0) size 0x1
                   RenderImage {IMG} at (0,0) size 1x1
           RenderPartObject {IFRAME} at (0,0) size 0x0
-            layer at (0,0) size 16x2151
+            layer at (0,0) size 16x2166
               RenderView at (0,0) size 0x0
-            layer at (0,0) size 0x2151
-              RenderBlock {HTML} at (0,0) size 0x2151
-                RenderBody {BODY} at (8,8) size 0x2130
-                  RenderBlock {PRE} at (0,0) size 0x2130
-                    RenderText {#text} at (0,0) size 8x2130
+            layer at (0,0) size 0x2166
+              RenderBlock {HTML} at (0,0) size 0x2166
+                RenderBody {BODY} at (8,8) size 0x2145
+                  RenderBlock {PRE} at (0,0) size 0x2145
+                    RenderText {#text} at (0,0) size 8x2145
                       text run at (0,0) width 8: "<"
                       text run at (0,15) width 8: "!"
                       text run at (0,30) width 8: "D"
@@ -50,139 +50,140 @@ layer at (20,20) size 644x433
                       text run at (0,90) width 8: "Y"
                       text run at (0,105) width 8: "P"
                       text run at (0,120) width 8: "E"
-                      text run at (0,135) width 8: "h"
-                      text run at (0,150) width 8: "t"
-                      text run at (0,165) width 8: "m"
-                      text run at (0,180) width 8: "l"
-                      text run at (0,195) width 8: ">"
-                      text run at (0,210) width 8: "<"
-                      text run at (0,225) width 8: "h"
-                      text run at (0,240) width 8: "t"
-                      text run at (0,255) width 8: "m"
-                      text run at (0,270) width 8: "l"
-                      text run at (0,285) width 8: ">"
-                      text run at (0,300) width 8: "<"
-                      text run at (0,315) width 8: "h"
-                      text run at (0,330) width 8: "e"
-                      text run at (0,345) width 8: "a"
-                      text run at (0,360) width 8: "d"
-                      text run at (0,375) width 8: ">"
-                      text run at (0,390) width 8: "<"
-                      text run at (0,405) width 8: "t"
-                      text run at (0,420) width 8: "i"
-                      text run at (0,435) width 8: "t"
-                      text run at (0,450) width 8: "l"
-                      text run at (0,465) width 8: "e"
-                      text run at (0,480) width 8: ">"
-                      text run at (0,495) width 8: "F"
-                      text run at (0,510) width 8: "A"
-                      text run at (0,525) width 8: "I"
-                      text run at (0,540) width 8: "L"
-                      text run at (0,555) width 8: "<"
-                      text run at (0,570) width 8: "/"
-                      text run at (0,585) width 8: "t"
-                      text run at (0,600) width 8: "i"
-                      text run at (0,615) width 8: "t"
-                      text run at (0,630) width 8: "l"
-                      text run at (0,645) width 8: "e"
-                      text run at (0,660) width 8: ">"
-                      text run at (0,675) width 8: "<"
-                      text run at (0,690) width 8: "/"
-                      text run at (0,705) width 8: "h"
-                      text run at (0,720) width 8: "e"
-                      text run at (0,735) width 8: "a"
-                      text run at (0,750) width 8: "d"
-                      text run at (0,765) width 8: ">"
-                      text run at (0,780) width 8: "<"
-                      text run at (0,795) width 8: "b"
-                      text run at (0,810) width 8: "o"
-                      text run at (0,825) width 8: "d"
-                      text run at (0,840) width 8: "y"
-                      text run at (0,855) width 8: ">"
-                      text run at (0,870) width 8: "<"
-                      text run at (0,885) width 8: "p"
-                      text run at (0,900) width 8: ">"
-                      text run at (0,915) width 8: "F"
-                      text run at (0,930) width 8: "A"
-                      text run at (0,945) width 8: "I"
-                      text run at (0,960) width 8: "L"
-                      text run at (0,975) width 8: "<"
-                      text run at (0,990) width 8: "/"
-                      text run at (0,1005) width 8: "p"
-                      text run at (0,1020) width 8: ">"
-                      text run at (0,1035) width 8: "<"
-                      text run at (0,1050) width 8: "s"
-                      text run at (0,1065) width 8: "c"
-                      text run at (0,1080) width 8: "r"
-                      text run at (0,1095) width 8: "i"
-                      text run at (0,1110) width 8: "p"
-                      text run at (0,1125) width 8: "t"
-                      text run at (0,1140) width 8: ">"
-                      text run at (0,1155) width 8: "p"
-                      text run at (0,1170) width 8: "a"
-                      text run at (0,1185) width 8: "r"
-                      text run at (0,1200) width 8: "e"
-                      text run at (0,1215) width 8: "n"
-                      text run at (0,1230) width 8: "t"
-                      text run at (0,1245) width 8: "."
-                      text run at (0,1260) width 8: "n"
-                      text run at (0,1275) width 8: "o"
-                      text run at (0,1290) width 8: "t"
-                      text run at (0,1305) width 8: "i"
-                      text run at (0,1320) width 8: "f"
-                      text run at (0,1335) width 8: "y"
-                      text run at (0,1350) width 8: "("
-                      text run at (0,1365) width 8: "\""
-                      text run at (0,1380) width 8: "r"
-                      text run at (0,1395) width 8: "e"
-                      text run at (0,1410) width 8: "s"
-                      text run at (0,1425) width 8: "o"
-                      text run at (0,1440) width 8: "u"
-                      text run at (0,1455) width 8: "r"
-                      text run at (0,1470) width 8: "c"
-                      text run at (0,1485) width 8: "e"
-                      text run at (0,1500) width 8: "s"
-                      text run at (0,1515) width 8: "/"
-                      text run at (0,1530) width 8: "a"
-                      text run at (0,1545) width 8: "c"
-                      text run at (0,1560) width 8: "i"
-                      text run at (0,1575) width 8: "d"
-                      text run at (0,1590) width 8: "3"
-                      text run at (0,1605) width 8: "/"
-                      text run at (0,1620) width 8: "e"
-                      text run at (0,1635) width 8: "m"
-                      text run at (0,1650) width 8: "p"
-                      text run at (0,1665) width 8: "t"
-                      text run at (0,1680) width 8: "y"
-                      text run at (0,1695) width 8: "."
-                      text run at (0,1710) width 8: "t"
-                      text run at (0,1725) width 8: "x"
-                      text run at (0,1740) width 8: "t"
-                      text run at (0,1755) width 8: "\""
-                      text run at (0,1770) width 8: ")"
-                      text run at (0,1785) width 8: "<"
-                      text run at (0,1800) width 8: "/"
-                      text run at (0,1815) width 8: "s"
-                      text run at (0,1830) width 8: "c"
-                      text run at (0,1845) width 8: "r"
-                      text run at (0,1860) width 8: "i"
-                      text run at (0,1875) width 8: "p"
-                      text run at (0,1890) width 8: "t"
-                      text run at (0,1905) width 8: ">"
-                      text run at (0,1920) width 8: "<"
-                      text run at (0,1935) width 8: "/"
-                      text run at (0,1950) width 8: "b"
-                      text run at (0,1965) width 8: "o"
-                      text run at (0,1980) width 8: "d"
-                      text run at (0,1995) width 8: "y"
-                      text run at (0,2010) width 8: ">"
-                      text run at (0,2025) width 8: "<"
-                      text run at (0,2040) width 8: "/"
-                      text run at (0,2055) width 8: "h"
-                      text run at (0,2070) width 8: "t"
-                      text run at (0,2085) width 8: "m"
-                      text run at (0,2100) width 8: "l"
-                      text run at (0,2115) width 8: ">"
+                      text run at (0,135) width 0: " "
+                      text run at (0,150) width 8: "h"
+                      text run at (0,165) width 8: "t"
+                      text run at (0,180) width 8: "m"
+                      text run at (0,195) width 8: "l"
+                      text run at (0,210) width 8: ">"
+                      text run at (0,225) width 8: "<"
+                      text run at (0,240) width 8: "h"
+                      text run at (0,255) width 8: "t"
+                      text run at (0,270) width 8: "m"
+                      text run at (0,285) width 8: "l"
+                      text run at (0,300) width 8: ">"
+                      text run at (0,315) width 8: "<"
+                      text run at (0,330) width 8: "h"
+                      text run at (0,345) width 8: "e"
+                      text run at (0,360) width 8: "a"
+                      text run at (0,375) width 8: "d"
+                      text run at (0,390) width 8: ">"
+                      text run at (0,405) width 8: "<"
+                      text run at (0,420) width 8: "t"
+                      text run at (0,435) width 8: "i"
+                      text run at (0,450) width 8: "t"
+                      text run at (0,465) width 8: "l"
+                      text run at (0,480) width 8: "e"
+                      text run at (0,495) width 8: ">"
+                      text run at (0,510) width 8: "F"
+                      text run at (0,525) width 8: "A"
+                      text run at (0,540) width 8: "I"
+                      text run at (0,555) width 8: "L"
+                      text run at (0,570) width 8: "<"
+                      text run at (0,585) width 8: "/"
+                      text run at (0,600) width 8: "t"
+                      text run at (0,615) width 8: "i"
+                      text run at (0,630) width 8: "t"
+                      text run at (0,645) width 8: "l"
+                      text run at (0,660) width 8: "e"
+                      text run at (0,675) width 8: ">"
+                      text run at (0,690) width 8: "<"
+                      text run at (0,705) width 8: "/"
+                      text run at (0,720) width 8: "h"
+                      text run at (0,735) width 8: "e"
+                      text run at (0,750) width 8: "a"
+                      text run at (0,765) width 8: "d"
+                      text run at (0,780) width 8: ">"
+                      text run at (0,795) width 8: "<"
+                      text run at (0,810) width 8: "b"
+                      text run at (0,825) width 8: "o"
+                      text run at (0,840) width 8: "d"
+                      text run at (0,855) width 8: "y"
+                      text run at (0,870) width 8: ">"
+                      text run at (0,885) width 8: "<"
+                      text run at (0,900) width 8: "p"
+                      text run at (0,915) width 8: ">"
+                      text run at (0,930) width 8: "F"
+                      text run at (0,945) width 8: "A"
+                      text run at (0,960) width 8: "I"
+                      text run at (0,975) width 8: "L"
+                      text run at (0,990) width 8: "<"
+                      text run at (0,1005) width 8: "/"
+                      text run at (0,1020) width 8: "p"
+                      text run at (0,1035) width 8: ">"
+                      text run at (0,1050) width 8: "<"
+                      text run at (0,1065) width 8: "s"
+                      text run at (0,1080) width 8: "c"
+                      text run at (0,1095) width 8: "r"
+                      text run at (0,1110) width 8: "i"
+                      text run at (0,1125) width 8: "p"
+                      text run at (0,1140) width 8: "t"
+                      text run at (0,1155) width 8: ">"
+                      text run at (0,1170) width 8: "p"
+                      text run at (0,1185) width 8: "a"
+                      text run at (0,1200) width 8: "r"
+                      text run at (0,1215) width 8: "e"
+                      text run at (0,1230) width 8: "n"
+                      text run at (0,1245) width 8: "t"
+                      text run at (0,1260) width 8: "."
+                      text run at (0,1275) width 8: "n"
+                      text run at (0,1290) width 8: "o"
+                      text run at (0,1305) width 8: "t"
+                      text run at (0,1320) width 8: "i"
+                      text run at (0,1335) width 8: "f"
+                      text run at (0,1350) width 8: "y"
+                      text run at (0,1365) width 8: "("
+                      text run at (0,1380) width 8: "\""
+                      text run at (0,1395) width 8: "r"
+                      text run at (0,1410) width 8: "e"
+                      text run at (0,1425) width 8: "s"
+                      text run at (0,1440) width 8: "o"
+                      text run at (0,1455) width 8: "u"
+                      text run at (0,1470) width 8: "r"
+                      text run at (0,1485) width 8: "c"
+                      text run at (0,1500) width 8: "e"
+                      text run at (0,1515) width 8: "s"
+                      text run at (0,1530) width 8: "/"
+                      text run at (0,1545) width 8: "a"
+                      text run at (0,1560) width 8: "c"
+                      text run at (0,1575) width 8: "i"
+                      text run at (0,1590) width 8: "d"
+                      text run at (0,1605) width 8: "3"
+                      text run at (0,1620) width 8: "/"
+                      text run at (0,1635) width 8: "e"
+                      text run at (0,1650) width 8: "m"
+                      text run at (0,1665) width 8: "p"
+                      text run at (0,1680) width 8: "t"
+                      text run at (0,1695) width 8: "y"
+                      text run at (0,1710) width 8: "."
+                      text run at (0,1725) width 8: "t"
+                      text run at (0,1740) width 8: "x"
+                      text run at (0,1755) width 8: "t"
+                      text run at (0,1770) width 8: "\""
+                      text run at (0,1785) width 8: ")"
+                      text run at (0,1800) width 8: "<"
+                      text run at (0,1815) width 8: "/"
+                      text run at (0,1830) width 8: "s"
+                      text run at (0,1845) width 8: "c"
+                      text run at (0,1860) width 8: "r"
+                      text run at (0,1875) width 8: "i"
+                      text run at (0,1890) width 8: "p"
+                      text run at (0,1905) width 8: "t"
+                      text run at (0,1920) width 8: ">"
+                      text run at (0,1935) width 8: "<"
+                      text run at (0,1950) width 8: "/"
+                      text run at (0,1965) width 8: "b"
+                      text run at (0,1980) width 8: "o"
+                      text run at (0,1995) width 8: "d"
+                      text run at (0,2010) width 8: "y"
+                      text run at (0,2025) width 8: ">"
+                      text run at (0,2040) width 8: "<"
+                      text run at (0,2055) width 8: "/"
+                      text run at (0,2070) width 8: "h"
+                      text run at (0,2085) width 8: "t"
+                      text run at (0,2100) width 8: "m"
+                      text run at (0,2115) width 8: "l"
+                      text run at (0,2130) width 8: ">"
           RenderPartObject {IFRAME} at (0,0) size 0x0
             layer at (0,0) size 0x0
               RenderView at (0,0) size 0x0
index 1a95400..82ae095 100644 (file)
@@ -546,26 +546,27 @@ layer at (0,0) size 785x1438
                 text run at (0,26) width 30: "WXYZ"
                 text run at (29,26) width 5: " "
                 text run at (0,39) width 130: "abcdefghijklmnopqrstuv"
-        layer at (583,422) size 56x58 clip at (584,423) size 39x56 scrollHeight 173
+        layer at (583,422) size 56x58 clip at (584,423) size 39x56 scrollHeight 186
           RenderTextControl {TEXTAREA} at (3,31) size 56x58 [bgcolor=#FFFFFF] [border: (1px solid #000000)]
-            RenderBlock {DIV} at (3,3) size 35x169
-              RenderText {#text} at (0,0) size 35x169
+            RenderBlock {DIV} at (3,3) size 35x182
+              RenderText {#text} at (0,0) size 35x182
                 text run at (0,0) width 34: "Lorem"
                 text run at (33,0) width 2: " "
                 text run at (0,13) width 33: "ipsum"
-                text run at (0,26) width 29: "dolor"
-                text run at (28,26) width 4: " "
-                text run at (0,39) width 30: "ABCD"
-                text run at (0,52) width 35: "EFGHIJ"
-                text run at (0,65) width 31: "KLMN"
-                text run at (0,78) width 31: "OPQR"
-                text run at (0,91) width 28: "STUV"
-                text run at (0,104) width 30: "WXYZ"
-                text run at (29,104) width 5: " "
-                text run at (0,117) width 32: "abcde"
-                text run at (0,130) width 34: "fghijkl"
-                text run at (0,143) width 31: "mnop"
-                text run at (0,156) width 34: "qrstuv"
+                text run at (0,26) width 7: "  "
+                text run at (0,39) width 29: "dolor"
+                text run at (28,39) width 4: " "
+                text run at (0,52) width 30: "ABCD"
+                text run at (0,65) width 35: "EFGHIJ"
+                text run at (0,78) width 31: "KLMN"
+                text run at (0,91) width 31: "OPQR"
+                text run at (0,104) width 28: "STUV"
+                text run at (0,117) width 30: "WXYZ"
+                text run at (29,117) width 5: " "
+                text run at (0,130) width 32: "abcde"
+                text run at (0,143) width 34: "fghijkl"
+                text run at (0,156) width 31: "mnop"
+                text run at (0,169) width 34: "qrstuv"
         layer at (3,503) size 161x47 clip at (4,504) size 159x30 scrollWidth 427
           RenderTextControl {TEXTAREA} at (3,17) size 161x47 [bgcolor=#FFFFFF] [border: (1px solid #000000)]
             RenderBlock {DIV} at (3,3) size 155x13
@@ -640,7 +641,7 @@ layer at (0,0) size 785x1438
                 text run at (0,0) width 105: "Lorem ipsum  dolor"
                 text run at (104,0) width 5: " "
                 text run at (0,13) width 183: "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-                text run at (0,26) width 130: "abcdefghijklmnopqrstuv"
+                text run at (0,26) width 134: " abcdefghijklmnopqrstuv"
         layer at (170,670) size 161x47 clip at (171,671) size 144x30 scrollWidth 185 scrollHeight 43
           RenderTextControl {TEXTAREA} at (3,45) size 161x47 [bgcolor=#FFFFFF] [border: (1px solid #000000)]
             RenderBlock {DIV} at (3,3) size 155x39
@@ -648,7 +649,7 @@ layer at (0,0) size 785x1438
                 text run at (0,0) width 105: "Lorem ipsum  dolor"
                 text run at (104,0) width 5: " "
                 text run at (0,13) width 183: "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-                text run at (0,26) width 130: "abcdefghijklmnopqrstuv"
+                text run at (0,26) width 134: " abcdefghijklmnopqrstuv"
       RenderPartObject {IFRAME} at (0,748) size 785x690
         layer at (0,0) size 785x690
           RenderView at (0,0) size 785x690
@@ -933,73 +934,78 @@ layer at (0,0) size 785x1438
                 text run at (0,117) width 30: "ghijkl"
                 text run at (0,130) width 38: "mnopq"
                 text run at (0,143) width 27: "rstuv"
-        layer at (429,155) size 60x68 clip at (430,156) size 43x66 scrollHeight 859
+        layer at (429,155) size 60x68 clip at (430,156) size 43x66 scrollHeight 924
           RenderTextControl {TEXTAREA} at (1,45) size 60x68 [bgcolor=#FFFFFF] [border: (1px solid #000000)]
-            RenderBlock {DIV} at (21,21) size 3x819
-              RenderText {#text} at (0,0) size 11x819
+            RenderBlock {DIV} at (21,21) size 3x884
+              RenderText {#text} at (0,0) size 11x884
                 text run at (0,0) width 6: "L"
                 text run at (0,13) width 7: "o"
                 text run at (0,26) width 5: "r"
                 text run at (0,39) width 7: "e"
                 text run at (0,52) width 11: "m"
-                text run at (0,65) width 4: "i"
-                text run at (0,78) width 7: "p"
-                text run at (0,91) width 6: "s"
-                text run at (0,104) width 7: "u"
-                text run at (0,117) width 11: "m"
-                text run at (0,130) width 7: "d"
-                text run at (0,143) width 7: "o"
-                text run at (0,156) width 4: "l"
-                text run at (0,169) width 7: "o"
-                text run at (0,182) width 5: "r"
-                text run at (0,195) width 8: "A"
-                text run at (0,208) width 7: "B"
-                text run at (0,221) width 8: "C"
-                text run at (0,234) width 9: "D"
-                text run at (0,247) width 6: "E"
-                text run at (0,260) width 6: "F"
-                text run at (0,273) width 8: "G"
-                text run at (0,286) width 9: "H"
-                text run at (0,299) width 4: "I"
-                text run at (0,312) width 4: "J"
-                text run at (0,325) width 8: "K"
-                text run at (0,338) width 6: "L"
-                text run at (0,351) width 10: "M"
-                text run at (0,364) width 9: "N"
-                text run at (0,377) width 9: "O"
-                text run at (0,390) width 7: "P"
-                text run at (0,403) width 9: "Q"
-                text run at (0,416) width 7: "R"
-                text run at (0,429) width 6: "S"
-                text run at (0,442) width 7: "T"
-                text run at (0,455) width 8: "U"
-                text run at (0,468) width 8: "V"
-                text run at (0,481) width 10: "W"
-                text run at (0,494) width 7: "X"
-                text run at (0,507) width 7: "Y"
-                text run at (0,520) width 7: "Z"
-                text run at (0,533) width 7: "a"
-                text run at (0,546) width 7: "b"
-                text run at (0,559) width 6: "c"
-                text run at (0,572) width 7: "d"
-                text run at (0,585) width 7: "e"
-                text run at (0,598) width 5: "f"
-                text run at (0,611) width 7: "g"
-                text run at (0,624) width 7: "h"
-                text run at (0,637) width 4: "i"
-                text run at (0,650) width 4: "j"
-                text run at (0,663) width 7: "k"
-                text run at (0,676) width 4: "l"
-                text run at (0,689) width 11: "m"
-                text run at (0,702) width 7: "n"
-                text run at (0,715) width 7: "o"
-                text run at (0,728) width 7: "p"
-                text run at (0,741) width 7: "q"
-                text run at (0,754) width 5: "r"
-                text run at (0,767) width 6: "s"
-                text run at (0,780) width 5: "t"
-                text run at (0,793) width 7: "u"
-                text run at (0,806) width 6: "v"
+                text run at (0,65) width 3: " "
+                text run at (0,78) width 4: "i"
+                text run at (0,91) width 7: "p"
+                text run at (0,104) width 6: "s"
+                text run at (0,117) width 7: "u"
+                text run at (0,130) width 11: "m"
+                text run at (0,143) width 3: " "
+                text run at (0,156) width 3: " "
+                text run at (0,169) width 7: "d"
+                text run at (0,182) width 7: "o"
+                text run at (0,195) width 4: "l"
+                text run at (0,208) width 7: "o"
+                text run at (0,221) width 5: "r"
+                text run at (0,234) width 3: " "
+                text run at (0,247) width 8: "A"
+                text run at (0,260) width 7: "B"
+                text run at (0,273) width 8: "C"
+                text run at (0,286) width 9: "D"
+                text run at (0,299) width 6: "E"
+                text run at (0,312) width 6: "F"
+                text run at (0,325) width 8: "G"
+                text run at (0,338) width 9: "H"
+                text run at (0,351) width 4: "I"
+                text run at (0,364) width 4: "J"
+                text run at (0,377) width 8: "K"
+                text run at (0,390) width 6: "L"
+                text run at (0,403) width 10: "M"
+                text run at (0,416) width 9: "N"
+                text run at (0,429) width 9: "O"
+                text run at (0,442) width 7: "P"
+                text run at (0,455) width 9: "Q"
+                text run at (0,468) width 7: "R"
+                text run at (0,481) width 6: "S"
+                text run at (0,494) width 7: "T"
+                text run at (0,507) width 8: "U"
+                text run at (0,520) width 8: "V"
+                text run at (0,533) width 10: "W"
+                text run at (0,546) width 7: "X"
+                text run at (0,559) width 7: "Y"
+                text run at (0,572) width 7: "Z"
+                text run at (0,585) width 3: " "
+                text run at (0,598) width 7: "a"
+                text run at (0,611) width 7: "b"
+                text run at (0,624) width 6: "c"
+                text run at (0,637) width 7: "d"
+                text run at (0,650) width 7: "e"
+                text run at (0,663) width 5: "f"
+                text run at (0,676) width 7: "g"
+                text run at (0,689) width 7: "h"
+                text run at (0,702) width 4: "i"
+                text run at (0,715) width 4: "j"
+                text run at (0,728) width 7: "k"
+                text run at (0,741) width 4: "l"
+                text run at (0,754) width 11: "m"
+                text run at (0,767) width 7: "n"
+                text run at (0,780) width 7: "o"
+                text run at (0,793) width 7: "p"
+                text run at (0,806) width 7: "q"
+                text run at (0,819) width 5: "r"
+                text run at (0,832) width 6: "s"
+                text run at (0,845) width 5: "t"
+                text run at (0,858) width 7: "u"
+                text run at (0,871) width 6: "v"
         layer at (511,195) size 60x28 clip at (512,196) size 43x26 scrollHeight 156
           RenderTextControl {TEXTAREA} at (1,45) size 60x28 [bgcolor=#FFFFFF] [border: (1px solid #000000)]
             RenderBlock {DIV} at (1,1) size 43x156
@@ -1239,26 +1245,27 @@ layer at (0,0) size 785x1438
                 text run at (0,26) width 30: "WXYZ"
                 text run at (29,26) width 5: " "
                 text run at (0,39) width 130: "abcdefghijklmnopqrstuv"
-        layer at (583,401) size 56x58 clip at (584,402) size 39x56 scrollHeight 173
+        layer at (583,401) size 56x58 clip at (584,402) size 39x56 scrollHeight 186
           RenderTextControl {TEXTAREA} at (3,31) size 56x58 [bgcolor=#FFFFFF] [border: (1px solid #000000)]
-            RenderBlock {DIV} at (3,3) size 35x169
-              RenderText {#text} at (0,0) size 35x169
+            RenderBlock {DIV} at (3,3) size 35x182
+              RenderText {#text} at (0,0) size 35x182
                 text run at (0,0) width 34: "Lorem"
                 text run at (33,0) width 2: " "
                 text run at (0,13) width 33: "ipsum"
-                text run at (0,26) width 29: "dolor"
-                text run at (28,26) width 4: " "
-                text run at (0,39) width 30: "ABCD"
-                text run at (0,52) width 35: "EFGHIJ"
-                text run at (0,65) width 31: "KLMN"
-                text run at (0,78) width 31: "OPQR"
-                text run at (0,91) width 28: "STUV"
-                text run at (0,104) width 30: "WXYZ"
-                text run at (29,104) width 5: " "
-                text run at (0,117) width 32: "abcde"
-                text run at (0,130) width 34: "fghijkl"
-                text run at (0,143) width 31: "mnop"
-                text run at (0,156) width 34: "qrstuv"
+                text run at (0,26) width 7: "  "
+                text run at (0,39) width 29: "dolor"
+                text run at (28,39) width 4: " "
+                text run at (0,52) width 30: "ABCD"
+                text run at (0,65) width 35: "EFGHIJ"
+                text run at (0,78) width 31: "KLMN"
+                text run at (0,91) width 31: "OPQR"
+                text run at (0,104) width 28: "STUV"
+                text run at (0,117) width 30: "WXYZ"
+                text run at (29,117) width 5: " "
+                text run at (0,130) width 32: "abcde"
+                text run at (0,143) width 34: "fghijkl"
+                text run at (0,156) width 31: "mnop"
+                text run at (0,169) width 34: "qrstuv"
         layer at (3,479) size 161x47 clip at (4,480) size 159x30 scrollWidth 427
           RenderTextControl {TEXTAREA} at (3,17) size 161x47 [bgcolor=#FFFFFF] [border: (1px solid #000000)]
             RenderBlock {DIV} at (3,3) size 155x13
@@ -1333,7 +1340,7 @@ layer at (0,0) size 785x1438
                 text run at (0,0) width 105: "Lorem ipsum  dolor"
                 text run at (104,0) width 5: " "
                 text run at (0,13) width 183: "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-                text run at (0,26) width 130: "abcdefghijklmnopqrstuv"
+                text run at (0,26) width 134: " abcdefghijklmnopqrstuv"
         layer at (170,640) size 161x47 clip at (171,641) size 144x30 scrollWidth 185 scrollHeight 43
           RenderTextControl {TEXTAREA} at (3,45) size 161x47 [bgcolor=#FFFFFF] [border: (1px solid #000000)]
             RenderBlock {DIV} at (3,3) size 155x39
@@ -1341,5 +1348,5 @@ layer at (0,0) size 785x1438
                 text run at (0,0) width 105: "Lorem ipsum  dolor"
                 text run at (104,0) width 5: " "
                 text run at (0,13) width 183: "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-                text run at (0,26) width 130: "abcdefghijklmnopqrstuv"
+                text run at (0,26) width 134: " abcdefghijklmnopqrstuv"
       RenderText {#text} at (0,0) size 0x0
index 183d37d..e679f3c 100644 (file)
@@ -365,10 +365,10 @@ layer at (26,603) size 161x136 clip at (27,604) size 159x134
         text run at (29,26) width 5: " "
         text run at (0,39) width 130: "abcdefghijklmnopqrstuv"
         text run at (129,39) width 5: " "
-layer at (26,761) size 56x58 clip at (27,762) size 39x56 scrollHeight 173
+layer at (26,761) size 56x58 clip at (27,762) size 39x56 scrollHeight 186
   RenderTextControl {TEXTAREA} at (17,3) size 56x58 [bgcolor=#FFFFFF] [border: (1px solid #000000)]
-    RenderBlock {DIV} at (3,3) size 35x169
-      RenderText {#text} at (0,0) size 35x169
+    RenderBlock {DIV} at (3,3) size 35x182
+      RenderText {#text} at (0,0) size 35x182
         text run at (0,0) width 34: "Lorem"
         text run at (33,0) width 2: " "
         text run at (0,13) width 33: "ipsum"
@@ -386,6 +386,7 @@ layer at (26,761) size 56x58 clip at (27,762) size 39x56 scrollHeight 173
         text run at (0,130) width 34: "fghijkl"
         text run at (0,143) width 31: "mnop"
         text run at (0,156) width 34: "qrstuv"
+        text run at (0,169) width 4: " "
 layer at (376,26) size 60x32 clip at (377,27) size 43x30 scrollHeight 160
   RenderTextControl {TEXTAREA} at (15,3) size 60x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)]
     RenderBlock {DIV} at (3,3) size 39x156
@@ -407,73 +408,78 @@ layer at (376,26) size 60x32 clip at (377,27) size 43x30 scrollHeight 160
         text run at (0,130) width 38: "mnopq"
         text run at (0,143) width 27: "rstuv"
         text run at (26,143) width 5: " "
-layer at (376,80) size 60x68 clip at (377,81) size 43x66 scrollHeight 859
+layer at (376,80) size 60x68 clip at (377,81) size 43x66 scrollHeight 924
   RenderTextControl {TEXTAREA} at (15,3) size 60x68 [bgcolor=#FFFFFF] [border: (1px solid #000000)]
-    RenderBlock {DIV} at (21,21) size 3x819
-      RenderText {#text} at (0,0) size 11x819
+    RenderBlock {DIV} at (21,21) size 3x884
+      RenderText {#text} at (0,0) size 11x884
         text run at (0,0) width 6: "L"
         text run at (0,13) width 7: "o"
         text run at (0,26) width 5: "r"
         text run at (0,39) width 7: "e"
         text run at (0,52) width 11: "m"
-        text run at (0,65) width 4: "i"
-        text run at (0,78) width 7: "p"
-        text run at (0,91) width 6: "s"
-        text run at (0,104) width 7: "u"
-        text run at (0,117) width 11: "m"
-        text run at (0,130) width 7: "d"
-        text run at (0,143) width 7: "o"
-        text run at (0,156) width 4: "l"
+        text run at (0,65) width 3: " "
+        text run at (0,78) width 4: "i"
+        text run at (0,91) width 7: "p"
+        text run at (0,104) width 6: "s"
+        text run at (0,117) width 7: "u"
+        text run at (0,130) width 11: "m"
+        text run at (0,143) width 3: " "
+        text run at (0,156) width 7: "d"
         text run at (0,169) width 7: "o"
-        text run at (0,182) width 5: "r"
-        text run at (0,195) width 8: "A"
-        text run at (0,208) width 7: "B"
-        text run at (0,221) width 8: "C"
-        text run at (0,234) width 9: "D"
-        text run at (0,247) width 6: "E"
-        text run at (0,260) width 6: "F"
-        text run at (0,273) width 8: "G"
-        text run at (0,286) width 9: "H"
-        text run at (0,299) width 4: "I"
-        text run at (0,312) width 4: "J"
-        text run at (0,325) width 8: "K"
-        text run at (0,338) width 6: "L"
-        text run at (0,351) width 10: "M"
-        text run at (0,364) width 9: "N"
-        text run at (0,377) width 9: "O"
-        text run at (0,390) width 7: "P"
-        text run at (0,403) width 9: "Q"
-        text run at (0,416) width 7: "R"
-        text run at (0,429) width 6: "S"
-        text run at (0,442) width 7: "T"
-        text run at (0,455) width 8: "U"
-        text run at (0,468) width 8: "V"
-        text run at (0,481) width 10: "W"
-        text run at (0,494) width 7: "X"
-        text run at (0,507) width 7: "Y"
-        text run at (0,520) width 7: "Z"
-        text run at (0,533) width 7: "a"
-        text run at (0,546) width 7: "b"
-        text run at (0,559) width 6: "c"
-        text run at (0,572) width 7: "d"
-        text run at (0,585) width 7: "e"
-        text run at (0,598) width 5: "f"
-        text run at (0,611) width 7: "g"
-        text run at (0,624) width 7: "h"
-        text run at (0,637) width 4: "i"
-        text run at (0,650) width 4: "j"
-        text run at (0,663) width 7: "k"
-        text run at (0,676) width 4: "l"
-        text run at (0,689) width 11: "m"
-        text run at (0,702) width 7: "n"
-        text run at (0,715) width 7: "o"
-        text run at (0,728) width 7: "p"
-        text run at (0,741) width 7: "q"
-        text run at (0,754) width 5: "r"
-        text run at (0,767) width 6: "s"
-        text run at (0,780) width 5: "t"
-        text run at (0,793) width 7: "u"
-        text run at (0,806) width 6: "v"
+        text run at (0,182) width 4: "l"
+        text run at (0,195) width 7: "o"
+        text run at (0,208) width 5: "r"
+        text run at (0,221) width 3: " "
+        text run at (0,234) width 8: "A"
+        text run at (0,247) width 7: "B"
+        text run at (0,260) width 8: "C"
+        text run at (0,273) width 9: "D"
+        text run at (0,286) width 6: "E"
+        text run at (0,299) width 6: "F"
+        text run at (0,312) width 8: "G"
+        text run at (0,325) width 9: "H"
+        text run at (0,338) width 4: "I"
+        text run at (0,351) width 4: "J"
+        text run at (0,364) width 8: "K"
+        text run at (0,377) width 6: "L"
+        text run at (0,390) width 10: "M"
+        text run at (0,403) width 9: "N"
+        text run at (0,416) width 9: "O"
+        text run at (0,429) width 7: "P"
+        text run at (0,442) width 9: "Q"
+        text run at (0,455) width 7: "R"
+        text run at (0,468) width 6: "S"
+        text run at (0,481) width 7: "T"
+        text run at (0,494) width 8: "U"
+        text run at (0,507) width 8: "V"
+        text run at (0,520) width 10: "W"
+        text run at (0,533) width 7: "X"
+        text run at (0,546) width 7: "Y"
+        text run at (0,559) width 7: "Z"
+        text run at (0,572) width 3: " "
+        text run at (0,585) width 7: "a"
+        text run at (0,598) width 7: "b"
+        text run at (0,611) width 6: "c"
+        text run at (0,624) width 7: "d"
+        text run at (0,637) width 7: "e"
+        text run at (0,650) width 5: "f"
+        text run at (0,663) width 7: "g"
+        text run at (0,676) width 7: "h"
+        text run at (0,689) width 4: "i"
+        text run at (0,702) width 4: "j"
+        text run at (0,715) width 7: "k"
+        text run at (0,728) width 4: "l"
+        text run at (0,741) width 11: "m"
+        text run at (0,754) width 7: "n"
+        text run at (0,767) width 7: "o"
+        text run at (0,780) width 7: "p"
+        text run at (0,793) width 7: "q"
+        text run at (0,806) width 5: "r"
+        text run at (0,819) width 6: "s"
+        text run at (0,832) width 5: "t"
+        text run at (0,845) width 7: "u"
+        text run at (0,858) width 6: "v"
+        text run at (0,871) width 3: " "
 layer at (376,170) size 60x28 clip at (377,171) size 43x26 scrollHeight 156
   RenderTextControl {TEXTAREA} at (15,3) size 60x28 [bgcolor=#FFFFFF] [border: (1px solid #000000)]
     RenderBlock {DIV} at (1,1) size 43x156
index a4be65a..4b3c303 100644 (file)
@@ -1,3 +1,31 @@
+2011-06-13  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Reviewed by David Hyatt.
+
+        Trailing tabs in a textarea become unselectable under certain conditions
+        https://bugs.webkit.org/show_bug.cgi?id=54598
+
+        The bug was caused by WebKit's erroneously collapsing leading whitespace when white-space is
+        set to pre-wrap. Per CSS 2.1 spec section 16.1.1, leading whitespace should not be removed
+        in this case.
+
+        See also: http://www.w3.org/TR/CSS2/text.html#white-space-model
+
+        Fixed the bug by adding an extra argument to shouldCollapseWhiteSpace, indicating whether
+        whitespace is leading or trailing. It defaults to leading because 16.1.1 does not allow allow
+        collapsing of whitespace anywhere but at the end of each line.
+
+        Test: fast/text/pre-wrap-trailing-tab.html
+
+        * rendering/RenderBlockLineLayout.cpp:
+        (WebCore::shouldCollapseWhiteSpace): Added WhitespacePosition as an argument. Returns false
+        when whitespacePosition is not TrailingWhitespace even if white-space is pre-wrap.
+        (WebCore::requiresLineBox): Takes WhitespacePosition as an argument and passes it to
+        shouldCollapseWhiteSpace.
+        (WebCore::RenderBlock::generatesLineBoxesForInlineChild): Calls requiresLineBox.
+        (WebCore::RenderBlock::LineBreaker::skipTrailingWhitespace): Ditto.
+        (WebCore::RenderBlock::LineBreaker::skipLeadingWhitespace): Ditto.
+
 2011-06-14  Beth Dakin  <bdakin@apple.com>
 
         Reviewed by Dan Bernstein.
index 1d056a5..3aa9dc8 100644 (file)
@@ -1481,9 +1481,15 @@ static inline bool skipNonBreakingSpace(const InlineIterator& it, const LineInfo
     return true;
 }
 
-static inline bool shouldCollapseWhiteSpace(const RenderStyle* style, const LineInfo& lineInfo)
+enum WhitespacePosition { LeadingWhitespace, TrailingWhitespace };
+static inline bool shouldCollapseWhiteSpace(const RenderStyle* style, const LineInfo& lineInfo, WhitespacePosition whitespacePosition)
 {
-    return style->collapseWhiteSpace() || (style->whiteSpace() == PRE_WRAP && (!lineInfo.isEmpty() || !lineInfo.previousLineBrokeCleanly()));
+    // CSS2 16.6.1
+    // If a space (U+0020) at the beginning of a line has 'white-space' set to 'normal', 'nowrap', or 'pre-line', it is removed.
+    // If a space (U+0020) at the end of a line has 'white-space' set to 'normal', 'nowrap', or 'pre-line', it is also removed.
+    // If spaces (U+0020) or tabs (U+0009) at the end of a line have 'white-space' set to 'pre-wrap', UAs may visually collapse them.
+    return style->collapseWhiteSpace()
+        || (whitespacePosition == TrailingWhitespace && style->whiteSpace() == PRE_WRAP && (!lineInfo.isEmpty() || !lineInfo.previousLineBrokeCleanly()));
 }
 
 static bool inlineFlowRequiresLineBox(RenderInline* flow)
@@ -1494,7 +1500,7 @@ static bool inlineFlowRequiresLineBox(RenderInline* flow)
     return !flow->firstChild() && flow->hasInlineDirectionBordersPaddingOrMargin();
 }
 
-static bool requiresLineBox(const InlineIterator& it, const LineInfo& lineInfo = LineInfo())
+static bool requiresLineBox(const InlineIterator& it, const LineInfo& lineInfo = LineInfo(), WhitespacePosition whitespacePosition = LeadingWhitespace)
 {
     if (it.m_obj->isFloatingOrPositioned())
         return false;
@@ -1502,7 +1508,7 @@ static bool requiresLineBox(const InlineIterator& it, const LineInfo& lineInfo =
     if (it.m_obj->isRenderInline() && !inlineFlowRequiresLineBox(toRenderInline(it.m_obj)))
         return false;
 
-    if (!shouldCollapseWhiteSpace(it.m_obj->style(), lineInfo) || it.m_obj->isBR())
+    if (!shouldCollapseWhiteSpace(it.m_obj->style(), lineInfo, whitespacePosition) || it.m_obj->isBR())
         return true;
 
     UChar current = it.current();
@@ -1515,6 +1521,7 @@ bool RenderBlock::generatesLineBoxesForInlineChild(RenderObject* inlineObj)
     ASSERT(inlineObj->parent() == this);
 
     InlineIterator it(this, inlineObj, 0);
+    // FIXME: We should pass correct value for WhitespacePosition.
     while (!it.atEnd() && !requiresLineBox(it))
         it.increment();
 
@@ -1529,7 +1536,7 @@ bool RenderBlock::generatesLineBoxesForInlineChild(RenderObject* inlineObj)
 // be skipped but it will not position them.
 void RenderBlock::LineBreaker::skipTrailingWhitespace(InlineIterator& iterator, const LineInfo& lineInfo)
 {
-    while (!iterator.atEnd() && !requiresLineBox(iterator, lineInfo)) {
+    while (!iterator.atEnd() && !requiresLineBox(iterator, lineInfo, TrailingWhitespace)) {
         RenderObject* object = iterator.m_obj;
         if (object->isFloating()) {
             m_block->insertFloatingObject(toRenderBox(object));
@@ -1542,7 +1549,7 @@ void RenderBlock::LineBreaker::skipTrailingWhitespace(InlineIterator& iterator,
 void RenderBlock::LineBreaker::skipLeadingWhitespace(InlineBidiResolver& resolver, const LineInfo& lineInfo,
                                                      FloatingObject* lastFloatFromPreviousLine, LineWidth& width)
 {
-    while (!resolver.position().atEnd() && !requiresLineBox(resolver.position(), lineInfo)) {
+    while (!resolver.position().atEnd() && !requiresLineBox(resolver.position(), lineInfo, LeadingWhitespace)) {
         RenderObject* object = resolver.position().m_obj;
         if (object->isFloating())
             m_block->positionNewFloatOnLine(m_block->insertFloatingObject(toRenderBox(object)), lastFloatFromPreviousLine, width);