Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/**
* Any copyright is dedicated to the Public Domain.
*/
"use strict";
var self = this;
/* exported testGenerator */
var testGenerator = testSteps();
function* testSteps() {
const dbName = self.window
? window.location.pathname
: "test_transaction_abort_hang";
const objStoreName = "foo";
const transactionCount = 30;
let completedTransactionCount = 0;
let caughtError = false;
let abortedTransactionIndex = Math.floor(transactionCount / 2);
if (abortedTransactionIndex % 2 == 0) {
abortedTransactionIndex++;
}
let request = indexedDB.open(dbName, 1);
request.onerror = errorHandler;
request.onupgradeneeded = grabEventAndContinueHandler;
let event = yield undefined;
request.result.createObjectStore(objStoreName, { autoIncrement: true });
request.onupgradeneeded = null;
request.onsuccess = grabEventAndContinueHandler;
event = yield undefined;
let db = event.target.result;
for (let i = 0; i < transactionCount; i++) {
const readonly = i % 2 == 0;
const mode = readonly ? "readonly" : "readwrite";
let transaction = db.transaction(objStoreName, mode);
if (i == transactionCount - 1) {
// Last one, finish the test.
transaction.oncomplete = grabEventAndContinueHandler;
} else if (i == abortedTransactionIndex - 1) {
transaction.oncomplete = function () {
ok(
true,
"Completed transaction " +
++completedTransactionCount +
" (We may hang after this!)"
);
};
} else if (i == abortedTransactionIndex) {
// Special transaction that we abort outside the normal event flow.
transaction.onerror = function (event) {
ok(
true,
"Aborted transaction " +
++completedTransactionCount +
" (We didn't hang!)"
);
is(
event.target.error.name,
"AbortError",
"AbortError set as the error on the request"
);
is(
event.target.transaction.error,
null,
"No error set on the transaction"
);
ok(!caughtError, "Haven't seen the error event yet");
caughtError = true;
event.preventDefault();
};
// This has to happen after the we return to the event loop but before the
// transaction starts running.
executeSoon(function () {
transaction.abort();
});
} else {
transaction.oncomplete = function () {
ok(true, "Completed transaction " + ++completedTransactionCount);
};
}
if (readonly) {
transaction.objectStore(objStoreName).get(0);
} else {
try {
transaction.objectStore(objStoreName).add({});
} catch (e) {}
}
}
ok(true, "Created all transactions");
event = yield undefined;
ok(true, "Completed transaction " + ++completedTransactionCount);
ok(caughtError, "Caught the error event when we aborted the transaction");
finishTest();
}