diff options
author | Matt A. Tobin <email@mattatobin.com> | 2020-04-17 06:03:18 -0400 |
---|---|---|
committer | Matt A. Tobin <email@mattatobin.com> | 2020-04-17 06:03:18 -0400 |
commit | 2bcd8923f776e1c7bc716bd42c7e7912c4fe8709 (patch) | |
tree | a34044005727184886ddd210962ec70aa285a9da /layout/base | |
parent | 4d1d777e706322cb9aca8ed2d5a6e50b805d3bd1 (diff) | |
download | uxp-2bcd8923f776e1c7bc716bd42c7e7912c4fe8709.tar.gz |
Bug 1368802 - nsFrameIterator::GetPlaceholderFrame should only try to get the placeholder for out-of-flow frames, because in-flow frames never have a placeholder
Tag #1375
Diffstat (limited to 'layout/base')
-rw-r--r-- | layout/base/nsFrameTraversal.cpp | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/layout/base/nsFrameTraversal.cpp b/layout/base/nsFrameTraversal.cpp index 40fb5ff30c..9ea6349f44 100644 --- a/layout/base/nsFrameTraversal.cpp +++ b/layout/base/nsFrameTraversal.cpp @@ -82,6 +82,10 @@ protected: virtual nsIFrame* GetNextSiblingInner(nsIFrame* aFrame); virtual nsIFrame* GetPrevSiblingInner(nsIFrame* aFrame); + /** + * Return the placeholder frame for aFrame if it has one, otherwise return + * aFrame itself. + */ nsIFrame* GetPlaceholderFrame(nsIFrame* aFrame); bool IsPopupFrame(nsIFrame* aFrame); @@ -486,18 +490,12 @@ nsFrameIterator::GetPrevSiblingInner(nsIFrame* aFrame) { nsIFrame* nsFrameIterator::GetPlaceholderFrame(nsIFrame* aFrame) { - nsIFrame* result = aFrame; - nsIPresShell *presShell = mPresContext->GetPresShell(); - if (presShell) { - nsIFrame* placeholder = presShell->GetPlaceholderFrameFor(aFrame); - if (placeholder) - result = placeholder; + if (MOZ_LIKELY(!aFrame || !aFrame->HasAnyStateBits(NS_FRAME_OUT_OF_FLOW))) { + return aFrame; } - - if (result != aFrame) - result = GetPlaceholderFrame(result); - - return result; + nsIFrame* placeholder = + aFrame->PresContext()->PresShell()->GetPlaceholderFrameFor(aFrame); + return placeholder ? placeholder : aFrame; } bool |