<!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="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('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');
        const store = transaction.objectStore('books');
        assert_throws('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');
        const store = transaction.objectStore('books');

        assert_throws('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('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('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');
        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');
        assert_throws(
            { name: 'Custom stringifying error' },
            () => {
              store.name = {
                toString: () => { throw { name: 'Custom stringifying error'}; }
              };
            }, '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');
        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>
