Reviewed by John
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 10 Mar 2005 17:24:05 +0000 (17:24 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 10 Mar 2005 17:24:05 +0000 (17:24 +0000)
        Fix for this bug:

        <rdar://problem/4024929> REGRESSION (Mail): Pasting text with multiple reply levels removes one level instead of all

        The code to figure out which node to use to merge into an existing line did not drill into the first inline element
        as needed to make the feature work as user expect. Instead, it looked at the first node, and if it was a block, it
        skipped that node. This worked for some cases (including the important "paste-as-quotation" case) but obviously
        doesn't work for content quoted more than once.

        Now, mergeStartNode() will look for the first node in pasted content that is not a block. It will now also look
        for nodes specially marked by Mail as a node added to make "Paste As Quotation" work. It won't skip those.

        NOTE: This change will break Mail's "Paste As Quotation" feature for TOT WebKit users, but this is only a temporary
        problem that will exist until we sync up with Mail's pending change to mark nodes as needed in its pasteAsQuotation:
        method.

        * khtml/editing/html_interchange.h: Add ApplePasteAsQuotation constant used to check for "marked" blockquotes.
        * khtml/editing/htmlediting.cpp:
        (khtml::ReplacementFragment::mergeStartNode): Look for first node that is either not a block or is marked as
        an ApplePasteAsQuotation node.
        (khtml::isMailPasteAsQuotationNode): New helper that looks for nodes marked with ApplePasteAsQuotation.
        * khtml/editing/htmlediting.h: Updated header for new function.

        This test result changed is an acceptable way.

        * layout-tests/editing/pasteboard/paste-text-013-expected.txt
        * layout-tests/editing/pasteboard/paste-text-013.html

        NOTE: This change causes a regression in this layout test:

        * layout-tests/editing/pasteboard/paste-text-013.html

        This problem will need to be fixed separately, and this bug has been filed to track this problem:
        <rdar://problem/4045513> Copying and pasting selection starting at end of paragraph can incorrectly remove line break

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

LayoutTests/editing/pasteboard/paste-text-013-expected.txt
LayoutTests/editing/pasteboard/paste-text-013.html
WebCore/ChangeLog-2005-08-23
WebCore/khtml/editing/html_interchange.h
WebCore/khtml/editing/htmlediting.cpp
WebCore/khtml/editing/htmlediting.h

index 97bd3bc6cf2edc105092cd5d710e6d74afc8511a..c65740ea1bc02679f28f98185c6a8f888926946c 100644 (file)
@@ -23,13 +23,12 @@ layer at (0,0) size 800x600
         RenderBlock (anonymous) at (14,14) size 756x28
           RenderText {TEXT} at (0,0) size 12x28
             text run at (0,0) width 12: "x"
-        RenderBlock {DIV} at (14,66) size 756x80
-          RenderBlock {BLOCKQUOTE} at (40,0) size 676x28
-            RenderText {TEXT} at (0,0) size 32x28
-              text run at (0,0) width 32: "foo"
-          RenderBlock {BLOCKQUOTE} at (40,52) size 676x28
-            RenderBR {BR} at (0,0) size 0x28
+        RenderBlock {BLOCKQUOTE} at (54,66) size 676x28
+          RenderText {TEXT} at (0,0) size 32x28
+            text run at (0,0) width 32: "foo"
+        RenderBlock {BLOCKQUOTE} at (54,118) size 676x28
+          RenderBR {BR} at (0,0) size 0x28
 selection is CARET:
-start:      position 0 of child 1 {BR} of child 2 {BLOCKQUOTE} of child 2 {DIV} of child 8 {DIV} of root {BODY}
-upstream:   position 0 of child 2 {BLOCKQUOTE} of child 2 {DIV} of child 8 {DIV} of root {BODY}
-downstream: position 0 of child 1 {BR} of child 2 {BLOCKQUOTE} of child 2 {DIV} of child 8 {DIV} of root {BODY}
+start:      position 0 of child 1 {BR} of child 3 {BLOCKQUOTE} of child 8 {DIV} of root {BODY}
+upstream:   position 0 of child 3 {BLOCKQUOTE} of child 8 {DIV} of root {BODY}
+downstream: position 0 of child 1 {BR} of child 3 {BLOCKQUOTE} of child 8 {DIV} of root {BODY}
index 6b07912b91451b80e4563fff88a878bc9f45a3a9..47115265bbbf3de28b1919f257c52d2d4bbeb067 100644 (file)
@@ -31,7 +31,7 @@ See this bug: <a href="rdar://problem/3918712">&lt;rdar://problem/3918712&gt;</a
 Should see one box with blockquoted "foo" text, followed by another box with an "x" (not in a blockquote) and "foo" (in a blockquote).
 <div style="height: 24px"></div>
 
-<div id="test" class="editing"><div><blockquote>foo</blockquote></div></div>
+<div id="test" class="editing"><div><blockquote class="Apple-paste-as-quotation">foo</blockquote></div></div>
 <div class="editing"></div>
   
 <script>
index 61a4b94a70eea08af81f300f8af5d9a7f4e99dd8..29ba02d3504bc2c2443b57fd3267a05e90735741 100644 (file)
@@ -1,3 +1,42 @@
+2005-03-10  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by John
+
+        Fix for this bug:
+        
+        <rdar://problem/4024929> REGRESSION (Mail): Pasting text with multiple reply levels removes one level instead of all
+        
+        The code to figure out which node to use to merge into an existing line did not drill into the first inline element
+        as needed to make the feature work as user expect. Instead, it looked at the first node, and if it was a block, it
+        skipped that node. This worked for some cases (including the important "paste-as-quotation" case) but obviously 
+        doesn't work for content quoted more than once.
+        
+        Now, mergeStartNode() will look for the first node in pasted content that is not a block. It will now also look
+        for nodes specially marked by Mail as a node added to make "Paste As Quotation" work. It won't skip those. 
+        
+        NOTE: This change will break Mail's "Paste As Quotation" feature for TOT WebKit users, but this is only a temporary 
+        problem that will exist until we sync up with Mail's pending change to mark nodes as needed in its pasteAsQuotation:
+        method.
+        
+        * khtml/editing/html_interchange.h: Add ApplePasteAsQuotation constant used to check for "marked" blockquotes.
+        * khtml/editing/htmlediting.cpp:
+        (khtml::ReplacementFragment::mergeStartNode): Look for first node that is either not a block or is marked as
+        an ApplePasteAsQuotation node.
+        (khtml::isMailPasteAsQuotationNode): New helper that looks for nodes marked with ApplePasteAsQuotation.
+        * khtml/editing/htmlediting.h: Updated header for new function.
+        
+        This test result changed is an acceptable way.
+        
+        * layout-tests/editing/pasteboard/paste-text-013-expected.txt
+        * layout-tests/editing/pasteboard/paste-text-013.html
+
+        NOTE: This change causes a regression in this layout test:
+
+        * layout-tests/editing/pasteboard/paste-text-013.html
+
+        This problem will need to be fixed separately, and this bug has been filed to track this problem:
+        <rdar://problem/4045513> Copying and pasting selection starting at end of paragraph can incorrectly remove line break
+
 2005-03-09  Maciej Stachowiak  <mjs@apple.com>
 
         Reviewed by Richard.
index 116e562a040f2da4781d372449a660c9cb499356..24f6fb395f88d4faceb0fd9a118fe4ef8b81951f 100644 (file)
@@ -30,6 +30,7 @@ class QString;
 
 #define AppleInterchangeNewline   "Apple-interchange-newline"
 #define AppleConvertedSpace       "Apple-converted-space"
+#define ApplePasteAsQuotation     "Apple-paste-as-quotation"
 #define AppleStyleSpanClass       "Apple-style-span"
 
 enum EAnnotateForInterchange { DoNotAnnotateForInterchange, AnnotateForInterchange };
index 9f4165ced5ab9c20ae96eaf7a27d67a7337459e9..1831a829397c37b7696a1432ad2b678c9ebfc3fb 100644 (file)
@@ -4187,11 +4187,9 @@ NodeImpl *ReplacementFragment::lastChild() const
 NodeImpl *ReplacementFragment::mergeStartNode() const
 {
     NodeImpl *node = m_fragment->firstChild();
-    if (!node)
-        return 0;
-    if (!isProbablyBlock(node))
-        return node;
-    return node->firstChild();
+    while (node && isProbablyBlock(node) && !isMailPasteAsQuotationNode(node))
+        node = node->traverseNextNode();
+    return node;
 }
 
 void ReplacementFragment::pruneEmptyNodes()
@@ -5819,4 +5817,12 @@ bool isMailBlockquote(const NodeImpl *node)
     return static_cast<const ElementImpl *>(node)->getAttribute("type") == "cite";
 }
 
+bool isMailPasteAsQuotationNode(const NodeImpl *node)
+{
+    if (!node)
+        return false;
+        
+    return static_cast<const ElementImpl *>(node)->getAttribute("class") == ApplePasteAsQuotation;
+}
+
 } // namespace khtml
index e72cee46de83a0bc7d1315d5c4c6e38572642d0a..024d7cf469865b85822e7f9041c12a010cc31eb9 100644 (file)
@@ -965,6 +965,7 @@ bool isProbablyBlock(const DOM::NodeImpl *);
 bool isProbablyTableStructureNode(const DOM::NodeImpl *);
 bool isMailBlockquote(const DOM::NodeImpl *);
 DOM::NodeImpl *nearestMailBlockquote(const DOM::NodeImpl *);
+bool isMailPasteAsQuotationNode(const DOM::NodeImpl *node);
 
 //------------------------------------------------------------------------------------------