mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 771994 - Make nsRangeStore refcounted; r=ehsan
This commit is contained in:
parent
2233ab8270
commit
0f9c1ead04
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -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));
|
||||
|
@ -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];
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user