| Index: third_party/WebKit/LayoutTests/imported/web-platform-tests/IndexedDB/idbtransaction_objectStoreNames.html | 
| diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/IndexedDB/idbtransaction_objectStoreNames.html b/third_party/WebKit/LayoutTests/imported/web-platform-tests/IndexedDB/idbtransaction_objectStoreNames.html | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..4d7c74501b84d005ac6a40c186551a7df221db6e | 
| --- /dev/null | 
| +++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/IndexedDB/idbtransaction_objectStoreNames.html | 
| @@ -0,0 +1,182 @@ | 
| +<!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> | 
|  |