This is an automated email from the git hooks/post-receive script.
pierov pushed a commit to branch geckoview-99.0.1-11.0-1 in repository tor-browser.
commit 6a5b2cdb63a652357cbf149ac1a74b1039be1bc7 Author: Olli Pettay Olli.Pettay@helsinki.fi AuthorDate: Fri Feb 4 11:37:14 2022 +0000
Bug 1750973, don't replace the nsILayoutHistoryState object when doing same document history navigations, r=peterv a=RyanVM
Differential Revision: https://phabricator.services.mozilla.com/D137703 --- docshell/base/nsDocShell.cpp | 13 ++++++++ docshell/test/navigation/file_bug1750973.html | 45 +++++++++++++++++++++++++++ docshell/test/navigation/mochitest.ini | 2 ++ docshell/test/navigation/test_bug1750973.html | 20 ++++++++++++ 4 files changed, 80 insertions(+)
diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index 80ca4c5d94658..5f8c40c837bcb 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -8879,7 +8879,20 @@ nsresult nsDocShell::HandleSameDocumentNavigation( "%s", this, mLoadingEntry->mInfo.GetURI()->GetSpecOrDefault().get())); bool hadActiveEntry = !!mActiveEntry; + + nsCOMPtr<nsILayoutHistoryState> currentLayoutHistoryState; + if (mActiveEntry) { + currentLayoutHistoryState = mActiveEntry->GetLayoutHistoryState(); + } mActiveEntry = MakeUnique<SessionHistoryInfo>(mLoadingEntry->mInfo); + if (currentLayoutHistoryState) { + // Restore the existing nsILayoutHistoryState object, since it is + // possibly being used by the layout. When doing a new load, the + // shared state is copied from the existing active entry, so this + // special case is needed only with the history loads. + mActiveEntry->SetLayoutHistoryState(currentLayoutHistoryState); + } + // We're passing in mCurrentURI, which could be null. SessionHistoryCommit // does require a non-null uri if this is for a refresh load of the same // URI, but in that case mCurrentURI won't be null here. diff --git a/docshell/test/navigation/file_bug1750973.html b/docshell/test/navigation/file_bug1750973.html new file mode 100644 index 0000000000000..28b2f995aed12 --- /dev/null +++ b/docshell/test/navigation/file_bug1750973.html @@ -0,0 +1,45 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset="utf-8"> + <script> + function test() { + history.scrollRestoration = "manual"; + document.getElementById("initialfocus").focus(); + history.pushState('data', '', ''); + history.back(); + } + + window.onpopstate = function() { + window.onscroll = function() { + window.onscroll = null; + document.documentElement.style.display = "none"; + // focus() triggers recreation of the nsIFrames without a reflow. + document.getElementById("focustarget").focus(); + document.documentElement.style.display = ""; + // Flush the layout. + document.documentElement.getBoundingClientRect(); + opener.isnot(window.scrollY, 0, "The page should have been scrolled down(1)"); + requestAnimationFrame( + function() { + // Extra timeout to ensure we're called after rAF has triggered a + // reflow. + setTimeout(function() { + opener.isnot(window.scrollY, 0, "The page should have been scrolled down(2)"); + window.close(); + opener.SimpleTest.finish(); + }); + }); + } + window.scrollTo(0, 1000); + } + </script> +</head> +<body onload="setTimeout(test)"> +<div style="position: fixed;"> + <input type="button" value="" id="initialfocus"> + <input type="button" value="" id="focustarget"> +</div> +<div style="border: 1px solid black; width: 100px; height: 9000px;"></div> +</body> +</html> diff --git a/docshell/test/navigation/mochitest.ini b/docshell/test/navigation/mochitest.ini index ee7ea5bf5ea52..adf8285cb0d0d 100644 --- a/docshell/test/navigation/mochitest.ini +++ b/docshell/test/navigation/mochitest.ini @@ -98,6 +98,8 @@ support-files = file_bug1583110.html [test_bug1706090.html] support-files = file_bug1706090.html skip-if = fission # The test is currently for the old bfcache implementation +[test_bug1750973.html] +support-files = file_bug1750973.html [test_bug270414.html] [test_bug278916.html] [test_bug279495.html] diff --git a/docshell/test/navigation/test_bug1750973.html b/docshell/test/navigation/test_bug1750973.html new file mode 100644 index 0000000000000..9f87075b90601 --- /dev/null +++ b/docshell/test/navigation/test_bug1750973.html @@ -0,0 +1,20 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset="utf-8"> + <title>The layout state restoration when reframing the root element</title> + <script src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" href="/tests/SimpleTest/test.css"/> + <script> + SimpleTest.waitForExplicitFinish(); + function test() { + window.open("file_bug1750973.html"); + } + </script> +</head> +<body onload="setTimeout(test)"> +<p id="display"></p> +<div id="content" style="display: none"></div> +<pre id="test"></pre> +</body> +</html>