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

        <rdar://problem/3910425> REGRESSION (Mail): Crash in ReplaceSelectionCommand; selection is empty, leading to null deref

        * khtml/editing/htmlediting.cpp:
        (khtml::MoveSelectionCommand::doApply): The node representing the destination for the move may have
        been deleted. If this is the case, set the destination to the node the delete command provides in
        its ending selection.

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

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

index b8f7d1d..e7cf5fd 100644 (file)
@@ -1,3 +1,16 @@
+2004-12-09  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by Harrison
+
+        Fix for this bug:
+        
+        <rdar://problem/3910425> REGRESSION (Mail): Crash in ReplaceSelectionCommand; selection is empty, leading to null deref
+
+        * khtml/editing/htmlediting.cpp:
+        (khtml::MoveSelectionCommand::doApply): The node representing the destination for the move may have
+        been deleted. If this is the case, set the destination to the node the delete command provides in
+        its ending selection.
+
 === Safari-175 ===
 
 2004-12-09  Ken Kocienda  <kocienda@apple.com>
index 596ea01..6d1c361 100644 (file)
@@ -2715,6 +2715,8 @@ void MoveSelectionCommand::doApply()
     Selection selection = endingSelection();
     ASSERT(selection.isRange());
 
+    Position pos = m_position;
+
     // Update the position otherwise it may become invalid after the selection is deleted.
     NodeImpl *positionNode = m_position.node();
     long positionOffset = m_position.offset();
@@ -2726,11 +2728,19 @@ void MoveSelectionCommand::doApply()
         if (selectionStart.node() == positionNode) {
             positionOffset += selectionStart.offset();
         }
+        pos = Position(positionNode, positionOffset);
     }
-    
+
     deleteSelection(m_smartMove);
 
-    setEndingSelection(Position(positionNode, positionOffset));
+    // If the node for the destination has been removed as a result of the deletion,
+    // set the destination to the ending point after the deletion.
+    // Fixes: <rdar://problem/3910425> REGRESSION (Mail): Crash in ReplaceSelectionCommand; 
+    //        selection is empty, leading to null deref
+    if (!pos.node()->inDocument())
+        pos = endingSelection().start();
+
+    setEndingSelection(pos);
     EditCommandPtr cmd(new ReplaceSelectionCommand(document(), m_fragment, true, m_smartMove));
     applyCommandToComposite(cmd);
 }