fixing range dom gravity bug first exposed by bug #10231

This commit is contained in:
jfrancis%netscape.com 1999-08-06 10:33:09 +00:00
parent 761823a1f3
commit f3fbfca040
4 changed files with 52 additions and 20 deletions

View File

@ -749,6 +749,16 @@ nsGenericDOMDataNode::RangeAdd(nsIDOMRange& aRange)
if (nsnull == mRangeList) {
return NS_ERROR_OUT_OF_MEMORY;
}
// Make sure we don't add a range that is already
// in the list!
PRInt32 i = mRangeList->IndexOf(&aRange);
if (i >= 0) {
// Range is already in the list, so there
// is nothing to do!
return NS_OK;
}
// dont need to addref - this call is made by the range object itself
PRBool rv = mRangeList->AppendElement(&aRange);
if (rv) return NS_OK;

View File

@ -411,30 +411,36 @@ nsresult nsRange::DoSetRange(nsIDOMNode* aStartN, PRInt32 aStartOffset,
aStartOffset = aEndOffset;
}
if (mStartParent && (mStartParent != aStartN) && (mStartParent != aEndN))
{
// if old start parent no longer involved, remove range from that
// node's range list.
RemoveFromListOf(mStartParent);
}
if (mEndParent && (mEndParent != aStartN) && (mEndParent != aEndN))
{
// if old end parent no longer involved, remove range from that
// node's range list.
RemoveFromListOf(mEndParent);
}
if (mStartParent.get() != aStartN)
{
if (mStartParent) // if it had a former start node, take it off it's list
{
RemoveFromListOf(mStartParent);
}
mStartParent = do_QueryInterface(aStartN);
if (mStartParent) // if it has a new start node, put it on it's list
{
AddToListOf(mStartParent);
AddToListOf(mStartParent); // AddToList() detects duplication for us
}
}
mStartOffset = aStartOffset;
if (mEndParent.get() != aEndN)
{
if (mEndParent) // if it had a former end node, take it off it's list
{
RemoveFromListOf(mEndParent);
}
mEndParent = do_QueryInterface(aEndN);
if (mEndParent) // if it has a new end node, put it on it's list
{
AddToListOf(mEndParent);
AddToListOf(mEndParent); // AddToList() detects duplication for us
}
}
mEndOffset = aEndOffset;

View File

@ -749,6 +749,16 @@ nsGenericDOMDataNode::RangeAdd(nsIDOMRange& aRange)
if (nsnull == mRangeList) {
return NS_ERROR_OUT_OF_MEMORY;
}
// Make sure we don't add a range that is already
// in the list!
PRInt32 i = mRangeList->IndexOf(&aRange);
if (i >= 0) {
// Range is already in the list, so there
// is nothing to do!
return NS_OK;
}
// dont need to addref - this call is made by the range object itself
PRBool rv = mRangeList->AppendElement(&aRange);
if (rv) return NS_OK;

View File

@ -411,30 +411,36 @@ nsresult nsRange::DoSetRange(nsIDOMNode* aStartN, PRInt32 aStartOffset,
aStartOffset = aEndOffset;
}
if (mStartParent && (mStartParent != aStartN) && (mStartParent != aEndN))
{
// if old start parent no longer involved, remove range from that
// node's range list.
RemoveFromListOf(mStartParent);
}
if (mEndParent && (mEndParent != aStartN) && (mEndParent != aEndN))
{
// if old end parent no longer involved, remove range from that
// node's range list.
RemoveFromListOf(mEndParent);
}
if (mStartParent.get() != aStartN)
{
if (mStartParent) // if it had a former start node, take it off it's list
{
RemoveFromListOf(mStartParent);
}
mStartParent = do_QueryInterface(aStartN);
if (mStartParent) // if it has a new start node, put it on it's list
{
AddToListOf(mStartParent);
AddToListOf(mStartParent); // AddToList() detects duplication for us
}
}
mStartOffset = aStartOffset;
if (mEndParent.get() != aEndN)
{
if (mEndParent) // if it had a former end node, take it off it's list
{
RemoveFromListOf(mEndParent);
}
mEndParent = do_QueryInterface(aEndN);
if (mEndParent) // if it has a new end node, put it on it's list
{
AddToListOf(mEndParent);
AddToListOf(mEndParent); // AddToList() detects duplication for us
}
}
mEndOffset = aEndOffset;