LayoutTests:
authoradele <adele@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 24 Mar 2007 04:38:54 +0000 (04:38 +0000)
committeradele <adele@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 24 Mar 2007 04:38:54 +0000 (04:38 +0000)
        Reviewed by Adele.

        - pixel test and updated results for http://bugs.webkit.org/show_bug.cgi?id=13153
          REGRESSION: Visual highlighting of pre-populated blank line in textarea is broken

        * editing/selection/doubleclick-crash-expected.checksum:
        * editing/selection/doubleclick-crash-expected.png:
        * fast/text/selection-hard-linebreak-expected.checksum: Added.
        * fast/text/selection-hard-linebreak-expected.png: Added.
        * fast/text/selection-hard-linebreak-expected.txt: Added.
        * fast/text/selection-hard-linebreak.html: Added.

WebCore:

        Reviewed by Adele.

        - fix http://bugs.webkit.org/show_bug.cgi?id=13153
          REGRESSION: Visual highlighting of pre-populated blank line in textarea is broken

        - fix a bug where selecting across a soft line break did not highlight to
          the end of the first line if it contained skipped whitespace

        Test: fast/text/selection-hard-linebreak.html

        * rendering/InlineTextBox.cpp:
        (WebCore::InlineTextBox::selectionState): Changed to treat a selection that ends on the
        end of a hard line break as if it ends after the line break. Fixed the case of a selection
        that starts and ends in the same text object as the box but does not intersect it
        to return SelectionNone instead of selectionBoth.

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

LayoutTests/ChangeLog
LayoutTests/editing/selection/doubleclick-crash-expected.checksum
LayoutTests/editing/selection/doubleclick-crash-expected.png
LayoutTests/fast/text/selection-hard-linebreak-expected.checksum [new file with mode: 0644]
LayoutTests/fast/text/selection-hard-linebreak-expected.png [new file with mode: 0644]
LayoutTests/fast/text/selection-hard-linebreak-expected.txt [new file with mode: 0644]
LayoutTests/fast/text/selection-hard-linebreak.html [new file with mode: 0644]
WebCore/ChangeLog
WebCore/rendering/InlineTextBox.cpp

index cd975d7e1ca690e2bd26e26bceca267b93a387a5..aee40b3406bf1d16b0a5d7182c9d9ba66707cacc 100644 (file)
@@ -1,3 +1,17 @@
+2007-03-23  Mitz Pettel  <mitz@webkit.org>
+
+        Reviewed by Adele.
+
+        - pixel test and updated results for http://bugs.webkit.org/show_bug.cgi?id=13153
+          REGRESSION: Visual highlighting of pre-populated blank line in textarea is broken
+
+        * editing/selection/doubleclick-crash-expected.checksum:
+        * editing/selection/doubleclick-crash-expected.png:
+        * fast/text/selection-hard-linebreak-expected.checksum: Added.
+        * fast/text/selection-hard-linebreak-expected.png: Added.
+        * fast/text/selection-hard-linebreak-expected.txt: Added.
+        * fast/text/selection-hard-linebreak.html: Added.
+
 2007-03-23  Mitz Pettel  <mitz@webkit.org>
 
         Reviewed by Adele.
