Chromium Code Reviews| Index: third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-advance-exception-order.html |
| diff --git a/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-advance-exception-order.html b/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-advance-exception-order.html |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..c40f3649b826c14e246606c41c10034f5c8f48a6 |
| --- /dev/null |
| +++ b/third_party/WebKit/LayoutTests/storage/indexeddb/idbcursor-advance-exception-order.html |
| @@ -0,0 +1,97 @@ |
| +<!DOCTYPE html> |
| +<title>IndexedDB: IDBCursor advance() Exception Ordering</title> |
| +<meta charset=utf-8> |
| +<link rel="help" href="https://w3c.github.io/IndexedDB/#dom-idbcursor-advance"> |
| +<script src="../../resources/testharness.js"></script> |
|
pwnall
2016/10/14 07:57:04
I think it'd be nice to add author information, to
jsbell
2016/10/17 19:42:03
Not something we'd normally do for blink and not a
|
| +<script src="../../resources/testharnessreport.js"></script> |
| +<script src="resources/testharness-helpers.js"></script> |
| +<script> |
| + |
| +indexeddb_test( |
| + (t, db) => { |
| + const store = db.createObjectStore('s'); |
| + store.put('value', 'key'); |
| + }, |
| + (t, db) => { |
| + const tx = db.transaction('s'); |
| + const store = tx.objectStore('s'); |
| + const finish = pin_transaction(store); |
|
pwnall
2016/10/14 07:57:04
I don't understand the necessity of the pin_transa
jsbell
2016/10/17 19:42:03
You're right - it doesn't matter for this test. Wi
|
| + |
| + const r = store.openKeyCursor(); |
| + r.onsuccess = t.step_func(() => { |
| + r.onsuccess = null; |
| + |
| + const cursor = r.result; |
| + |
| + setTimeout(t.step_func(() => { |
| + assert_throws(new TypeError, () => { cursor.advance(0); }, |
| + '"zero" check (TypeError) should precede ' + |
| + '"not active" check (TransactionInactiveError)'); |
| + finish(); |
| + t.done(); |
| + }), 0); |
| + }); |
| + }, |
| + 'IDBCursor.advance exception order: TypeError vs. TransactionInactiveError' |
| +); |
| + |
| +indexeddb_test( |
| + (t, db) => { |
| + const store = db.createObjectStore('s'); |
| + const finish = pin_transaction(store); |
|
pwnall
2016/10/14 07:57:04
Same as above, except I commented out setTimeout t
jsbell
2016/10/17 19:42:03
Done.
|
| + |
| + const s = db.createObjectStore('s2'); |
| + s.put('value', 'key'); |
| + |
| + const r = s.openKeyCursor(); |
| + r.onsuccess = t.step_func(() => { |
| + r.onsuccess = null; |
| + |
| + const cursor = r.result; |
| + db.deleteObjectStore('s2'); |
| + |
| + setTimeout(t.step_func(() => { |
| + assert_throws('TransactionInactiveError', () => { cursor.advance(1); }, |
| + '"not active" check (TransactionInactiveError) ' + |
| + 'should precede "deleted" check (InvalidStateError)'); |
| + finish(); |
| + t.done(); |
| + }), 0); |
| + }); |
| + }, |
| + (t, db) => {}, |
| + 'IDBCursor.advance exception order: ' + |
| + 'TransactionInactiveError vs. InvalidStateError #1' |
| +); |
| + |
| +indexeddb_test( |
| + (t, db) => { |
| + const store = db.createObjectStore('s'); |
| + store.put('value', 'key'); |
| + }, |
| + (t, db) => { |
| + const tx = db.transaction('s'); |
| + const store = tx.objectStore('s'); |
| + const finish = pin_transaction(store); |
|
pwnall
2016/10/14 07:57:04
Same as above.
jsbell
2016/10/17 19:42:03
Done.
|
| + |
| + const r = store.openKeyCursor(); |
| + r.onsuccess = t.step_func(() => { |
| + r.onsuccess = null; |
| + |
| + const cursor = r.result; |
| + cursor.continue(); |
|
pwnall
2016/10/14 07:57:04
Is there any value in using advance() instead of c
jsbell
2016/10/17 19:42:03
Sure, switched. (I was considering `continue()` to
|
| + |
| + setTimeout(t.step_func(() => { |
| + assert_throws('TransactionInactiveError', () => { cursor.advance(1); }, |
| + '"not active" check (TransactionInactiveError) ' + |
| + 'should precede "got value" check (InvalidStateError)'); |
| + finish(); |
| + t.done(); |
| + }), 0); |
| + }); |
| + }, |
| + 'IDBCursor.advance exception order: ' + |
| + 'TransactionInactiveError vs. InvalidStateError #2' |
| +); |
| + |
| +</script> |