Bug 1283828 - Ensure output arguments are set in GetFrameForFirstRangeStartOrLastRangeEnd if returned frame isn't nullptr.
MozReview-Commit-ID: 3sC3HLPrOtF
--- a/layout/base/AccessibleCaretManager.cpp
+++ b/layout/base/AccessibleCaretManager.cpp
@@ -943,16 +943,17 @@ AccessibleCaretManager::GetFrameForFirst
nsDirection aDirection, int32_t* aOutOffset, nsINode** aOutNode,
int32_t* aOutNodeOffset) const
{
if (!mPresShell) {
return nullptr;
}
MOZ_ASSERT(GetCaretMode() == CaretMode::Selection);
+ MOZ_ASSERT(aOutOffset, "aOutOffset shouldn't be nullptr!");
nsRange* range = nullptr;
RefPtr<nsINode> startNode;
RefPtr<nsINode> endNode;
int32_t nodeOffset = 0;
CaretAssociationHint hint;
RefPtr<Selection> selection = GetSelection();
@@ -972,46 +973,53 @@ AccessibleCaretManager::GetFrameForFirst
hint = CARET_ASSOCIATE_BEFORE;
}
nsCOMPtr<nsIContent> startContent = do_QueryInterface(startNode);
RefPtr<nsFrameSelection> fs = GetFrameSelection();
nsIFrame* startFrame =
fs->GetFrameForNodeOffset(startContent, nodeOffset, hint, aOutOffset);
+ if (!startFrame) {
+ ErrorResult err;
+ RefPtr<TreeWalker> walker = mPresShell->GetDocument()->CreateTreeWalker(
+ *startNode, nsIDOMNodeFilter::SHOW_ALL, nullptr, err);
+
+ if (!walker) {
+ return nullptr;
+ }
+
+ startFrame = startContent ? startContent->GetPrimaryFrame() : nullptr;
+ while (!startFrame && startNode != endNode) {
+ startNode = findInFirstRangeStart ? walker->NextNode(err)
+ : walker->PreviousNode(err);
+
+ if (!startNode) {
+ break;
+ }
+
+ startContent = startNode->AsContent();
+ startFrame = startContent ? startContent->GetPrimaryFrame() : nullptr;
+ }
+
+ // We are walking among the nodes in the content tree, so the node offset
+ // relative to startNode should be set to 0.
+ nodeOffset = 0;
+ *aOutOffset = 0;
+ }
+
if (startFrame) {
if (aOutNode) {
*aOutNode = startNode.get();
}
if (aOutNodeOffset) {
*aOutNodeOffset = nodeOffset;
}
- return startFrame;
- }
-
- ErrorResult err;
- RefPtr<TreeWalker> walker = mPresShell->GetDocument()->CreateTreeWalker(
- *startNode, nsIDOMNodeFilter::SHOW_ALL, nullptr, err);
-
- if (!walker) {
- return nullptr;
}
- startFrame = startContent ? startContent->GetPrimaryFrame() : nullptr;
- while (!startFrame && startNode != endNode) {
- startNode = findInFirstRangeStart ? walker->NextNode(err)
- : walker->PreviousNode(err);
-
- if (!startNode) {
- break;
- }
-
- startContent = startNode->AsContent();
- startFrame = startContent ? startContent->GetPrimaryFrame() : nullptr;
- }
return startFrame;
}
bool
AccessibleCaretManager::RestrictCaretDraggingOffsets(
nsIFrame::ContentOffsets& aOffsets)
{
if (!mPresShell) {