7f56f795a182e1a81dafb6400ec83c8c30c0d5fa
[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     // 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 }