Skip to content
Permalink
Browse files
2010-07-30 Mihai Parparita <mihaip@chromium.org>
        Reviewed by Darin Fisher.

        Session history should skip over JS redirects
        https://bugs.webkit.org/show_bug.cgi?id=42861

        Lock the back/forward list for location changes that happen before the
        onload event fires that are not the result of user gestures.

        http/tests/history tests now pass, their expectatiosn were updated
        accordingly. Other tests needed a setTimeout wrapper around location
        changes during onload, otherwise they would not generate history
        entries as expected anymore.

        * fast/css/target-fragment-match.html:
        * fast/dom/Window/timer-resume-on-navigation-back.html:
        * fast/dom/location-hash.html:
        * fast/events/pageshow-pagehide-on-back-cached-with-frames-expected.txt:
        * fast/events/pageshow-pagehide-on-back-cached-with-frames.html:
        * fast/frames/resources/cached-page-1.html:
        * fast/frames/resources/cached-page-2.html:
        * fast/harness/resources/cached-page-1.html:
        * fast/harness/resources/cached-page-with-data-urls.html:
        * fast/history/gesture-before-onload-expected.txt: Added.
        * fast/history/gesture-before-onload.html: Added.
        * fast/history/history-length.html:
        * fast/history/resources/gesture-before-onload-target.html: Added.
        * fast/history/saves-state-after-fragment-nav.html:
        * fast/loader/input-element-page-cache-crash.html:
        * fast/loader/stateobjects/document-destroyed-navigate-back.html:
        * fast/loader/stateobjects/pushstate-clears-forward-history.html:
        * fast/loader/subframe-navigate-during-main-frame-load.html:
        * http/tests/history/redirect-js-document-location-before-load-expected.txt:
        * http/tests/history/redirect-js-location-assign-before-load-expected.txt:
        * http/tests/history/redirect-js-location-before-load-expected.txt:
        * http/tests/history/redirect-js-location-href-before-load-expected.txt:
        * http/tests/navigation/resources/document-location.js:
        (start):
        * security/autocomplete-cleared-on-back.html:
        * storage/hash-change-with-xhr.js:
        (updateDatabase):
        (invokeBack):
        (runTest):
        (runTestsInner):
2010-07-30  Mihai Parparita  <mihaip@chromium.org>

        Reviewed by Darin Fisher.

        Session history should skip over JS redirects
        https://bugs.webkit.org/show_bug.cgi?id=42861

        Lock the back/forward list for location changes that happen before the
        onload event fires that are not the result of user gestures.

        Test: fast/history/gesture-before-onload.html and updated expectations
        for http/tests/history tests that used to fail.

        * loader/RedirectScheduler.cpp:
        (WebCore::RedirectScheduler::scheduleRedirect):
        (WebCore::RedirectScheduler::mustLockBackForwardList):
        (WebCore::RedirectScheduler::scheduleLocationChange):
        (WebCore::RedirectScheduler::scheduleFormSubmission):
        * loader/RedirectScheduler.h:

Canonical link: https://commits.webkit.org/55230@main
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@64408 268f45cc-cd09-0410-ab3c-d52691b4dbfc
  • Loading branch information
