<!doctype html>
<meta charset="utf8">
<meta name="timeout" content="long">
<title>IndexedDB: object store renaming support</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="support-promises.js"></script>
<script>
'use strict';

// Renames the 'books' store to 'renamed_books'.
//
// Returns a promise that resolves to an IndexedDB database. The caller must
// close the database.
const renameBooksStore = (testCase) => {
    return migrateDatabase(testCase, 2, (database, transaction) => {
        const store = transaction.objectStore('books');
        store.name = 'renamed_books';
    });
};

promise_test(testCase => {
    let bookStore = null, bookStore2 = null;
    let renamedBookStore = null, renamedBookStore2 = null;
    return createDatabase(testCase, (database, transaction) => {
        bookStore = createBooksStore(testCase, database);
    }).then(database => {
        assert_array_equals(
            database.objectStoreNames, ['books'],
            'Test setup should have created a "books" object store');
        const transaction = database.transaction('books', 'readonly');
        bookStore2 = transaction.objectStore('books');
        return checkStoreContents(
            testCase, bookStore2,
            'The store should have the expected contents before any renaming').
            then(() => database.close());
    }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
        renamedBookStore = transaction.objectStore('books');
        renamedBookStore.name = 'renamed_books';

        assert_equals(
            renamedBookStore.name, 'renamed_books',
            'IDBObjectStore name should change immediately after a rename');
        assert_array_equals(
            database.objectStoreNames, ['renamed_books'],
            'IDBDatabase.objectStoreNames should immediately reflect the ' +
            'rename');
        assert_array_equals(
            transaction.objectStoreNames, ['renamed_books'],
            'IDBTransaction.objectStoreNames should immediately reflect the ' +
            'rename');
        assert_equals(
            transaction.objectStore('renamed_books'), renamedBookStore,
            'IDBTransaction.objectStore should return the renamed object ' +
            'store when queried using the new name immediately after the ' +
            'rename');
        assert_throws(
            'NotFoundError', () => transaction.objectStore('books'),
            'IDBTransaction.objectStore should throw when queried using the ' +
            "renamed object store's old name immediately after the rename");
    })).then(database => {
        assert_array_equals(
            database.objectStoreNames, ['renamed_books'],
            'IDBDatabase.objectStoreNames should still reflect the rename ' +
            'after the versionchange transaction commits');
        const transaction = database.transaction('renamed_books', 'readonly');
        renamedBookStore2 = transaction.objectStore('renamed_books');
        return checkStoreContents(
            testCase, renamedBookStore2,
            'Renaming an object store should not change its records').then(
            () => database.close());
    }).then(() => {
        assert_equals(
            bookStore.name, 'books',
            'IDBObjectStore obtained before the rename transaction should ' +
            'not reflect the rename');
        assert_equals(
            bookStore2.name, 'books',
            'IDBObjectStore obtained before the rename transaction should ' +
            'not reflect the rename');
        assert_equals(
            renamedBookStore.name, 'renamed_books',
            'IDBObjectStore used in the rename transaction should keep ' +
            'reflecting the new name after the transaction is committed');
        assert_equals(
            renamedBookStore2.name, 'renamed_books',
            'IDBObjectStore obtained after the rename transaction should ' +
            'reflect the new name');
    });
}, 'IndexedDB object store rename in new transaction');

