Reviewed by John
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 3 Dec 2004 00:33:24 +0000 (00:33 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 3 Dec 2004 00:33:24 +0000 (00:33 +0000)
        Fix for this bug:

        <rdar://problem/3786362> REGRESSION (Mail): pasted text loses one newline

        * khtml/editing/htmlediting.cpp:
        (khtml::InsertLineBreakCommand::doApply): Added check for strict mode before adding an extra br element
        at the end of a block. This is only necessary in quirks mode. Also, lower-case "br" used to make element.
        (khtml::ReplaceSelectionCommand::doApply): If the replacement adds a br element as the last element
        in a block and the document is in quirks mode, add an additional br to make the one in the
        replacement content show up. This turns out to be much the same logic as is done in InsertLineBreakCommand.
        * layout-tests/editing/inserting/insert-3786362-fix-expected.txt: Added.
        * layout-tests/editing/inserting/insert-3786362-fix.html: Added.

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

LayoutTests/editing/inserting/insert-3786362-fix-expected.txt [new file with mode: 0644]
LayoutTests/editing/inserting/insert-3786362-fix.html [new file with mode: 0644]
WebCore/ChangeLog-2005-08-23
WebCore/khtml/editing/htmlediting.cpp

diff --git a/LayoutTests/editing/inserting/insert-3786362-fix-expected.txt b/LayoutTests/editing/inserting/insert-3786362-fix-expected.txt
new file mode 100644 (file)
index 0000000..f05b7de
--- /dev/null
@@ -0,0 +1,22 @@
+layer at (0,0) size 800x600
+  RenderCanvas 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 {DIV} at (0,0) size 784x88 [border: (2px solid #FF0000)]
+        RenderText {TEXT} at (2,2) size 11x28
+          text run at (2,2) width 11: "a"
+        RenderBR {BR} at (0,0) size 0x0
+        RenderBR {BR} at (2,30) size 0x28
+        RenderText {TEXT} at (2,58) size 12x28
+          text run at (2,58) width 12: "b"
+      RenderBlock {DIV} at (0,88) size 784x88 [border: (2px solid #FF0000)]
+        RenderText {TEXT} at (2,2) size 11x28
+          text run at (2,2) width 11: "a"
+        RenderBR {BR} at (0,0) size 0x0
+        RenderBR {BR} at (2,30) size 0x28
+        RenderBR {BR} at (2,58) size 0x28
+selection is CARET:
+start:      position 0 of child 4 {BR} of child 3 {DIV} of root {BODY}
+upstream:   position 1 of child 3 {BR} of child 3 {DIV} of root {BODY}
+downstream: position 0 of child 4 {BR} of child 3 {DIV} of root {BODY}
diff --git a/LayoutTests/editing/inserting/insert-3786362-fix.html b/LayoutTests/editing/inserting/insert-3786362-fix.html
new file mode 100644 (file)
index 0000000..3629965
--- /dev/null
@@ -0,0 +1,39 @@
+<html> 
+<head>
+
+<style>
+.editing { 
+    border: 2px solid red; 
+    font-size: 24px; 
+    word-wrap: break-word; 
+    -khtml-nbsp-mode: space; 
+    -khtml-line-break: after-white-space;
+}
+</style>
+<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
+
+<script>
+
+function editingTest() {
+    extendSelectionForwardByLineCommand();
+    extendSelectionForwardByLineCommand();
+    copyCommand();
+    moveSelectionForwardByLineCommand();
+    moveSelectionForwardByLineCommand();
+    pasteCommand();
+}
+
+</script>
+
+<title>Editing Test</title> 
+</head> 
+<body contenteditable id="root">
+<div class="editing" id="test">a<br><br>b</div>
+<div class="editing"></div>
+
+<script>
+runEditingTest();
+</script>
+
+</body>
+</html>
index 118ca421aa9fe4a39389e6f45dc5853bf8a211e5..4d935277522b7e701c967764e0a814e5ab11e13b 100644 (file)
@@ -1,3 +1,20 @@
+2004-12-02  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by John
+
+        Fix for this bug:
+        
+        <rdar://problem/3786362> REGRESSION (Mail): pasted text loses one newline
+
+        * khtml/editing/htmlediting.cpp:
+        (khtml::InsertLineBreakCommand::doApply): Added check for strict mode before adding an extra br element
+        at the end of a block. This is only necessary in quirks mode. Also, lower-case "br" used to make element.
+        (khtml::ReplaceSelectionCommand::doApply): If the replacement adds a br element as the last element
+        in a block and the document is in quirks mode, add an additional br to make the one in the 
+        replacement content show up. This turns out to be much the same logic as is done in InsertLineBreakCommand.
+        * layout-tests/editing/inserting/insert-3786362-fix-expected.txt: Added.
+        * layout-tests/editing/inserting/insert-3786362-fix.html: Added.
+
 2004-12-02  Richard Williamson   <rjw@apple.com>
 
        Fixed <rdar://problem/3841332> REGRESSION (125.9-167u): repro crash in -[KWQPageState invalidate] involving .Mac images
index d35bf4f452253c1fcc5be68d0926dd7543fd2804..f5833495566185f2e1ee189683a9252454342adb 100644 (file)
@@ -2034,9 +2034,9 @@ void InsertLineBreakCommand::doApply()
             if (hasTrailingBR) {
                 setEndingSelection(Position(next, 0));
             }
-            else {
+            else if (!document()->inStrictMode()) {
                 // Insert an "extra" BR at the end of the block. 
-                ElementImpl *extraBreakNode = document()->createHTMLElement("BR", exceptionCode);
+                ElementImpl *extraBreakNode = document()->createHTMLElement("br", exceptionCode);
                 ASSERT(exceptionCode == 0);
                 insertNodeAfter(extraBreakNode, nodeToInsert);
                 setEndingSelection(Position(extraBreakNode, 0));
@@ -3298,6 +3298,21 @@ void ReplaceSelectionCommand::doApply()
         completeHTMLReplacement(startPos, endPos);
     }
     else {
+        if (lastNodeInserted->id() == ID_BR && !document()->inStrictMode()) {
+            document()->updateLayout();
+            VisiblePosition pos(Position(lastNodeInserted, 0));
+            if (isLastVisiblePositionInBlock(pos)) {
+                NodeImpl *next = lastNodeInserted->traverseNextNode();
+                bool hasTrailingBR = next && next->id() == ID_BR && lastNodeInserted->enclosingBlockFlowElement() == next->enclosingBlockFlowElement();
+                if (!hasTrailingBR) {
+                    // Insert an "extra" BR at the end of the block. 
+                    int exceptionCode = 0;
+                    ElementImpl *extraBreakNode = document()->createHTMLElement("br", exceptionCode);
+                    ASSERT(exceptionCode == 0);
+                    insertNodeBefore(extraBreakNode, lastNodeInserted);
+                }
+            }
+        }
         completeHTMLReplacement(firstNodeInserted, lastNodeInserted);
     }
 }