webkit-commit-queue committed Jul 31, 2010
1 parent 9906b6a commit 1fc1d92ba7022a707cc40cfd98691b9a0be6cf9a
Showing with 279 additions and 92 deletions.
  1. +46 −0 LayoutTests/ChangeLog
  2. +6 −0 LayoutTests/fast/css/target-fragment-match.html
  3. +6 −3 LayoutTests/fast/dom/Window/timer-resume-on-navigation-back.html
  4. +3 −2 LayoutTests/fast/dom/location-hash.html
  5. +14 −14 LayoutTests/fast/events/pageshow-pagehide-on-back-cached-with-frames-expected.txt
  6. +6 −3 LayoutTests/fast/events/pageshow-pagehide-on-back-cached-with-frames.html
  7. +2 −1 LayoutTests/fast/frames/resources/cached-page-1.html
  8. +2 −1 LayoutTests/fast/frames/resources/cached-page-2.html
  9. +2 −1 LayoutTests/fast/harness/resources/cached-page-1.html
  10. +2 −1 LayoutTests/fast/harness/resources/cached-page-with-data-urls.html
  11. +9 −0 LayoutTests/fast/history/gesture-before-onload-expected.txt
  12. +32 −0 LayoutTests/fast/history/gesture-before-onload.html
  13. +28 −24 LayoutTests/fast/history/history-length.html
  14. +41 −0 LayoutTests/fast/history/resources/gesture-before-onload-target.html
  15. +5 −2 LayoutTests/fast/history/saves-state-after-fragment-nav.html
  16. +3 −2 LayoutTests/fast/loader/input-element-page-cache-crash.html
  17. +4 −3 LayoutTests/fast/loader/stateobjects/document-destroyed-navigate-back.html
  18. +20 −16 LayoutTests/fast/loader/stateobjects/pushstate-clears-forward-history.html
  19. +3 −2 LayoutTests/fast/loader/subframe-navigate-during-main-frame-load.html
  20. +1 −2 LayoutTests/http/tests/history/redirect-js-document-location-before-load-expected.txt
  21. +1 −2 LayoutTests/http/tests/history/redirect-js-location-assign-before-load-expected.txt
  22. +1 −2 LayoutTests/http/tests/history/redirect-js-location-before-load-expected.txt
  23. +1 −2 LayoutTests/http/tests/history/redirect-js-location-href-before-load-expected.txt
  24. +2 −1 LayoutTests/http/tests/navigation/resources/document-location.js
  25. +2 −1 LayoutTests/security/autocomplete-cleared-on-back.html
  26. +6 −0 LayoutTests/storage/hash-change-with-xhr.js
  27. +20 −0 WebCore/ChangeLog
  28. +9 −5 WebCore/loader/RedirectScheduler.cpp
  29. +2 −2 WebCore/loader/RedirectScheduler.h
@@ -1,3 +1,49 @@
2010-07-30 Mihai Parparita <mihaip@chromium.org>

Reviewed by Darin Fisher.

Session history should skip over JS redirects
https://bugs.webkit.org/show_bug.cgi?id=42861

Lock the back/forward list for location changes that happen before the
onload event fires that are not the result of user gestures.

http/tests/history tests now pass, their expectatiosn were updated
accordingly. Other tests needed a setTimeout wrapper around location
changes during onload, otherwise they would not generate history
entries as expected anymore.

* fast/css/target-fragment-match.html:
* fast/dom/Window/timer-resume-on-navigation-back.html:
* fast/dom/location-hash.html:
* fast/events/pageshow-pagehide-on-back-cached-with-frames-expected.txt:
* fast/events/pageshow-pagehide-on-back-cached-with-frames.html:
* fast/frames/resources/cached-page-1.html:
* fast/frames/resources/cached-page-2.html:
* fast/harness/resources/cached-page-1.html:
* fast/harness/resources/cached-page-with-data-urls.html:
* fast/history/gesture-before-onload-expected.txt: Added.
* fast/history/gesture-before-onload.html: Added.
* fast/history/history-length.html:
* fast/history/resources/gesture-before-onload-target.html: Added.
* fast/history/saves-state-after-fragment-nav.html:
* fast/loader/input-element-page-cache-crash.html:
* fast/loader/stateobjects/document-destroyed-navigate-back.html:
* fast/loader/stateobjects/pushstate-clears-forward-history.html:
* fast/loader/subframe-navigate-during-main-frame-load.html:
* http/tests/history/redirect-js-document-location-before-load-expected.txt:
* http/tests/history/redirect-js-location-assign-before-load-expected.txt:
* http/tests/history/redirect-js-location-before-load-expected.txt:
* http/tests/history/redirect-js-location-href-before-load-expected.txt:
* http/tests/navigation/resources/document-location.js:
(start):
* security/autocomplete-cleared-on-back.html:
* storage/hash-change-with-xhr.js:
(updateDatabase):
(invokeBack):
(runTest):
(runTestsInner):

