| OLD | NEW |
| (Empty) |
| 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> | |
| 9 | |
| 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; | |
| 14 | |
| 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); | |
| 20 } | |
| 21 | |
| 22 open_rq.onsuccess = function(e) { | |
| 23 var i = 0, continue_reading = true; | |
| 24 | |
| 25 /* Pre-fill some read requests */ | |
| 26 for (i = 0; i < RQ_COUNT; i++) | |
| 27 { | |
| 28 read_request_count++; | |
| 29 | |
| 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 }); | |
| 37 } | |
| 38 | |
| 39 this.step(loop); | |
| 40 | |
| 41 function loop() { | |
| 42 read_request_count++; | |
| 43 | |
| 44 db.transaction("s") | |
| 45 .objectStore("s") | |
| 46 .get(1) | |
| 47 .onsuccess = this.step_func(function(e) | |
| 48 { | |
| 49 read_success_count++; | |
| 50 assert_equals(e.target.transaction.mode, "readonly"); | |
| 51 | |
| 52 if (read_success_count >= RQ_COUNT && write_request_count == 0) | |
| 53 { | |
| 54 write_request_count++; | |
| 55 | |
| 56 db.transaction("s", "readwrite") | |
| 57 .objectStore("s") | |
| 58 .add("written", read_request_count) | |
| 59 .onsuccess = this.step_func(function(e) | |
| 60 { | |
| 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 }); | |
| 66 | |
| 67 /* Reads done after the write */ | |
| 68 for (i = 0; i < 5; i++) | |
| 69 { | |
| 70 read_request_count++; | |
| 71 | |
| 72 db.transaction("s") | |
| 73 .objectStore("s") | |
| 74 .get(1) | |
| 75 .onsuccess = this.step_func(function(e) | |
| 76 { | |
| 77 read_success_count++; | |
| 78 }); | |
| 79 } | |
| 80 } | |
| 81 }); | |
| 82 | |
| 83 if (read_success_count < RQ_COUNT + 5) | |
| 84 setTimeout(this.step_func(loop), write_request_count ? 1000 : 10
0); | |
| 85 else | |
| 86 // This is merely a "nice" hack to run finish after the last req
uest is done | |
| 87 db.transaction("s") | |
| 88 .objectStore("s") | |
| 89 .count() | |
| 90 .onsuccess = this.step_func(function() | |
| 91 { | |
| 92 setTimeout(this.step_func(finish), 100); | |
| 93 }); | |
| 94 } | |
| 95 } | |
| 96 | |
| 97 | |
| 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(); | |
| 102 } | |
| 103 </script> | |
| 104 | |
| 105 <div id=log></div> | |
| OLD | NEW |