|  | // META: global=window,worker | 
|  | // META: title=IndexedDB: object store renaming error handling | 
|  | // META: script=resources/support-promises.js | 
|  |  | 
|  | // Spec: https://w3c.github.io/IndexedDB/#dom-idbobjectstore-name | 
|  |  | 
|  | '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'); | 
|  | 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'); | 
|  | 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'); | 
|  | 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'); | 
|  | let 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'); | 
|  | 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'); |