promise_test(testCase => {
    let renamedBookStore = null, renamedBookStore2 = null;
    return createDatabase(testCase, (database, transaction) => {
        renamedBookStore = createBooksStore(testCase, database);
        renamedBookStore.name = 'renamed_books';

        assert_equals(
            renamedBookStore.name, 'renamed_books',
            'IDBObjectStore name should change immediately after a rename');
        assert_array_equals(
            database.objectStoreNames, ['renamed_books'],
            'IDBDatabase.objectStoreNames should immediately reflect the ' +
            'rename');
        assert_array_equals(
            transaction.objectStoreNames, ['renamed_books'],
            'IDBTransaction.objectStoreNames should immediately reflect the ' +
            'rename');
        assert_equals(
            transaction.objectStore('renamed_books'), renamedBookStore,
            'IDBTransaction.objectStore should return the renamed object ' +
            'store when queried using the new name immediately after the ' +
            'rename');
        assert_throws(
            'NotFoundError', () => transaction.objectStore('books'),
            'IDBTransaction.objectStore should throw when queried using the ' +
            "renamed object store's old name immediately after the rename");
    }).then(database => {
        assert_array_equals(
            database.objectStoreNames, ['renamed_books'],
            'IDBDatabase.objectStoreNames should still reflect the rename ' +
            'after the versionchange transaction commits');
        const transaction = database.transaction('renamed_books', 'readonly');
        renamedBookStore2 = transaction.objectStore('renamed_books');
        return checkStoreContents(
            testCase, renamedBookStore2,
            'Renaming an object store should not change its records').then(
            () => database.close());
    }).then(() => {
        assert_equals(
            renamedBookStore.name, 'renamed_books',
            'IDBObjectStore used in the rename transaction should keep ' +
            'reflecting the new name after the transaction is committed');
        assert_equals(
            renamedBookStore2.name, 'renamed_books',
            'IDBObjectStore obtained after the rename transaction should ' +
            'reflect the new name');
    });
}, 'IndexedDB object store rename in the transaction where it is created');

promise_test(testCase => {
    return createDatabase(testCase, (database, transaction) => {
        createBooksStore(testCase, database);
    }).then(database => {
        const transaction = database.transaction('books', 'readonly');
        const store = transaction.objectStore('books');
        return checkStoreIndexes(
            testCase, store,
            'The object store index should have the expected contens before ' +
            'any renaming').then(
            () => database.close());
    }).then(() => renameBooksStore(testCase)
    ).then(database => {
        const transaction = database.transaction('renamed_books', 'readonly');
        const store = transaction.objectStore('renamed_books');
        return checkStoreIndexes(
            testCase, store,
            'Renaming an object store should not change its indexes').then(
            () => database.close());
    });
}, 'IndexedDB object store rename covers index');

