| <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.dumpDatabaseCallbacks(); |
| 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> |