| Joshua Bell | 8f17185 | 2016-06-21 16:14:33 | [diff] [blame] | 1 | <!DOCTYPE html> | 
 | 2 | <title>IndexedDB: Commit ordering of empty transactions</title> | 
| Joshua Bell | b574794 | 2016-06-27 08:32:39 | [diff] [blame] | 3 | <script src="/resources/testharness.js"></script> | 
 | 4 | <script src="/resources/testharnessreport.js"></script> | 
 | 5 | <script src="support.js"></script> | 
| Joshua Bell | 8f17185 | 2016-06-21 16:14:33 | [diff] [blame] | 6 | <script> | 
 | 7 |  | 
 | 8 | // Call with a test object and array of expected values. Returns a | 
 | 9 | // function to call with each actual value. Once the expected number | 
 | 10 | // of values is seen, asserts that the value orders match and completes | 
 | 11 | // the test. | 
 | 12 | function expect(t, expected) { | 
 | 13 |  var results = []; | 
 | 14 |  return result => { | 
 | 15 |  results.push(result); | 
 | 16 |  if (results.length === expected.length) { | 
 | 17 |  assert_array_equals(results, expected); | 
 | 18 |  t.done(); | 
 | 19 |  } | 
 | 20 |  }; | 
 | 21 | } | 
 | 22 |  | 
 | 23 | indexeddb_test( | 
 | 24 |  (t, db) => { | 
 | 25 |  db.createObjectStore('store'); | 
 | 26 |  }, | 
 | 27 |  (t, db) => { | 
 | 28 |  var saw = expect(t, ['rq1.onsuccess', | 
 | 29 |  'rq2.onsuccess', | 
 | 30 |  'tx1.oncomplete', | 
 | 31 |  'tx2.oncomplete']); | 
 | 32 |  | 
 | 33 |  var tx1 = db.transaction('store', 'readwrite'); | 
 | 34 |  tx1.onabort = t.unreached_func('transaction should commit'); | 
 | 35 |  tx1.oncomplete = t.step_func(() => saw('tx1.oncomplete')); | 
 | 36 |  | 
 | 37 |  var store = tx1.objectStore('store'); | 
 | 38 |  var rq1 = store.put('a', 1); | 
 | 39 |  rq1.onerror = t.unreached_func('put should succeed'); | 
 | 40 |  rq1.onsuccess = t.step_func(() => { | 
 | 41 |  saw('rq1.onsuccess'); | 
 | 42 |  | 
 | 43 |  var tx2 = db.transaction('store', 'readonly'); | 
 | 44 |  tx2.onabort = t.unreached_func('transaction should commit'); | 
 | 45 |  tx2.oncomplete = t.step_func(() => saw('tx2.oncomplete')); | 
 | 46 |  | 
 | 47 |  var rq2 = store.put('b', 2); | 
 | 48 |  rq2.onsuccess = t.step_func(() => saw('rq2.onsuccess')); | 
 | 49 |  rq2.onerror = t.unreached_func('request should succeed'); | 
 | 50 |  }); | 
 | 51 |  | 
 | 52 |  }, | 
 | 53 |  'Transactions without requests complete in the expected order'); | 
 | 54 |  | 
 | 55 | indexeddb_test( | 
 | 56 |  (t, db) => { | 
 | 57 |  db.createObjectStore('store'); | 
 | 58 |  }, | 
 | 59 |  (t, db) => { | 
 | 60 |  var saw = expect(t, ['rq1.onsuccess', | 
 | 61 |  'rq2.onsuccess', | 
 | 62 |  'tx1.oncomplete', | 
 | 63 |  'tx2.oncomplete', | 
 | 64 |  'tx3.oncomplete']); | 
 | 65 |  var tx1 = db.transaction('store', 'readwrite'); | 
 | 66 |  tx1.onabort = t.unreached_func('transaction should commit'); | 
 | 67 |  tx1.oncomplete = t.step_func(() => saw('tx1.oncomplete')); | 
 | 68 |  | 
 | 69 |  var store = tx1.objectStore('store'); | 
 | 70 |  var rq1 = store.put('a', 1); | 
 | 71 |  rq1.onerror = t.unreached_func('put should succeed'); | 
 | 72 |  rq1.onsuccess = t.step_func(() => { | 
 | 73 |  saw('rq1.onsuccess'); | 
 | 74 |  | 
 | 75 |  var tx2 = db.transaction('store', 'readonly'); | 
 | 76 |  tx2.onabort = t.unreached_func('transaction should commit'); | 
 | 77 |  tx2.oncomplete = t.step_func(() => saw('tx2.oncomplete')); | 
 | 78 |  | 
 | 79 |  var tx3 = db.transaction('store', 'readonly'); | 
 | 80 |  tx3.onabort = t.unreached_func('transaction should commit'); | 
 | 81 |  tx3.oncomplete = t.step_func(() => saw('tx3.oncomplete')); | 
 | 82 |  | 
 | 83 |  var rq2 = store.put('b', 2); | 
 | 84 |  rq2.onsuccess = t.step_func(() => saw('rq2.onsuccess')); | 
 | 85 |  rq2.onerror = t.unreached_func('request should succeed'); | 
 | 86 |  }); | 
 | 87 |  }, | 
 | 88 |  'Multiple transactions without requests complete in the expected order'); | 
 | 89 | </script> |