Index: LayoutTests/imported/web-platform-tests/IndexedDB/writer-starvation.htm |
diff --git a/LayoutTests/imported/web-platform-tests/IndexedDB/writer-starvation.htm b/LayoutTests/imported/web-platform-tests/IndexedDB/writer-starvation.htm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ac795a6c444ae3c0a736265c2fc3beeedb800f55 |
--- /dev/null |
+++ b/LayoutTests/imported/web-platform-tests/IndexedDB/writer-starvation.htm |
@@ -0,0 +1,105 @@ |
+<!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> |