From dcd7223f097ce085a96558fa170d3e7d17c7297c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sat, 20 Jul 2019 15:09:07 +0000 Subject: [PATCH] Bug 1566783 - Make sure to clear mLastAnchorScrolledTo after calling PresShell::ScrollToAnchor(). r=dholbert Seems we can leave this node alive for too long if the user scrolls between domcontentloaded (where GoToAnchor is called) and onload (where ScrollToAnchor() is called). Though it seems we can leave it for too long if we don't end up calling ScrollToAnchor(), the documentation of the method claims that it's cleared unconditionally. Differential Revision: https://phabricator.services.mozilla.com/D38398 --HG-- extra : moz-landing-system : lando --- layout/base/PresShell.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/layout/base/PresShell.cpp b/layout/base/PresShell.cpp index 046e409159de..0b38c9bfe9d1 100644 --- a/layout/base/PresShell.cpp +++ b/layout/base/PresShell.cpp @@ -3184,22 +3184,20 @@ nsresult PresShell::GoToAnchor(const nsAString& aAnchorName, bool aScroll, } nsresult PresShell::ScrollToAnchor() { - if (!mLastAnchorScrolledTo) { + nsCOMPtr lastAnchor = mLastAnchorScrolledTo.forget(); + if (!lastAnchor) { return NS_OK; } - NS_ASSERTION(mDidInitialize, "should have done initial reflow by now"); + NS_ASSERTION(mDidInitialize, "should have done initial reflow by now"); nsIScrollableFrame* rootScroll = GetRootScrollFrameAsScrollable(); if (!rootScroll || mLastAnchorScrollPositionY != rootScroll->GetScrollPosition().y) { return NS_OK; } - nsCOMPtr lastAnchorScrollTo = mLastAnchorScrolledTo; - nsresult rv = ScrollContentIntoView( - lastAnchorScrollTo, ScrollAxis(kScrollToTop, WhenToScroll::Always), - ScrollAxis(), ScrollFlags::AnchorScrollFlags); - mLastAnchorScrolledTo = nullptr; - return rv; + return ScrollContentIntoView(lastAnchor, + ScrollAxis(kScrollToTop, WhenToScroll::Always), + ScrollAxis(), ScrollFlags::AnchorScrollFlags); } /*