Reviewed by Harrison
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 9 Dec 2004 22:37:45 +0000 (22:37 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 9 Dec 2004 22:37:45 +0000 (22:37 +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@8164 268f45cc-cd09-0410-ab3c-d52691b4dbfc

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

index d284e49c1cf1e4528de74df4f4b703d6df6cd8e7..d1c3d45e36757a9fe8bbedeb758d99c2e7d08bcc 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.
+
 2004-12-09  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by John
index 596ea0108bdd48941d350a2b48f20d45bd74e258..6d1c36191742671d24833655b5df1f08c9af0cb5 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);
 }