promise_test(testCase => {
    return createDatabase(testCase, (database, transaction) => {
        createBooksStore(testCase, database);
    }).then(database => {
        const transaction = database.transaction('books', 'readwrite');
        const store = transaction.objectStore('books');
        return checkStoreGenerator(
            testCase, store, 345679,
            'The object store key generator should have the expected state ' +
            'before any renaming').then(() => database.close());
    }).then(() => renameBooksStore(testCase)
    ).then(database => {
        const transaction = database.transaction('renamed_books', 'readwrite');
        const store = transaction.objectStore('renamed_books');
        return checkStoreGenerator(
            testCase, store, 345680,
            'Renaming an object store should not change the state of its key ' +
            'generator').then(() => database.close());
    });
}, 'IndexedDB object store rename covers key generator');

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');
        store.name = 'books';
        assert_array_equals(
            database.objectStoreNames, ['books'],
            'Renaming a store to the same name should not change ' +
            "the store's IDBDatabase.objectStoreNames");
    })).then(database => {
        assert_array_equals(
            database.objectStoreNames, ['books'],
            'Committing a transaction that renames a store to the same name ' +
            "should not change the store's IDBDatabase.objectStoreNames");
        const transaction = database.transaction('books', 'readonly');
        const store = transaction.objectStore('books');
        return checkStoreContents(
            testCase, store,
            'Committing a transaction that renames a store to the same name ' +
            "should not change the store's contents").then(
            () => database.close());
    });
}, 'IndexedDB object store rename to the same name succeeds');

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');
        database.deleteObjectStore('not_books');
        store.name = 'not_books';
        assert_array_equals(
            database.objectStoreNames, ['not_books'],
            'IDBDatabase.objectStoreNames should immediately reflect the ' +
            'rename');
    })).then(database => {
        assert_array_equals(
            database.objectStoreNames, ['not_books'],
            'IDBDatabase.objectStoreNames should still reflect the rename ' +
            'after the versionchange transaction commits');
        const transaction = database.transaction('not_books', 'readonly');
        const store = transaction.objectStore('not_books');
        return checkStoreContents(
            testCase, store,
            'Renaming an object store should not change its records').then(
            () => database.close());
    });
}, 'IndexedDB object store rename to the name of a deleted store succeeds');

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 bookStore = transaction.objectStore('books');
        const notBookStore = transaction.objectStore('not_books');

        transaction.objectStore('books').name = 'tmp';
        transaction.objectStore('not_books').name = 'books';
        transaction.objectStore('tmp').name = 'not_books';

        assert_array_equals(
            database.objectStoreNames, ['books', 'not_books'],
            'IDBDatabase.objectStoreNames should immediately reflect the swap');

        assert_equals(
            transaction.objectStore('books'), notBookStore,
            'IDBTransaction.objectStore should return the original "books" ' +
            'store when queried with "not_books" after the swap');
        assert_equals(
            transaction.objectStore('not_books'), bookStore,
            'IDBTransaction.objectStore should return the original ' +
            '"not_books" store when queried with "books" after the swap');
    })).then(database => {
        assert_array_equals(
            database.objectStoreNames, ['books', 'not_books'],
            'IDBDatabase.objectStoreNames should still reflect the swap ' +
            'after the versionchange transaction commits');
        const transaction = database.transaction('not_books', 'readonly');
        const store = transaction.objectStore('not_books');
        assert_array_equals(
            store.indexNames, ['by_author', 'by_title'],
            '"not_books" index names should still reflect the swap after the ' +
            'versionchange transaction commits');
        return checkStoreContents(
            testCase, store,
            'Swapping two object stores should not change their records').then(
            () => database.close());
    });
}, 'IndexedDB object store swapping via renames succeeds');

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');

        store.name = 42;
        assert_equals(store.name, '42',
            'IDBObjectStore name should change immediately after a ' +
            'rename to a number');
        assert_array_equals(
            database.objectStoreNames, ['42'],
            'IDBDatabase.objectStoreNames should immediately reflect the ' +
            'stringifying rename');

        store.name = true;
        assert_equals(store.name, 'true',
            'IDBObjectStore name should change immediately after a ' +
            'rename to a boolean');

        store.name = {};
        assert_equals(store.name, '[object Object]',
            'IDBObjectStore name should change immediately after a ' +
            'rename to an object');

        store.name = () => null;
        assert_equals(store.name, '() => null',
            'IDBObjectStore name should change immediately after a ' +
            'rename to a function');

        store.name = undefined;
        assert_equals(store.name, 'undefined',
            'IDBObjectStore name should change immediately after a ' +
            'rename to undefined');
    })).then(database => {
        assert_array_equals(
            database.objectStoreNames, ['undefined'],
            'IDBDatabase.objectStoreNames should reflect the last rename ' +
            'after the versionchange transaction commits');
        const transaction = database.transaction('undefined', 'readonly');
        const store = transaction.objectStore('undefined');
        return checkStoreContents(
            testCase, store,
            'Renaming an object store should not change its records').then(
            () => database.close());
    });
}, 'IndexedDB object store rename stringifies non-string names');

for (let escapedName of ['', '\\u0000', '\\uDC00\\uD800']) ((escapedName) => {
  const name = JSON.parse('"' + escapedName + '"');
  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');

          store.name = name;
          assert_equals(store.name, name,
              'IDBObjectStore name should change immediately after the ' +
              'rename');
          assert_array_equals(
              database.objectStoreNames, [name],
              'IDBDatabase.objectStoreNames should immediately reflect the ' +
              'rename');
      })).then(database => {
          assert_array_equals(
              database.objectStoreNames, [name],
              'IDBDatabase.objectStoreNames should reflect the rename ' +
              'after the versionchange transaction commits');
          const transaction = database.transaction(name, 'readonly');
          const store = transaction.objectStore(name);
          return checkStoreContents(
              testCase, store,
              'Renaming an object store should not change its records').then(
              () => database.close());
      });
  }, 'IndexedDB object store can be renamed to "' + escapedName + '"');
})(escapedName);

</script>
