summaryrefslogtreecommitdiffstats
path: root/LayoutTests/storage/hash-change-with-xhr.html
diff options
context:
space:
mode:
Diffstat (limited to 'LayoutTests/storage/hash-change-with-xhr.html')
-rw-r--r--LayoutTests/storage/hash-change-with-xhr.html140
1 files changed, 140 insertions, 0 deletions
diff --git a/LayoutTests/storage/hash-change-with-xhr.html b/LayoutTests/storage/hash-change-with-xhr.html
new file mode 100644
index 0000000..9cbf276
--- /dev/null
+++ b/LayoutTests/storage/hash-change-with-xhr.html
@@ -0,0 +1,140 @@
+<html>
+<head>
+<title>Hash Change with an Open XHR should not stop database transactions</title>
+
+<script type="text/javascript">
+
+var DB_UPDATE_INTERVAL = 100;
+var SEND_XHR_INTERVAL = 100;
+var BACK_INTERVAL = 100;
+var CREATE_HEALTH_TABLE = 'CREATE TABLE IF NOT EXISTS health (key VARCHAR(16) PRIMARY KEY);';
+var UPDATE_DATA = 'REPLACE INTO health VALUES("health-check-key");';
+
+var db = window.openDatabase('bug25710', '1.0', 'LayoutTest for bug 25710', 102400);
+var backIterations;
+var msgDiv;
+var xhrFctIntervalId;
+var backFctIntervalId;
+var successCheckIntervalId;
+var dbFctIntervalId;
+var successes;
+var databaseUpdates;
+var stoppedIntervals;
+
+function log(msg)
+{
+ var newMsg = document.createElement('div');
+ newMsg.innerText = msg;
+ msgDiv.appendChild(newMsg);
+}
+
+function stopIntervals()
+{
+ stoppedIntervals = true;
+ window.clearInterval(dbFctIntervalId);
+ window.clearInterval(xhrFctIntervalId);
+ window.clearInterval(backFctIntervalId);
+}
+
+function stopTest(message)
+{
+ if (!stoppedIntervals)
+ stopIntervals();
+
+ log(message);
+
+ if (window.layoutTestController)
+ layoutTestController.notifyDone();
+}
+
+function updateDatabase()
+{
+ databaseUpdates++;
+ db.transaction(function(transaction) {
+ transaction.executeSql(UPDATE_DATA, [], function() {}, errorHandler);
+ }, errorHandler, function() {
+ successes++;
+ });
+}
+
+function checkForSuccess()
+{
+ if (successes == databaseUpdates) {
+ stopTest('Test Complete, SUCCESS');
+ window.clearInterval(successCheckIntervalId);
+ }
+}
+
+function errorHandler(tx, error)
+{
+ log('DB error, code: ' + error.code + ', msg: ' + error.message);
+ stopTest('Test Complete, FAILED');
+}
+
+function sendXhr()
+{
+ xhr = new XMLHttpRequest();
+ xhr.open('GET', location.href, true);
+ xhr.send('');
+}
+
+function invokeBack()
+{
+ backIterations--;
+ if (backIterations) {
+ history.back();
+ } else {
+ stopIntervals();
+ // Allow a little time for all the database transactions to complete now we've stopped making them.
+ successCheckIntervalId = window.setInterval(checkForSuccess, 250);
+ // If we don't finish before this time, then we consider the test failed.
+ window.setTimeout(function() { stopTest('Timed out waiting for transactions to complete. FAILED'); }, 20000);
+
+ }
+}
+
+function runTest()
+{
+ if (window.layoutTestController) {
+ layoutTestController.dumpAsText();
+ layoutTestController.waitUntilDone();
+ }
+
+ msgDiv = document.getElementById('msgs');
+
+ msgDiv.innerHTML = '';
+ backIterations = 10;
+ consecutiveFailures = 0;
+ successes = 0;
+ databaseUpdates = 0;
+ stoppedIntervals = false;
+
+ // Create some hashes so we can call history.back().
+ log('Changing the hash to create history entries.');
+ for (var i = 0; i < backIterations; i++) {
+ location.hash = i;
+ }
+
+ // Init the database.
+ db.transaction(function(transaction) {
+ transaction.executeSql(CREATE_HEALTH_TABLE, [], function() {}, errorHandler);
+ }, errorHandler, function() {
+ // Give a little for the database to 'warm up' before making xhr requests
+ // and calling history.back().
+ window.setTimeout(function() {
+ log('Db is warmed up');
+
+ // NOTE: If we don't make any xhr requests, then the test
+ // successfully passes (comment this line out).
+ xhrFctIntervalId = window.setInterval(sendXhr, SEND_XHR_INTERVAL);
+ backFctIntervalId = window.setInterval(invokeBack, BACK_INTERVAL);
+ dbFctIntervalId = window.setInterval(updateDatabase, DB_UPDATE_INTERVAL);
+ }, 500);
+ });
+}
+</script>
+</head>
+<body onload="runTest()">
+<div id="msgs"></div>
+</body>
+</html>