From 0f9c1ead0460ad8b67a186cf8311900cf44a7174 Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Fri, 13 Jul 2012 09:31:15 +0300 Subject: [PATCH] Bug 771994 - Make nsRangeStore refcounted; r=ehsan --- editor/libeditor/base/nsSelectionState.cpp | 21 ++++++------ editor/libeditor/base/nsSelectionState.h | 25 +++++++------- editor/libeditor/html/nsHTMLEditRules.cpp | 38 ++++++++++++---------- editor/libeditor/html/nsHTMLEditRules.h | 2 +- 4 files changed, 47 insertions(+), 39 deletions(-) diff --git a/editor/libeditor/base/nsSelectionState.cpp b/editor/libeditor/base/nsSelectionState.cpp index 259a3e8de09..e261237a2e8 100644 --- a/editor/libeditor/base/nsSelectionState.cpp +++ b/editor/libeditor/base/nsSelectionState.cpp @@ -29,13 +29,13 @@ nsSelectionState::DoTraverse(nsCycleCollectionTraversalCallback &cb) { for (PRUint32 i = 0, iEnd = mArray.Length(); i < iEnd; ++i) { - nsRangeStore &item = mArray[i]; + nsRangeStore* item = mArray[i]; NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "selection state mArray[i].startNode"); - cb.NoteXPCOMChild(item.startNode); + cb.NoteXPCOMChild(item->startNode); NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "selection state mArray[i].endNode"); - cb.NoteXPCOMChild(item.endNode); + cb.NoteXPCOMChild(item->endNode); } } @@ -53,6 +53,7 @@ nsSelectionState::SaveSelection(nsISelection *aSel) for (i=0; i range; res = aSel->GetRangeAt(i, getter_AddRefs(range)); - mArray[i].StoreRange(range); + mArray[i]->StoreRange(range); } return res; @@ -91,7 +92,7 @@ nsSelectionState::RestoreSelection(nsISelection *aSel) for (i=0; i range; - mArray[i].GetRange(getter_AddRefs(range)); + mArray[i]->GetRange(getter_AddRefs(range)); NS_ENSURE_TRUE(range, NS_ERROR_UNEXPECTED); res = aSel->AddRange(range); @@ -106,7 +107,7 @@ nsSelectionState::IsCollapsed() { if (1 != mArray.Length()) return false; nsRefPtr range; - mArray[0].GetRange(getter_AddRefs(range)); + mArray[0]->GetRange(getter_AddRefs(range)); NS_ENSURE_TRUE(range, false); bool bIsCollapsed = false; range->GetCollapsed(&bIsCollapsed); @@ -124,8 +125,8 @@ nsSelectionState::IsEqual(nsSelectionState *aSelState) for (i=0; i myRange, itsRange; - mArray[i].GetRange(getter_AddRefs(myRange)); - aSelState->mArray[i].GetRange(getter_AddRefs(itsRange)); + mArray[i]->GetRange(getter_AddRefs(myRange)); + aSelState->mArray[i]->GetRange(getter_AddRefs(itsRange)); NS_ENSURE_TRUE(myRange && itsRange, false); PRInt16 compResult; @@ -190,7 +191,7 @@ nsRangeUpdater::RegisterSelectionState(nsSelectionState &aSelState) for (i=0; i startNode; PRInt32 startOffset; @@ -55,7 +57,7 @@ class nsSelectionState void MakeEmpty(); bool IsEmpty(); protected: - nsTArray mArray; + nsTArray > mArray; friend class nsRangeUpdater; }; @@ -99,7 +101,7 @@ class nsRangeUpdater nsresult WillMoveNode(); nsresult DidMoveNode(nsIDOMNode *aOldParent, PRInt32 aOldOffset, nsIDOMNode *aNewParent, PRInt32 aNewOffset); protected: - nsTArray mArray; + nsTArray > mArray; bool mLock; }; @@ -115,25 +117,26 @@ class NS_STACK_CLASS nsAutoTrackDOMPoint nsRangeUpdater &mRU; nsCOMPtr *mNode; PRInt32 *mOffset; - nsRangeStore mRangeItem; + nsRefPtr mRangeItem; public: nsAutoTrackDOMPoint(nsRangeUpdater &aRangeUpdater, nsCOMPtr *aNode, PRInt32 *aOffset) : mRU(aRangeUpdater) ,mNode(aNode) ,mOffset(aOffset) { - mRangeItem.startNode = *mNode; - mRangeItem.endNode = *mNode; - mRangeItem.startOffset = *mOffset; - mRangeItem.endOffset = *mOffset; - mRU.RegisterRangeItem(&mRangeItem); + mRangeItem = new nsRangeStore(); + mRangeItem->startNode = *mNode; + mRangeItem->endNode = *mNode; + mRangeItem->startOffset = *mOffset; + mRangeItem->endOffset = *mOffset; + mRU.RegisterRangeItem(mRangeItem); } ~nsAutoTrackDOMPoint() { - mRU.DropRangeItem(&mRangeItem); - *mNode = mRangeItem.startNode; - *mOffset = mRangeItem.startOffset; + mRU.DropRangeItem(mRangeItem); + *mNode = mRangeItem->startNode; + *mOffset = mRangeItem->startOffset; } }; diff --git a/editor/libeditor/html/nsHTMLEditRules.cpp b/editor/libeditor/html/nsHTMLEditRules.cpp index 18b97c6c535..d66bf281212 100644 --- a/editor/libeditor/html/nsHTMLEditRules.cpp +++ b/editor/libeditor/html/nsHTMLEditRules.cpp @@ -184,6 +184,7 @@ mDocChangeRange(nsnull) mCachedStyles[16] = StyleCache(nsEditProperty::cssBackgroundColor, EmptyString(), EmptyString()); mCachedStyles[17] = StyleCache(nsEditProperty::sub, EmptyString(), EmptyString()); mCachedStyles[18] = StyleCache(nsEditProperty::sup, EmptyString(), EmptyString()); + mRangeItem = new nsRangeStore(); } nsHTMLEditRules::~nsHTMLEditRules() @@ -287,17 +288,17 @@ nsHTMLEditRules::BeforeEdit(nsEditor::OperationID action, PRInt32 selOffset; res = mHTMLEditor->GetStartNodeAndOffset(selection, getter_AddRefs(selStartNode), &selOffset); NS_ENSURE_SUCCESS(res, res); - mRangeItem.startNode = selStartNode; - mRangeItem.startOffset = selOffset; + mRangeItem->startNode = selStartNode; + mRangeItem->startOffset = selOffset; // get the selection end location res = mHTMLEditor->GetEndNodeAndOffset(selection, getter_AddRefs(selEndNode), &selOffset); NS_ENSURE_SUCCESS(res, res); - mRangeItem.endNode = selEndNode; - mRangeItem.endOffset = selOffset; + mRangeItem->endNode = selEndNode; + mRangeItem->endOffset = selOffset; // register this range with range updater to track this as we perturb the doc - (mHTMLEditor->mRangeUpdater).RegisterRangeItem(&mRangeItem); + (mHTMLEditor->mRangeUpdater).RegisterRangeItem(mRangeItem); // clear deletion state bool mDidDeleteSelection = false; @@ -361,7 +362,7 @@ nsHTMLEditRules::AfterEdit(nsEditor::OperationID action, res = AfterEditInner(action, aDirection); // free up selectionState range item - (mHTMLEditor->mRangeUpdater).DropRangeItem(&mRangeItem); + (mHTMLEditor->mRangeUpdater).DropRangeItem(mRangeItem); // Reset the contenteditable count to its previous value if (mRestoreContentEditableCount) { @@ -453,11 +454,13 @@ nsHTMLEditRules::AfterEditInner(nsEditor::OperationID action, NS_ENSURE_SUCCESS(res, res); // also do this for original selection endpoints. - nsWSRunObject(mHTMLEditor, mRangeItem.startNode, mRangeItem.startOffset).AdjustWhitespace(); + nsWSRunObject(mHTMLEditor, mRangeItem->startNode, + mRangeItem->startOffset).AdjustWhitespace(); // we only need to handle old selection endpoint if it was different from start - if ((mRangeItem.startNode != mRangeItem.endNode) || (mRangeItem.startOffset != mRangeItem.endOffset)) - { - nsWSRunObject(mHTMLEditor, mRangeItem.endNode, mRangeItem.endOffset).AdjustWhitespace(); + if (mRangeItem->startNode != mRangeItem->endNode || + mRangeItem->startOffset != mRangeItem->endOffset) { + nsWSRunObject(mHTMLEditor, mRangeItem->endNode, + mRangeItem->endOffset).AdjustWhitespace(); } } @@ -494,7 +497,8 @@ nsHTMLEditRules::AfterEditInner(nsEditor::OperationID action, } res = mHTMLEditor->HandleInlineSpellCheck(action, selection, - mRangeItem.startNode, mRangeItem.startOffset, + mRangeItem->startNode, + mRangeItem->startOffset, rangeStartParent, rangeStartOffset, rangeEndParent, rangeEndOffset); NS_ENSURE_SUCCESS(res, res); @@ -5572,7 +5576,7 @@ nsHTMLEditRules::GetNodesForOperation(nsCOMArray& inArrayOfRanges, if (!aDontTouchContent) { - nsAutoTArray rangeItemArray; + nsTArray > rangeItemArray; if (!rangeItemArray.AppendElements(rangeCount)) { return NS_ERROR_OUT_OF_MEMORY; } @@ -5584,21 +5588,21 @@ nsHTMLEditRules::GetNodesForOperation(nsCOMArray& inArrayOfRanges, for (i = 0; i < rangeCount; i++) { opRange = inArrayOfRanges[0]; - nsRangeStore *item = rangeItemArray.Elements() + i; - item->StoreRange(opRange); - mHTMLEditor->mRangeUpdater.RegisterRangeItem(item); + rangeItemArray[i] = new nsRangeStore(); + rangeItemArray[i]->StoreRange(opRange); + mHTMLEditor->mRangeUpdater.RegisterRangeItem(rangeItemArray[i]); inArrayOfRanges.RemoveObjectAt(0); } // now bust up inlines. Safe to start at rangeCount-1, since we // asserted we have enough items above. for (i = rangeCount-1; i >= 0 && NS_SUCCEEDED(res); i--) { - res = BustUpInlinesAtRangeEndpoints(rangeItemArray[i]); + res = BustUpInlinesAtRangeEndpoints(*rangeItemArray[i]); } // then unregister the ranges for (i = 0; i < rangeCount; i++) { - nsRangeStore *item = rangeItemArray.Elements() + i; + nsRangeStore* item = rangeItemArray[i]; mHTMLEditor->mRangeUpdater.DropRangeItem(item); nsRefPtr range; nsresult res2 = item->GetRange(getter_AddRefs(range)); diff --git a/editor/libeditor/html/nsHTMLEditRules.h b/editor/libeditor/html/nsHTMLEditRules.h index b9f8a313bdd..02b909a79f9 100644 --- a/editor/libeditor/html/nsHTMLEditRules.h +++ b/editor/libeditor/html/nsHTMLEditRules.h @@ -293,7 +293,7 @@ protected: nsRefPtr mUtilRange; PRUint32 mJoinOffset; // need to remember an int across willJoin/didJoin... nsCOMPtr mNewBlock; - nsRangeStore mRangeItem; + nsRefPtr mRangeItem; StyleCache mCachedStyles[SIZE_STYLE_TABLE]; };