Reviewed by John
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 4 Jan 2005 18:35:11 +0000 (18:35 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 4 Jan 2005 18:35:11 +0000 (18:35 +0000)
        Fix for this bug:

        <rdar://problem/3927554> Style info applied to remainder of document after a newline is entered

        * khtml/editing/htmlediting.cpp:
        (khtml::InsertParagraphSeparatorCommand::doApply): Clean up and simplification in code that inserts
        a paragraph separator. The bug was all about applying styles to the new paragraph that did not need
        to be applied. Now the code will detect when at the end of a style run and will not move and apply
        that ending style to the new paragraph, though it will place that style into the typing style. This
        seems to match NSText behavior.
        * layout-tests/editing/inserting/insert-div-021-expected.txt: This test result exhibited the bug fixed
        here. The only reason it was not noticed is that the erroneously copied inline was a span, and so did
        not have any visible effect on the document.
        * layout-tests/editing/inserting/insert-div-022-expected.txt: Added.
        * layout-tests/editing/inserting/insert-div-022.html: Added.

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

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

index 54dbb182f1db7f3e9f7b599f0790a2ab95c0bbb8..25e6009eeccf3e06ad602cc0cbed52fe3cef8f68 100644 (file)
@@ -18,17 +18,11 @@ layer at (0,0) size 800x600
         RenderInline {SPAN} at (0,0) size 32x28
           RenderText {TEXT} at (0,0) size 32x28
             text run at (0,0) width 32: "foo"
-      RenderBlock (anonymous) at (0,152) size 784x84
-        RenderBlock {P} at (0,0) size 784x28 [border: (2px solid #0000FF)]
-        RenderBlock {P} at (0,28) size 784x56 [border: (2px solid #0000FF)]
-          RenderInline {SPAN} at (0,0) size 31x28
-            RenderText {TEXT} at (14,14) size 31x28
-              text run at (14,14) width 31: "bar"
-      RenderBlock (anonymous) at (0,236) size 784x0
-        RenderInline {SPAN} at (0,0) size 0x0
-        RenderText {TEXT} at (0,0) size 0x0
-        RenderText {TEXT} at (0,0) size 0x0
+      RenderBlock {P} at (0,152) size 784x28 [border: (2px solid #0000FF)]
+      RenderBlock {P} at (0,180) size 784x56 [border: (2px solid #0000FF)]
+        RenderText {TEXT} at (14,14) size 31x28
+          text run at (14,14) width 31: "bar"
 selection is CARET:
-start:      position 0 of child 1 {TEXT} of child 1 {SPAN} of child 3 {P} of child 6 {SPAN} of root {BODY}
-upstream:   position 0 of child 3 {P} of child 6 {SPAN} of root {BODY}
-downstream: position 0 of child 1 {TEXT} of child 1 {SPAN} of child 3 {P} of child 6 {SPAN} of root {BODY}
+start:      position 0 of child 1 {TEXT} of child 8 {P} of root {BODY}
+upstream:   position 0 of child 8 {P} of root {BODY}
+downstream: position 0 of child 1 {TEXT} of child 8 {P} of root {BODY}
diff --git a/LayoutTests/editing/inserting/insert-div-022-expected.txt b/LayoutTests/editing/inserting/insert-div-022-expected.txt
new file mode 100644 (file)
index 0000000..953a462
--- /dev/null
@@ -0,0 +1,32 @@
+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 784x568
+      RenderBlock (anonymous) at (0,0) size 784x112
+        RenderText {TEXT} at (0,0) size 759x84
+          text run at (0,0) width 759: "Test inserting paragraphs: should see \"foo\" in a blue box, then a blue box with"
+          text run at (0,28) width 754: "with two lines in it: First line a bold \"x\"; second line a non-bold \"bar\". Fix for"
+          text run at (0,56) width 90: "this bug: "
+        RenderInline {A} at (0,0) size 260x28 [color=#0000EE]
+          RenderText {TEXT} at (90,56) size 260x28
+            text run at (90,56) width 260: "<rdar://problem/3927554>"
+        RenderText {TEXT} at (350,56) size 685x56
+          text run at (350,56) width 335: " Style info applied to remainder of"
+          text run at (0,84) width 347: "document after a newline is entered"
+      RenderBlock {DIV} at (0,112) size 784x12
+      RenderBlock {P} at (0,148) size 784x56 [border: (2px solid #0000FF)]
+        RenderInline {B} at (0,0) size 32x28
+          RenderText {TEXT} at (14,14) size 32x28
+            text run at (14,14) width 32: "foo"
+      RenderBlock {P} at (0,228) size 784x84 [border: (2px solid #0000FF)]
+        RenderInline {B} at (0,0) size 12x28
+          RenderText {TEXT} at (14,14) size 12x28
+            text run at (14,14) width 12: "x"
+        RenderBR {BR} at (0,0) size 0x0
+        RenderText {TEXT} at (14,42) size 31x28
+          text run at (14,42) width 31: "bar"
+selection is CARET:
+start:      position 1 of child 1 {TEXT} of child 1 {B} of child 7 {P} of root {BODY}
+upstream:   position 1 of child 1 {TEXT} of child 1 {B} of child 7 {P} of root {BODY}
+downstream: position 0 of child 2 {BR} of child 7 {P} of root {BODY}
diff --git a/LayoutTests/editing/inserting/insert-div-022.html b/LayoutTests/editing/inserting/insert-div-022.html
new file mode 100644 (file)
index 0000000..aa8e89a
--- /dev/null
@@ -0,0 +1,50 @@
+<html> 
+<head>
+
+<style>
+body {
+    font-size: 24px; 
+}
+.editing { 
+    border: 2px solid red; 
+    padding: 12px; 
+}
+p {
+    border: 2px solid blue; 
+    padding: 12px; 
+}
+br {
+    background-color: green; 
+}
+
+</style>
+<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
+
+<script>
+
+function editingTest() {
+    for (i = 0; i < 3; i++)
+        moveSelectionForwardByCharacterCommand();
+    insertParagraphCommand();
+    typeCharacterCommand();
+}
+
+</script>
+
+<title>Editing Test</title> 
+</head> 
+<body contenteditable id="root" style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space;">
+
+Test inserting paragraphs: should see "foo" in a blue box, then a blue box with with two lines in it: First line a bold "x"; second line a non-bold "bar". Fix for this bug:
+<a href="rdar://problem/3924579">&lt;rdar://problem/3927554&gt;</a> Style info applied to remainder of document after a newline is entered
+
+<div style="height: 12px"></div>
+
+<p id="test"><b>foo</b><br>bar</p>
+
+<script>
+runEditingTest();
+</script>
+
+</body>
+</html>
index 7e2337ae18050fd50b9b2c76cf1de81819499e57..84f4fafb2f2844807afa39641006eda6eb01aa31 100644 (file)
@@ -1,3 +1,23 @@
+2005-01-04  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by John
+
+        Fix for this bug:
+        
+        <rdar://problem/3927554> Style info applied to remainder of document after a newline is entered
+
+        * khtml/editing/htmlediting.cpp:
+        (khtml::InsertParagraphSeparatorCommand::doApply): Clean up and simplification in code that inserts
+        a paragraph separator. The bug was all about applying styles to the new paragraph that did not need
+        to be applied. Now the code will detect when at the end of a style run and will not move and apply 
+        that ending style to the new paragraph, though it will place that style into the typing style. This
+        seems to match NSText behavior.
+        * layout-tests/editing/inserting/insert-div-021-expected.txt: This test result exhibited the bug fixed 
+        here. The only reason it was not noticed is that the erroneously copied inline was a span, and so did
+        not have any visible effect on the document.
+        * layout-tests/editing/inserting/insert-div-022-expected.txt: Added.
+        * layout-tests/editing/inserting/insert-div-022.html: Added.
+
 2005-01-04  David Hyatt  <hyatt@apple.com>
 
        Fix for 3904562, make sure to clear the outline dictionary when drawing so that random focus rings dont get drawn
index cd7be50daca15ce2cd512ec5a85899fab0e9ef47..9688b938321057efedca4935f0f3429c90918a8d 100644 (file)
@@ -2361,25 +2361,22 @@ void InsertParagraphSeparatorCommand::doApply()
     // 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()) {
-        Position downstreamPos = pos.downstream(StayInBlock);
-        if (downstreamPos.node()->id() == ID_BR) {
-            NodeImpl *extraBreak = createBreakElement(document());
-            insertNodeAfter(extraBreak, downstreamPos.node());
-        }
-        else {
-            Position upstreamPos = pos.upstream(StayInBlock);
-            if (upstreamPos.node()->id() == ID_BR)
-                insertNodeAfter(createBreakElement(document()), upstreamPos.node());
-            // leave pos where it is
-        }
+        Position upstreamPos = pos.upstream(StayInBlock);
+        if (upstreamPos.node()->id() == ID_BR)
+            insertNodeAfter(createBreakElement(document()), upstreamPos.node());
     }
+    
+    // Move downstream. Typing style code will take care of carrying along the 
+    // style of the upstream position.
+    pos = pos.downstream(StayInBlock);
+    startNode = pos.node();
 
     // Build up list of ancestors in between the start node and the start block.
     if (startNode != startBlock) {
         for (NodeImpl *n = startNode->parentNode(); n && n != startBlock; n = n->parentNode())
             ancestors.prepend(n);
     }
-
+    
     // Split at pos if in the middle of a text node.
     if (startNode->isTextNode()) {
         TextImpl *textNode = static_cast<TextImpl *>(startNode);
@@ -2391,14 +2388,6 @@ void InsertParagraphSeparatorCommand::doApply()
             startNode = splitCommand->node();
             pos = Position(startNode, 0);
         }
-        else if (atEnd) {
-            startNode = startNode->traverseNextNode();
-            ASSERT(startNode);
-        }
-    }
-    else if (pos.offset() > 0) {
-        startNode = startNode->traverseNextNode();
-        ASSERT(startNode);
     }
 
     // Put the added block in the tree.
@@ -2425,8 +2414,6 @@ void InsertParagraphSeparatorCommand::doApply()
     // Move the start node and the siblings of the start node.
     if (startNode != startBlock) {
         NodeImpl *n = startNode;
-        if (n->id() == ID_BR)
-            n = n->nextSibling();
         while (n && n != blockToInsert) {
             NodeImpl *next = n->nextSibling();
             removeNode(n);