summaryrefslogtreecommitdiffstats
path: root/dom/indexedDB/test/unit/test_transaction_abort_hang.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/indexedDB/test/unit/test_transaction_abort_hang.js')
-rw-r--r--dom/indexedDB/test/unit/test_transaction_abort_hang.js108
1 files changed, 108 insertions, 0 deletions
diff --git a/dom/indexedDB/test/unit/test_transaction_abort_hang.js b/dom/indexedDB/test/unit/test_transaction_abort_hang.js
new file mode 100644
index 0000000000..6a2c61128b
--- /dev/null
+++ b/dom/indexedDB/test/unit/test_transaction_abort_hang.js
@@ -0,0 +1,108 @@
+/**
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+"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 (event) {
+ 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 (event) {
+ 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();
+}