| // META: title=IDBTransaction - abort |
| // META: global=window,worker |
| // META: script=resources/support.js |
| |
| // Spec: https://w3c.github.io/IndexedDB/#transaction-abort |
| |
| 'use strict'; |
| |
| async_test(t => { |
| let db; |
| let aborted; |
| const record = {indexedProperty: 'bar'}; |
| |
| let open_rq = createdb(t); |
| open_rq.onupgradeneeded = function(e) { |
| db = e.target.result; |
| let txn = e.target.transaction; |
| let objStore = db.createObjectStore('store'); |
| objStore.add(record, 1); |
| objStore.add(record, 2); |
| let index = |
| objStore.createIndex('index', 'indexedProperty', {unique: true}); |
| |
| assert_true(index instanceof IDBIndex, 'IDBIndex'); |
| |
| e.target.transaction.onabort = t.step_func(function(e) { |
| aborted = true; |
| assert_equals(e.type, 'abort', 'event type'); |
| }); |
| |
| db.onabort = function(e) { |
| assert_true(aborted, 'transaction.abort event has fired'); |
| t.done(); |
| }; |
| |
| e.target.transaction.oncomplete = fail(t, 'got complete, expected abort'); |
| }; |
| }, 'Abort event should fire during transaction'); |
| |
| indexeddb_test( |
| (t, db) => { |
| db.createObjectStore('blobs', {keyPath: 'id', autoIncrement: true}); |
| }, |
| (t, db) => { |
| const txn = db.transaction('blobs', 'readwrite'); |
| const objectStore = txn.objectStore('blobs'); |
| const data = new Blob(['test'], {type: 'text/plain'}); |
| |
| const putRequest = objectStore.put({id: 0, data: data}); |
| |
| putRequest.onsuccess = t.step_func(() => { |
| t.step_timeout(() => { |
| assert_throws_dom('InvalidStateError', () => { |
| txn.abort(); |
| }, 'Abort should throw InvalidStateError on an auto-committing transaction.'); |
| }, 0); |
| }); |
| |
| // Ensure the transaction completes. |
| txn.oncomplete = t.step_func(() => { |
| t.done(); |
| }); |
| |
| // Abort should fail once the transaction has started committing. |
| txn.onabort = t.step_func((event) => { |
| assert_unreached('Unexpected transaction abort: ' + event.target.error); |
| }); |
| t.add_cleanup(() => { |
| if (db) { |
| db.close(); |
| } |
| }); |
| }, |
| `Abort during auto-committing should throw InvalidStateError.`); |
| |
| indexeddb_test( |
| (t, db) => { |
| db.createObjectStore('blobs', {keyPath: 'id', autoIncrement: true}); |
| }, |
| (t, db) => { |
| const txn = db.transaction('blobs', 'readwrite'); |
| const objectStore = txn.objectStore('blobs'); |
| const data = new Blob(['test'], {type: 'text/plain'}); |
| |
| // Put the object into the store. |
| const putRequest = objectStore.put({id: 0, data: data}); |
| |
| // Handle transaction completion. |
| txn.oncomplete = t.step_func(() => { |
| assert_throws_dom('InvalidStateError', () => { |
| txn.abort(); |
| }, 'Abort should throw InvalidStateError on a completed transaction.'); |
| t.done(); |
| }); |
| |
| // Handle transaction error. |
| txn.onerror = t.step_func((event) => { |
| assert_unreached('Unexpected transaction error: ' + event.target.error); |
| }); |
| |
| t.add_cleanup(() => { |
| if (db) { |
| db.close(); |
| } |
| }); |
| }, |
| `Abort on completed transaction should throw InvalidStateError.`); |