mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Fix longstanding issue where anchor scrolls on a POST result page could lead to a silent re-POST during history traversal. Bug 413310, r+sr=biesi, a=dsicore,beltzner,righteousness.
This commit is contained in:
parent
7988be93ce
commit
52c572e4be
@ -6880,6 +6880,7 @@ nsDocShell::InternalLoad(nsIURI * aURI,
|
||||
OnNewURI(aURI, nsnull, mLoadType, PR_TRUE);
|
||||
nsCOMPtr<nsIInputStream> postData;
|
||||
PRUint32 pageIdent = PR_UINT32_MAX;
|
||||
nsCOMPtr<nsISupports> cacheKey;
|
||||
|
||||
if (mOSHE) {
|
||||
/* save current position of scroller(s) (bug 59774) */
|
||||
@ -6893,6 +6894,7 @@ nsDocShell::InternalLoad(nsIURI * aURI,
|
||||
if (aLoadType & LOAD_CMD_NORMAL) {
|
||||
mOSHE->GetPostData(getter_AddRefs(postData));
|
||||
mOSHE->GetPageIdentifier(&pageIdent);
|
||||
mOSHE->GetCacheKey(getter_AddRefs(cacheKey));
|
||||
}
|
||||
}
|
||||
|
||||
@ -6907,6 +6909,11 @@ nsDocShell::InternalLoad(nsIURI * aURI,
|
||||
// page will restore the appropriate postData.
|
||||
if (postData)
|
||||
mOSHE->SetPostData(postData);
|
||||
|
||||
// Make sure we won't just repost without hitting the
|
||||
// cache first
|
||||
if (cacheKey)
|
||||
mOSHE->SetCacheKey(cacheKey);
|
||||
|
||||
// Propagate our page ident to the new mOSHE so that
|
||||
// we'll know it just differed by a scroll on the page.
|
||||
|
@ -63,6 +63,9 @@ _TEST_FILES = \
|
||||
test_bug387979.html \
|
||||
test_bug404548.html \
|
||||
bug404548-subframe.html \
|
||||
test_bug413310.html \
|
||||
bug413310-subframe.html \
|
||||
bug413310-post.sjs \
|
||||
$(NULL)
|
||||
|
||||
libs:: $(_TEST_FILES)
|
||||
|
7
docshell/test/bug413310-post.sjs
Normal file
7
docshell/test/bug413310-post.sjs
Normal file
@ -0,0 +1,7 @@
|
||||
function handleRequest(request, response) {
|
||||
response.setHeader("Content-Type", "text/html");
|
||||
response.write("<body onload='window.parent.onloadCount++'>" +
|
||||
request.method + " " +
|
||||
Date.now() +
|
||||
"</body>");
|
||||
}
|
7
docshell/test/bug413310-subframe.html
Normal file
7
docshell/test/bug413310-subframe.html
Normal file
@ -0,0 +1,7 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<body onload="window.parent.onloadCount++">
|
||||
<form action="bug413310-post.sjs" method="POST">
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
98
docshell/test/test_bug413310.html
Normal file
98
docshell/test/test_bug413310.html
Normal file
@ -0,0 +1,98 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<!--
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=413310
|
||||
-->
|
||||
<head>
|
||||
<title>Test for Bug 413310</title>
|
||||
<script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
|
||||
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
||||
</head>
|
||||
<body>
|
||||
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=413310">Mozilla Bug 413310</a>
|
||||
<p id="display">
|
||||
<iframe id="i" src="bug413310-subframe.html" onload="setTimeout(doNextStep, 20)">
|
||||
</iframe>
|
||||
</p>
|
||||
<div id="content" style="display: none">
|
||||
|
||||
</div>
|
||||
<pre id="test">
|
||||
<script class="testbody" type="text/javascript">
|
||||
|
||||
/** Test for Bug 413310 **/
|
||||
|
||||
// NOTE: If we ever make subframes do bfcache stuff, this test will need to be
|
||||
// modified accordingly! It assumes that subframes do not get bfcached.
|
||||
var onloadCount = 0;
|
||||
|
||||
var step = -1; // One increment will come from the initial subframe onload.
|
||||
|
||||
var textContent;
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
addLoadEvent(doNextStep);
|
||||
|
||||
function doNextStep() {
|
||||
++step;
|
||||
switch (step) {
|
||||
case 1:
|
||||
is(onloadCount, 1, "Loaded initial page");
|
||||
is($("i").contentWindow.location.href,
|
||||
location.href.replace(/test_bug413310.html/,
|
||||
"bug413310-subframe.html"),
|
||||
"Unexpected subframe location after initial load");
|
||||
$("i").contentDocument.forms[0].submit();
|
||||
break;
|
||||
case 2:
|
||||
is(onloadCount, 2, "Loaded POST result");
|
||||
|
||||
is($("i").contentWindow.location.href,
|
||||
location.href.replace(/test_bug413310.html/,
|
||||
"bug413310-post.sjs"),
|
||||
"Unexpected subframe location after POST load");
|
||||
|
||||
textContent = $("i").contentDocument.body.textContent;
|
||||
isDeeply(textContent.match(/^POST /), ["POST "], "Not a POST?");
|
||||
|
||||
$("i").contentWindow.location.hash = "foo";
|
||||
setTimeout(doNextStep, 0);
|
||||
break;
|
||||
case 3:
|
||||
is(onloadCount, 2, "Anchor scroll should not fire onload");
|
||||
is($("i").contentWindow.location.href,
|
||||
location.href.replace(/test_bug413310.html/,
|
||||
"bug413310-post.sjs#foo"),
|
||||
"Unexpected subframe location after anchor scroll");
|
||||
is(textContent, $("i").contentDocument.body.textContent,
|
||||
"Did a load when scrolling?");
|
||||
$("i").contentWindow.location.href = "bug413310-subframe.html";;
|
||||
break;
|
||||
case 4:
|
||||
is(onloadCount, 3, "Done new load");
|
||||
is($("i").contentWindow.location.href,
|
||||
location.href.replace(/test_bug413310.html/,
|
||||
"bug413310-subframe.html"),
|
||||
"Unexpected subframe location after new load");
|
||||
history.back();
|
||||
break;
|
||||
case 5:
|
||||
is(onloadCount, 4,
|
||||
"History traversal didn't fire onload: bfcache issues!");
|
||||
is($("i").contentWindow.location.href,
|
||||
location.href.replace(/test_bug413310.html/,
|
||||
"bug413310-post.sjs#foo"),
|
||||
"Unexpected subframe location");
|
||||
is(textContent, $("i").contentDocument.body.textContent,
|
||||
"Did a load when going back?");
|
||||
SimpleTest.finish();
|
||||
break;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
|
Loading…
Reference in New Issue
Block a user