| <!DOCTYPE html> | |
| <title>IndexedDB: IDBTransaction.objectStoreNames attribute</title> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script> | |
| function indexeddb_test(upgrade_func, open_func, description) { | |
| async_test(function(t) { | |
| var dbname = document.location + '-' + t.name; | |
| var del = indexedDB.deleteDatabase(dbname); | |
| del.onerror = t.unreached_func('deleteDatabase should succeed'); | |
| var open = indexedDB.open(dbname, 1); | |
| open.onerror = t.unreached_func('open should succeed'); | |
| open.onupgradeneeded = t.step_func(function() { | |
| var db = open.result; | |
| var tx = open.transaction; | |
| upgrade_func(t, db, tx); | |
| }); | |
| open.onsuccess = t.step_func(function() { | |
| var db = open.result; | |
| open_func(t, db); | |
| }); | |
| }, description); | |
| } | |
| function with_stores_test(store_names, open_func, description) { | |
| indexeddb_test(function(t, db, tx) { | |
| store_names.forEach(function(name) { | |
| db.createObjectStore(name); | |
| }); | |
| }, open_func, description); | |
| } | |
| indexeddb_test(function(t, db, tx) { | |
| assert_array_equals(tx.objectStoreNames, [], | |
| 'transaction objectStoreNames should be empty'); | |
| assert_array_equals(db.objectStoreNames, tx.objectStoreNames, | |
| 'connection and transacton objectStoreNames should match'); | |
| db.createObjectStore('s1'); | |
| assert_array_equals(tx.objectStoreNames, ['s1'], | |
| 'transaction objectStoreNames should have new store'); | |
| assert_array_equals(db.objectStoreNames, tx.objectStoreNames, | |
| 'connection and transacton objectStoreNames should match'); | |
| db.createObjectStore('s3'); | |
| assert_array_equals(tx.objectStoreNames, ['s1', 's3'], | |
| 'transaction objectStoreNames should have new store'); | |
| assert_array_equals(db.objectStoreNames, tx.objectStoreNames, | |
| 'connection and transacton objectStoreNames should match'); | |
| db.createObjectStore('s2'); | |
| assert_array_equals(tx.objectStoreNames, ['s1', 's2', 's3'], | |
| 'transaction objectStoreNames should be sorted'); | |
| assert_array_equals(db.objectStoreNames, tx.objectStoreNames, | |
| 'connection and transacton objectStoreNames should match'); | |
| db.deleteObjectStore('s1'); | |
| assert_array_equals(tx.objectStoreNames, ['s2', 's3'], | |
| 'transaction objectStoreNames should be updated after delete'); | |
| assert_array_equals(db.objectStoreNames, tx.objectStoreNames, | |
| 'connection and transacton objectStoreNames should match'); | |
| }, function(t, db) { | |
| t.done(); | |
| }, 'IDBTransaction.objectStoreNames - during upgrade transaction'); | |
| (function() { | |
| var saved_tx; | |
| indexeddb_test(function(t, db, tx) { | |
| saved_tx = tx; | |
| db.createObjectStore('s2'); | |
| db.createObjectStore('s3'); | |
| }, function(t, db) { | |
| db.close(); | |
| var open2 = indexedDB.open(db.name, db.version + 1); | |
| open2.onerror = t.unreached_func('open should succeed'); | |
| open2.onupgradeneeded = t.step_func(function() { | |
| var db2 = open2.result; | |
| var tx2 = open2.transaction; | |
| assert_array_equals(tx2.objectStoreNames, ['s2', 's3'], | |
| 'transaction should have previous stores in scope'); | |
| assert_array_equals(db2.objectStoreNames, tx2.objectStoreNames, | |
| 'connection and transacton objectStoreNames should match'); | |
| db2.createObjectStore('s4'); | |
| assert_array_equals(tx2.objectStoreNames, ['s2', 's3', 's4'], | |
| 'transaction should have new store in scope'); | |
| assert_array_equals(db2.objectStoreNames, tx2.objectStoreNames, | |
| 'connection and transacton objectStoreNames should match'); | |
| assert_array_equals(saved_tx.objectStoreNames, ['s2', 's3'], | |
| 'previous transaction objectStoreNames should be unchanged'); | |
| assert_array_equals(db.objectStoreNames, saved_tx.objectStoreNames, | |
| 'connection and transaction objectStoreNames should match'); | |
| t.done(); | |
| }); | |
| }, 'IDBTransaction.objectStoreNames - value after close'); | |
| }()); | |
| with_stores_test(['s1', 's2'], function(t, db) { | |
| assert_array_equals(db.transaction('s1').objectStoreNames, ['s1'], | |
| 'transaction should have one store in scope'); | |
| assert_array_equals(db.transaction(['s1', 's2']).objectStoreNames, | |
| ['s1', 's2'], | |
| 'transaction should have two stores in scope'); | |
| t.done(); | |
| }, 'IDBTransaction.objectStoreNames - transaction scope'); | |
| with_stores_test(['s1', 's2'], function(t, db) { | |
| var tx = db.transaction(['s1', 's2'], 'readwrite'); | |
| tx.objectStore('s1').put(0, 0); | |
| tx.onabort = t.unreached_func('transaction should complete'); | |
| tx.oncomplete = t.step_func(function() { | |
| assert_array_equals(tx.objectStoreNames, ['s1', 's2'], | |
| 'objectStoreNames should return scope after transaction commits'); | |
| t.done(); | |
| }); | |
| }, 'IDBTransaction.objectStoreNames - value after commit'); | |
| with_stores_test(['s1', 's2'], function(t, db) { | |
| var tx = db.transaction(['s1', 's2'], 'readwrite'); | |
| tx.objectStore('s1').put(0, 0); | |
| tx.objectStore('s1').add(0, 0); | |
| tx.oncomplete = t.unreached_func('transaction should abort'); | |
| tx.onabort = t.step_func(function() { | |
| assert_array_equals(tx.objectStoreNames, ['s1', 's2'], | |
| 'objectStoreNames should return scope after transaction aborts'); | |
| t.done(); | |
| }); | |
| }, 'IDBTransaction.objectStoreNames - value after abort'); | |
| with_stores_test(['s1', 's2', 's3'], function(t, db) { | |
| assert_array_equals(db.transaction(['s3', 's2', 's1']).objectStoreNames, | |
| ['s1', 's2', 's3'], | |
| 'transaction objectStoreNames should be sorted'); | |
| t.done(); | |
| }, 'IDBTransaction.objectStoreNames - sorting'); | |
| with_stores_test(['s1', 's2'], function(t, db) { | |
| assert_array_equals( | |
| db.transaction(['s2', 's1', 's2']).objectStoreNames, | |
| ['s1', 's2'], | |
| 'transaction objectStoreNames should not have duplicates'); | |
| t.done(); | |
| }, 'IDBTransaction.objectStoreNames - no duplicates'); | |
| var unusual_names = [ | |
| '', // empty string | |
| '\x00', // U+0000 NULL | |
| '\xFF', // U+00FF LATIN SMALL LETTER Y WITH DIAERESIS | |
| '1', // basic ASCII | |
| '12', // basic ASCII | |
| '123', // basic ASCII | |
| 'abc', // basic ASCII | |
| 'ABC', // basic ASCII | |
| '\xA2', // U+00A2 CENT SIGN | |
| '\u6C34', // U+6C34 CJK UNIFIED IDEOGRAPH (water) | |
| '\uD834\uDD1E', // U+1D11E MUSICAL SYMBOL G-CLEF (UTF-16 surrogate pair) | |
| '\uFFFD', // U+FFFD REPLACEMENT CHARACTER | |
| '\uD800', // UTF-16 surrogate lead | |
| '\uDC00', // UTF-16 surrogate trail | |
| ]; | |
| unusual_names.sort(); | |
| indexeddb_test(function(t, db, tx) { | |
| unusual_names.slice().reverse().forEach(function(name) { | |
| db.createObjectStore(name); | |
| }); | |
| assert_array_equals(tx.objectStoreNames, unusual_names, | |
| 'transaction should have names sorted'); | |
| }, function(t, db) { | |
| var tx = db.transaction(unusual_names.slice().reverse().concat(unusual_names)); | |
| assert_array_equals(tx.objectStoreNames, unusual_names, | |
| 'transaction should have names sorted with no duplicates'); | |
| t.done(); | |
| }, 'IDBTransaction.objectStoreNames - unusual names'); | |
| </script> |