diff --git a/editor/libeditor/base/CreateElementTxn.cpp b/editor/libeditor/base/CreateElementTxn.cpp index 3783fd177e4..8521105d2de 100644 --- a/editor/libeditor/base/CreateElementTxn.cpp +++ b/editor/libeditor/base/CreateElementTxn.cpp @@ -94,18 +94,38 @@ NS_IMETHODIMP CreateElementTxn::DoTransaction(void) NS_ASSERTION(mEditor && mParent, "bad state"); if (!mEditor || !mParent) return NS_ERROR_NOT_INITIALIZED; + // create a new node + nsAutoString textNodeTag; + nsresult result = nsEditor::GetTextNodeTag(textNodeTag); + if (NS_FAILED(result)) { return result; } - nsCOMPtr newContent; - - //new call to use instead to get proper HTML element, bug# 39919 - nsresult result = mEditor->CreateHTMLContent(mTag, getter_AddRefs(newContent)); - if (NS_FAILED(result)) return result; - nsCOMPtrnewElement = do_QueryInterface(newContent); - if (!newElement) return NS_ERROR_NULL_POINTER; - mNewNode = do_QueryInterface(newElement); - // Try to insert formatting whitespace for the new node: - mEditor->MarkNodeDirty(mNewNode); + if (textNodeTag == mTag) + { + nsCOMPtrdoc; + result = mEditor->GetDocument(getter_AddRefs(doc)); + if (NS_FAILED(result)) return result; + if (!doc) return NS_ERROR_NULL_POINTER; + + const nsString stringData; + nsCOMPtrnewTextNode; + result = doc->CreateTextNode(stringData, getter_AddRefs(newTextNode)); + if (NS_FAILED(result)) return result; + if (!newTextNode) return NS_ERROR_NULL_POINTER; + mNewNode = do_QueryInterface(newTextNode); + } + else + { + nsCOMPtr newContent; + //new call to use instead to get proper HTML element, bug# 39919 + result = mEditor->CreateHTMLContent(mTag, getter_AddRefs(newContent)); + if (NS_FAILED(result)) return result; + nsCOMPtrnewElement = do_QueryInterface(newContent); + if (!newElement) return NS_ERROR_NULL_POINTER; + mNewNode = do_QueryInterface(newElement); + // Try to insert formatting whitespace for the new node: + mEditor->MarkNodeDirty(mNewNode); + } NS_ASSERTION(((NS_SUCCEEDED(result)) && (mNewNode)), "could not create element."); if (!mNewNode) return NS_ERROR_NULL_POINTER; diff --git a/editor/libeditor/base/nsEditor.cpp b/editor/libeditor/base/nsEditor.cpp index adbd4dc0bf8..5503719c966 100644 --- a/editor/libeditor/base/nsEditor.cpp +++ b/editor/libeditor/base/nsEditor.cpp @@ -2523,6 +2523,22 @@ NS_IMETHODIMP nsEditor::ScrollSelectionIntoView(PRBool aScrollToAnchor) return NS_OK; } +/** static helper method */ +nsresult nsEditor::GetTextNodeTag(nsAString& aOutString) +{ + aOutString.Truncate(); + static nsString *gTextNodeTag=nsnull; + if (!gTextNodeTag) + { + if ( (gTextNodeTag = new nsString) == 0 ) + return NS_ERROR_OUT_OF_MEMORY; + gTextNodeTag->AssignLiteral("special text node tag"); + } + aOutString = *gTextNodeTag; + return NS_OK; +} + + NS_IMETHODIMP nsEditor::InsertTextImpl(const nsAString& aStringToInsert, nsCOMPtr *aInOutNode, PRInt32 *aInOutOffset, diff --git a/editor/libeditor/base/nsEditor.h b/editor/libeditor/base/nsEditor.h index 696fa94c772..7ae51af8136 100644 --- a/editor/libeditor/base/nsEditor.h +++ b/editor/libeditor/base/nsEditor.h @@ -368,6 +368,10 @@ public: nsresult RestorePreservedSelection(nsISelection *aSel); void StopPreservingSelection(); + + /** return the string that represents text nodes in the content tree */ + static nsresult GetTextNodeTag(nsAString& aOutString); + /** * SplitNode() creates a new node identical to an existing node, and split the contents between the two nodes * @param aExistingRightNode the node to split. It will become the new node's next sibling.