diff options
Diffstat (limited to 'testing/web-platform/tests/IndexedDB/idbobjectstore-rename-errors.html')
-rw-r--r-- | testing/web-platform/tests/IndexedDB/idbobjectstore-rename-errors.html | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/testing/web-platform/tests/IndexedDB/idbobjectstore-rename-errors.html b/testing/web-platform/tests/IndexedDB/idbobjectstore-rename-errors.html new file mode 100644 index 0000000000..de72c5cf48 --- /dev/null +++ b/testing/web-platform/tests/IndexedDB/idbobjectstore-rename-errors.html @@ -0,0 +1,121 @@ +<!doctype html> +<meta charset="utf8"> +<title>IndexedDB: object store renaming error handling</title> +<link rel="help" + href="https://w3c.github.io/IndexedDB/#dom-idbobjectstore-name"> +<link rel="author" href="pwnall@chromium.org" title="Victor Costan"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/support-promises.js"></script> +<script> +'use strict'; + +promise_test(testCase => { + return createDatabase(testCase, (database, transaction) => { + createBooksStore(testCase, database); + }).then(database => { + database.close(); + }).then(() => migrateDatabase(testCase, 2, (database, transaction) => { + const store = transaction.objectStore('books'); + database.deleteObjectStore('books'); + assert_throws_dom('InvalidStateError', () => store.name = 'renamed_books'); + })).then(database => { + database.close(); + }); +}, 'IndexedDB deleted object store rename throws'); + +promise_test(testCase => { + return createDatabase(testCase, (database, transaction) => { + createBooksStore(testCase, database); + }).then(database => { + const transaction = database.transaction('books', 'readonly', {durability: 'relaxed'}); + const store = transaction.objectStore('books'); + assert_throws_dom('InvalidStateError', () => store.name = 'renamed_books'); + database.close(); + }); +}, 'IndexedDB object store rename throws in a readonly transaction'); + +promise_test(testCase => { + return createDatabase(testCase, (database, transaction) => { + createBooksStore(testCase, database); + }).then(database => { + const transaction = database.transaction('books', 'readwrite', {durability: 'relaxed'}); + const store = transaction.objectStore('books'); + + assert_throws_dom('InvalidStateError', () => store.name = 'renamed_books'); + database.close(); + }); +}, 'IndexedDB object store rename throws in a readwrite transaction'); + +promise_test(testCase => { + let bookStore = null; + return createDatabase(testCase, (database, transaction) => { + bookStore = createBooksStore(testCase, database); + }).then(database => { + assert_throws_dom('TransactionInactiveError', + () => { bookStore.name = 'renamed_books'; }); + database.close(); + }); +}, 'IndexedDB object store rename throws in an inactive transaction'); + +promise_test(testCase => { + return createDatabase(testCase, (database, transaction) => { + createBooksStore(testCase, database); + createNotBooksStore(testCase, database); + }).then(database => { + database.close(); + }).then(() => migrateDatabase(testCase, 2, (database, transaction) => { + const store = transaction.objectStore('books'); + assert_throws_dom('ConstraintError', () => store.name = 'not_books'); + assert_array_equals( + database.objectStoreNames, ['books', 'not_books'], + 'A store rename that throws an exception should not change the ' + + "store's IDBDatabase.objectStoreNames"); + })).then(database => { + assert_array_equals( + database.objectStoreNames, ['books', 'not_books'], + 'Committing a transaction with a failed store rename attempt ' + + "should not change the store's IDBDatabase.objectStoreNames"); + const transaction = database.transaction('books', 'readonly', {durability: 'relaxed'}); + const store = transaction.objectStore('books'); + return checkStoreContents( + testCase, store, + 'Committing a transaction with a failed rename attempt should ' + + "not change the store's contents").then(() => database.close()); + }); +}, 'IndexedDB object store rename to the name of another store throws'); + +promise_test(testCase => { + return createDatabase(testCase, (database, transaction) => { + createBooksStore(testCase, database); + }).then(database => { + database.close(); + }).then(() => migrateDatabase(testCase, 2, (database, transaction) => { + const store = transaction.objectStore('books'); + var exception = { name: 'Custom stringifying error' } + assert_throws_exactly( + exception, + () => { + store.name = { + toString: () => { throw exception; } + }; + }, 'IDBObjectStore rename should re-raise toString() exception'); + assert_array_equals( + database.objectStoreNames, ['books'], + 'A store rename that throws an exception should not change the ' + + "store's IDBDatabase.objectStoreNames"); + })).then(database => { + assert_array_equals( + database.objectStoreNames, ['books'], + 'Committing a transaction with a failed store rename attempt ' + + "should not change the store's IDBDatabase.objectStoreNames"); + const transaction = database.transaction('books', 'readonly', {durability: 'relaxed'}); + const store = transaction.objectStore('books'); + return checkStoreContents( + testCase, store, + 'Committing a transaction with a failed rename attempt should ' + + "not change the store's contents").then(() => database.close()); + }); +}, 'IndexedDB object store rename handles exceptions when stringifying names'); + +</script> |