| <!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> |