Home | History | Annotate | Download | only in storage
      1 var DB_UPDATE_INTERVAL = 100;
      2 var SEND_XHR_INTERVAL = 100;
      3 var BACK_INTERVAL = 100;
      4 var CREATE_HEALTH_TABLE = 'CREATE TABLE IF NOT EXISTS health (key VARCHAR(16) PRIMARY KEY);';
      5 var UPDATE_DATA = 'REPLACE INTO health VALUES("health-check-key");';
      6  
      7 var db = openDatabaseWithSuffix('bug25710', '1.0', 'LayoutTest for bug 25710', 102400);
      8 var backIterations;
      9 var xhrFctIntervalId;
     10 var backFctIntervalId;
     11 var successCheckIntervalId;
     12 var dbFctIntervalId;
     13 var successes;
     14 var databaseUpdates;
     15 var stoppedIntervals;
     16  
     17 function stopIntervals()
     18 {
     19     stoppedIntervals = true;
     20     clearInterval(dbFctIntervalId);
     21     clearInterval(xhrFctIntervalId);
     22     clearInterval(backFctIntervalId);
     23 }
     24 
     25 function stopTest(message)
     26 {
     27     if (!stoppedIntervals)
     28         stopIntervals();
     29 
     30     log(message);
     31 
     32     if (window.layoutTestController)
     33         layoutTestController.notifyDone();
     34 }
     35     
     36 function updateDatabase()
     37 {
     38     databaseUpdates++;  
     39     db.transaction(function(transaction) {
     40         transaction.executeSql(UPDATE_DATA, [], function() {}, errorHandler);
     41     }, errorHandler, function() {
     42         successes++;
     43     });
     44 }
     45 
     46 function checkForSuccess()
     47 {
     48     if (successes == databaseUpdates) {
     49         stopTest('Test Complete, SUCCESS');
     50         clearInterval(successCheckIntervalId);
     51     }
     52 }
     53  
     54 function errorHandler(tx, error)
     55 {
     56     log('DB error, code: ' + error.code + ', msg: ' + error.message);
     57     stopTest('Test Complete, FAILED');
     58 }
     59  
     60 function sendXhr()
     61 {
     62     xhr = new XMLHttpRequest();
     63     xhr.open('GET', location.href, true);
     64     xhr.send('');
     65 }
     66  
     67 function invokeBack()
     68 {
     69     backIterations--;
     70     if (backIterations) {
     71         history.back();
     72     } else {
     73         stopIntervals();
     74         // Allow a little time for all the database transactions to complete now we've stopped making them.
     75         successCheckIntervalId = setInterval(checkForSuccess, 250);
     76         // If we don't finish before this time, then we consider the test failed.
     77         setTimeout(function() { stopTest('Timed out waiting for transactions to complete. FAILED'); }, 20000);
     78         
     79     }
     80 }
     81 
     82 function runTest()
     83 {
     84     // Location changes need to happen outside the onload handler to generate history entries.
     85     setTimeout(runTestsInner, 0);
     86 }
     87 
     88 function runTestsInner()
     89 {
     90     backIterations = 10;
     91     consecutiveFailures = 0;
     92     successes = 0;
     93     databaseUpdates = 0;
     94     stoppedIntervals = false;
     95 
     96     // Create some hashes so we can call history.back().
     97     log('Changing the hash to create history entries.');
     98     for (var i = 0; i < backIterations; i++) {
     99         setLocationHash(i);
    100     }
    101 
    102     // Init the database.
    103     db.transaction(function(transaction) {
    104         transaction.executeSql(CREATE_HEALTH_TABLE, [], function() {}, errorHandler);
    105     }, errorHandler, function() {
    106         // Give a little for the database to 'warm up' before making xhr requests
    107         // and calling history.back().
    108         setTimeout(function() {
    109             log('Db is warmed up');
    110 
    111             // NOTE: If we don't make any xhr requests, then the test
    112             // successfully passes (comment this line out).
    113             xhrFctIntervalId = setInterval(sendXhr, SEND_XHR_INTERVAL);
    114             backFctIntervalId = setInterval(invokeBack, BACK_INTERVAL);
    115             dbFctIntervalId = setInterval(updateDatabase, DB_UPDATE_INTERVAL);
    116         }, 500);
    117     });
    118 }
    119