107 lines
3.1 KiB
JavaScript
107 lines
3.1 KiB
JavaScript
// 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.`);
|