<!-- webkit-test-runner [ UsesBackForwardCache=true ] -->
<script>
if (window.testRunner) {
	testRunner.dumpAsText();
	testRunner.waitUntilDone();
}

var cachedApplicationCache = window.applicationCache;
var cachedConsole = window.console;
var cachedCrypto = window.crypto;
var cachedHistory = window.history;
var cachedLocalStorage = window.localStorage;
var cachedLocation = window.location;
var cachedLocationbar = window.locationbar;
var cachedMedia = window.styleMedia;
var cachedMenubar = window.menubar;
var cachedNavigator = window.navigator;
var cachedPersonalbar = window.personalbar;
var cachedScreen = window.screen;
var cachedScrollbars = window.scrollbars;
var cachedSelection = window.getSelection();
var cachedSessionStorage = window.sessionStorage;
var cachedStatusbar = window.statusbar;
var cachedToolbar = window.toolbar;

function logMessage(msg)
{
	document.getElementById("outputDiv").innerText += msg + " \n";
}

function logErrorMessage(msg)
{
	document.getElementById("errorDiv").innerText += msg + " \n";
}

window.onpageshow = function(evt) {
	if (!evt.persisted) {
		window.setTimeout("window.location.href = 'resources/empty-document-goes-back.html'", 0);
		return;
	}
	
	// First alert all of the objects to make sure we get a valid toString()-ification
	// instead of "undefined", "null", or "Object"
	logMessage(window.applicationCache);
	logMessage(window.console);
	logMessage(window.crypto);
	logMessage(window.history);
	logMessage(window.localStorage);
	logMessage(window.location != null && window.location != undefined);
	logMessage(window.locationbar);
	logMessage(window.styleMedia);
	logMessage(window.menubar);
	logMessage(window.navigator);
	logMessage(window.personalbar);
	logMessage(window.screen);
	logMessage(window.scrollbars);
	logMessage(window.getSelection() != null && window.getSelection() != undefined);
	logMessage(window.sessionStorage);
	logMessage(window.statusbar);
	logMessage(window.toolbar);
	
	// Then make sure the window properties match the cached references from the initial page load
	if (cachedApplicationCache != window.applicationCache)
		logErrorMessage("applicationCache");
	if (cachedConsole != window.console)
		logErrorMessage("console");
	if (cachedCrypto != window.crypto)
		logErrorMessage("crypto");
	if (cachedHistory != window.history)
		logErrorMessage("history");
	if (cachedLocalStorage != window.localStorage)
		logErrorMessage("localStorage");
	if (cachedLocation != window.location)
		logErrorMessage("location");
	if (cachedLocationbar != window.locationbar)
		logErrorMessage("locationbar");
	if (cachedMedia != window.styleMedia)
		logErrorMessage("styleMedia");
	if (cachedMenubar != window.menubar)
		logErrorMessage("menubar");
	if (cachedNavigator != window.navigator)
		logErrorMessage("navigator");
	if (cachedPersonalbar != window.personalbar)
		logErrorMessage("personalbar");
	if (cachedScreen != window.screen)
		logErrorMessage("screen");
	if (cachedScrollbars != window.scrollbars)
		logErrorMessage("scrollbars");
	if (cachedSelection != window.getSelection())
		logErrorMessage("getSelection");
	if (cachedSessionStorage != window.sessionStorage)
		logErrorMessage("sessionStorage");
	if (cachedStatusbar != window.statusbar)
		logErrorMessage("statusbar");
	if (cachedToolbar != window.toolbar)
		logErrorMessage("toolbar");

	if (document.getElementById("errorDiv").innerText == "")
		document.getElementById("errorDiv").innerText = "All tests passed.";

	if (window.testRunner)
		testRunner.notifyDone();
}

</script>
<body>
This test makes sure that various properties on the window object are correctly reconnected after restoring a page from the page cache.<br>
<div id="outputDiv"></div><br>
<div id="errorDiv"></div>
</body>
