Reviewed by John
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 16 Dec 2004 23:39:50 +0000 (23:39 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 16 Dec 2004 23:39:50 +0000 (23:39 +0000)
        Fix for these bugs:

        <rdar://problem/3924486> REGRESSION (Mail): Hitting return key does not insert visible newline
        <rdar://problem/3924579> REGRESSION (Mail): After deleting, hitting return key does not insert visible newline

        * khtml/editing/htmlediting.cpp:
        (khtml::InsertParagraphSeparatorCommand::doApply): For the first bug, detect when inserting a <p> will
        make a visible <br> collapse. For the second bug, move the code that inserts the new <p> after
        a check which may move the node used as the reference node for the insertion. Also change this code to
        insert the <p> after the last sibling of the starting position, to move it past the nodes we're going
        to want to shift into the new <p>.

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/editing/htmlediting.cpp

index 34a2d6a..e5909d5 100644 (file)
@@ -1,3 +1,19 @@
+2004-12-16  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by John
+
+        Fix for these bugs:
+        
+        <rdar://problem/3924486> REGRESSION (Mail): Hitting return key does not insert visible newline
+        <rdar://problem/3924579> REGRESSION (Mail): After deleting, hitting return key does not insert visible newline
+
+        * khtml/editing/htmlediting.cpp:
+        (khtml::InsertParagraphSeparatorCommand::doApply): For the first bug, detect when inserting a <p> will
+        make a visible <br> collapse. For the second bug, move the code that inserts the new <p> after
+        a check which may move the node used as the reference node for the insertion. Also change this code to
+        insert the <p> after the last sibling of the starting position, to move it past the nodes we're going
+        to want to shift into the new <p>.
+
 2004-12-16  Darin Adler  <darin@apple.com>
 
         Reviewed by Ken.
 2004-12-16  Darin Adler  <darin@apple.com>
 
         Reviewed by Ken.
index 0747b7b..5d5ac7e 100644 (file)
@@ -2273,8 +2273,26 @@ void InsertParagraphSeparatorCommand::doApply()
 
     LOG(Editing, "insert paragraph separator: general case");
 
 
     LOG(Editing, "insert paragraph separator: general case");
 
-    // Put the added block in the tree.
-    insertNodeAfter(blockToInsert, startBlockIsRoot ? pos.node() : startBlock);
+    // Check if pos.node() is a <br>. If it is, and the document is in quirks mode, 
+    // then this <br> will collapse away when we add a block after it. Add an extra <br>.
+    if (!document()->inStrictMode()) {
+        int exceptionCode = 0;
+        if (pos.node()->id() == ID_BR) {
+            NodeImpl *extraBreak = document()->createHTMLElement("br", exceptionCode);
+            ASSERT(exceptionCode == 0);
+            insertNodeAfter(extraBreak, pos.node());
+            pos = Position(extraBreak, 0);
+        }
+        else {
+            Position upstreamPos = pos.upstream(StayInBlock);
+            if (upstreamPos.node()->id() == ID_BR) {
+                NodeImpl *extraBreak = document()->createHTMLElement("br", exceptionCode);
+                ASSERT(exceptionCode == 0);
+                insertNodeAfter(extraBreak, upstreamPos.node());
+            }
+            // leave pos where it is
+        }
+    }
 
     // Build up list of ancestors in between the start node and the start block.
     if (startNode != startBlock) {
 
     // Build up list of ancestors in between the start node and the start block.
     if (startNode != startBlock) {
@@ -2303,6 +2321,17 @@ void InsertParagraphSeparatorCommand::doApply()
         ASSERT(startNode);
     }
 
         ASSERT(startNode);
     }
 
+    // Put the added block in the tree.
+    if (startBlockIsRoot) {
+        NodeImpl *lastSibling = pos.node();
+        while (lastSibling->nextSibling())
+            lastSibling = lastSibling->nextSibling();
+        insertNodeAfter(blockToInsert, lastSibling);
+    }
+    else {
+        insertNodeAfter(blockToInsert, startBlock);
+    }
+
     // Make clones of ancestors in between the start node and the start block.
     NodeImpl *parent = blockToInsert;
     for (QPtrListIterator<NodeImpl> it(ancestors); it.current(); ++it) {
     // Make clones of ancestors in between the start node and the start block.
     NodeImpl *parent = blockToInsert;
     for (QPtrListIterator<NodeImpl> it(ancestors); it.current(); ++it) {