--- a/editor/libeditor/HTMLEditRules.cpp
+++ b/editor/libeditor/HTMLEditRules.cpp
@@ -5312,128 +5312,123 @@ HTMLEditRules::NormalizeSelection(Select
return NS_OK;
}
// we don't need to mess with cell selections, and we assume multirange selections are those.
if (inSelection->RangeCount() != 1) {
return NS_OK;
}
+ if (NS_WARN_IF(!mHTMLEditor)) {
+ return NS_ERROR_UNEXPECTED;
+ }
+ RefPtr<HTMLEditor> htmlEditor = mHTMLEditor;
+
RefPtr<nsRange> range = inSelection->GetRangeAt(0);
NS_ENSURE_TRUE(range, NS_ERROR_NULL_POINTER);
- nsCOMPtr<nsIDOMNode> startNode, endNode;
- uint32_t startOffset, endOffset;
- nsCOMPtr<nsIDOMNode> newStartNode, newEndNode;
-
- nsresult rv = range->GetStartContainer(getter_AddRefs(startNode));
- NS_ENSURE_SUCCESS(rv, rv);
- rv = range->GetStartOffset(&startOffset);
- NS_ENSURE_SUCCESS(rv, rv);
- rv = range->GetEndContainer(getter_AddRefs(endNode));
- NS_ENSURE_SUCCESS(rv, rv);
- rv = range->GetEndOffset(&endOffset);
- NS_ENSURE_SUCCESS(rv, rv);
+
+ nsCOMPtr<nsINode> startNode = range->GetStartContainer();
+ if (NS_WARN_IF(!startNode)) {
+ return NS_ERROR_FAILURE;
+ }
+ nsCOMPtr<nsINode> endNode = range->GetEndContainer();
+ if (NS_WARN_IF(!endNode)) {
+ return NS_ERROR_FAILURE;
+ }
+ uint32_t startOffset = range->StartOffset();
+ uint32_t endOffset = range->EndOffset();
// adjusted values default to original values
- newStartNode = startNode;
+ nsCOMPtr<nsINode> newStartNode = startNode;
uint32_t newStartOffset = startOffset;
- newEndNode = endNode;
+ nsCOMPtr<nsINode> newEndNode = endNode;
uint32_t newEndOffset = endOffset;
// some locals we need for whitespace code
nsCOMPtr<nsINode> unused;
int32_t offset = -1;
WSType wsType;
// let the whitespace code do the heavy lifting
- WSRunObject wsEndObj(mHTMLEditor, endNode, static_cast<int32_t>(endOffset));
+ WSRunObject wsEndObj(htmlEditor, endNode, static_cast<int32_t>(endOffset));
// is there any intervening visible whitespace? if so we can't push selection past that,
// it would visibly change maening of users selection
- nsCOMPtr<nsINode> endNode_(do_QueryInterface(endNode));
- wsEndObj.PriorVisibleNode(endNode_, static_cast<int32_t>(endOffset),
+ wsEndObj.PriorVisibleNode(endNode, static_cast<int32_t>(endOffset),
address_of(unused), &offset, &wsType);
if (wsType != WSType::text && wsType != WSType::normalWS) {
// eThisBlock and eOtherBlock conveniently distinquish cases
// of going "down" into a block and "up" out of a block.
if (wsEndObj.mStartReason == WSType::otherBlock) {
// endpoint is just after the close of a block.
- nsCOMPtr<nsIDOMNode> child =
- GetAsDOMNode(mHTMLEditor->GetRightmostChild(wsEndObj.mStartReasonNode,
- true));
+ nsINode* child =
+ htmlEditor->GetRightmostChild(wsEndObj.mStartReasonNode, true);
if (child) {
int32_t offset = -1;
newEndNode = EditorBase::GetNodeLocation(child, &offset);
// offset *after* child
newEndOffset = static_cast<uint32_t>(offset + 1);
}
// else block is empty - we can leave selection alone here, i think.
} else if (wsEndObj.mStartReason == WSType::thisBlock) {
// endpoint is just after start of this block
- nsCOMPtr<nsIDOMNode> child;
- NS_ENSURE_STATE(mHTMLEditor);
- mHTMLEditor->GetPriorHTMLNode(endNode, static_cast<int32_t>(endOffset),
- address_of(child));
+ nsINode* child =
+ htmlEditor->GetPriorHTMLNode(endNode, static_cast<int32_t>(endOffset));
if (child) {
int32_t offset = -1;
newEndNode = EditorBase::GetNodeLocation(child, &offset);
// offset *after* child
newEndOffset = static_cast<uint32_t>(offset + 1);
}
// else block is empty - we can leave selection alone here, i think.
} else if (wsEndObj.mStartReason == WSType::br) {
// endpoint is just after break. lets adjust it to before it.
int32_t offset = -1;
newEndNode =
- EditorBase::GetNodeLocation(GetAsDOMNode(wsEndObj.mStartReasonNode),
- &offset);
+ EditorBase::GetNodeLocation(wsEndObj.mStartReasonNode, &offset);
newEndOffset = static_cast<uint32_t>(offset);;
}
}
// similar dealio for start of range
- WSRunObject wsStartObj(mHTMLEditor, startNode,
+ WSRunObject wsStartObj(htmlEditor, startNode,
static_cast<int32_t>(startOffset));
// is there any intervening visible whitespace? if so we can't push selection past that,
// it would visibly change maening of users selection
- nsCOMPtr<nsINode> startNode_(do_QueryInterface(startNode));
- wsStartObj.NextVisibleNode(startNode_, static_cast<int32_t>(startOffset),
+ wsStartObj.NextVisibleNode(startNode, static_cast<int32_t>(startOffset),
address_of(unused), &offset, &wsType);
if (wsType != WSType::text && wsType != WSType::normalWS) {
// eThisBlock and eOtherBlock conveniently distinquish cases
// of going "down" into a block and "up" out of a block.
if (wsStartObj.mEndReason == WSType::otherBlock) {
// startpoint is just before the start of a block.
- nsCOMPtr<nsIDOMNode> child =
- GetAsDOMNode(mHTMLEditor->GetLeftmostChild(wsStartObj.mEndReasonNode,
- true));
+ nsINode* child =
+ htmlEditor->GetLeftmostChild(wsStartObj.mEndReasonNode, true);
if (child) {
int32_t offset = -1;
newStartNode = EditorBase::GetNodeLocation(child, &offset);
newStartOffset = static_cast<uint32_t>(offset);
}
// else block is empty - we can leave selection alone here, i think.
} else if (wsStartObj.mEndReason == WSType::thisBlock) {
// startpoint is just before end of this block
- nsCOMPtr<nsIDOMNode> child;
- NS_ENSURE_STATE(mHTMLEditor);
- mHTMLEditor->GetNextHTMLNode(startNode, static_cast<int32_t>(startOffset),
- address_of(child));
+ nsINode* child =
+ htmlEditor->GetNextHTMLNode(startNode,
+ static_cast<int32_t>(startOffset));
if (child) {
int32_t offset = -1;
newStartNode = EditorBase::GetNodeLocation(child, &offset);
newStartOffset = static_cast<uint32_t>(offset);
}
// else block is empty - we can leave selection alone here, i think.
} else if (wsStartObj.mEndReason == WSType::br) {
// startpoint is just before a break. lets adjust it to after it.
int32_t offset = -1;
newStartNode =
- EditorBase::GetNodeLocation(GetAsDOMNode(wsStartObj.mEndReasonNode),
- &offset);
+ EditorBase::GetNodeLocation(wsStartObj.mEndReasonNode, &offset);
// offset *after* break
newStartOffset = static_cast<uint32_t>(offset + 1);
}
}
// there is a demented possiblity we have to check for. We might have a very strange selection
// that is not collapsed and yet does not contain any editable content, and satisfies some of the
// above conditions that cause tweaking. In this case we don't want to tweak the selection into