Bug 580069 - replaceState should clear the SHEntry's POST data. r+a2.0=sicking

--HG--
extra : rebase_source : 48bcebb876ff77a4c8a7157c5aa15746846dd007
This commit is contained in:
Justin Lebar 2010-08-11 16:49:43 -07:00
parent 5375d3cf44
commit f8d507aa2b
5 changed files with 81 additions and 1 deletions

View File

@ -9408,6 +9408,7 @@ nsDocShell::AddState(nsIVariant *aData, const nsAString& aTitle,
// a. cloned data as the state object,
// b. if the third argument was present, the absolute URL found in
// step 2
// Also clear the new history entry's POST data (see bug 580069).
// 5. If aReplace is false (i.e. we're doing a pushState instead of a
// replaceState), notify bfcache that we've navigated to a new page.
// 6. If the third argument is present, set the document's current address
@ -9570,8 +9571,10 @@ nsDocShell::AddState(nsIVariant *aData, const nsAString& aTitle,
newSHEntry->SetURI(newURI);
}
// Step 4: Modify new/original session history entry
// Step 4: Modify new/original session history entry and clear its POST
// data, if there is any.
newSHEntry->SetStateData(dataStr);
newSHEntry->SetPostData(nsnull);
// Step 5: If aReplace is false, indicating that we're doing a pushState
// rather than a replaceState, notify bfcache that we've added a page to

View File

@ -87,6 +87,9 @@ _TEST_FILES = \
bug529119-window.html \
test_bug540462.html \
file_bug540462.html \
test_bug580069.html \
file_bug580069_1.html \
file_bug580069_2.sjs \
$(NULL)
ifeq ($(MOZ_WIDGET_TOOLKIT),cocoa)

View File

@ -0,0 +1,8 @@
<html>
<body onload='parent.page1Load();'>
file_bug580069_1.html
<form id='form' action='file_bug580069_2.sjs' method='POST'></form>
</body>
</html>

View File

@ -0,0 +1,5 @@
function handleRequest(request, response)
{
response.setHeader("Content-Type", "text/html", false);
response.write('<html><body onload=\'parent.page2Load("' + request.method + '")\'>file_bug580069_2.sjs</body></html>');
}

View File

@ -0,0 +1,61 @@
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=580069
-->
<head>
<title>Test for Bug 580069</title>
<script type="application/javascript" src="/MochiKit/packed.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/EventUtils.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=580069">Mozilla Bug 580069</a>
<iframe id='iframe' src='file_bug580069_1.html'></iframe>
<script type="application/javascript">
SimpleTest.waitForExplicitFinish();
var iframe = document.getElementById('iframe');
var iframeCw = iframe.contentWindow;
// Called when file_bug580069_1.html loads.
function page1Load() {
// This should cause us to load file 2.
dump('page1Load\n');
iframeCw.document.getElementById('form').submit();
}
// Called when file_bug580069_2.html loads.
var page2Loads = 0;
function page2Load(method) {
dump("iframe's location is: " + iframeCw.location + ", method is " + method + "\n");
if (page2Loads == 0) {
is(method, "POST", "Method for first load should be POST.");
iframeCw.history.replaceState('', '', '?replaced');
// This refresh shouldn't pop up the "are you sure you want to refresh a page
// with POST data?" dialog. If it does, this test will hang and fail, and
// we'll see 'Refreshing iframe...' at the end of the test log.
dump('Refreshing iframe...\n');
iframeCw.location.reload();
}
else if (page2Loads == 1) {
is(method, "GET", "Method for second load should be GET.");
is(iframeCw.location.search, "?replaced", "Wrong search on iframe after refresh.");
SimpleTest.finish();
}
else {
ok(false, "page2Load should only be called twice.");
}
page2Loads++;
}
</script>
</body>
</html>