96 lines
3.1 KiB
JavaScript
96 lines
3.1 KiB
JavaScript
// META: script=resources/support-promises.js
|
|
// META: title=Indexed DB transaction state during Structured Serializing
|
|
// META: timeout=long
|
|
'use strict';
|
|
|
|
promise_test(async testCase => {
|
|
const db = await createDatabase(testCase, database => {
|
|
database.createObjectStore('store');
|
|
});
|
|
|
|
const transaction = db.transaction(['store'], 'readwrite');
|
|
const objectStore = transaction.objectStore('store');
|
|
|
|
let getterCalled = false;
|
|
const activeValue = {};
|
|
Object.defineProperty(activeValue, 'propertyName', {
|
|
enumerable: true,
|
|
get: testCase.step_func(() => {
|
|
getterCalled = true;
|
|
assert_throws_dom('TransactionInactiveError', () => {
|
|
objectStore.get('key');
|
|
}, 'transaction should not be active during structured clone');
|
|
return 'value that should not be used';
|
|
}),
|
|
});
|
|
objectStore.add(activeValue, 'key');
|
|
await promiseForTransaction(testCase, transaction);
|
|
db.close();
|
|
|
|
assert_true(getterCalled,
|
|
"activeValue's getter should be called during test");
|
|
}, 'Transaction inactive during structured clone in IDBObjectStore.add()');
|
|
|
|
promise_test(async testCase => {
|
|
const db = await createDatabase(testCase, database => {
|
|
database.createObjectStore('store');
|
|
});
|
|
|
|
const transaction = db.transaction(['store'], 'readwrite');
|
|
const objectStore = transaction.objectStore('store');
|
|
|
|
let getterCalled = false;
|
|
const activeValue = {};
|
|
Object.defineProperty(activeValue, 'propertyName', {
|
|
enumerable: true,
|
|
get: testCase.step_func(() => {
|
|
getterCalled = true;
|
|
assert_throws_dom('TransactionInactiveError', () => {
|
|
objectStore.get('key');
|
|
}, 'transaction should not be active during structured clone');
|
|
return 'value that should not be used';
|
|
}),
|
|
});
|
|
|
|
objectStore.put(activeValue, 'key');
|
|
await promiseForTransaction(testCase, transaction);
|
|
db.close();
|
|
|
|
assert_true(getterCalled,
|
|
"activeValue's getter should be called during test");
|
|
}, 'Transaction inactive during structured clone in IDBObjectStore.put()');
|
|
|
|
promise_test(async testCase => {
|
|
const db = await createDatabase(testCase, database => {
|
|
const objectStore = database.createObjectStore('store');
|
|
objectStore.put({}, 'key');
|
|
});
|
|
|
|
const transaction = db.transaction(['store'], 'readwrite');
|
|
const objectStore = transaction.objectStore('store');
|
|
|
|
let getterCalled = false;
|
|
const activeValue = {};
|
|
Object.defineProperty(activeValue, 'propertyName', {
|
|
enumerable: true,
|
|
get: testCase.step_func(() => {
|
|
getterCalled = true;
|
|
assert_throws_dom('TransactionInactiveError', () => {
|
|
objectStore.get('key');
|
|
}, 'transaction should not be active during structured clone');
|
|
return 'value that should not be used';
|
|
}),
|
|
});
|
|
|
|
const request = objectStore.openCursor();
|
|
request.onsuccess = testCase.step_func(() => {
|
|
const cursor = request.result;
|
|
cursor.update(activeValue);
|
|
});
|
|
|
|
await promiseForTransaction(testCase, transaction);
|
|
db.close();
|
|
|
|
assert_true(getterCalled,
|
|
"activeValue's getter should be called during test");
|
|
}, 'Transaction inactive during structured clone in IDBCursor.update()');
|