diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 91a7290ae608..bef5b40daf48 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -8315,12 +8315,27 @@ nsIFrame::GetFrameFromDirection(nsDirection aDirection, bool aVisual, if (NS_FAILED(result)) return result; - if (aDirection == eDirNext) - frameTraversal->Next(); - else - frameTraversal->Prev(); + auto Advance = [&frameTraversal, aDirection] () { + if (aDirection == eDirNext) { + frameTraversal->Next(); + } else { + frameTraversal->Prev(); + } + return frameTraversal->CurrentItem(); + }; - traversedFrame = frameTraversal->CurrentItem(); + traversedFrame = Advance(); + + if (nsIContent* content = GetContent()) { + // Advance until the frame is inside the same tree as 'this'. + for (nsIContent* traversedContent; + traversedFrame && + !traversedFrame->IsGeneratedContentFrame() && + (traversedContent = traversedFrame->GetContent()) && + !nsContentUtils::IsInSameAnonymousTree(content, traversedContent);) { + traversedFrame = Advance(); + } + } // Skip anonymous elements, but watch out for generated content if (!traversedFrame || @@ -9177,23 +9192,31 @@ nsFrame::DoGetParentStyleContext(nsIFrame** aProviderFrame) const void nsFrame::GetLastLeaf(nsPresContext* aPresContext, nsIFrame **aFrame) { - if (!aFrame || !*aFrame) + if (!aFrame || !*aFrame) { return; - nsIFrame *child = *aFrame; - //if we are a block frame then go for the last line of 'this' - while (1){ + } + + nsIFrame* child = *aFrame; + while (true) { child = child->PrincipalChildList().FirstChild(); - if (!child) - return;//nothing to do - nsIFrame* siblingFrame; - nsIContent* content; - //ignore anonymous elements, e.g. mozTableAdd* mozTableRemove* - //see bug 278197 comment #12 #13 for details - while ((siblingFrame = child->GetNextSibling()) && - (content = siblingFrame->GetContent()) && - !content->IsRootOfNativeAnonymousSubtree()) - child = siblingFrame; - *aFrame = child; + if (!child) { + return; // done + } + + // Ignore anonymous elements, e.g. mozTableAdd* mozTableRemove* + // see bug 278197 comment #12 #13 for details. + nsIFrame* nonAnonymousChild = nullptr; + const nsIContent* content; + while (child && + (content = child->GetContent()) && + !content->IsRootOfNativeAnonymousSubtree()) { + nonAnonymousChild = child; + child = child->GetNextSibling(); + } + if (!nonAnonymousChild) { + return; + } + *aFrame = child = nonAnonymousChild; } }