Bug 771994 - Make nsRangeStore refcounted; r=ehsan

This commit is contained in:
Aryeh Gregor 2012-07-13 09:31:15 +03:00
parent 2233ab8270
commit 0f9c1ead04
4 changed files with 47 additions and 39 deletions

View File

@ -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<count; i++)
{
mArray.AppendElement();
mArray[i] = new nsRangeStore();
}
}
@ -71,7 +72,7 @@ nsSelectionState::SaveSelection(nsISelection *aSel)
{
nsCOMPtr<nsIDOMRange> 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<arrayCount; i++)
{
nsRefPtr<nsRange> 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<nsRange> 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<myCount; i++)
{
nsRefPtr<nsRange> 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<theCount; i++)
{
RegisterRangeItem(&aSelState.mArray[i]);
RegisterRangeItem(aSelState.mArray[i]);
}
return NS_OK;
@ -204,7 +205,7 @@ nsRangeUpdater::DropSelectionState(nsSelectionState &aSelState)
for (i=0; i<theCount; i++)
{
DropRangeItem(&aSelState.mArray[i]);
DropRangeItem(aSelState.mArray[i]);
}
return NS_OK;

View File

@ -30,6 +30,8 @@ struct nsRangeStore
~nsRangeStore();
nsresult StoreRange(nsIDOMRange *aRange);
nsresult GetRange(nsRange** outRange);
NS_INLINE_DECL_REFCOUNTING(nsRangeStore)
nsCOMPtr<nsIDOMNode> startNode;
PRInt32 startOffset;
@ -55,7 +57,7 @@ class nsSelectionState
void MakeEmpty();
bool IsEmpty();
protected:
nsTArray<nsRangeStore> mArray;
nsTArray<nsRefPtr<nsRangeStore> > mArray;
friend class nsRangeUpdater;
};
@ -99,7 +101,7 @@ class nsRangeUpdater
nsresult WillMoveNode();
nsresult DidMoveNode(nsIDOMNode *aOldParent, PRInt32 aOldOffset, nsIDOMNode *aNewParent, PRInt32 aNewOffset);
protected:
nsTArray<nsRangeStore*> mArray;
nsTArray<nsRefPtr<nsRangeStore> > mArray;
bool mLock;
};
@ -115,25 +117,26 @@ class NS_STACK_CLASS nsAutoTrackDOMPoint
nsRangeUpdater &mRU;
nsCOMPtr<nsIDOMNode> *mNode;
PRInt32 *mOffset;
nsRangeStore mRangeItem;
nsRefPtr<nsRangeStore> mRangeItem;
public:
nsAutoTrackDOMPoint(nsRangeUpdater &aRangeUpdater, nsCOMPtr<nsIDOMNode> *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;
}
};

View File

@ -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<nsIDOMRange>& inArrayOfRanges,
if (!aDontTouchContent)
{
nsAutoTArray<nsRangeStore, 16> rangeItemArray;
nsTArray<nsRefPtr<nsRangeStore> > rangeItemArray;
if (!rangeItemArray.AppendElements(rangeCount)) {
return NS_ERROR_OUT_OF_MEMORY;
}
@ -5584,21 +5588,21 @@ nsHTMLEditRules::GetNodesForOperation(nsCOMArray<nsIDOMRange>& 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<nsRange> range;
nsresult res2 = item->GetRange(getter_AddRefs(range));

View File

@ -293,7 +293,7 @@ protected:
nsRefPtr<nsRange> mUtilRange;
PRUint32 mJoinOffset; // need to remember an int across willJoin/didJoin...
nsCOMPtr<nsIDOMNode> mNewBlock;
nsRangeStore mRangeItem;
nsRefPtr<nsRangeStore> mRangeItem;
StyleCache mCachedStyles[SIZE_STYLE_TABLE];
};