<!doctype html> <meta charset="utf8"> <title>IndexedDB: object store renaming support in aborted transactions</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 => { const dbName = databaseName(testCase); let bookStore = null, bookStore2 = null; return createDatabase(testCase, (database, transaction) => { createBooksStore(testCase, database); }).then(database => { database.close(); }).then(() => migrateDatabase(testCase, 2, (database, transaction) => { bookStore = transaction.objectStore('books'); bookStore.name = 'renamed_books'; transaction.abort(); assert_equals( bookStore.name, 'books', 'IDBObjectStore.name should not reflect the rename any more ' + 'immediately after transaction.abort() returns'); assert_array_equals( database.objectStoreNames, ['books'], 'IDBDatabase.objectStoreNames should not reflect the rename ' + 'any more immediately after transaction.abort() returns'); assert_array_equals( transaction.objectStoreNames, ['books'], 'IDBTransaction.objectStoreNames should not reflect the ' + 'rename any more immediately after transaction.abort() returns'); })).then(event => { assert_equals(bookStore.name, 'books', 'IDBObjectStore.name should not reflect the rename any more ' + 'after the versionchange transaction is aborted'); const request = indexedDB.open(dbName, 1); return promiseForRequest(testCase, request); }).then(database => { assert_array_equals( database.objectStoreNames, ['books'], 'IDBDatabase.objectStoreNames should not reflect the rename ' + 'after the versionchange transaction is aborted'); const transaction = database.transaction('books', 'readonly', {durability: 'relaxed'}); bookStore2 = transaction.objectStore('books'); return checkStoreContents( testCase, bookStore2, 'Aborting an object store rename transaction should not change ' + "the store's records").then(() => database.close()); }).then(() => { assert_equals( bookStore.name, 'books', 'IDBObjectStore used in aborted rename transaction should not ' + 'reflect the rename after the transaction is aborted'); assert_equals( bookStore2.name, 'books', 'IDBObjectStore obtained after an aborted rename transaction ' + 'should not reflect the rename'); }); }, 'IndexedDB object store rename in aborted transaction'); promise_test(testCase => { const dbName = databaseName(testCase); let notBookStore = null; return createDatabase(testCase, (database, transaction) => { }).then(database => { database.close(); }).then(() => migrateDatabase(testCase, 2, (database, transaction) => { notBookStore = createNotBooksStore(testCase, database); notBookStore.name = 'not_books_renamed'; notBookStore.name = 'not_books_renamed_again'; transaction.abort(); assert_equals( notBookStore.name, 'not_books_renamed_again', 'IDBObjectStore.name should reflect the last rename ' + 'immediately after transaction.abort() returns'); assert_array_equals( database.objectStoreNames, [], 'IDBDatabase.objectStoreNames should not reflect the creation ' + 'or the rename any more immediately after transaction.abort() ' + 'returns'); assert_array_equals( transaction.objectStoreNames, [], 'IDBTransaction.objectStoreNames should not reflect the ' + 'creation or the rename any more immediately after ' + 'transaction.abort() returns'); assert_array_equals(notBookStore.indexNames, [], 'IDBObjectStore.indexNames for the newly created store ' + 'should be empty immediately after transaction.abort() ' + 'returns'); })).then(event => { assert_equals( notBookStore.name, 'not_books_renamed_again', 'IDBObjectStore.name should reflect the last rename after the ' + 'versionchange transaction is aborted'); assert_array_equals(notBookStore.indexNames, [], 'IDBObjectStore.indexNames for the newly created store ' + 'should be empty after the versionchange transaction is aborted ' + 'returns'); const request = indexedDB.open(dbName, 1); return promiseForRequest(testCase, request); }).then(database => { assert_array_equals( database.objectStoreNames, [], 'IDBDatabase.objectStoreNames should not reflect the creation or ' + 'the rename after the versionchange transaction is aborted'); database.close(); }); }, 'IndexedDB object store creation and rename in an aborted transaction'); </script>