From cba42d43ac4c603108559d2a127717dfed923372 Mon Sep 17 00:00:00 2001 From: Timothy Nikkel Date: Wed, 5 Apr 2017 00:18:11 -0500 Subject: [PATCH] Bug 1346109. Call NotifyApproximateFrameVisibilityUpdate after we set a display port base rect. r=botond NotifyApproximateFrameVisibilityUpdate gets the displayport so we want the base rect set before calling it. We also don't want to record the displayport if we ignored it in the actual visibility pass. --- layout/base/PresShell.cpp | 4 ++-- layout/generic/nsGfxScrollFrame.cpp | 15 ++++++++++----- layout/generic/nsGfxScrollFrame.h | 10 +++++----- layout/generic/nsIScrollableFrame.h | 4 +++- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/layout/base/PresShell.cpp b/layout/base/PresShell.cpp index 3c3c60131d1e..2a70a7462f5b 100644 --- a/layout/base/PresShell.cpp +++ b/layout/base/PresShell.cpp @@ -6003,8 +6003,6 @@ PresShell::MarkFramesInSubtreeApproximatelyVisible(nsIFrame* aFrame, nsIScrollableFrame* scrollFrame = do_QueryFrame(aFrame); if (scrollFrame) { - scrollFrame->NotifyApproximateFrameVisibilityUpdate(); - bool ignoreDisplayPort = false; if (nsLayoutUtils::IsMissingDisplayPortBaseRect(aFrame->GetContent())) { // We can properly set the base rect for root scroll frames on top level @@ -6023,6 +6021,8 @@ PresShell::MarkFramesInSubtreeApproximatelyVisible(nsIFrame* aFrame, } } + scrollFrame->NotifyApproximateFrameVisibilityUpdate(ignoreDisplayPort); + nsRect displayPort; bool usingDisplayport = !ignoreDisplayPort && nsLayoutUtils::GetDisplayPortForVisibilityTesting( diff --git a/layout/generic/nsGfxScrollFrame.cpp b/layout/generic/nsGfxScrollFrame.cpp index 6c21217a26bf..a73352411406 100644 --- a/layout/generic/nsGfxScrollFrame.cpp +++ b/layout/generic/nsGfxScrollFrame.cpp @@ -2717,12 +2717,17 @@ ScrollFrameHelper::ScheduleSyntheticMouseMove() } void -ScrollFrameHelper::NotifyApproximateFrameVisibilityUpdate() +ScrollFrameHelper::NotifyApproximateFrameVisibilityUpdate(bool aIgnoreDisplayPort) { mLastUpdateFramesPos = GetScrollPosition(); - mHadDisplayPortAtLastFrameUpdate = - nsLayoutUtils::GetDisplayPort(mOuter->GetContent(), - &mDisplayPortAtLastFrameUpdate); + if (aIgnoreDisplayPort) { + mHadDisplayPortAtLastFrameUpdate = false; + mDisplayPortAtLastFrameUpdate = nsRect(); + } else { + mHadDisplayPortAtLastFrameUpdate = + nsLayoutUtils::GetDisplayPort(mOuter->GetContent(), + &mDisplayPortAtLastFrameUpdate); + } } bool @@ -3238,7 +3243,7 @@ ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder, const nsDisplayListSet& aLists) { if (aBuilder->IsForFrameVisibility()) { - NotifyApproximateFrameVisibilityUpdate(); + NotifyApproximateFrameVisibilityUpdate(false); } mOuter->DisplayBorderBackgroundOutline(aBuilder, aLists); diff --git a/layout/generic/nsGfxScrollFrame.h b/layout/generic/nsGfxScrollFrame.h index 26f2ea4021cc..d1c24f1dc2c8 100644 --- a/layout/generic/nsGfxScrollFrame.h +++ b/layout/generic/nsGfxScrollFrame.h @@ -405,7 +405,7 @@ public: bool DecideScrollableLayer(nsDisplayListBuilder* aBuilder, nsRect* aDirtyRect, bool aAllowCreateDisplayPort); - void NotifyApproximateFrameVisibilityUpdate(); + void NotifyApproximateFrameVisibilityUpdate(bool aIgnoreDisplayPort); bool GetDisplayPortAtLastApproximateFrameVisibilityUpdate(nsRect* aDisplayPort); bool AllowDisplayPortExpiration(); @@ -943,8 +943,8 @@ public: bool aAllowCreateDisplayPort) override { return mHelper.DecideScrollableLayer(aBuilder, aDirtyRect, aAllowCreateDisplayPort); } - virtual void NotifyApproximateFrameVisibilityUpdate() override { - mHelper.NotifyApproximateFrameVisibilityUpdate(); + virtual void NotifyApproximateFrameVisibilityUpdate(bool aIgnoreDisplayPort) override { + mHelper.NotifyApproximateFrameVisibilityUpdate(aIgnoreDisplayPort); } virtual bool GetDisplayPortAtLastApproximateFrameVisibilityUpdate(nsRect* aDisplayPort) override { return mHelper.GetDisplayPortAtLastApproximateFrameVisibilityUpdate(aDisplayPort); @@ -1463,8 +1463,8 @@ public: bool aAllowCreateDisplayPort) override { return mHelper.DecideScrollableLayer(aBuilder, aDirtyRect, aAllowCreateDisplayPort); } - virtual void NotifyApproximateFrameVisibilityUpdate() override { - mHelper.NotifyApproximateFrameVisibilityUpdate(); + virtual void NotifyApproximateFrameVisibilityUpdate(bool aIgnoreDisplayPort) override { + mHelper.NotifyApproximateFrameVisibilityUpdate(aIgnoreDisplayPort); } virtual bool GetDisplayPortAtLastApproximateFrameVisibilityUpdate(nsRect* aDisplayPort) override { return mHelper.GetDisplayPortAtLastApproximateFrameVisibilityUpdate(aDisplayPort); diff --git a/layout/generic/nsIScrollableFrame.h b/layout/generic/nsIScrollableFrame.h index deb8d19733e7..6149cceacdcf 100644 --- a/layout/generic/nsIScrollableFrame.h +++ b/layout/generic/nsIScrollableFrame.h @@ -452,8 +452,10 @@ public: /** * Notification that this scroll frame is getting its frame visibility updated. + * aIgnoreDisplayPort indicates that the display port was ignored (because + * there was no suitable base rect) */ - virtual void NotifyApproximateFrameVisibilityUpdate() = 0; + virtual void NotifyApproximateFrameVisibilityUpdate(bool aIgnoreDisplayPort) = 0; /** * Returns true if this scroll frame had a display port at the last frame