2010-07-30 Matthew Delaney <mdelaney@apple.com>

Reviewed by Darin Adler.
@@ -11,6 +11,12 @@
{
if (window.layoutTestController)
layoutTestController.waitUntilDone();

// Location changes need to happen outside the onload handler to generate history entries.
setTimeout(runTest, 0);
}

function runTest() {
window.location.hash ='#target-01';
document.body.offsetTop;
window.history.back(); // This queues up a navigation, so we need to delay the call to notifyDone.
@@ -18,9 +18,12 @@
layoutTestController.waitUntilDone();
layoutTestController.overridePreference("WebKitUsesPageCachePreferenceKey", 1);
}
window.setTimeout("verify()", timeoutValue);
timestamp = new Date().getTime();
window.location.href = "data:text/html,<body onload='history.back()'></body>";
// Location changes need to happen outside the onload handler to generate history entries.
setTimeout(function() {
window.setTimeout(verify, timeoutValue);
timestamp = new Date().getTime();
window.location.href = "data:text/html,<body onload='history.back()'></body>";
}, 0);
}

</script>
@@ -87,8 +87,9 @@
numErrors = 0;
originalLocation = window.location.href;
originalHistoryLength = window.history.length;

step();

// Location changes need to happen outside the onload handler to generate history entries.
setTimeout(step, 0);
}
</script>
</head>
@@ -1,16 +1,16 @@
CONSOLE MESSAGE: line 20: ***Top level frame being parsed for the initial page load***
CONSOLE MESSAGE: line 20: Subsubframe window.onload
CONSOLE MESSAGE: line 20: Subsubframe window.onpageshow, target = [object HTMLDocument], persisted = false
CONSOLE MESSAGE: line 20: Subframe window.onload
CONSOLE MESSAGE: line 20: Subframe window.onpageshow, target = [object HTMLDocument], persisted = false
CONSOLE MESSAGE: line 20: Main frame window.onload
CONSOLE MESSAGE: line 20: Main frame window.onpageshow, target = [object HTMLDocument], persisted = false
CONSOLE MESSAGE: line 20: ***Navigating top-level frame to a page that will immediately navigate back to this one***
CONSOLE MESSAGE: line 20: Main frame window.onpagehide, target = [object HTMLDocument], persisted = true
CONSOLE MESSAGE: line 20: Subframe window.onpagehide, target = [object HTMLDocument], persisted = true
CONSOLE MESSAGE: line 20: Subsubframe window.onpagehide, target = [object HTMLDocument], persisted = true
CONSOLE MESSAGE: line 20: Subsubframe window.onpageshow, target = [object HTMLDocument], persisted = true
CONSOLE MESSAGE: line 20: Subframe window.onpageshow, target = [object HTMLDocument], persisted = true
CONSOLE MESSAGE: line 20: Main frame window.onpageshow, target = [object HTMLDocument], persisted = true
Test pageshow/pagehide event behavior when navigating away from a page with frames, putting the page in the page cache, then back to it.
***Top level frame being parsed for the initial page load***
Subsubframe window.onload
Subsubframe window.onpageshow, target = [object HTMLDocument], persisted = false
Subframe window.onload
Subframe window.onpageshow, target = [object HTMLDocument], persisted = false
Main frame window.onload
Main frame window.onpageshow, target = [object HTMLDocument], persisted = false
***Navigating top-level frame to a page that will immediately navigate back to this one***
Main frame window.onpagehide, target = [object HTMLDocument], persisted = true
Subframe window.onpagehide, target = [object HTMLDocument], persisted = true
Subsubframe window.onpagehide, target = [object HTMLDocument], persisted = true
Subsubframe window.onpageshow, target = [object HTMLDocument], persisted = true
Subframe window.onpageshow, target = [object HTMLDocument], persisted = true
Main frame window.onpageshow, target = [object HTMLDocument], persisted = true

