Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / third_party / WebKit / LayoutTests / imported / web-platform-tests / IndexedDB / writer-starvation.htm
blobac795a6c444ae3c0a736265c2fc3beeedb800f55
1 <!DOCTYPE html>
2 <meta charset=utf-8>
3 <title>Writer starvation</title>
4 <link rel="author" href="mailto:odinho@opera.com" title="Odin Hørthe Omdal">
5 <meta name=timeout content=long>
6 <script src=../../../resources/testharness.js></script>
7 <script src=../../../resources/testharnessreport.js></script>
8 <script src=support.js></script>
10 <script>
11 var db, read_request_count = 0, read_success_count = 0;
12 var write_request_count = 0, write_success_count = 0;
13 var RQ_COUNT = 25;
15 var open_rq = createdb(async_test(undefined, {timeout: 20000}));
16 open_rq.onupgradeneeded = function(e) {
17 db = e.target.result;
18 db.createObjectStore("s")
19 .add("1", 1);
22 open_rq.onsuccess = function(e) {
23 var i = 0, continue_reading = true;
25 /* Pre-fill some read requests */
26 for (i = 0; i < RQ_COUNT; i++)
28 read_request_count++;
30 db.transaction("s")
31 .objectStore("s")
32 .get(1)
33 .onsuccess = this.step_func(function(e) {
34 read_success_count++;
35 assert_equals(e.target.transaction.mode, "readonly");
36 });
39 this.step(loop);
41 function loop() {
42 read_request_count++;
44 db.transaction("s")
45 .objectStore("s")
46 .get(1)
47 .onsuccess = this.step_func(function(e)
49 read_success_count++;
50 assert_equals(e.target.transaction.mode, "readonly");
52 if (read_success_count >= RQ_COUNT && write_request_count == 0)
54 write_request_count++;
56 db.transaction("s", "readwrite")
57 .objectStore("s")
58 .add("written", read_request_count)
59 .onsuccess = this.step_func(function(e)
61 write_success_count++;
62 assert_equals(e.target.transaction.mode, "readwrite");
63 assert_equals(e.target.result, read_success_count,
64 "write cb came before later read cb's")
65 });
67 /* Reads done after the write */
68 for (i = 0; i < 5; i++)
70 read_request_count++;
72 db.transaction("s")
73 .objectStore("s")
74 .get(1)
75 .onsuccess = this.step_func(function(e)
77 read_success_count++;
78 });
81 });
83 if (read_success_count < RQ_COUNT + 5)
84 setTimeout(this.step_func(loop), write_request_count ? 1000 : 100);
85 else
86 // This is merely a "nice" hack to run finish after the last request is done
87 db.transaction("s")
88 .objectStore("s")
89 .count()
90 .onsuccess = this.step_func(function()
92 setTimeout(this.step_func(finish), 100);
93 });
98 function finish() {
99 assert_equals(read_request_count, read_success_count, "read counts");
100 assert_equals(write_request_count, write_success_count, "write counts");
101 this.done();
103 </script>
105 <div id=log></div>