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