@@ -14,8 +14,10 @@

function log(message)
{
var log = document.getElementById("log");
log.innerHTML += message + "\n";
// Logging to the console instead of the "log" DIV in the DOM because
// otherwise we trigger the assert mentioned at http://webkit.org/b/43152
// (since we log during pagehide)
console.log(message);
}

log("***Top level frame being parsed for the initial page load***");
@@ -31,7 +33,8 @@
layoutTestController.notifyDone();
} else {
log("***Navigating top-level frame to a page that will immediately navigate back to this one***");
window.location.href = "data:text/html,<script>history.back();</scr" + "ipt>";
// Location changes need to happen outside the onload handler to generate history entries.
setTimeout(function() {window.location.href = "data:text/html,<script>history.back();</scr" + "ipt>";}, 0);
}
}

@@ -17,7 +17,8 @@
intervalId = setInterval(endTest, 100);

window.opener.log("page-1, about to navigate to page-2.")
location.href = "cached-page-2.html";
// Location changes need to happen outside the onload handler to generate history entries.
setTimeout(function() {location.href = "cached-page-2.html";}, 0);
}

// This unload handler exists just to make sure this page is not added
@@ -19,7 +19,8 @@
intervalId = setInterval(goBack, 20);

window.opener.log("page-2, about to navigate to page-3.")
location.href = "cached-page-3.html";
// Location changes need to happen outside the onload handler to generate history entries.
setTimeout(function() {location.href = "cached-page-3.html";}, 0);
}
</script>
<body onload="loadNext()">
@@ -22,7 +22,8 @@
intervalId = setInterval(check, 10);

window.opener.log("page-1, about to navigate to page-2.")
location.href = "cached-page-2.html";
// Location changes need to happen outside the onload handler to generate history entries.
setTimeout(function() {location.href = "cached-page-2.html";}, 0);
}
</script>
<body onload="loadNext()"></body>
@@ -18,7 +18,8 @@
intervalId = setInterval(check, 10);

window.opener.log("page with data urls, about to navigate to page-2.")
location.href = "cached-page-2.html";
// Location changes need to happen outside the onload handler to generate history entries.
setTimeout(function() {location.href = "cached-page-2.html";}, 0);
}
</script>
<body onload="loadNext()">
@@ -0,0 +1,9 @@
This page is the target of a redirect.

PASS: History item count should be 2 and is.


============== Back Forward List ==============
(file test):fast/history/gesture-before-onload.html **nav target**
curr-> (file test):fast/history/resources/gesture-before-onload-target.html#2 **nav target**
===============================================
@@ -0,0 +1,32 @@
<head>
</head>
<body onload="onload()">
<button id="nav-button" onclick="nav();">Navigate</button>
<div id="manual-explanation" style="display: none; color: blue">When running this test outside of DRT, please click on the "Navigate" button.</div>
</body>
<script>
if (window.layoutTestController) {
layoutTestController.clearBackForwardList();
layoutTestController.waitUntilDone();
}

if (window.eventSender) {
var navButtonNode = document.getElementById('nav-button');
eventSender.mouseMoveTo(
navButtonNode.offsetLeft + navButtonNode.offsetWidth / 2,
navButtonNode.offsetTop + navButtonNode.offsetHeight / 2);
eventSender.mouseDown();
eventSender.mouseUp();
} else {
document.getElementById('manual-explanation').style.display = '';
}

function nav() {
window.location.href = 'resources/gesture-before-onload-target.html#2';
}

function onload() {
window.console.log('FAIL: Should not have reached onload before navigating away');
}
</script>

