From 5945072229af7faf1a51f6267e46f848db84416d Mon Sep 17 00:00:00 2001 From: Masayuki Nakano Date: Wed, 21 Oct 2015 01:45:03 +0900 Subject: [PATCH] Bug 1215798 nsContentIterator::Init(nsIDOMRange*) should not skip empty start node when mPre is true r=smaug --- dom/base/nsContentIterator.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/dom/base/nsContentIterator.cpp b/dom/base/nsContentIterator.cpp index 1100c43e06c..4b666d0f5f6 100644 --- a/dom/base/nsContentIterator.cpp +++ b/dom/base/nsContentIterator.cpp @@ -48,11 +48,21 @@ NodeIsInTraversalRange(nsINode* aNode, bool aIsPreMode, 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(); @@ -341,12 +351,14 @@ nsContentIterator::Init(nsIDOMRange* aDOMRange) // 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
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;