blob: 389187f2a3b7b1a10767fe450620b19963e3772e [file] [log] [blame]
//
// Here is the shared test code among the various navigation tests. The idea is to apply
// a number of operation sequences to a variety of navigation techniques. "Operations"
// are things like loading a page, or going back or forward. "Navigation techniques" are
// things like a HTTP 302 redirect, or the idiom of a POST followed by a redirect.
// utility function to fill the test form with some state, simulating the user's input
function fillTestForm() {
// Add data to form here instead of inside longForm.html, so these settings aren't
// also done when we return to that page, so we are sure to test the form state restore.
// Currently the state of checkboxes and radio buttons doesn't affect the DumpRenderTree
// output, so those settings are moot.
testDoc = (window.frames.length == 0) ? document : window.frames['main'].document;
testForm = testDoc.getElementById('testform');
testForm.textfield1.value='New form text from user';
testDoc.getElementById('radiooption2').checked=true;
testForm.checkbox2.checked=true;
testForm.selectgroup1.selectedIndex=2;
testForm.textarea1.value='More new form text from user, which should be restored when we return to this page.';
}
// utility function to scroll the document down a bit, to test save/restore
function scrollDocDown() {
testDoc = (window.frames.length == 0) ? document : window.frames['main'].document;
testDoc.getElementById('testbody').scrollTop=50;
}
// utility function to make a form post
function submitFormWithPost() {
testDoc = (window.frames.length == 0) ? document : window.frames['main'].document;
testDoc.getElementById('testform').submitwithpost.click();
}
// utility function to make a form post, using the postredirect idiom
function submitFormWithPostRedirect() {
testDoc = (window.frames.length == 0) ? document : window.frames['main'].document;
testDoc.getElementById('testform').submitwithpostredirect.click();
}
// utility function to make a form post, using the postredirect idiom
function submitFormWithPostRedirectReload() {
testDoc = (window.frames.length == 0) ? document : window.frames['main'].document;
testDoc.getElementById('testform').submitwithpostredirectreload.click();
}
// utility function to do a jump within the page to an anchor
function jumpToAnchor() {
testWin = (window.frames.length == 0) ? window : window.frames['main'];
testWin.location.hash = "anchor1";
}
// This is the most basic sequence. Just load the page and verify it worked.
// This is used for the non-frames and frames case.
// Optionally we will also poke the page to perform a post or jump to an anchor.
//
// Note most back/forward bugs are due to the b/f list not being created
// right during the loading, so this catches a lot of those.
// When testCase is a URL with an anchor, or when we queue a jumpToAnchor(),
// it's important to check that that we end up scrolled to the right place,
// proving the anchor was visited.
function runBasicTest(testCase, extraStep) {
if (window.testRunner) {
testRunner.dumpBackForwardList();
testRunner.queueLoad(testCase);
if (extraStep == "post") {
testRunner.queueNonLoadingScript("fillTestForm()");
testRunner.queueLoadingScript("submitFormWithPost()");
} else if (extraStep == "postredirect") {
testRunner.queueNonLoadingScript("fillTestForm()");
testRunner.queueLoadingScript("submitFormWithPostRedirect()");
} else if (extraStep == "relativeanchor") {
testRunner.queueNonLoadingScript("jumpToAnchor()");
}
}
}
// A sequence testing back/forward. Tests that we made it back to
// right page, and that the form and scroll state was saved and restored.
// This is used for the non-frames and frames case.
// Optionally we will also poke the page to perform a post or jump to an anchor.
//
// When testCase is a URL with an anchor, or when we queue a jumpToAnchor(),
// when we go back the scroll set by the user in this sequence should override
// the scroll implied by the anchor.
// When we POST it is interesting to test going back to the post result,
// and going back 2 pages to the original form.
function runBackTest(testCase, howFarBack, extraStep) {
if (window.testRunner) {
testRunner.dumpBackForwardList();
testRunner.queueLoad(testCase);
testRunner.queueNonLoadingScript("fillTestForm()");
testRunner.queueNonLoadingScript("scrollDocDown()");
if (extraStep == "post") {
testRunner.queueLoadingScript("submitFormWithPost()");
} else if (extraStep == "postredirect") {
testRunner.queueLoadingScript("submitFormWithPostRedirect()");
} else if (extraStep == "relativeanchor") {
testRunner.queueNonLoadingScript("jumpToAnchor()");
}
testRunner.queueLoad("resources/otherpage.html");
testRunner.queueBackNavigation(howFarBack);
}
}
// A sequence testing frames, where the given nav technique is used to
// load a single child frame, after the load of the whole frameset.
function runLoadChildFrameTest(testCase) {
if (window.testRunner) {
testRunner.dumpBackForwardList();
testRunner.queueLoad("resources/frameset.pl?frameURL=otherpage.html");
testRunner.queueLoad(testCase, "main");
}
}
// A sequence testing frames, where the given nav technique is used to
// load a single child frame, and then we go back to that point to check
// state save/restore. Some browsers do not let you restablish the
// set of subframes you were viewing when you go back in a case like this.
function runLoadChildFrameBackTest(testCase) {
if (window.testRunner) {
testRunner.dumpBackForwardList();
testRunner.queueLoad("resources/frameset.pl?frameURL=otherpage.html");
testRunner.queueLoad(testCase, "main");
testRunner.queueNonLoadingScript("fillTestForm()");
testRunner.queueNonLoadingScript("scrollDocDown()");
testRunner.queueLoad("resources/otherpage.html");
testRunner.queueBackNavigation(1);
}
}
// A sequence testing reload. The goals are that form state is cleared,
// scroll state is restored, and nothing is added to b/f list.
function runReloadTest(testCase) {
if (window.testRunner) {
testRunner.dumpBackForwardList();
testRunner.queueLoad(testCase);
testRunner.queueNonLoadingScript("fillTestForm()");
testRunner.queueNonLoadingScript("scrollDocDown()");
testRunner.queueReload();
}
}
// A sequence testing the repeated load of the same URL, not via the reload
// button (e.g., the user hits return in the location field). It was decided
// that this case should not preserve scroll state or form state, and not add
// anything to the b/f list.
function runLoadSameTest(testCase) {
testRunner.dumpBackForwardList();
testRunner.queueLoad(testCase);
testRunner.queueNonLoadingScript("fillTestForm()");
testRunner.queueNonLoadingScript("scrollDocDown()");
testRunner.queueLoad(testCase);
}
// A sequence testing a reload after a redirect. The goal is to check
// that in a reload we use the method set by the redirect, GET,
// instead of the original one, POST.
function runRedirectReloadTest(testCase) {
testRunner.dumpBackForwardList();
testRunner.queueLoad(testCase);
testRunner.queueLoadingScript("submitFormWithPostRedirectReload()");
testRunner.queueReload();
}