Reviewed by Chris
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 28 Feb 2005 17:51:12 +0000 (17:51 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 28 Feb 2005 17:51:12 +0000 (17:51 +0000)
        Fix for this bug:

        <rdar://problem/4026906> Paste of HTML table content can break table structure

        * khtml/editing/htmlediting.cpp:
        (khtml::ReplacementFragment::pruneEmptyNodes): Call new isProbablyTableStructureNode() function to prevent
        removal of empty table structure nodes.
        (khtml::ReplacementFragment::removeUnrenderedNodesUsingTestRendering): Ditto.
        (khtml::isProbablyTableStructureNode): New helper function.
        * khtml/editing/htmlediting.h: Declare new helper.

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

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

index bf5c02d..ea17919 100644 (file)
@@ -1,3 +1,18 @@
+2005-02-28  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by Chris
+
+        Fix for this bug:
+        
+        <rdar://problem/4026906> Paste of HTML table content can break table structure
+
+        * khtml/editing/htmlediting.cpp:
+        (khtml::ReplacementFragment::pruneEmptyNodes): Call new isProbablyTableStructureNode() function to prevent
+        removal of empty table structure nodes.
+        (khtml::ReplacementFragment::removeUnrenderedNodesUsingTestRendering): Ditto.
+        (khtml::isProbablyTableStructureNode): New helper function.
+        * khtml/editing/htmlediting.h: Declare new helper.
+
 2005-02-28  Chris Blumenberg  <cblu@apple.com>
 
        Fixed: <rdar://problem/4023566> Stickies: Crash in ReplacementFragment::insertFragmentForTestRendering on paste
index aaeeb8e..87e27f3 100644 (file)
@@ -4171,7 +4171,7 @@ void ReplacementFragment::pruneEmptyNodes()
         NodeImpl *node = m_fragment->firstChild();
         while (node) {
             if ((node->isTextNode() && static_cast<TextImpl *>(node)->length() == 0) ||
-                (isProbablyBlock(node) && node->childNodeCount() == 0)) {
+                (isProbablyBlock(node) && !isProbablyTableStructureNode(node) && node->childNodeCount() == 0)) {
                 NodeImpl *next = node->traverseNextSibling();
                 removeNode(node);
                 node = next;
@@ -4310,7 +4310,7 @@ void ReplacementFragment::removeUnrenderedNodesUsingTestRendering(NodeImpl *hold
     QPtrList<NodeImpl> unrendered;
 
     for (NodeImpl *node = holder->firstChild(); node; node = node->traverseNextNode(holder)) {
-        if (!isNodeRendered(node))
+        if (!isNodeRendered(node) && !isTableStructureNode(node))
             unrendered.append(node);
     }
 
@@ -5652,6 +5652,23 @@ bool isProbablyBlock(const NodeImpl *node)
     return false;
 }
 
+bool isProbablyTableStructureNode(const NodeImpl *node)
+{
+    if (!node)
+        return false;
+    
+    switch (node->id()) {
+        case ID_TABLE:
+        case ID_TBODY:
+        case ID_TD:
+        case ID_TFOOT:
+        case ID_THEAD:
+        case ID_TR:
+            return true;
+    }
+    return false;
+}
+
 NodeImpl *nearestMailBlockquote(const NodeImpl *node)
 {
     for (NodeImpl *n = const_cast<NodeImpl *>(node); n; n = n->parentNode()) {
index 0916776..2969fad 100644 (file)
@@ -938,6 +938,7 @@ DOM::ElementImpl *createStyleSpanElement(DOM::DocumentImpl *document);
 
 bool isNodeRendered(const DOM::NodeImpl *);
 bool isProbablyBlock(const DOM::NodeImpl *);
+bool isProbablyTableStructureNode(const DOM::NodeImpl *);
 bool isMailBlockquote(const DOM::NodeImpl *);
 DOM::NodeImpl *nearestMailBlockquote(const DOM::NodeImpl *);