Bug 1215798 nsContentIterator::Init(nsIDOMRange*) should not skip empty start node when mPre is true r=smaug
--- a/dom/base/nsContentIterator.cpp
+++ b/dom/base/nsContentIterator.cpp
@@ -43,21 +43,31 @@ static bool
NodeIsInTraversalRange(nsINode* aNode, bool aIsPreMode,
nsINode* aStartNode, int32_t aStartOffset,
nsINode* aEndNode, int32_t aEndOffset)
{
if (!aStartNode || !aEndNode || !aNode) {
return false;
}
- // If a chardata node contains an end point of the traversal range, it is
+ // If a leaf node contains an end point of the traversal range, it is
// always in the traversal range.
- if (aNode->IsNodeOfType(nsINode::eDATA_NODE) &&
- (aNode == aStartNode || aNode == aEndNode)) {
- return true;
+ if (aNode == aStartNode || aNode == aEndNode) {
+ if (aNode->IsNodeOfType(nsINode::eDATA_NODE)) {
+ return true; // text node or something
+ }
+ if (!aNode->HasChildren()) {
+ MOZ_ASSERT(aNode != aStartNode || !aStartOffset,
+ "aStartNode doesn't have children and not a data node, "
+ "aStartOffset should be 0");
+ MOZ_ASSERT(aNode != aEndNode || !aEndOffset,
+ "aStartNode doesn't have children and not a data node, "
+ "aStartOffset should be 0");
+ return true;
+ }
}
nsINode* parent = aNode->GetParentNode();
if (!parent) {
return false;
}
int32_t indx = parent->IndexOf(aNode);
@@ -336,22 +346,24 @@ nsContentIterator::Init(nsIDOMRange* aDO
// XXXbz no children might also just mean no children. So I'm not
// sure what that comment above is talking about.
if (mPre) {
// XXX: In the future, if start offset is after the last
// character in the cdata node, should we set mFirst to
// the next sibling?
- if (!startIsData) {
+ // If the node has no child, the child may be <br> or something.
+ // So, we shouldn't skip the empty node if the start offset is 0.
+ // In other words, if the offset is 1, the node should be ignored.
+ if (!startIsData && startIndx) {
mFirst = GetNextSibling(startNode);
// Does mFirst node really intersect the range? The range could be
// 'degenerate', i.e., not collapsed but still contain no content.
-
if (mFirst && !NodeIsInTraversalRange(mFirst, mPre, startNode,
startIndx, endNode, endIndx)) {
mFirst = nullptr;
}
} else {
mFirst = startNode->AsContent();
}
} else {