NS_IMETHODIMP DeleteRangeTxn::DoTransaction(void) { #ifdef NS_DEBUG if (gNoisy) { printf("Do Delete Range\n"); } #endif NS_ENSURE_TRUE(mStartParent && mEndParent && mCommonParent && mEditor, NS_ERROR_NOT_INITIALIZED); nsresult result; // build the child transactions if (mStartParent==mEndParent) { // the selection begins and ends in the same node result = CreateTxnsToDeleteBetween(mStartParent, mStartOffset, mEndOffset); } else { // the selection ends in a different node from where it started // delete the relevant content in the start node result = CreateTxnsToDeleteContent(mStartParent, mStartOffset, nsIEditor::eNext); if (NS_SUCCEEDED(result)) { // delete the intervening nodes result = CreateTxnsToDeleteNodesBetween(); if (NS_SUCCEEDED(result)) { // delete the relevant content in the end node result = CreateTxnsToDeleteContent(mEndParent, mEndOffset, nsIEditor::ePrevious); } } } // if we've successfully built this aggregate transaction, then do it. if (NS_SUCCEEDED(result)) { result = EditAggregateTxn::DoTransaction(); } NS_ENSURE_SUCCESS(result, result); // only set selection to deletion point if editor gives permission PRBool bAdjustSelection; mEditor->ShouldTxnSetSelection(&bAdjustSelection); if (bAdjustSelection) { nsCOMPtr<nsISelection> selection; result = mEditor->GetSelection(getter_AddRefs(selection)); // At this point, it is possible that the frame for our root element // might have been destroyed, in which case, the above call returns // an error. We eat that error here intentionally. See bug 574558 // for a sample case where this happens. NS_ENSURE_SUCCESS(result, NS_OK); NS_ENSURE_TRUE(selection, NS_ERROR_NULL_POINTER); result = selection->Collapse(mStartParent, mStartOffset); } else { // do nothing - dom range gravity will adjust selection } return result; }
NS_IMETHODIMP DeleteRangeTxn::DoTransaction(void) { #ifdef NS_DEBUG if (gNoisy) { printf("Do Delete Range\n"); } #endif if (!mStartParent || !mEndParent || !mCommonParent || !mEditor) return NS_ERROR_NOT_INITIALIZED; nsresult result; // build the child transactions if (mStartParent==mEndParent) { // the selection begins and ends in the same node result = CreateTxnsToDeleteBetween(mStartParent, mStartOffset, mEndOffset); } else { // the selection ends in a different node from where it started // delete the relevant content in the start node result = CreateTxnsToDeleteContent(mStartParent, mStartOffset, nsIEditor::eNext); if (NS_SUCCEEDED(result)) { // delete the intervening nodes result = CreateTxnsToDeleteNodesBetween(); if (NS_SUCCEEDED(result)) { // delete the relevant content in the end node result = CreateTxnsToDeleteContent(mEndParent, mEndOffset, nsIEditor::ePrevious); } } } // if we've successfully built this aggregate transaction, then do it. if (NS_SUCCEEDED(result)) { result = EditAggregateTxn::DoTransaction(); } if (NS_FAILED(result)) return result; // only set selection to deletion point if editor gives permission PRBool bAdjustSelection; mEditor->ShouldTxnSetSelection(&bAdjustSelection); if (bAdjustSelection) { nsCOMPtr<nsISelection> selection; result = mEditor->GetSelection(getter_AddRefs(selection)); if (NS_FAILED(result)) return result; if (!selection) return NS_ERROR_NULL_POINTER; result = selection->Collapse(mStartParent, mStartOffset); } else { // do nothing - dom range gravity will adjust selection } return result; }
NS_IMETHODIMP DeleteRangeTransaction::DoTransaction() { MOZ_ASSERT(mRange && mEditorBase); nsresult res; // build the child transactions nsCOMPtr<nsINode> startParent = mRange->GetStartParent(); int32_t startOffset = mRange->StartOffset(); nsCOMPtr<nsINode> endParent = mRange->GetEndParent(); int32_t endOffset = mRange->EndOffset(); MOZ_ASSERT(startParent && endParent); if (startParent == endParent) { // the selection begins and ends in the same node res = CreateTxnsToDeleteBetween(startParent, startOffset, endOffset); NS_ENSURE_SUCCESS(res, res); } else { // the selection ends in a different node from where it started. delete // the relevant content in the start node res = CreateTxnsToDeleteContent(startParent, startOffset, nsIEditor::eNext); NS_ENSURE_SUCCESS(res, res); // delete the intervening nodes res = CreateTxnsToDeleteNodesBetween(); NS_ENSURE_SUCCESS(res, res); // delete the relevant content in the end node res = CreateTxnsToDeleteContent(endParent, endOffset, nsIEditor::ePrevious); NS_ENSURE_SUCCESS(res, res); } // if we've successfully built this aggregate transaction, then do it. res = EditAggregateTransaction::DoTransaction(); NS_ENSURE_SUCCESS(res, res); // only set selection to deletion point if editor gives permission bool bAdjustSelection; mEditorBase->ShouldTxnSetSelection(&bAdjustSelection); if (bAdjustSelection) { RefPtr<Selection> selection = mEditorBase->GetSelection(); NS_ENSURE_TRUE(selection, NS_ERROR_NULL_POINTER); res = selection->Collapse(startParent, startOffset); NS_ENSURE_SUCCESS(res, res); } // else do nothing - dom range gravity will adjust selection return NS_OK; }