--- a/dom/base/nsRange.cpp
+++ b/dom/base/nsRange.cpp
@@ -332,17 +332,17 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(ns
// This needs to be unlinked after Reset() is called, as it controls
// the result of IsInSelection() which is used by tmp->Reset().
NS_IMPL_CYCLE_COLLECTION_UNLINK(mSelection);
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsRange)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOwner)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mStartParent)
+ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mStartContainer)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mEndParent)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mRoot)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSelection)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsRange)
NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER
NS_IMPL_CYCLE_COLLECTION_TRACE_END
@@ -455,53 +455,53 @@ nsRange::CharacterDataChanged(nsIDocumen
// again (when the new text node is notified).
nsINode* parentNode = aContent->GetParentNode();
int32_t index = -1;
if (parentNode == mEndParent && mEndOffset > 0 &&
(index = parentNode->IndexOf(aContent)) + 1 == mEndOffset) {
++mEndOffset;
mEndOffsetWasIncremented = true;
}
- if (parentNode == mStartParent && mStartOffset > 0 &&
+ if (parentNode == mStartContainer && mStartOffset > 0 &&
(index != -1 ? index : parentNode->IndexOf(aContent)) + 1 == mStartOffset) {
++mStartOffset;
mStartOffsetWasIncremented = true;
}
#ifdef DEBUG
if (mStartOffsetWasIncremented || mEndOffsetWasIncremented) {
mAssertNextInsertOrAppendIndex =
(mStartOffsetWasIncremented ? mStartOffset : mEndOffset) - 1;
mAssertNextInsertOrAppendNode = aInfo->mDetails->mNextSibling;
}
#endif
}
// If the changed node contains our start boundary and the change starts
// before the boundary we'll need to adjust the offset.
- if (aContent == mStartParent &&
+ if (aContent == mStartContainer &&
aInfo->mChangeStart < static_cast<uint32_t>(mStartOffset)) {
if (aInfo->mDetails) {
// splitText(), aInfo->mDetails->mNextSibling is the new text node
NS_ASSERTION(aInfo->mDetails->mType ==
CharacterDataChangeInfo::Details::eSplit,
"only a split can start before the end");
NS_ASSERTION(static_cast<uint32_t>(mStartOffset) <= aInfo->mChangeEnd + 1,
"mStartOffset is beyond the end of this node");
newStartOffset = static_cast<uint32_t>(mStartOffset) - aInfo->mChangeStart;
newStartNode = aInfo->mDetails->mNextSibling;
if (MOZ_UNLIKELY(aContent == mRoot)) {
newRoot = IsValidBoundary(newStartNode);
}
- bool isCommonAncestor = IsInSelection() && mStartParent == mEndParent;
+ bool isCommonAncestor = IsInSelection() && mStartContainer == mEndParent;
if (isCommonAncestor) {
- UnregisterCommonAncestor(mStartParent);
+ UnregisterCommonAncestor(mStartContainer);
RegisterCommonAncestor(newStartNode);
}
- if (mStartParent->IsDescendantOfCommonAncestorForRangeInSelection()) {
+ if (mStartContainer->IsDescendantOfCommonAncestorForRangeInSelection()) {
newStartNode->SetDescendantOfCommonAncestorForRangeInSelection();
}
} else {
// If boundary is inside changed text, position it before change
// else adjust start offset for the change in length.
mStartOffset = static_cast<uint32_t>(mStartOffset) <= aInfo->mChangeEnd ?
aInfo->mChangeStart :
mStartOffset + aInfo->mChangeStart - aInfo->mChangeEnd +
@@ -519,21 +519,21 @@ nsRange::CharacterDataChanged(nsIDocumen
NS_ASSERTION(aInfo->mDetails->mType ==
CharacterDataChangeInfo::Details::eSplit,
"only a split can start before the end");
NS_ASSERTION(static_cast<uint32_t>(mEndOffset) <= aInfo->mChangeEnd + 1,
"mEndOffset is beyond the end of this node");
newEndOffset = static_cast<uint32_t>(mEndOffset) - aInfo->mChangeStart;
newEndNode = aInfo->mDetails->mNextSibling;
- bool isCommonAncestor = IsInSelection() && mStartParent == mEndParent;
+ bool isCommonAncestor = IsInSelection() && mStartContainer == mEndParent;
if (isCommonAncestor && !newStartNode) {
// The split occurs inside the range.
- UnregisterCommonAncestor(mStartParent);
- RegisterCommonAncestor(mStartParent->GetParentNode());
+ UnregisterCommonAncestor(mStartContainer);
+ RegisterCommonAncestor(mStartContainer->GetParentNode());
newEndNode->SetDescendantOfCommonAncestorForRangeInSelection();
} else if (mEndParent->IsDescendantOfCommonAncestorForRangeInSelection()) {
newEndNode->SetDescendantOfCommonAncestorForRangeInSelection();
}
} else {
mEndOffset = static_cast<uint32_t>(mEndOffset) <= aInfo->mChangeEnd ?
aInfo->mChangeStart :
mEndOffset + aInfo->mChangeStart - aInfo->mChangeEnd +
@@ -541,17 +541,17 @@ nsRange::CharacterDataChanged(nsIDocumen
}
}
if (aInfo->mDetails &&
aInfo->mDetails->mType == CharacterDataChangeInfo::Details::eMerge) {
// normalize(), aInfo->mDetails->mNextSibling is the merged text node
// that will be removed
nsIContent* removed = aInfo->mDetails->mNextSibling;
- if (removed == mStartParent) {
+ if (removed == mStartContainer) {
newStartOffset = static_cast<uint32_t>(mStartOffset) + aInfo->mChangeStart;
newStartNode = aContent;
if (MOZ_UNLIKELY(removed == mRoot)) {
newRoot = IsValidBoundary(newStartNode);
}
}
if (removed == mEndParent) {
newEndOffset = static_cast<uint32_t>(mEndOffset) + aInfo->mChangeStart;
@@ -562,33 +562,33 @@ nsRange::CharacterDataChanged(nsIDocumen
}
// When the removed text node's parent is one of our boundary nodes we may
// need to adjust the offset to account for the removed node. However,
// there will also be a ContentRemoved notification later so the only cases
// we need to handle here is when the removed node is the text node after
// the boundary. (The m*Offset > 0 check is an optimization - a boundary
// point before the first child is never affected by normalize().)
nsINode* parentNode = aContent->GetParentNode();
- if (parentNode == mStartParent && mStartOffset > 0 &&
+ if (parentNode == mStartContainer && mStartOffset > 0 &&
uint32_t(mStartOffset) < parentNode->GetChildCount() &&
removed == parentNode->GetChildAt(mStartOffset)) {
newStartNode = aContent;
newStartOffset = aInfo->mChangeStart;
}
if (parentNode == mEndParent && mEndOffset > 0 &&
uint32_t(mEndOffset) < parentNode->GetChildCount() &&
removed == parentNode->GetChildAt(mEndOffset)) {
newEndNode = aContent;
newEndOffset = aInfo->mChangeEnd;
}
}
if (newStartNode || newEndNode) {
if (!newStartNode) {
- newStartNode = mStartParent;
+ newStartNode = mStartContainer;
newStartOffset = mStartOffset;
}
if (!newEndNode) {
newEndNode = mEndParent;
newEndOffset = mEndOffset;
}
DoSetRange(newStartNode, newStartOffset, newEndNode, newEndOffset,
newRoot ? newRoot : mRoot.get(),
@@ -634,17 +634,17 @@ nsRange::ContentInserted(nsIDocument* aD
nsIContent* aChild,
int32_t aIndexInContainer)
{
NS_ASSERTION(mIsPositioned, "shouldn't be notified if not positioned");
nsINode* container = NODE_FROM(aContainer, aDocument);
// Adjust position if a sibling was inserted.
- if (container == mStartParent && aIndexInContainer < mStartOffset &&
+ if (container == mStartContainer && aIndexInContainer < mStartOffset &&
!mStartOffsetWasIncremented) {
++mStartOffset;
}
if (container == mEndParent && aIndexInContainer < mEndOffset &&
!mEndOffsetWasIncremented) {
++mEndOffset;
}
if (container->IsSelectionDescendant() &&
@@ -678,38 +678,39 @@ nsRange::ContentRemoved(nsIDocument* aDo
"splitText failed to notify insert/append?");
nsINode* container = NODE_FROM(aContainer, aDocument);
bool gravitateStart = false;
bool gravitateEnd = false;
bool didCheckStartParentDescendant = false;
// Adjust position if a sibling was removed...
- if (container == mStartParent) {
+ if (container == mStartContainer) {
if (aIndexInContainer < mStartOffset) {
--mStartOffset;
}
} else { // ...or gravitate if an ancestor was removed.
didCheckStartParentDescendant = true;
- gravitateStart = nsContentUtils::ContentIsDescendantOf(mStartParent, aChild);
+ gravitateStart =
+ nsContentUtils::ContentIsDescendantOf(mStartContainer, aChild);
}
// Do same thing for end boundry.
if (container == mEndParent) {
if (aIndexInContainer < mEndOffset) {
--mEndOffset;
}
- } else if (didCheckStartParentDescendant && mStartParent == mEndParent) {
+ } else if (didCheckStartParentDescendant && mStartContainer == mEndParent) {
gravitateEnd = gravitateStart;
} else {
gravitateEnd = nsContentUtils::ContentIsDescendantOf(mEndParent, aChild);
}
if (gravitateStart || gravitateEnd) {
- DoSetRange(gravitateStart ? container : mStartParent.get(),
+ DoSetRange(gravitateStart ? container : mStartContainer.get(),
gravitateStart ? aIndexInContainer : mStartOffset,
gravitateEnd ? container : mEndParent.get(),
gravitateEnd ? aIndexInContainer : mEndOffset,
mRoot);
}
if (container->IsSelectionDescendant() &&
aChild->IsDescendantOfCommonAncestorForRangeInSelection()) {
aChild->ClearDescendantOfCommonAncestorForRangeInSelection();
@@ -719,34 +720,34 @@ nsRange::ContentRemoved(nsIDocument* aDo
void
nsRange::ParentChainChanged(nsIContent *aContent)
{
MOZ_ASSERT(!mStartOffsetWasIncremented && !mEndOffsetWasIncremented &&
mAssertNextInsertOrAppendIndex == -1,
"splitText failed to notify insert/append?");
NS_ASSERTION(mRoot == aContent, "Wrong ParentChainChanged notification?");
- nsINode* newRoot = IsValidBoundary(mStartParent);
+ nsINode* newRoot = IsValidBoundary(mStartContainer);
NS_ASSERTION(newRoot, "No valid boundary or root found!");
if (newRoot != IsValidBoundary(mEndParent)) {
// Sometimes ordering involved in cycle collection can lead to our
// start parent and/or end parent being disconnected from our root
// without our getting a ContentRemoved notification.
// See bug 846096 for more details.
NS_ASSERTION(mEndParent->IsInNativeAnonymousSubtree(),
"This special case should happen only with "
"native-anonymous content");
// When that happens, bail out and set pointers to null; since we're
// in cycle collection and unreachable it shouldn't matter.
Reset();
return;
}
// This is safe without holding a strong ref to self as long as the change
// of mRoot is the last thing in DoSetRange.
- DoSetRange(mStartParent, mStartOffset, mEndParent, mEndOffset, newRoot);
+ DoSetRange(mStartContainer, mStartOffset, mEndParent, mEndOffset, newRoot);
}
/******************************************************
* Utilities for comparing points: API from nsIDOMRange
******************************************************/
NS_IMETHODIMP
nsRange::IsPointInRange(nsIDOMNode* aParent, int32_t aOffset, bool* aResult)
{
@@ -807,17 +808,18 @@ nsRange::ComparePoint(nsINode& aParent,
if (aOffset > aParent.Length()) {
aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
return 0;
}
int32_t cmp;
if ((cmp = nsContentUtils::ComparePoints(&aParent, aOffset,
- mStartParent, mStartOffset)) <= 0) {
+ mStartContainer,
+ mStartOffset)) <= 0) {
return cmp;
}
if (nsContentUtils::ComparePoints(mEndParent, mEndOffset,
&aParent, aOffset) == -1) {
return 1;
}
@@ -855,17 +857,17 @@ nsRange::IntersectsNode(nsINode& aNode,
}
// Step 5.
int32_t nodeIndex = parent->IndexOf(&aNode);
// Steps 6-7.
// Note: if disconnected is true, ComparePoints returns 1.
bool disconnected = false;
- bool result = nsContentUtils::ComparePoints(mStartParent, mStartOffset,
+ bool result = nsContentUtils::ComparePoints(mStartContainer, mStartOffset,
parent, nodeIndex + 1,
&disconnected) < 0 &&
nsContentUtils::ComparePoints(parent, nodeIndex,
mEndParent, mEndOffset,
&disconnected) < 0;
// Step 2.
if (disconnected) {
@@ -915,24 +917,25 @@ nsRange::DoSetRange(nsINode* aStartN, in
if (mRoot != aRoot) {
if (mRoot) {
mRoot->RemoveMutationObserver(this);
}
if (aRoot) {
aRoot->AddMutationObserver(this);
}
}
- bool checkCommonAncestor = (mStartParent != aStartN || mEndParent != aEndN) &&
- IsInSelection() && !aNotInsertedYet;
+ bool checkCommonAncestor =
+ (mStartContainer != aStartN || mEndParent != aEndN) &&
+ IsInSelection() && !aNotInsertedYet;
nsINode* oldCommonAncestor = checkCommonAncestor ? GetCommonAncestor() : nullptr;
- mStartParent = aStartN;
+ mStartContainer = aStartN;
mStartOffset = aStartOffset;
mEndParent = aEndN;
mEndOffset = aEndOffset;
- mIsPositioned = !!mStartParent;
+ mIsPositioned = !!mStartContainer;
if (checkCommonAncestor) {
nsINode* newCommonAncestor = GetCommonAncestor();
if (newCommonAncestor != oldCommonAncestor) {
if (oldCommonAncestor) {
UnregisterCommonAncestor(oldCommonAncestor);
}
if (newCommonAncestor) {
RegisterCommonAncestor(newCommonAncestor);
@@ -992,17 +995,17 @@ nsRange::SetSelection(mozilla::dom::Sele
UnregisterCommonAncestor(commonAncestor);
}
}
nsINode*
nsRange::GetCommonAncestor() const
{
return mIsPositioned ?
- nsContentUtils::GetCommonAncestor(mStartParent, mEndParent) :
+ nsContentUtils::GetCommonAncestor(mStartContainer, mEndParent) :
nullptr;
}
void
nsRange::Reset()
{
DoSetRange(nullptr, 0, nullptr, 0, nullptr);
}
@@ -1012,28 +1015,28 @@ nsRange::Reset()
******************************************************/
NS_IMETHODIMP
nsRange::GetStartContainer(nsIDOMNode** aStartParent)
{
if (!mIsPositioned)
return NS_ERROR_NOT_INITIALIZED;
- return CallQueryInterface(mStartParent, aStartParent);
+ return CallQueryInterface(mStartContainer, aStartParent);
}
nsINode*
nsRange::GetStartContainer(ErrorResult& aRv) const
{
if (!mIsPositioned) {
aRv.Throw(NS_ERROR_NOT_INITIALIZED);
return nullptr;
}
- return mStartParent;
+ return mStartContainer;
}
NS_IMETHODIMP
nsRange::GetStartOffset(int32_t* aStartOffset)
{
if (!mIsPositioned)
return NS_ERROR_NOT_INITIALIZED;
@@ -1109,17 +1112,17 @@ nsRange::GetCollapsed(bool* aIsCollapsed
nsINode*
nsRange::GetCommonAncestorContainer(ErrorResult& aRv) const
{
if (!mIsPositioned) {
aRv.Throw(NS_ERROR_NOT_INITIALIZED);
return nullptr;
}
- return nsContentUtils::GetCommonAncestor(mStartParent, mEndParent);
+ return nsContentUtils::GetCommonAncestor(mStartContainer, mEndParent);
}
NS_IMETHODIMP
nsRange::GetCommonAncestorContainer(nsIDOMNode** aCommonParent)
{
ErrorResult rv;
nsINode* commonAncestor = GetCommonAncestorContainer(rv);
if (commonAncestor) {
@@ -1362,24 +1365,24 @@ nsRange::SetEnd(nsINode* aParent, int32_
if (!IsValidOffset(aParent, aOffset)) {
return NS_ERROR_DOM_INDEX_SIZE_ERR;
}
// Collapse if not positioned yet, if positioned in another doc or
// if the new end is before start.
if (!mIsPositioned || newRoot != mRoot ||
- nsContentUtils::ComparePoints(mStartParent, mStartOffset,
+ nsContentUtils::ComparePoints(mStartContainer, mStartOffset,
aParent, aOffset) == 1) {
DoSetRange(aParent, aOffset, aParent, aOffset, newRoot);
return NS_OK;
}
- DoSetRange(mStartParent, mStartOffset, aParent, aOffset, mRoot);
+ DoSetRange(mStartContainer, mStartOffset, aParent, aOffset, mRoot);
return NS_OK;
}
nsresult
nsRange::SetStartAndEnd(nsINode* aStartParent, int32_t aStartOffset,
nsINode* aEndParent, int32_t aEndOffset)
{
@@ -1511,20 +1514,22 @@ nsRange::SetEndAfter(nsIDOMNode* aSiblin
NS_IMETHODIMP
nsRange::Collapse(bool aToStart)
{
if (!mIsPositioned)
return NS_ERROR_NOT_INITIALIZED;
AutoInvalidateSelection atEndOfBlock(this);
- if (aToStart)
- DoSetRange(mStartParent, mStartOffset, mStartParent, mStartOffset, mRoot);
- else
+ if (aToStart) {
+ DoSetRange(mStartContainer, mStartOffset,
+ mStartContainer, mStartOffset, mRoot);
+ } else {
DoSetRange(mEndParent, mEndOffset, mEndParent, mEndOffset, mRoot);
+ }
return NS_OK;
}
void
nsRange::CollapseJS(bool aToStart)
{
AutoCalledByJSRestore calledByJSRestorer(*this);
@@ -2000,17 +2005,17 @@ ValidateCurrentNode(nsRange* aRange, Ran
nsresult
nsRange::CutContents(DocumentFragment** aFragment)
{
if (aFragment) {
*aFragment = nullptr;
}
- nsCOMPtr<nsIDocument> doc = mStartParent->OwnerDoc();
+ nsCOMPtr<nsIDocument> doc = mStartContainer->OwnerDoc();
ErrorResult res;
nsCOMPtr<nsINode> commonAncestor = GetCommonAncestorContainer(res);
NS_ENSURE_TRUE(!res.Failed(), res.StealNSResult());
// If aFragment isn't null, create a temporary fragment to hold our return.
RefPtr<DocumentFragment> retval;
if (aFragment) {
@@ -2019,17 +2024,17 @@ nsRange::CutContents(DocumentFragment**
nsCOMPtr<nsINode> commonCloneAncestor = retval.get();
// Batch possible DOMSubtreeModified events.
mozAutoSubtreeModified subtree(mRoot ? mRoot->OwnerDoc(): nullptr, nullptr);
// Save the range end points locally to avoid interference
// of Range gravity during our edits!
- nsCOMPtr<nsINode> startContainer = mStartParent;
+ nsCOMPtr<nsINode> startContainer = mStartContainer;
int32_t startOffset = mStartOffset;
nsCOMPtr<nsINode> endContainer = mEndParent;
int32_t endOffset = mEndOffset;
if (retval) {
// For extractContents(), abort early if there's a doctype (bug 719533).
// This can happen only if the common ancestor is a document, in which case
// we just need to find its doctype child and check if that's in the range.
@@ -2323,29 +2328,29 @@ nsRange::CompareBoundaryPoints(uint16_t
return 0;
}
nsINode *ourNode, *otherNode;
int32_t ourOffset, otherOffset;
switch (aHow) {
case nsIDOMRange::START_TO_START:
- ourNode = mStartParent;
+ ourNode = mStartContainer;
ourOffset = mStartOffset;
otherNode = aOtherRange.GetStartContainer();
otherOffset = aOtherRange.StartOffset();
break;
case nsIDOMRange::START_TO_END:
ourNode = mEndParent;
ourOffset = mEndOffset;
otherNode = aOtherRange.GetStartContainer();
otherOffset = aOtherRange.StartOffset();
break;
case nsIDOMRange::END_TO_START:
- ourNode = mStartParent;
+ ourNode = mStartContainer;
ourOffset = mStartOffset;
otherNode = aOtherRange.GetEndContainer();
otherOffset = aOtherRange.EndOffset();
break;
case nsIDOMRange::END_TO_END:
ourNode = mEndParent;
ourOffset = mEndOffset;
otherNode = aOtherRange.GetEndContainer();
@@ -2425,17 +2430,17 @@ nsRange::CloneContents(nsIDOMDocumentFra
}
already_AddRefed<DocumentFragment>
nsRange::CloneContents(ErrorResult& aRv)
{
nsCOMPtr<nsINode> commonAncestor = GetCommonAncestorContainer(aRv);
MOZ_ASSERT(!aRv.Failed(), "GetCommonAncestorContainer() shouldn't fail!");
- nsCOMPtr<nsIDocument> doc = mStartParent->OwnerDoc();
+ nsCOMPtr<nsIDocument> doc = mStartContainer->OwnerDoc();
NS_ASSERTION(doc, "CloneContents needs a document to continue.");
if (!doc) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
// Create a new document fragment in the context of this document,
// which might be null
@@ -2474,17 +2479,17 @@ nsRange::CloneContents(ErrorResult& aRv)
// parent hierarchy, adds a cloned version of the subtree, to it, then
// correctly places this new subtree into the doc fragment.
while (!iter.IsDone())
{
nsCOMPtr<nsINode> node = iter.GetCurrentNode();
bool deepClone = !node->IsElement() ||
(!(node == mEndParent && mEndOffset == 0) &&
- !(node == mStartParent &&
+ !(node == mStartContainer &&
mStartOffset ==
int32_t(node->AsElement()->GetChildCount())));
// Clone the current subtree!
nsCOMPtr<nsINode> clone = node->CloneNode(deepClone, aRv);
if (aRv.Failed()) {
return nullptr;
@@ -2515,18 +2520,17 @@ nsRange::CloneContents(ErrorResult& aRv)
{
aRv = charData->DeleteData(mEndOffset, dataLength - mEndOffset);
if (aRv.Failed()) {
return nullptr;
}
}
}
- if (node == mStartParent)
- {
+ if (node == mStartContainer) {
// We don't need any data before mStartOffset, so just
// delete it!
if (mStartOffset > 0)
{
aRv = charData->DeleteData(0, mStartOffset);
if (aRv.Failed()) {
return nullptr;
@@ -2630,17 +2634,18 @@ nsRange::CloneContents(ErrorResult& aRv)
already_AddRefed<nsRange>
nsRange::CloneRange() const
{
RefPtr<nsRange> range = new nsRange(mOwner);
range->SetMaySpanAnonymousSubtrees(mMaySpanAnonymousSubtrees);
- range->DoSetRange(mStartParent, mStartOffset, mEndParent, mEndOffset, mRoot);
+ range->DoSetRange(mStartContainer, mStartOffset,
+ mEndParent, mEndOffset, mRoot);
return range.forget();
}
NS_IMETHODIMP
nsRange::CloneRange(nsIDOMRange** aReturn)
{
*aReturn = CloneRange().take();
@@ -2784,30 +2789,30 @@ nsRange::SurroundContents(nsINode& aNewP
}
if (!mRoot) {
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return;
}
// INVALID_STATE_ERROR: Raised if the Range partially selects a non-text
// node.
- if (mStartParent != mEndParent) {
- bool startIsText = mStartParent->IsNodeOfType(nsINode::eTEXT);
+ if (mStartContainer != mEndParent) {
+ bool startIsText = mStartContainer->IsNodeOfType(nsINode::eTEXT);
bool endIsText = mEndParent->IsNodeOfType(nsINode::eTEXT);
- nsINode* startGrandParent = mStartParent->GetParentNode();
+ nsINode* startGrandParent = mStartContainer->GetParentNode();
nsINode* endGrandParent = mEndParent->GetParentNode();
if (!((startIsText && endIsText &&
startGrandParent &&
startGrandParent == endGrandParent) ||
(startIsText &&
startGrandParent &&
startGrandParent == mEndParent) ||
(endIsText &&
endGrandParent &&
- endGrandParent == mStartParent))) {
+ endGrandParent == mStartContainer))) {
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return;
}
}
// INVALID_NODE_TYPE_ERROR if aNewParent is something that can't be inserted
// (Document, DocumentType, DocumentFragment)
uint16_t nodeType = aNewParent.NodeType();
@@ -2885,38 +2890,37 @@ nsRange::ToString(nsAString& aReturn)
return NS_OK;
}
#ifdef DEBUG_range
printf("Range dump: -----------------------\n");
#endif /* DEBUG */
// effeciency hack for simple case
- if (mStartParent == mEndParent)
- {
- nsCOMPtr<nsIDOMText> textNode( do_QueryInterface(mStartParent) );
+ if (mStartContainer == mEndParent) {
+ nsCOMPtr<nsIDOMText> textNode = do_QueryInterface(mStartContainer);
if (textNode)
{
#ifdef DEBUG_range
// If debug, dump it:
- nsCOMPtr<nsIContent> cN (do_QueryInterface(mStartParent));
+ nsCOMPtr<nsIContent> cN = do_QueryInterface(mStartContainer);
if (cN) cN->List(stdout);
printf("End Range dump: -----------------------\n");
#endif /* DEBUG */
// grab the text
if (NS_FAILED(textNode->SubstringData(mStartOffset,mEndOffset-mStartOffset,aReturn)))
return NS_ERROR_UNEXPECTED;
return NS_OK;
}
}
- /* complex case: mStartParent != mEndParent, or mStartParent not a text node
- revisit - there are potential optimizations here and also tradeoffs.
+ /* complex case: mStartContainer != mEndParent, or mStartParent not a text
+ node revisit - there are potential optimizations here and also tradeoffs.
*/
nsCOMPtr<nsIContentIterator> iter = NS_NewContentIterator();
nsresult rv = iter->Init(this);
NS_ENSURE_SUCCESS(rv, rv);
nsString tempString;
@@ -2928,18 +2932,17 @@ nsRange::ToString(nsAString& aReturn)
#ifdef DEBUG_range
// If debug, dump it:
n->List(stdout);
#endif /* DEBUG */
nsCOMPtr<nsIDOMText> textNode(do_QueryInterface(n));
if (textNode) // if it's a text node, get the text
{
- if (n == mStartParent) // only include text past start offset
- {
+ if (n == mStartContainer) { // only include text past start offset
uint32_t strLength;
textNode->GetLength(&strLength);
textNode->SubstringData(mStartOffset,strLength-mStartOffset,tempString);
aReturn += tempString;
}
else if (n == mEndParent) // only include text before end offset
{
textNode->SubstringData(0,mEndOffset,tempString);
@@ -2969,31 +2972,31 @@ nsRange::Detach()
return NS_OK;
}
NS_IMETHODIMP
nsRange::CreateContextualFragment(const nsAString& aFragment,
nsIDOMDocumentFragment** aReturn)
{
if (mIsPositioned) {
- return nsContentUtils::CreateContextualFragment(mStartParent, aFragment,
+ return nsContentUtils::CreateContextualFragment(mStartContainer, aFragment,
false, aReturn);
}
return NS_ERROR_FAILURE;
}
already_AddRefed<DocumentFragment>
nsRange::CreateContextualFragment(const nsAString& aFragment, ErrorResult& aRv)
{
if (!mIsPositioned) {
aRv.Throw(NS_ERROR_FAILURE);
return nullptr;
}
- return nsContentUtils::CreateContextualFragment(mStartParent, aFragment,
+ return nsContentUtils::CreateContextualFragment(mStartContainer, aFragment,
false, aRv);
}
static void ExtractRectFromOffset(nsIFrame* aFrame,
const int32_t aOffset, nsRect* aR, bool aKeepLeft,
bool aClampToEdge)
{
nsPoint point;
@@ -3178,22 +3181,22 @@ nsRange::GetBoundingClientRect(nsIDOMCli
*aResult = GetBoundingClientRect(true).take();
return NS_OK;
}
already_AddRefed<DOMRect>
nsRange::GetBoundingClientRect(bool aClampToEdge, bool aFlushLayout)
{
RefPtr<DOMRect> rect = new DOMRect(ToSupports(this));
- if (!mStartParent) {
+ if (!mStartContainer) {
return rect.forget();
}
nsLayoutUtils::RectAccumulator accumulator;
- CollectClientRectsAndText(&accumulator, nullptr, this, mStartParent,
+ CollectClientRectsAndText(&accumulator, nullptr, this, mStartContainer,
mStartOffset, mEndParent, mEndOffset, aClampToEdge, aFlushLayout);
nsRect r = accumulator.mResultRect.IsEmpty() ? accumulator.mFirstRect :
accumulator.mResultRect;
rect->SetLayoutRect(r);
return rect.forget();
}
@@ -3202,64 +3205,64 @@ nsRange::GetClientRects(nsIDOMClientRect
{
*aResult = GetClientRects(true).take();
return NS_OK;
}
already_AddRefed<DOMRectList>
nsRange::GetClientRects(bool aClampToEdge, bool aFlushLayout)
{
- if (!mStartParent) {
+ if (!mStartContainer) {
return nullptr;
}
RefPtr<DOMRectList> rectList =
new DOMRectList(static_cast<nsIDOMRange*>(this));
nsLayoutUtils::RectListBuilder builder(rectList);
- CollectClientRectsAndText(&builder, nullptr, this, mStartParent,
+ CollectClientRectsAndText(&builder, nullptr, this, mStartContainer,
mStartOffset, mEndParent, mEndOffset, aClampToEdge, aFlushLayout);
return rectList.forget();
}
void
nsRange::GetClientRectsAndTexts(
mozilla::dom::ClientRectsAndTexts& aResult,
ErrorResult& aErr)
{
- if (!mStartParent) {
+ if (!mStartContainer) {
return;
}
aResult.mRectList = new DOMRectList(static_cast<nsIDOMRange*>(this));
nsLayoutUtils::RectListBuilder builder(aResult.mRectList);
CollectClientRectsAndText(&builder, &aResult.mTextList, this,
- mStartParent, mStartOffset, mEndParent, mEndOffset, true, true);
+ mStartContainer, mStartOffset, mEndParent, mEndOffset, true, true);
}
NS_IMETHODIMP
nsRange::GetUsedFontFaces(nsIDOMFontFaceList** aResult)
{
*aResult = nullptr;
- NS_ENSURE_TRUE(mStartParent, NS_ERROR_UNEXPECTED);
-
- nsCOMPtr<nsINode> startContainer = do_QueryInterface(mStartParent);
+ NS_ENSURE_TRUE(mStartContainer, NS_ERROR_UNEXPECTED);
+
+ nsCOMPtr<nsINode> startContainer = do_QueryInterface(mStartContainer);
nsCOMPtr<nsINode> endContainer = do_QueryInterface(mEndParent);
// Flush out layout so our frames are up to date.
- nsIDocument* doc = mStartParent->OwnerDoc();
+ nsIDocument* doc = mStartContainer->OwnerDoc();
NS_ENSURE_TRUE(doc, NS_ERROR_UNEXPECTED);
doc->FlushPendingNotifications(FlushType::Frames);
// Recheck whether we're still in the document
- NS_ENSURE_TRUE(mStartParent->IsInUncomposedDoc(), NS_ERROR_UNEXPECTED);
+ NS_ENSURE_TRUE(mStartContainer->IsInUncomposedDoc(), NS_ERROR_UNEXPECTED);
RefPtr<nsFontFaceList> fontFaceList = new nsFontFaceList();
RangeSubtreeIterator iter;
nsresult rv = iter.Init(this);
NS_ENSURE_SUCCESS(rv, rv);
while (!iter.IsDone()) {
@@ -3298,17 +3301,17 @@ nsRange::GetUsedFontFaces(nsIDOMFontFace
return NS_OK;
}
nsINode*
nsRange::GetRegisteredCommonAncestor()
{
NS_ASSERTION(IsInSelection(),
"GetRegisteredCommonAncestor only valid for range in selection");
- nsINode* ancestor = GetNextRangeCommonAncestor(mStartParent);
+ nsINode* ancestor = GetNextRangeCommonAncestor(mStartContainer);
while (ancestor) {
RangeHashTable* ranges =
static_cast<RangeHashTable*>(ancestor->GetProperty(nsGkAtoms::range));
if (ranges->GetEntry(this)) {
break;
}
ancestor = GetNextRangeCommonAncestor(ancestor->GetParentNode());
}
@@ -3352,17 +3355,17 @@ static bool ExcludeIfNextToNonSelectable
aContent->HasFlag(NS_CREATE_FRAME_IF_NON_WHITESPACE);
}
void
nsRange::ExcludeNonSelectableNodes(nsTArray<RefPtr<nsRange>>* aOutRanges)
{
MOZ_ASSERT(mIsPositioned);
MOZ_ASSERT(mEndParent);
- MOZ_ASSERT(mStartParent);
+ MOZ_ASSERT(mStartContainer);
nsRange* range = this;
RefPtr<nsRange> newRange;
while (range) {
nsCOMPtr<nsIContentIterator> iter = NS_NewPreContentIterator();
nsresult rv = iter->Init(range);
if (NS_FAILED(rv)) {
return;