// META: title=IndexedDB: index renaming support in aborted transactions // META: global=window,worker // META: script=resources/support-promises.js // Spec: https://w3c.github.io/IndexedDB/#dom-idbindex-name 'use strict'; promise_test(testCase => { const dbName = databaseName(testCase); let authorIndex = null; let authorIndex2 = null; return createDatabase( testCase, (database, transaction) => { createBooksStore(testCase, database); }) .then(database => { database.close(); }) .then( () => migrateDatabase( testCase, 2, (database, transaction) => { const store = transaction.objectStore('books'); authorIndex = store.index('by_author'); authorIndex.name = 'renamed_by_author'; transaction.abort(); assert_equals( authorIndex.name, 'by_author', 'IDBIndex.name should not reflect the rename any more ' + 'immediately after transaction.abort() returns'); assert_array_equals( store.indexNames, ['by_author', 'by_title'], 'IDBObjectStore.indexNames should not reflect the rename any ' + 'more immediately after transaction.abort() returns'); })) .then(event => { assert_equals( authorIndex.name, 'by_author', 'IDBIndex.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 => { const transaction = database.transaction('books', 'readonly'); const store = transaction.objectStore('books'); assert_array_equals( store.indexNames, ['by_author', 'by_title'], 'IDBDatabase.objectStoreNames should not reflect the rename ' + 'after the versionchange transaction is aborted'); authorIndex2 = store.index('by_author'); return checkAuthorIndexContents( testCase, authorIndex2, 'Aborting an index rename transaction should not change the ' + 'index\'s records') .then(() => database.close()); }) .then(() => { assert_equals( authorIndex.name, 'by_author', 'IDBIndex used in aborted rename transaction should not reflect ' + 'the rename after the transaction is aborted'); assert_equals( authorIndex2.name, 'by_author', 'IDBIndex obtained after an aborted rename transaction should ' + 'not reflect the rename'); }); }, 'IndexedDB index rename in aborted transaction'); promise_test(testCase => { const dbName = databaseName(testCase); let authorIndex = null; return createDatabase( testCase, (database, transaction) => { createNotBooksStore(testCase, database); }) .then(database => { database.close(); }) .then( () => migrateDatabase( testCase, 2, (database, transaction) => { const store = transaction.objectStore('not_books'); authorIndex = store.createIndex('by_author', 'author'); authorIndex.name = 'by_author_renamed'; authorIndex.name = 'by_author_renamed_again'; transaction.abort(); assert_equals( authorIndex.name, 'by_author_renamed_again', 'IDBIndex.name should reflect the last rename immediately after ' + 'transaction.abort() returns'); assert_array_equals( store.indexNames, ['not_by_author', 'not_by_title'], 'IDBObjectStore.indexNames should not reflect the creation or ' + 'the rename immediately after transaction.abort() returns'); })) .then(event => { assert_equals( authorIndex.name, 'by_author_renamed_again', 'IDBIndex.name should reflect the last rename after the ' + 'versionchange transaction is aborted'); const request = indexedDB.open(dbName, 1); return promiseForRequest(testCase, request); }) .then(database => { const transaction = database.transaction('not_books', 'readonly'); const store = transaction.objectStore('not_books'); assert_array_equals( store.indexNames, ['not_by_author', 'not_by_title'], 'IDBDatabase.objectStoreNames should not reflect the creation or ' + 'the rename after the versionchange transaction is aborted'); database.close(); }); }, 'IndexedDB index creation and rename in an aborted transaction');