index c06c269dcd9c6e74cc05493fcb64a7455e474bf4..bd74dd40379d1b587de918de40bcf44854c432bc 100644 (file)
@@ -1 +1 @@
-dbe98ef1002f98bb46f49de6e875f258
\ No newline at end of file
+824fd7986f341d5e018848921b311757
\ No newline at end of file
index 900812d55caf9fdddbec93e29a898b6c67503f0c..e936fc28706aa31a3879ffd3a8a5b408c71cc84c 100644 (file)
Binary files a/LayoutTests/editing/selection/doubleclick-crash-expected.png and b/LayoutTests/editing/selection/doubleclick-crash-expected.png differ
diff --git a/LayoutTests/fast/text/selection-hard-linebreak-expected.checksum b/LayoutTests/fast/text/selection-hard-linebreak-expected.checksum
new file mode 100644 (file)
index 0000000..ded5d5c
--- /dev/null
@@ -0,0 +1 @@
+57b721cc0dcabdbdcc34134027ca296b
\ No newline at end of file
diff --git a/LayoutTests/fast/text/selection-hard-linebreak-expected.png b/LayoutTests/fast/text/selection-hard-linebreak-expected.png
new file mode 100644 (file)
index 0000000..78f1166
Binary files /dev/null and b/LayoutTests/fast/text/selection-hard-linebreak-expected.png differ
diff --git a/LayoutTests/fast/text/selection-hard-linebreak-expected.txt b/LayoutTests/fast/text/selection-hard-linebreak-expected.txt
new file mode 100644 (file)
index 0000000..2dca3d8
--- /dev/null
@@ -0,0 +1,160 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock {P} at (0,0) size 784x36
+        RenderText {#text} at (0,0) size 53x18
+          text run at (0,0) width 53: "Test for "
+        RenderInline {I} at (0,0) size 774x36
+          RenderInline {A} at (0,0) size 301x18 [color=#0000EE]
+            RenderText {#text} at (53,0) size 301x18
+              text run at (53,0) width 301: "http://bugs.webkit.org/show_bug.cgi?id=13153"
+          RenderText {#text} at (354,0) size 774x36
+            text run at (354,0) width 4: " "
+            text run at (358,0) width 416: "REGRESSION: Visual highlighting of pre-populated blank line in"
+            text run at (0,18) width 113: "textarea is broken"
+        RenderText {#text} at (113,18) size 4x18
+          text run at (113,18) width 4: "."
+      RenderBlock {P} at (0,52) size 784x18
+        RenderText {#text} at (0,0) size 333x18
+          text run at (0,0) width 333: "Testing the highlighting of and near hard line breaks."
+      RenderBlock (anonymous) at (0,86) size 784x80
+        RenderPartObject {IFRAME} at (4,4) size 62x72 [border: (1px solid #0000FF)]
+          layer at (0,0) size 60x70
+            RenderView at (0,0) size 60x70
+          layer at (0,0) size 60x61
+            RenderBlock {HTML} at (0,0) size 60x61
+              RenderBody {BODY} at (8,8) size 44x45
+                RenderBlock {PRE} at (0,0) size 44x45
+                  RenderText {#text} at (0,0) size 24x45
+                    text run at (0,0) width 24: "foo"
+                    text run at (24,0) width 0: " "
+                    text run at (0,15) width 0: " "
+                    text run at (0,30) width 24: "bar"
+        RenderPartObject {IFRAME} at (74,4) size 62x72 [border: (1px solid #0000FF)]
+          layer at (0,0) size 60x70
+            RenderView at (0,0) size 60x70
+          layer at (0,0) size 60x61
+            RenderBlock {HTML} at (0,0) size 60x61
+              RenderBody {BODY} at (8,8) size 44x45
+                RenderBlock {PRE} at (0,0) size 44x45
+                  RenderText {#text} at (0,0) size 24x45
+                    text run at (0,0) width 24: "foo"
+                    text run at (24,0) width 0: " "
+                    text run at (0,15) width 0: " "
+                    text run at (0,30) width 24: "bar"
+        RenderPartObject {IFRAME} at (144,4) size 62x72 [border: (1px solid #0000FF)]
+          layer at (0,0) size 60x70
+            RenderView at (0,0) size 60x70
+          layer at (0,0) size 60x61
+            RenderBlock {HTML} at (0,0) size 60x61
+              RenderBody {BODY} at (8,8) size 44x45
+                RenderBlock {PRE} at (0,0) size 44x45
+                  RenderText {#text} at (0,0) size 24x45
+                    text run at (0,0) width 24: "foo"
+                    text run at (24,0) width 0: " "
+                    text run at (0,15) width 0: " "
+                    text run at (0,30) width 24: "bar"
+        RenderPartObject {IFRAME} at (214,4) size 62x72 [border: (1px solid #0000FF)]
+          layer at (0,0) size 60x70
+            RenderView at (0,0) size 60x70
+          layer at (0,0) size 60x61
+            RenderBlock {HTML} at (0,0) size 60x61
+              RenderBody {BODY} at (8,8) size 44x45
+                RenderBlock {PRE} at (0,0) size 44x45
+                  RenderText {#text} at (0,0) size 24x45
+                    text run at (0,0) width 24: "foo"
+                    text run at (24,0) width 0: " "
+                    text run at (0,15) width 0: " "
+                    text run at (0,30) width 24: "bar"
+        RenderPartObject {IFRAME} at (284,4) size 62x72 [border: (1px solid #0000FF)]
+          layer at (0,0) size 60x70
+            RenderView at (0,0) size 60x70
+          layer at (0,0) size 60x61
+            RenderBlock {HTML} at (0,0) size 60x61
+              RenderBody {BODY} at (8,8) size 44x45
+                RenderBlock {PRE} at (0,0) size 44x45
+                  RenderText {#text} at (0,0) size 24x45
+                    text run at (0,0) width 24: "foo"
+                    text run at (24,0) width 0: " "
+                    text run at (0,15) width 0: " "
+                    text run at (0,30) width 24: "bar"
+        RenderPartObject {IFRAME} at (354,4) size 62x72 [border: (1px solid #0000FF)]
+          layer at (0,0) size 60x70
+            RenderView at (0,0) size 60x70
+          layer at (0,0) size 60x61
+            RenderBlock {HTML} at (0,0) size 60x61
+              RenderBody {BODY} at (8,8) size 44x45
+                RenderBlock {PRE} at (0,0) size 44x45
+                  RenderText {#text} at (0,0) size 24x45
+                    text run at (0,0) width 24: "foo"
+                    text run at (24,0) width 0: " "
+                    text run at (0,15) width 0: " "
+                    text run at (0,30) width 24: "bar"
+        RenderPartObject {IFRAME} at (424,4) size 62x72 [border: (1px solid #0000FF)]
+          layer at (0,0) size 60x70
+            RenderView at (0,0) size 60x70
+          layer at (0,0) size 60x61
+            RenderBlock {HTML} at (0,0) size 60x61
+              RenderBody {BODY} at (8,8) size 44x45
+                RenderBlock {PRE} at (0,0) size 44x45
+                  RenderText {#text} at (0,0) size 24x45
+                    text run at (0,0) width 24: "foo"
+                    text run at (24,0) width 0: " "
+                    text run at (0,15) width 0: " "
+                    text run at (0,30) width 24: "bar"
+        RenderPartObject {IFRAME} at (494,4) size 62x72 [border: (1px solid #0000FF)]
+          layer at (0,0) size 60x70
+            RenderView at (0,0) size 60x70
+          layer at (0,0) size 60x61
+            RenderBlock {HTML} at (0,0) size 60x61
+              RenderBody {BODY} at (8,8) size 44x45
+                RenderBlock {PRE} at (0,0) size 44x45
+                  RenderText {#text} at (0,0) size 24x45
+                    text run at (0,0) width 24: "foo"
+                    text run at (24,0) width 0: " "
+                    text run at (0,15) width 0: " "
+                    text run at (0,30) width 24: "bar"
+        RenderPartObject {IFRAME} at (564,4) size 62x72 [border: (1px solid #0000FF)]
+          layer at (0,0) size 60x70
+            RenderView at (0,0) size 60x70
+          layer at (0,0) size 60x61
+            RenderBlock {HTML} at (0,0) size 60x61
+              RenderBody {BODY} at (8,8) size 44x45
+                RenderBlock {PRE} at (0,0) size 44x45
+                  RenderText {#text} at (0,0) size 24x45
+                    text run at (0,0) width 24: "foo"
+                    text run at (24,0) width 0: " "
+                    text run at (0,15) width 0: " "
+                    text run at (0,30) width 24: "bar"
+        RenderPartObject {IFRAME} at (634,4) size 62x72 [border: (1px solid #0000FF)]
+          layer at (0,0) size 60x70
+            RenderView at (0,0) size 60x70
+          layer at (0,0) size 60x61
+            RenderBlock {HTML} at (0,0) size 60x61
+              RenderBody {BODY} at (8,8) size 44x45
+                RenderBlock {PRE} at (0,0) size 44x45
+                  RenderText {#text} at (0,0) size 24x45
+                    text run at (0,0) width 24: "foo"
+                    text run at (24,0) width 0: " "
+                    text run at (0,15) width 0: " "
+                    text run at (0,30) width 24: "bar"
+        RenderText {#text} at (0,0) size 0x0
+      RenderBlock {P} at (0,182) size 784x18
+        RenderText {#text} at (0,0) size 312x18
+          text run at (0,0) width 312: "Testing the highlighting of text split across boxes."
+      RenderBlock (anonymous) at (0,216) size 784x80
+        RenderPartObject {IFRAME} at (4,4) size 130x72 [border: (1px solid #0000FF)]
+          layer at (0,0) size 128x70
+            RenderView at (0,0) size 128x70
+          layer at (0,0) size 128x70
+            RenderBlock {HTML} at (0,0) size 128x70
+              RenderBody {BODY} at (8,8) size 112x54
+                RenderBlock {DIV} at (0,0) size 112x36
+                  RenderText {#text} at (0,0) size 84x36
+                    text run at (0,0) width 46: "Lorem "
+                    text run at (46,0) width 38: "ipsum"
+                    text run at (0,18) width 33: "dolor"
+        RenderText {#text} at (0,0) size 0x0
+        RenderText {#text} at (0,0) size 0x0
diff --git a/LayoutTests/fast/text/selection-hard-linebreak.html b/LayoutTests/fast/text/selection-hard-linebreak.html
new file mode 100644 (file)
index 0000000..e0a7bcc
--- /dev/null
@@ -0,0 +1,57 @@
+<head>
+    <script>
+        function test()
+        {
+            addTest(2, 3);
+            addTest(2, 4);
+            addTest(2, 5);
+            addTest(2, 6);
+            addTest(3, 4);
+            addTest(3, 5);
+            addTest(3, 6);
+            addTest(4, 5);
+            addTest(4, 6);
+            addTest(5, 6);
+        }
+
+        function addTest(i, j)
+        {
+            var iframe = document.createElement("iframe");
+            document.body.appendChild(iframe);
+            var doc = iframe.contentDocument;
+            var pre = doc.createElement("pre");
+            var text = doc.createTextNode("foo\n\nbar");
+            pre.appendChild(text);
+            pre.style.margin = "0";
+            doc.body.appendChild(pre);
+            var sel = doc.defaultView.getSelection();
+            sel.setBaseAndExtent(text, i, text, j);
+        }
+    </script>
+    <style>
+        iframe { border: 1px solid blue; width: 60px; height: 70px; margin: 4px; }
+    </style>
+</head>
+<body>
+    <p>
+        Test for <i><a href="http://bugs.webkit.org/show_bug.cgi?id=13153">http://bugs.webkit.org/show_bug.cgi?id=13153</a>
+        REGRESSION: Visual highlighting of pre-populated blank line in textarea is broken</i>.
+    </p>
+    <p>
+        Testing the highlighting of and near hard line breaks.
+    </p>
+    <script>
+        test();
+    </script>
+    <p>
+        Testing the highlighting of text split across boxes.
+    </p>
+    <iframe style="width: 128px;" src="data:text/html,
+        <div id='target'>Lorem    ipsum dolor</div>
+        <script>
+            var text = document.getElementById('target').firstChild;
+            getSelection().setBaseAndExtent(text, 13, text, 16);
+        </script>
+    ">
+    </iframe>
+</body>
index 6bdd0df7f45ca4ed8a263473e9ed0a672ad6f25b..8528745152d3e1f70231b7a981c1e33aecf4c39a 100644 (file)
@@ -1,3 +1,21 @@
+2007-03-23  Mitz Pettel  <mitz@webkit.org>
+
+        Reviewed by Adele.
+
+        - fix http://bugs.webkit.org/show_bug.cgi?id=13153
+          REGRESSION: Visual highlighting of pre-populated blank line in textarea is broken
+
+        - fix a bug where selecting across a soft line break did not highlight to
+          the end of the first line if it contained skipped whitespace
+
+        Test: fast/text/selection-hard-linebreak.html
+
+        * rendering/InlineTextBox.cpp:
+        (WebCore::InlineTextBox::selectionState): Changed to treat a selection that ends on the
+        end of a hard line break as if it ends after the line break. Fixed the case of a selection
+        that starts and ends in the same text object as the box but does not intersect it
+        to return SelectionNone instead of selectionBoth.
+
 2007-03-23  Mitz Pettel  <mitz@webkit.org>
 
         Reviewed by Adele.
index adf2fce13a18e6e94cffe862f1bd91e188fb7772..65d9aa8e24a7fd4a5fcb2e0c087f87ec1f0535a7 100644 (file)
@@ -92,9 +92,11 @@ RenderObject::SelectionState InlineTextBox::selectionState()
     if (state == RenderObject::SelectionStart || state == RenderObject::SelectionEnd || state == RenderObject::SelectionBoth) {
         int startPos, endPos;
         object()->selectionStartEnd(startPos, endPos);
+        // The position after a hard line break is considered to be past its end.
+        int lastSelectable = start() + len() - (isLineBreak() ? 1 : 0);
 
         bool start = (state != RenderObject::SelectionEnd && startPos >= m_start && startPos < m_start + m_len);
-        bool end = (state != RenderObject::SelectionStart && endPos > m_start && endPos <= m_start + m_len);
+        bool end = (state != RenderObject::SelectionStart && endPos > m_start && endPos <= lastSelectable);
         if (start && end)
             state = RenderObject::SelectionBoth;
         else if (start)
@@ -102,8 +104,10 @@ RenderObject::SelectionState InlineTextBox::selectionState()
         else if (end)
             state = RenderObject::SelectionEnd;
         else if ((state == RenderObject::SelectionEnd || startPos < m_start) &&
-                 (state == RenderObject::SelectionStart || endPos > m_start + m_len))
+                 (state == RenderObject::SelectionStart || endPos > lastSelectable))
             state = RenderObject::SelectionInside;
+        else if (state == RenderObject::SelectionBoth)
+            state = RenderObject::SelectionNone;
     }
     return state;
 }