diff --git a/editor/libeditor/html/nsWSRunObject.cpp b/editor/libeditor/html/nsWSRunObject.cpp index e3b4b54966b..b77210d6552 100644 --- a/editor/libeditor/html/nsWSRunObject.cpp +++ b/editor/libeditor/html/nsWSRunObject.cpp @@ -405,7 +405,7 @@ nsWSRunObject::DeleteWSBackward() // Caller's job to ensure that previous char is really ws. If it is normal // ws, we need to delete the whole run. if (nsCRT::IsAsciiSpace(point.mChar)) { - nsCOMPtr startNodeText, endNodeText; + nsRefPtr startNodeText, endNodeText; int32_t startOffset, endOffset; GetAsciiWSBounds(eBoth, point.mTextNode, point.mOffset + 1, getter_AddRefs(startNodeText), &startOffset, @@ -456,7 +456,7 @@ nsWSRunObject::DeleteWSForward() // Caller's job to ensure that next char is really ws. If it is normal ws, // we need to delete the whole run. if (nsCRT::IsAsciiSpace(point.mChar)) { - nsCOMPtr startNodeText, endNodeText; + nsRefPtr startNodeText, endNodeText; int32_t startOffset, endOffset; GetAsciiWSBounds(eBoth, point.mTextNode, point.mOffset + 1, getter_AddRefs(startNodeText), &startOffset, @@ -628,11 +628,11 @@ nsWSRunObject::GetWSNodes() nsCOMPtr wsBoundingParent = GetWSBoundingParent(); // first look backwards to find preceding ws nodes - if (mNode->NodeType() == nsIDOMNode::TEXT_NODE) { - nsCOMPtr textNode(do_QueryInterface(mNode)); + if (mNode->IsNodeOfType(nsINode::eTEXT)) { + nsRefPtr textNode(static_cast(mNode.get())); const nsTextFragment* textFrag = textNode->GetText(); - mNodeArray.InsertElementAt(0, static_cast(mNode.get())); + mNodeArray.InsertElementAt(0, textNode); if (mOffset) { for (int32_t pos = mOffset - 1; pos >= 0; pos--) { // sanity bounds check the char position. bug 136165 @@ -643,22 +643,22 @@ nsWSRunObject::GetWSNodes() char16_t theChar = textFrag->CharAt(pos); if (!nsCRT::IsAsciiSpace(theChar)) { if (theChar != nbsp) { - mStartNode = mNode; + mStartNode = textNode; mStartOffset = pos + 1; mStartReason = WSType::text; - mStartReasonNode = mNode; + mStartReasonNode = textNode; break; } // as we look backwards update our earliest found nbsp - mFirstNBSPNode = mNode; + mFirstNBSPNode = textNode; mFirstNBSPOffset = pos; // also keep track of latest nbsp so far if (!mLastNBSPNode) { - mLastNBSPNode = mNode; + mLastNBSPNode = textNode; mLastNBSPOffset = pos; } } - start.node = mNode; + start.node = textNode; start.offset = pos; } } @@ -675,11 +675,9 @@ nsWSRunObject::GetWSNodes() mStartOffset = start.offset; mStartReason = WSType::otherBlock; mStartReasonNode = priorNode; - } - else if (priorNode->NodeType() == nsIDOMNode::TEXT_NODE) { - mNodeArray.InsertElementAt(0, static_cast(priorNode.get())); - NS_ENSURE_SUCCESS(res, res); - nsCOMPtr textNode(do_QueryInterface(priorNode)); + } else if (priorNode->IsNodeOfType(nsINode::eTEXT)) { + nsRefPtr textNode(static_cast(priorNode.get())); + mNodeArray.InsertElementAt(0, textNode); const nsTextFragment *textFrag; if (!textNode || !(textFrag = textNode->GetText())) { return NS_ERROR_NULL_POINTER; @@ -700,22 +698,22 @@ nsWSRunObject::GetWSNodes() char16_t theChar = textFrag->CharAt(pos); if (!nsCRT::IsAsciiSpace(theChar)) { if (theChar != nbsp) { - mStartNode = priorNode; + mStartNode = textNode; mStartOffset = pos + 1; mStartReason = WSType::text; - mStartReasonNode = priorNode; + mStartReasonNode = textNode; break; } // as we look backwards update our earliest found nbsp - mFirstNBSPNode = priorNode; + mFirstNBSPNode = textNode; mFirstNBSPOffset = pos; // also keep track of latest nbsp so far if (!mLastNBSPNode) { - mLastNBSPNode = priorNode; + mLastNBSPNode = textNode; mLastNBSPOffset = pos; } } - start.SetPoint(priorNode, pos); + start.SetPoint(textNode, pos); } } } else { @@ -740,9 +738,9 @@ nsWSRunObject::GetWSNodes() } // then look ahead to find following ws nodes - if (mNode->NodeType() == nsIDOMNode::TEXT_NODE) { + if (mNode->IsNodeOfType(nsINode::eTEXT)) { // don't need to put it on list. it already is from code above - nsCOMPtr textNode(do_QueryInterface(mNode)); + nsRefPtr textNode(static_cast(mNode.get())); const nsTextFragment *textFrag = textNode->GetText(); uint32_t len = textNode->TextLength(); @@ -756,22 +754,22 @@ nsWSRunObject::GetWSNodes() char16_t theChar = textFrag->CharAt(pos); if (!nsCRT::IsAsciiSpace(theChar)) { if (theChar != nbsp) { - mEndNode = mNode; + mEndNode = textNode; mEndOffset = pos; mEndReason = WSType::text; - mEndReasonNode = mNode; + mEndReasonNode = textNode; break; } // as we look forwards update our latest found nbsp - mLastNBSPNode = mNode; + mLastNBSPNode = textNode; mLastNBSPOffset = pos; // also keep track of earliest nbsp so far if (!mFirstNBSPNode) { - mFirstNBSPNode = mNode; + mFirstNBSPNode = textNode; mFirstNBSPOffset = pos; } } - end.SetPoint(mNode, pos + 1); + end.SetPoint(textNode, pos + 1); } } } @@ -788,9 +786,9 @@ nsWSRunObject::GetWSNodes() mEndOffset = end.offset; mEndReason = WSType::otherBlock; mEndReasonNode = nextNode; - } else if (mHTMLEditor->IsTextNode(nextNode)) { - mNodeArray.AppendElement(static_cast(nextNode.get())); - nsCOMPtr textNode(do_QueryInterface(nextNode)); + } else if (nextNode->IsNodeOfType(nsINode::eTEXT)) { + nsRefPtr textNode(static_cast(nextNode.get())); + mNodeArray.AppendElement(textNode); const nsTextFragment *textFrag; if (!textNode || !(textFrag = textNode->GetText())) { return NS_ERROR_NULL_POINTER; @@ -800,7 +798,7 @@ nsWSRunObject::GetWSNodes() if (len < 1) { // Zero length text node. Set end point to it // so we can get past it! - end.SetPoint(nextNode,0); + end.SetPoint(textNode, 0); } else { for (uint32_t pos = 0; pos < len; pos++) { // sanity bounds check the char position. bug 136165 @@ -811,22 +809,22 @@ nsWSRunObject::GetWSNodes() char16_t theChar = textFrag->CharAt(pos); if (!nsCRT::IsAsciiSpace(theChar)) { if (theChar != nbsp) { - mEndNode = nextNode; + mEndNode = textNode; mEndOffset = pos; mEndReason = WSType::text; - mEndReasonNode = nextNode; + mEndReasonNode = textNode; break; } // as we look forwards update our latest found nbsp - mLastNBSPNode = nextNode; + mLastNBSPNode = textNode; mLastNBSPOffset = pos; // also keep track of earliest nbsp so far if (!mFirstNBSPNode) { - mFirstNBSPNode = nextNode; + mFirstNBSPNode = textNode; mFirstNBSPOffset = pos; } } - end.SetPoint(nextNode, pos + 1); + end.SetPoint(textNode, pos + 1); } } } else { @@ -1249,7 +1247,7 @@ nsWSRunObject::PrepareToDeleteRangePriv(nsWSRunObject* aEndObject) WSPoint point = GetCharBefore(mNode, mOffset); if (point.mTextNode && nsCRT::IsAsciiSpace(point.mChar)) { - nsCOMPtr wsStartNode, wsEndNode; + nsRefPtr wsStartNode, wsEndNode; int32_t wsStartOffset, wsEndOffset; GetAsciiWSBounds(eBoth, mNode, mOffset, getter_AddRefs(wsStartNode), &wsStartOffset, @@ -1294,7 +1292,7 @@ nsWSRunObject::PrepareToSplitAcrossBlocksPriv() WSPoint point = GetCharBefore(mNode, mOffset); if (point.mTextNode && nsCRT::IsAsciiSpace(point.mChar)) { - nsCOMPtr wsStartNode, wsEndNode; + nsRefPtr wsStartNode, wsEndNode; int32_t wsStartOffset, wsEndOffset; GetAsciiWSBounds(eBoth, mNode, mOffset, getter_AddRefs(wsStartNode), &wsStartOffset, @@ -1406,7 +1404,7 @@ nsWSRunObject::GetCharAfter(nsINode* aNode, int32_t aOffset) return GetWSPointAfter(aNode, aOffset); } else { // Use WSPoint version of GetCharAfter() - return GetCharAfter(WSPoint(static_cast(aNode), aOffset, 0)); + return GetCharAfter(WSPoint(mNodeArray[idx], aOffset, 0)); } } @@ -1421,7 +1419,7 @@ nsWSRunObject::GetCharBefore(nsINode* aNode, int32_t aOffset) return GetWSPointBefore(aNode, aOffset); } else { // Use WSPoint version of GetCharBefore() - return GetCharBefore(WSPoint(static_cast(aNode), aOffset, 0)); + return GetCharBefore(WSPoint(mNodeArray[idx], aOffset, 0)); } } @@ -1511,7 +1509,7 @@ nsWSRunObject::ConvertToNBSP(WSPoint aPoint, AreaRestriction aAR) NS_ENSURE_SUCCESS(res, res); // Next, find range of ws it will replace - nsCOMPtr startNode, endNode; + nsRefPtr startNode, endNode; int32_t startOffset = 0, endOffset = 0; GetAsciiWSBounds(eAfter, aPoint.mTextNode, aPoint.mOffset + 1, @@ -1529,13 +1527,13 @@ nsWSRunObject::ConvertToNBSP(WSPoint aPoint, AreaRestriction aAR) void nsWSRunObject::GetAsciiWSBounds(int16_t aDir, nsINode* aNode, int32_t aOffset, - nsIContent** outStartNode, int32_t* outStartOffset, - nsIContent** outEndNode, int32_t* outEndOffset) + Text** outStartNode, int32_t* outStartOffset, + Text** outEndNode, int32_t* outEndOffset) { MOZ_ASSERT(aNode && outStartNode && outStartOffset && outEndNode && outEndOffset); - nsCOMPtr startNode, endNode; + nsRefPtr startNode, endNode; int32_t startOffset = 0, endOffset = 0; if (aDir & eAfter) { @@ -1632,7 +1630,7 @@ nsWSRunObject::FindRun(nsINode* aNode, int32_t aOffset, WSFragment** outRun, } char16_t -nsWSRunObject::GetCharAt(nsIContent *aTextNode, int32_t aOffset) +nsWSRunObject::GetCharAt(Text* aTextNode, int32_t aOffset) { // return 0 if we can't get a char, for whatever reason NS_ENSURE_TRUE(aTextNode, 0); @@ -1838,7 +1836,7 @@ nsWSRunObject::CheckTrailingNBSPOfRun(WSFragment *aRun) // editor softwraps at this point, the spaces won't be split across lines, // which looks ugly and is bad for the moose. - nsCOMPtr startNode, endNode; + nsRefPtr startNode, endNode; int32_t startOffset, endOffset; GetAsciiWSBounds(eBoth, prevPoint.mTextNode, prevPoint.mOffset + 1, getter_AddRefs(startNode), &startOffset, diff --git a/editor/libeditor/html/nsWSRunObject.h b/editor/libeditor/html/nsWSRunObject.h index bc6e37b4f08..c942bcf2939 100644 --- a/editor/libeditor/html/nsWSRunObject.h +++ b/editor/libeditor/html/nsWSRunObject.h @@ -282,16 +282,11 @@ class MOZ_STACK_CLASS nsWSRunObject // stored in the struct. struct MOZ_STACK_CLASS WSPoint { - nsCOMPtr mTextNode; + nsRefPtr mTextNode; uint32_t mOffset; char16_t mChar; WSPoint() : mTextNode(0),mOffset(0),mChar(0) {} - WSPoint(nsIContent* aNode, int32_t aOffset, char16_t aChar) : - mTextNode(aNode),mOffset(aOffset),mChar(aChar) - { - MOZ_ASSERT(mTextNode->IsNodeOfType(nsINode::eTEXT)); - } WSPoint(mozilla::dom::Text* aTextNode, int32_t aOffset, char16_t aChar) : mTextNode(aTextNode),mOffset(aOffset),mChar(aChar) {} }; @@ -333,13 +328,13 @@ class MOZ_STACK_CLASS nsWSRunObject nsresult ConvertToNBSP(WSPoint aPoint, AreaRestriction aAR = eAnywhere); void GetAsciiWSBounds(int16_t aDir, nsINode* aNode, int32_t aOffset, - nsIContent** outStartNode, + mozilla::dom::Text** outStartNode, int32_t* outStartOffset, - nsIContent** outEndNode, + mozilla::dom::Text** outEndNode, int32_t* outEndOffset); void FindRun(nsINode* aNode, int32_t aOffset, WSFragment** outRun, bool after); - char16_t GetCharAt(nsIContent *aTextNode, int32_t aOffset); + char16_t GetCharAt(mozilla::dom::Text* aTextNode, int32_t aOffset); WSPoint GetWSPointAfter(nsINode* aNode, int32_t aOffset); WSPoint GetWSPointBefore(nsINode* aNode, int32_t aOffset); nsresult CheckTrailingNBSPOfRun(WSFragment *aRun); @@ -371,10 +366,10 @@ class MOZ_STACK_CLASS nsWSRunObject WSType mEndReason; // reason why ws ends (eText, eOtherBlock, etc) nsCOMPtr mEndReasonNode; // the node that implicated by end reason - nsCOMPtr mFirstNBSPNode; // location of first nbsp in ws run, if any + nsRefPtr mFirstNBSPNode; // location of first nbsp in ws run, if any int32_t mFirstNBSPOffset; // ... - nsCOMPtr mLastNBSPNode; // location of last nbsp in ws run, if any + nsRefPtr mLastNBSPNode; // location of last nbsp in ws run, if any int32_t mLastNBSPOffset; // ... // the list of nodes containing ws in this run diff --git a/editor/libeditor/nsEditor.cpp b/editor/libeditor/nsEditor.cpp index 379956878ce..e754d99c877 100644 --- a/editor/libeditor/nsEditor.cpp +++ b/editor/libeditor/nsEditor.cpp @@ -2446,7 +2446,7 @@ nsEditor::InsertTextImpl(const nsAString& aStringToInsert, nsresult nsEditor::InsertTextIntoTextNodeImpl(const nsAString& aStringToInsert, - nsINode* aTextNode, + Text* aTextNode, int32_t aOffset, bool aSuppressIME) { diff --git a/editor/libeditor/nsEditor.h b/editor/libeditor/nsEditor.h index d9cb0d2d085..9a2b687823e 100644 --- a/editor/libeditor/nsEditor.h +++ b/editor/libeditor/nsEditor.h @@ -208,7 +208,7 @@ public: int32_t *aInOutOffset, nsIDOMDocument *aDoc); nsresult InsertTextIntoTextNodeImpl(const nsAString& aStringToInsert, - nsINode* aTextNode, + mozilla::dom::Text* aTextNode, int32_t aOffset, bool aSuppressIME = false); nsresult InsertTextIntoTextNodeImpl(const nsAString& aStringToInsert,