| <!DOCTYPE html> | |
| <meta charset=utf-8> | |
| <title>Writer starvation</title> | |
| <link rel="author" href="mailto:odinho@opera.com" title="Odin Hørthe Omdal"> | |
| <meta name=timeout content=long> | |
| <script src=/resources/testharness.js></script> | |
| <script src=/resources/testharnessreport.js></script> | |
| <script src=support.js></script> | |
| <script> | |
| var db, read_request_count = 0, read_success_count = 0; | |
| var write_request_count = 0, write_success_count = 0; | |
| var RQ_COUNT = 25; | |
| var open_rq = createdb(async_test(undefined, {timeout: 20000})); | |
| open_rq.onupgradeneeded = function(e) { | |
| db = e.target.result; | |
| db.createObjectStore("s") | |
| .add("1", 1); | |
| } | |
| open_rq.onsuccess = function(e) { | |
| var i = 0, continue_reading = true; | |
| /* Pre-fill some read requests */ | |
| for (i = 0; i < RQ_COUNT; i++) | |
| { | |
| read_request_count++; | |
| db.transaction("s") | |
| .objectStore("s") | |
| .get(1) | |
| .onsuccess = this.step_func(function(e) { | |
| read_success_count++; | |
| assert_equals(e.target.transaction.mode, "readonly"); | |
| }); | |
| } | |
| this.step(loop); | |
| function loop() { | |
| read_request_count++; | |
| db.transaction("s") | |
| .objectStore("s") | |
| .get(1) | |
| .onsuccess = this.step_func(function(e) | |
| { | |
| read_success_count++; | |
| assert_equals(e.target.transaction.mode, "readonly"); | |
| if (read_success_count >= RQ_COUNT && write_request_count == 0) | |
| { | |
| write_request_count++; | |
| db.transaction("s", "readwrite") | |
| .objectStore("s") | |
| .add("written", read_request_count) | |
| .onsuccess = this.step_func(function(e) | |
| { | |
| write_success_count++; | |
| assert_equals(e.target.transaction.mode, "readwrite"); | |
| assert_equals(e.target.result, read_success_count, | |
| "write cb came before later read cb's") | |
| }); | |
| /* Reads done after the write */ | |
| for (i = 0; i < 5; i++) | |
| { | |
| read_request_count++; | |
| db.transaction("s") | |
| .objectStore("s") | |
| .get(1) | |
| .onsuccess = this.step_func(function(e) | |
| { | |
| read_success_count++; | |
| }); | |
| } | |
| } | |
| }); | |
| if (read_success_count < RQ_COUNT + 5) | |
| setTimeout(this.step_func(loop), write_request_count ? 1000 : 100); | |
| else | |
| // This is merely a "nice" hack to run finish after the last request is done | |
| db.transaction("s") | |
| .objectStore("s") | |
| .count() | |
| .onsuccess = this.step_func(function() | |
| { | |
| setTimeout(this.step_func(finish), 100); | |
| }); | |
| } | |
| } | |
| function finish() { | |
| assert_equals(read_request_count, read_success_count, "read counts"); | |
| assert_equals(write_request_count, write_success_count, "write counts"); | |
| this.done(); | |
| } | |
| </script> | |
| <div id=log></div> |