diff options
Diffstat (limited to 'LayoutTests/storage/hash-change-with-xhr.html')
-rw-r--r-- | LayoutTests/storage/hash-change-with-xhr.html | 140 |
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> |