2010-05-28 Eric Uhrhane <ericu@chromium.org>
[WebKit-https.git] / LayoutTests / storage / hash-change-with-xhr.js
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     backIterations = 10;
85     consecutiveFailures = 0;
86     successes = 0;
87     databaseUpdates = 0;
88     stoppedIntervals = false;
89
90     // Create some hashes so we can call history.back().
91     log('Changing the hash to create history entries.');
92     for (var i = 0; i < backIterations; i++) {
93         setLocationHash(i);
94     }
95
96     // Init the database.
97     db.transaction(function(transaction) {
98         transaction.executeSql(CREATE_HEALTH_TABLE, [], function() {}, errorHandler);
99     }, errorHandler, function() {
100         // Give a little for the database to 'warm up' before making xhr requests
101         // and calling history.back().
102         setTimeout(function() {
103             log('Db is warmed up');
104
105             // NOTE: If we don't make any xhr requests, then the test
106             // successfully passes (comment this line out).
107             xhrFctIntervalId = setInterval(sendXhr, SEND_XHR_INTERVAL);
108             backFctIntervalId = setInterval(invokeBack, BACK_INTERVAL);
109             dbFctIntervalId = setInterval(updateDatabase, DB_UPDATE_INTERVAL);
110         }, 500);
111     });
112 }