<!DOCTYPE html>
<title>IndexedDB: IDBTransaction.objectStoreNames attribute</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support.js"></script>
<script>

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');
            db2.close();
            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>
