blob: 93979ad3ab9da368260ab1ca3320bbf5238a9d94 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>history_test.html</title>
<script src="test_bootstrap.js"></script>
<script type="text/javascript">
goog.require('bot');
goog.require('bot.locators');
goog.require('bot.test');
goog.require('bot.window');
goog.require('bot.userAgent');
goog.require('goog');
goog.require('goog.dom');
goog.require('goog.events');
goog.require('goog.testing.AsyncTestCase');
goog.require('goog.testing.asserts');
goog.require('goog.testing.jsunit');
goog.require('goog.userAgent');
goog.require('goog.userAgent.product');
</script>
</head>
<body>
<iframe id="frame"></iframe>
<script type="text/javascript">
var asyncTestCase = goog.testing.AsyncTestCase.createAndInstall();
// Set longer timeout due both to slowness in the Android emulator and
// slowness in the loading of popup windows in all browsers.
asyncTestCase.stepTimeout = 5000;
var frame = null;
var popup = null;
var callback = null;
// On Selenium-backed drivers (as used for Safari and Opera 10), the
// window.opener property of popups has no properties, so we can't notify
// this page when the popup has loaded (b/3504107). On Opera 11.5, the popup
// blocker is currently enabled (b/5746540). On Webview (Android),
// window.open will cause a dialog prompt that will cause load failure.
// On IE 10, the popup block is enabled (b/7126679).
// For these browsers, we test history in an iframe instead of a popup,
// which limits the history properties we can reliably check.
// TODO (gdennis): Use popups on all browsers once these bugs are fixed.
if (bot.test.isSeleniumBacked() || goog.userAgent.product.ANDROID ||
(goog.userAgent.OPERA && bot.userAgent.isEngineVersion(11.5)) ||
bot.userAgent.IE_DOC_10) {
// A bug in prior versions of WebKit (persisting into Safari 5) causes the
// initial page of an iframe to not enter the browser history, so we
// initialize the iframe to a dummy page and the test cases here do not
// make any assertions about this page being in the browser history.
frame = bot.locators.findElement({'id': 'frame'});
goog.events.listen(frame, 'load', notifyLoaded);
continueAfterLoad('waiting for initial page load', function() {
bot.setWindow(goog.dom.getFrameContentWindow(frame));
});
frame.src = 'testdata/history_page0.html';
}
function continueAfterLoad(desc, fn) {
asyncTestCase.waitForAsync(desc);
callback = fn;
}
function notifyLoaded() {
// A dummy onunload event ensures the browser will not cache the page
// and will fire a load event when on history.back() and forward(), see:
// http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/
bot.getWindow().onunload = goog.nullFunction;
window.setTimeout(function() {
asyncTestCase.continueTesting();
// In some browsers, an error thrown outside of a test function will not
// be caught and cause the test to fail, so we catch and set a flag that
// is later caught during tearDown and causes the test to fail then.
try {
callback();
} catch (e) {
fail(e.toString());
}
}, 0);
}
function tearDown() {
if (popup) {
popup.close();
popup = null;
}
}
function load(url, fn) {
var loc = window.location.href;
url = loc.substring(0, loc.lastIndexOf('/') + 1) + url;
continueAfterLoad('waiting for window to load ' + url, fn);
if (popup || frame) {
assertNotEquals('bot.setWindow() not called', bot.getWindow(), window);
bot.getWindow().location.href = url;
} else {
popup = window.open(url);
assertTrue('window.open() failed: is a pop-up blocker enabled?', !!popup);
bot.setWindow(popup);
}
}
function back(numPages, fn) {
continueAfterLoad('waiting for browser to go back ' + numPages, fn);
bot.window.back(numPages);
}
function forward(numPages, fn) {
continueAfterLoad('waiting for browser to go forward ' + numPages, fn);
bot.window.forward(numPages);
}
function assertUrlContains(str) {
assertContains(str, bot.getWindow().location.href);
}
function testErrorThrownWhenNumPagesNonPositive() {
assertThrows(goog.partial(bot.window.back, 0));
assertThrows(goog.partial(bot.window.back, 0));
assertThrows(goog.partial(bot.window.back, -1));
assertThrows(goog.partial(bot.window.forward, -1));
}
function testErrorThrowWhenNumPagesNotLessThanHistoryLength() {
// If not testing with popups, cannot check this property reliably,
// because we cannot guarantee the history stack starts fresh.
if (!popup) {
return;
}
load('testdata/history_page1.html', function() {
load('testdata/history_page2.html', function() {
assertThrows(goog.partial(bot.window.back, 3));
if (!goog.userAgent.OPERA &&
(!goog.userAgent.WEBKIT || bot.userAgent.isEngineVersion('533'))) {
assertThrows(goog.partial(bot.window.forward, 3));
}
});
});
}
function testBackForwardOnePage() {
load('testdata/history_page1.html', function() {
load('testdata/history_page2.html', function() {
back(1, function() {
assertUrlContains('history_page1.html');
forward(1, function() {
assertUrlContains('history_page2.html');
});
});
});
});
}
function testBackForwardMultiplePages() {
load('testdata/history_page1.html', function() {
load('testdata/history_page2.html', function() {
load('testdata/history_page3.html', function() {
back(2, function() {
assertUrlContains('history_page1.html');
forward(2, function() {
assertUrlContains('history_page3.html');
});
});
});
});
});
}
</script>
</body>
</html>