From bfb6a46780fd51a8c4f3379aa0df97f30af09901 Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Fri, 29 Aug 2014 14:43:23 +0300 Subject: [PATCH] Bug 1056166 part 2 - Clean up InsertTextTxn; r=ehsan --- editor/libeditor/InsertTextTxn.cpp | 172 ++++++++++---------------- editor/libeditor/InsertTextTxn.h | 77 ++++++------ editor/libeditor/nsEditor.cpp | 129 ++++++++----------- editor/libeditor/nsEditor.h | 19 ++- editor/libeditor/nsSelectionState.cpp | 28 ++--- editor/libeditor/nsSelectionState.h | 4 +- editor/libeditor/nsWSRunObject.cpp | 10 +- 7 files changed, 183 insertions(+), 256 deletions(-) diff --git a/editor/libeditor/InsertTextTxn.cpp b/editor/libeditor/InsertTextTxn.cpp index 8e416d0dc591..4c896e2738b1 100644 --- a/editor/libeditor/InsertTextTxn.cpp +++ b/editor/libeditor/InsertTextTxn.cpp @@ -3,20 +3,28 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include // for printf - #include "InsertTextTxn.h" -#include "nsAString.h" -#include "nsDebug.h" // for NS_ASSERTION, etc -#include "nsError.h" // for NS_OK, etc -#include "nsIDOMCharacterData.h" // for nsIDOMCharacterData -#include "nsIEditor.h" // for nsIEditor -#include "nsISelection.h" // for nsISelection -#include "nsISupportsUtils.h" // for NS_ADDREF_THIS, NS_RELEASE -#include "nsITransaction.h" // for nsITransaction -InsertTextTxn::InsertTextTxn() +#include "mozilla/dom/Selection.h" // Selection local var +#include "mozilla/dom/Text.h" // mTextNode +#include "nsAString.h" // nsAString parameter +#include "nsDebug.h" // for NS_ASSERTION, etc +#include "nsEditor.h" // mEditor +#include "nsError.h" // for NS_OK, etc + +using namespace mozilla; +using namespace mozilla::dom; + +class nsITransaction; + +InsertTextTxn::InsertTextTxn(Text& aTextNode, uint32_t aOffset, + const nsAString& aStringToInsert, + nsEditor& aEditor) : EditTxn() + , mTextNode(&aTextNode) + , mOffset(aOffset) + , mStringToInsert(aStringToInsert) + , mEditor(aEditor) { } @@ -25,129 +33,83 @@ InsertTextTxn::~InsertTextTxn() } NS_IMPL_CYCLE_COLLECTION_INHERITED(InsertTextTxn, EditTxn, - mElement) + mTextNode) NS_IMPL_ADDREF_INHERITED(InsertTextTxn, EditTxn) NS_IMPL_RELEASE_INHERITED(InsertTextTxn, EditTxn) NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(InsertTextTxn) - if (aIID.Equals(InsertTextTxn::GetCID())) { - *aInstancePtr = (void*)(InsertTextTxn*)this; - NS_ADDREF_THIS(); - return NS_OK; - } else + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsITransaction, InsertTextTxn) NS_INTERFACE_MAP_END_INHERITING(EditTxn) -NS_IMETHODIMP InsertTextTxn::Init(nsIDOMCharacterData *aElement, - uint32_t aOffset, - const nsAString &aStringToInsert, - nsIEditor *aEditor) + +NS_IMETHODIMP +InsertTextTxn::DoTransaction() { -#if 0 - nsAutoString text; - aElement->GetData(text); - printf("InsertTextTxn: Offset to insert at = %d. Text of the node to insert into:\n", aOffset); - wprintf(text.get()); - printf("\n"); -#endif + nsresult res = mTextNode->InsertData(mOffset, mStringToInsert); + NS_ENSURE_SUCCESS(res, res); - NS_ASSERTION(aElement && aEditor, "bad args"); - NS_ENSURE_TRUE(aElement && aEditor, NS_ERROR_NULL_POINTER); + // Only set selection to insertion point if editor gives permission + if (mEditor.GetShouldTxnSetSelection()) { + nsRefPtr selection = mEditor.GetSelection(); + NS_ENSURE_TRUE(selection, NS_ERROR_NULL_POINTER); + res = selection->Collapse(mTextNode, + mOffset + mStringToInsert.Length()); + NS_ASSERTION(NS_SUCCEEDED(res), + "Selection could not be collapsed after insert"); + } else { + // Do nothing - DOM Range gravity will adjust selection + } - mElement = do_QueryInterface(aElement); - mOffset = aOffset; - mStringToInsert = aStringToInsert; - mEditor = aEditor; return NS_OK; } -NS_IMETHODIMP InsertTextTxn::DoTransaction(void) +NS_IMETHODIMP +InsertTextTxn::UndoTransaction() { - NS_ASSERTION(mElement && mEditor, "bad state"); - if (!mElement || !mEditor) { return NS_ERROR_NOT_INITIALIZED; } - - nsresult result = mElement->InsertData(mOffset, mStringToInsert); - NS_ENSURE_SUCCESS(result, result); - - // only set selection to insertion point if editor gives permission - bool bAdjustSelection; - mEditor->ShouldTxnSetSelection(&bAdjustSelection); - if (bAdjustSelection) - { - nsCOMPtr selection; - result = mEditor->GetSelection(getter_AddRefs(selection)); - NS_ENSURE_SUCCESS(result, result); - NS_ENSURE_TRUE(selection, NS_ERROR_NULL_POINTER); - result = selection->Collapse(mElement, mOffset+mStringToInsert.Length()); - NS_ASSERTION((NS_SUCCEEDED(result)), "selection could not be collapsed after insert."); - } - else - { - // do nothing - dom range gravity will adjust selection - } - - return result; + return mTextNode->DeleteData(mOffset, mStringToInsert.Length()); } -NS_IMETHODIMP InsertTextTxn::UndoTransaction(void) +NS_IMETHODIMP +InsertTextTxn::Merge(nsITransaction* aTransaction, bool* aDidMerge) { - NS_ASSERTION(mElement && mEditor, "bad state"); - if (!mElement || !mEditor) { return NS_ERROR_NOT_INITIALIZED; } - - uint32_t length = mStringToInsert.Length(); - return mElement->DeleteData(mOffset, length); -} - -NS_IMETHODIMP InsertTextTxn::Merge(nsITransaction *aTransaction, bool *aDidMerge) -{ - // set out param default value - if (aDidMerge) - *aDidMerge = false; - nsresult result = NS_OK; - if (aDidMerge && aTransaction) - { - // if aTransaction is a InsertTextTxn, and if the selection hasn't changed, - // then absorb it - InsertTextTxn *otherInsTxn = nullptr; - aTransaction->QueryInterface(InsertTextTxn::GetCID(), (void **)&otherInsTxn); - if (otherInsTxn) - { - if (IsSequentialInsert(otherInsTxn)) - { - nsAutoString otherData; - otherInsTxn->GetData(otherData); - mStringToInsert += otherData; - *aDidMerge = true; - } - NS_RELEASE(otherInsTxn); - } + if (!aTransaction || !aDidMerge) { + return NS_OK; } - return result; + // Set out param default value + *aDidMerge = false; + + // If aTransaction is a InsertTextTxn, and if the selection hasn't changed, + // then absorb it + nsRefPtr otherInsTxn = do_QueryObject(aTransaction); + if (otherInsTxn && IsSequentialInsert(*otherInsTxn)) { + nsAutoString otherData; + otherInsTxn->GetData(otherData); + mStringToInsert += otherData; + *aDidMerge = true; + } + + return NS_OK; } -NS_IMETHODIMP InsertTextTxn::GetTxnDescription(nsAString& aString) +NS_IMETHODIMP +InsertTextTxn::GetTxnDescription(nsAString& aString) { aString.AssignLiteral("InsertTextTxn: "); aString += mStringToInsert; return NS_OK; } -/* ============ protected methods ================== */ +/* ============ private methods ================== */ -NS_IMETHODIMP InsertTextTxn::GetData(nsString& aResult) +void +InsertTextTxn::GetData(nsString& aResult) { aResult = mStringToInsert; - return NS_OK; } -bool InsertTextTxn::IsSequentialInsert(InsertTextTxn *aOtherTxn) +bool +InsertTextTxn::IsSequentialInsert(InsertTextTxn& aOtherTxn) { - NS_ASSERTION(aOtherTxn, "null param"); - if (aOtherTxn && aOtherTxn->mElement == mElement) - { - // here, we need to compare offsets. - int32_t length = mStringToInsert.Length(); - if (aOtherTxn->mOffset == (mOffset + length)) - return true; - } - return false; + return aOtherTxn.mTextNode == mTextNode && + aOtherTxn.mOffset == mOffset + mStringToInsert.Length(); } diff --git a/editor/libeditor/InsertTextTxn.h b/editor/libeditor/InsertTextTxn.h index 244951824b05..eccb21fb7d8b 100644 --- a/editor/libeditor/InsertTextTxn.h +++ b/editor/libeditor/InsertTextTxn.h @@ -6,73 +6,74 @@ #ifndef InsertTextTxn_h__ #define InsertTextTxn_h__ -#include "EditTxn.h" // for EditTxn, NS_DECL_EDITTXN -#include "nsCOMPtr.h" // for nsCOMPtr -#include "nsCycleCollectionParticipant.h" -#include "nsID.h" // for nsIID -#include "nsIDOMCharacterData.h" // for nsIDOMCharacterData -#include "nsISupportsImpl.h" // for NS_DECL_ISUPPORTS_INHERITED -#include "nsString.h" // for nsString -#include "nscore.h" // for NS_IMETHOD, nsAString +#include "EditTxn.h" // base class +#include "nsAutoPtr.h" // nsRefPtr members +#include "nsCycleCollectionParticipant.h" // various macros +#include "nsID.h" // NS_DECLARE_STATIC_IID_ACCESSOR +#include "nsISupportsImpl.h" // NS_DECL_ISUPPORTS_INHERITED +#include "nsString.h" // nsString members +#include "nscore.h" // NS_IMETHOD, nsAString -class nsIEditor; +class nsEditor; class nsITransaction; +#define NS_INSERTTEXTTXN_IID \ +{ 0x8c9ad77f, 0x22a7, 0x4d01, \ + { 0xb1, 0x59, 0x8a, 0x0f, 0xdb, 0x1d, 0x08, 0xe9 } } -#define INSERT_TEXT_TXN_CID \ -{/* 93276f00-ab2c-11d2-8f4b-006008159b0c*/ \ -0x93276f00, 0xab2c, 0x11d2, \ -{0x8f, 0xb4, 0x0, 0x60, 0x8, 0x15, 0x9b, 0xc} } +namespace mozilla { +namespace dom { + +class Text; /** - * A transaction that inserts text into a content node. + * A transaction that inserts text into a content node. */ class InsertTextTxn : public EditTxn { public: + NS_DECLARE_STATIC_IID_ACCESSOR(NS_INSERTTEXTTXN_IID) - static const nsIID& GetCID() { static const nsIID iid = INSERT_TEXT_TXN_CID; return iid; } - - /** initialize the transaction - * @param aElement the text content node + /** @param aElement the text content node * @param aOffset the location in aElement to do the insertion * @param aString the new text to insert * @param aPresShell used to get and set the selection */ - NS_IMETHOD Init(nsIDOMCharacterData *aElement, - uint32_t aOffset, - const nsAString& aString, - nsIEditor *aEditor); - - InsertTextTxn(); + InsertTextTxn(Text& aTextNode, uint32_t aOffset, const nsAString& aString, + nsEditor& aEditor); NS_DECL_ISUPPORTS_INHERITED NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(InsertTextTxn, EditTxn) NS_DECL_EDITTXN - NS_IMETHOD Merge(nsITransaction *aTransaction, bool *aDidMerge); + NS_IMETHOD Merge(nsITransaction* aTransaction, bool* aDidMerge) MOZ_OVERRIDE; - /** return the string data associated with this transaction */ - NS_IMETHOD GetData(nsString& aResult); + /** Return the string data associated with this transaction */ + void GetData(nsString& aResult); -protected: +private: virtual ~InsertTextTxn(); - /** return true if aOtherTxn immediately follows this txn */ - virtual bool IsSequentialInsert(InsertTextTxn *aOtherTxn); - - /** the text element to operate upon */ - nsCOMPtr mElement; - - /** the offset into mElement where the insertion is to take place */ + /** Return true if aOtherTxn immediately follows this txn */ + bool IsSequentialInsert(InsertTextTxn& aOtherTxn); + + /** The Text node to operate upon */ + nsRefPtr mTextNode; + + /** The offset into mTextNode where the insertion is to take place */ uint32_t mOffset; - /** the text to insert into mElement at mOffset */ + /** The text to insert into mTextNode at mOffset */ nsString mStringToInsert; - /** the editor, which we'll need to get the selection */ - nsIEditor *mEditor; + /** The editor, which we'll need to get the selection */ + nsEditor& mEditor; }; +NS_DEFINE_STATIC_IID_ACCESSOR(InsertTextTxn, NS_INSERTTEXTTXN_IID) + +} +} + #endif diff --git a/editor/libeditor/nsEditor.cpp b/editor/libeditor/nsEditor.cpp index 0f6b7e645a3f..df33af2812d5 100644 --- a/editor/libeditor/nsEditor.cpp +++ b/editor/libeditor/nsEditor.cpp @@ -2335,17 +2335,15 @@ nsEditor::InsertTextImpl(const nsAString& aStringToInsert, node = newNode; offset = 0; } - nsCOMPtr charDataNode = do_QueryInterface(node); - NS_ENSURE_STATE(charDataNode); - res = InsertTextIntoTextNodeImpl(aStringToInsert, charDataNode, offset); + res = InsertTextIntoTextNodeImpl(aStringToInsert, *node->GetAsText(), + offset); NS_ENSURE_SUCCESS(res, res); offset += aStringToInsert.Length(); } else { if (node->IsNodeOfType(nsINode::eTEXT)) { // we are inserting text into an existing text node. - nsCOMPtr charDataNode = do_QueryInterface(node); - NS_ENSURE_STATE(charDataNode); - res = InsertTextIntoTextNodeImpl(aStringToInsert, charDataNode, offset); + res = InsertTextIntoTextNodeImpl(aStringToInsert, *node->GetAsText(), + offset); NS_ENSURE_SUCCESS(res, res); offset += aStringToInsert.Length(); } else { @@ -2368,29 +2366,19 @@ nsEditor::InsertTextImpl(const nsAString& aStringToInsert, } -nsresult nsEditor::InsertTextIntoTextNodeImpl(const nsAString& aStringToInsert, - Text* aTextNode, - int32_t aOffset, - bool aSuppressIME) -{ - return InsertTextIntoTextNodeImpl(aStringToInsert, - static_cast(GetAsDOMNode(aTextNode)), - aOffset, aSuppressIME); -} - -nsresult nsEditor::InsertTextIntoTextNodeImpl(const nsAString& aStringToInsert, - nsIDOMCharacterData *aTextNode, - int32_t aOffset, - bool aSuppressIME) +nsresult +nsEditor::InsertTextIntoTextNodeImpl(const nsAString& aStringToInsert, + Text& aTextNode, + int32_t aOffset, bool aSuppressIME) { nsRefPtr txn; - nsresult result = NS_OK; bool isIMETransaction = false; // aSuppressIME is used when editor must insert text, yet this text is not - // part of current ime operation. example: adjusting whitespace around an ime insertion. + // part of the current IME operation. Example: adjusting whitespace around an + // IME insertion. if (mComposition && !aSuppressIME) { if (!mIMETextNode) { - mIMETextNode = aTextNode; + mIMETextNode = do_QueryInterface(&aTextNode); mIMETextOffset = aOffset; } // Modify mPhonetic with raw text input clauses. @@ -2410,58 +2398,58 @@ nsresult nsEditor::InsertTextIntoTextNodeImpl(const nsAString& aStringToInsert, } nsRefPtr imeTxn; - result = CreateTxnForIMEText(aStringToInsert, getter_AddRefs(imeTxn)); + nsresult res = CreateTxnForIMEText(aStringToInsert, + getter_AddRefs(imeTxn)); + NS_ENSURE_SUCCESS(res, res); txn = imeTxn; isIMETransaction = true; + } else { + txn = CreateTxnForInsertText(aStringToInsert, aTextNode, aOffset); } - else - { - nsRefPtr insertTxn; - result = CreateTxnForInsertText(aStringToInsert, aTextNode, aOffset, - getter_AddRefs(insertTxn)); - txn = insertTxn; - } - NS_ENSURE_SUCCESS(result, result); - // let listeners know what's up - int32_t i; - for (i = 0; i < mActionListeners.Count(); i++) - mActionListeners[i]->WillInsertText(aTextNode, aOffset, aStringToInsert); - - // XXX we may not need these view batches anymore. This is handled at a higher level now I believe + // Let listeners know what's up + for (int32_t i = 0; i < mActionListeners.Count(); i++) { + mActionListeners[i]->WillInsertText( + static_cast(aTextNode.AsDOMNode()), aOffset, + aStringToInsert); + } + + // XXX We may not need these view batches anymore. This is handled at a + // higher level now I believe. BeginUpdateViewBatch(); - result = DoTransaction(txn); + nsresult res = DoTransaction(txn); EndUpdateViewBatch(); mRangeUpdater.SelAdjInsertText(aTextNode, aOffset, aStringToInsert); - - // let listeners know what happened - for (i = 0; i < mActionListeners.Count(); i++) - mActionListeners[i]->DidInsertText(aTextNode, aOffset, aStringToInsert, result); - // Added some cruft here for bug 43366. Layout was crashing because we left an - // empty text node lying around in the document. So I delete empty text nodes - // caused by IME. I have to mark the IME transaction as "fixed", which means - // that furure ime txns won't merge with it. This is because we don't want - // future ime txns trying to put their text into a node that is no longer in - // the document. This does not break undo/redo, because all these txns are - // wrapped in a parent PlaceHolder txn, and placeholder txns are already - // savvy to having multiple ime txns inside them. - - // delete empty ime text node if there is one - if (isIMETransaction && mIMETextNode) - { + // let listeners know what happened + for (int32_t i = 0; i < mActionListeners.Count(); i++) { + mActionListeners[i]->DidInsertText( + static_cast(aTextNode.AsDOMNode()), + aOffset, aStringToInsert, res); + } + + // Added some cruft here for bug 43366. Layout was crashing because we left + // an empty text node lying around in the document. So I delete empty text + // nodes caused by IME. I have to mark the IME transaction as "fixed", which + // means that furure IME txns won't merge with it. This is because we don't + // want future IME txns trying to put their text into a node that is no + // longer in the document. This does not break undo/redo, because all these + // txns are wrapped in a parent PlaceHolder txn, and placeholder txns are + // already savvy to having multiple ime txns inside them. + + // Delete empty IME text node if there is one + if (isIMETransaction && mIMETextNode) { uint32_t len; mIMETextNode->GetLength(&len); - if (!len) - { + if (!len) { DeleteNode(mIMETextNode); mIMETextNode = nullptr; - static_cast(txn.get())->MarkFixed(); // mark the ime txn "fixed" + static_cast(txn.get())->MarkFixed(); } } - - return result; + + return res; } @@ -2549,22 +2537,13 @@ nsEditor::NotifyDocumentListeners(TDocumentListenerNotification aNotificationTyp } -NS_IMETHODIMP nsEditor::CreateTxnForInsertText(const nsAString & aStringToInsert, - nsIDOMCharacterData *aTextNode, - int32_t aOffset, - InsertTextTxn ** aTxn) +already_AddRefed +nsEditor::CreateTxnForInsertText(const nsAString& aStringToInsert, + Text& aTextNode, int32_t aOffset) { - NS_ENSURE_TRUE(aTextNode && aTxn, NS_ERROR_NULL_POINTER); - nsresult rv; - - nsRefPtr txn = new InsertTextTxn(); - rv = txn->Init(aTextNode, aOffset, aStringToInsert, this); - if (NS_SUCCEEDED(rv)) - { - txn.forget(aTxn); - } - - return rv; + nsRefPtr txn = new InsertTextTxn(aTextNode, aOffset, + aStringToInsert, *this); + return txn.forget(); } diff --git a/editor/libeditor/nsEditor.h b/editor/libeditor/nsEditor.h index ab78a93eef13..a655a5de20f0 100644 --- a/editor/libeditor/nsEditor.h +++ b/editor/libeditor/nsEditor.h @@ -32,7 +32,6 @@ class ChangeAttributeTxn; class DeleteNodeTxn; class EditAggregateTxn; class IMETextTxn; -class InsertTextTxn; class JoinElementTxn; class RemoveStyleSheetTxn; class SplitElementTxn; @@ -74,6 +73,7 @@ class DataTransfer; class DeleteTextTxn; class Element; class EventTarget; +class InsertTextTxn; class InsertNodeTxn; class Selection; class Text; @@ -207,11 +207,7 @@ public: int32_t *aInOutOffset, nsIDOMDocument *aDoc); nsresult InsertTextIntoTextNodeImpl(const nsAString& aStringToInsert, - mozilla::dom::Text* aTextNode, - int32_t aOffset, - bool aSuppressIME = false); - nsresult InsertTextIntoTextNodeImpl(const nsAString& aStringToInsert, - nsIDOMCharacterData *aTextNode, + mozilla::dom::Text& aTextNode, int32_t aOffset, bool aSuppressIME = false); NS_IMETHOD DeleteSelectionImpl(EDirection aAction, @@ -306,13 +302,12 @@ protected: int32_t* aLength); - /** create a transaction for inserting aStringToInsert into aTextNode - * if aTextNode is null, the string is inserted at the current selection. + /** Create a transaction for inserting aStringToInsert into aTextNode. Never + * returns null. */ - NS_IMETHOD CreateTxnForInsertText(const nsAString & aStringToInsert, - nsIDOMCharacterData *aTextNode, - int32_t aOffset, - InsertTextTxn ** aTxn); + already_AddRefed + CreateTxnForInsertText(const nsAString& aStringToInsert, + mozilla::dom::Text& aTextNode, int32_t aOffset); NS_IMETHOD CreateTxnForIMEText(const nsAString & aStringToInsert, IMETextTxn ** aTxn); diff --git a/editor/libeditor/nsSelectionState.cpp b/editor/libeditor/nsSelectionState.cpp index 98d08b5ccbd4..b9f6832319d5 100644 --- a/editor/libeditor/nsSelectionState.cpp +++ b/editor/libeditor/nsSelectionState.cpp @@ -446,45 +446,35 @@ nsRangeUpdater::SelAdjJoinNodes(nsIDOMNode* aLeftNode, } -nsresult -nsRangeUpdater::SelAdjInsertText(nsIContent* aTextNode, int32_t aOffset, - const nsAString &aString) +void +nsRangeUpdater::SelAdjInsertText(Text& aTextNode, int32_t aOffset, + const nsAString& aString) { if (mLock) { // lock set by Will/DidReplaceParent, etc... - return NS_OK; + return; } uint32_t count = mArray.Length(); if (!count) { - return NS_OK; + return; } - NS_ENSURE_TRUE(aTextNode, NS_ERROR_NULL_POINTER); uint32_t len = aString.Length(); for (uint32_t i = 0; i < count; i++) { nsRangeStore* item = mArray[i]; - NS_ENSURE_TRUE(item, NS_ERROR_NULL_POINTER); + MOZ_ASSERT(item); - if (item->startNode == aTextNode && item->startOffset > aOffset) { + if (item->startNode == &aTextNode && item->startOffset > aOffset) { item->startOffset += len; } - if (item->endNode == aTextNode && item->endOffset > aOffset) { + if (item->endNode == &aTextNode && item->endOffset > aOffset) { item->endOffset += len; } } - return NS_OK; + return; } -nsresult -nsRangeUpdater::SelAdjInsertText(nsIDOMCharacterData* aTextNode, - int32_t aOffset, const nsAString &aString) -{ - nsCOMPtr textNode = do_QueryInterface(aTextNode); - return SelAdjInsertText(textNode, aOffset, aString); -} - - nsresult nsRangeUpdater::SelAdjDeleteText(nsIContent* aTextNode, int32_t aOffset, int32_t aLength) diff --git a/editor/libeditor/nsSelectionState.h b/editor/libeditor/nsSelectionState.h index 3626021094ad..ab831a66cbf9 100644 --- a/editor/libeditor/nsSelectionState.h +++ b/editor/libeditor/nsSelectionState.h @@ -20,6 +20,7 @@ class nsRange; namespace mozilla { namespace dom { class Selection; +class Text; } } @@ -108,9 +109,8 @@ class nsRangeUpdater nsIDOMNode *aParent, int32_t aOffset, int32_t aOldLeftNodeLength); - nsresult SelAdjInsertText(nsIContent* aTextNode, int32_t aOffset, + void SelAdjInsertText(mozilla::dom::Text& aTextNode, int32_t aOffset, const nsAString &aString); - nsresult SelAdjInsertText(nsIDOMCharacterData *aTextNode, int32_t aOffset, const nsAString &aString); nsresult SelAdjDeleteText(nsIContent* aTextNode, int32_t aOffset, int32_t aLength); nsresult SelAdjDeleteText(nsIDOMCharacterData *aTextNode, int32_t aOffset, int32_t aLength); diff --git a/editor/libeditor/nsWSRunObject.cpp b/editor/libeditor/nsWSRunObject.cpp index e9e4a6a54abd..c9a6382cc307 100644 --- a/editor/libeditor/nsWSRunObject.cpp +++ b/editor/libeditor/nsWSRunObject.cpp @@ -1506,7 +1506,7 @@ nsWSRunObject::ConvertToNBSP(WSPoint aPoint, AreaRestriction aAR) nsAutoTxnsConserveSelection dontSpazMySelection(mHTMLEditor); nsAutoString nbspStr(nbsp); nsresult res = mHTMLEditor->InsertTextIntoTextNodeImpl(nbspStr, - aPoint.mTextNode, aPoint.mOffset, true); + *aPoint.mTextNode, aPoint.mOffset, true); NS_ENSURE_SUCCESS(res, res); // Next, find range of ws it will replace @@ -1821,7 +1821,7 @@ nsWSRunObject::CheckTrailingNBSPOfRun(WSFragment *aRun) nsAutoTxnsConserveSelection dontSpazMySelection(mHTMLEditor); nsAutoString spaceStr(char16_t(32)); res = mHTMLEditor->InsertTextIntoTextNodeImpl(spaceStr, - thePoint.mTextNode, + *thePoint.mTextNode, thePoint.mOffset, true); NS_ENSURE_SUCCESS(res, res); @@ -1851,7 +1851,7 @@ nsWSRunObject::CheckTrailingNBSPOfRun(WSFragment *aRun) // Finally, insert that nbsp before the ASCII ws run nsAutoTxnsConserveSelection dontSpazMySelection(mHTMLEditor); nsAutoString nbspStr(nbsp); - res = mHTMLEditor->InsertTextIntoTextNodeImpl(nbspStr, startNode, + res = mHTMLEditor->InsertTextIntoTextNodeImpl(nbspStr, *startNode, startOffset, true); NS_ENSURE_SUCCESS(res, res); } @@ -1887,7 +1887,7 @@ nsWSRunObject::CheckTrailingNBSP(WSFragment* aRun, nsINode* aNode, nsAutoTxnsConserveSelection dontSpazMySelection(mHTMLEditor); nsAutoString spaceStr(char16_t(32)); nsresult res = mHTMLEditor->InsertTextIntoTextNodeImpl(spaceStr, - thePoint.mTextNode, thePoint.mOffset, true); + *thePoint.mTextNode, thePoint.mOffset, true); NS_ENSURE_SUCCESS(res, res); // Finally, delete that nbsp @@ -1928,7 +1928,7 @@ nsWSRunObject::CheckLeadingNBSP(WSFragment* aRun, nsINode* aNode, nsAutoTxnsConserveSelection dontSpazMySelection(mHTMLEditor); nsAutoString spaceStr(char16_t(32)); nsresult res = mHTMLEditor->InsertTextIntoTextNodeImpl(spaceStr, - thePoint.mTextNode, thePoint.mOffset, true); + *thePoint.mTextNode, thePoint.mOffset, true); NS_ENSURE_SUCCESS(res, res); // Finally, delete that nbsp