@@ -8,30 +8,34 @@
layoutTestController.waitUntilDone();
}
}
// This test advances history by 2 pages, then navigates back one, and
// records history.length. We expect history.length to indicate the total
// length of session history. At the end of the test, it should be 2 greater
// than it was at the start of the test.
switch (sessionStorage.testStage++) {
case 0:
sessionStorage.initialLength = history.length;
location = "?a";
break;
case 1:
location = "?b";
break;
case 2:
history.back();
break;
case 3:
if (history.length == (sessionStorage.initialLength - 0) + 2)
document.body.innerHTML = "PASS";
else
document.body.innerHTML = "FAIL: initialLength=" + sessionStorage.initialLength + ", history.length=" + history.length;
if (window.layoutTestController)
layoutTestController.notifyDone();
break;
}

// Location changes need to happen outside the onload handler to generate history entries.
setTimeout(function() {
// This test advances history by 2 pages, then navigates back one, and
// records history.length. We expect history.length to indicate the total
// length of session history. At the end of the test, it should be 2 greater
// than it was at the start of the test.
switch (sessionStorage.testStage++) {
case 0:
sessionStorage.initialLength = history.length;
location = "?a";
break;
case 1:
location = "?b";
break;
case 2:
history.back();
break;
case 3:
if (history.length == (sessionStorage.initialLength - 0) + 2)
document.body.innerHTML = "PASS";
else
document.body.innerHTML = "FAIL: initialLength=" + sessionStorage.initialLength + ", history.length=" + history.length;
if (window.layoutTestController)
layoutTestController.notifyDone();
break;
}
}, 0);
}
onunload = function() {
// disable page cache
@@ -0,0 +1,41 @@
<!-- This page accepts a query string specifying how many history items should
be present once it finishes loading. -->

<html>
<head>
<title>Redirect Target</title>

<script>
function log(s)
{
document.getElementById("console").appendChild(document.createTextNode(s + "\n"));
}

function testHistoryItemCount()
{
var expected = parseInt(location.hash.slice(1));
var actual = history.length;
if (actual === expected)
log("PASS: History item count should be " + expected + " and is.");
else
log("FAIL: History item count should be " + expected + " but instead is " + actual + ".");
}

window.addEventListener("load", function () {
if (window.layoutTestController) {
layoutTestController.dumpAsText();
testHistoryItemCount();
layoutTestController.dumpBackForwardList();
layoutTestController.notifyDone();
} else {
testHistoryItemCount();
}
}, false);
</script>
</head>

<body>
<p>This page is the target of a redirect.</p>
<pre id="console"></pre>
</body>
</html>
@@ -30,8 +30,11 @@
layoutTestController.dumpAsText();
layoutTestController.waitUntilDone();
}
navigateToHash(field);
navigateAwayAndBack();
// Location changes need to happen outside the onload handler to generate history entries.
setTimeout(function() {
navigateToHash(field);
navigateAwayAndBack();
}, 0);
} else {
document.body.innerHTML = (field.value == '') ? 'FAIL' : 'PASS';
if (window.layoutTestController)
@@ -13,8 +13,9 @@
var input = document.getElementById("testinput");
input.setAttribute("autocomplete", "on");
input.parentNode.removeChild(input);

window.location = "data:text/html,<script>history.back();</scrip" + "t>";

// Location changes need to happen outside the onload handler to generate history entries.
setTimeout(function() {window.location = "data:text/html,<script>history.back();</scrip" + "t>";}, 0);
}

function pageHidden()
@@ -33,9 +33,10 @@

function loaded()
{
if (!sessionStorage.stage)
runFirstStageOfTest();
else if (sessionStorage.stage == 2)
if (!sessionStorage.stage) {
// Location changes need to happen outside the onload handler to generate history entries.
setTimeout(runFirstStageOfTest, 0);
} else if (sessionStorage.stage == 2)
runSecondStageOfTest();
else if (sessionStorage.stage == 3)
runThirdStageOfTest();

0 comments on commit 1fc1d92

Please sign in to comment.