if (this.importScripts) {
    importScripts('../../../resources/js-test.js');
    importScripts('shared.js');
}

description("Ensure pending open waits for version change transaction to complete.");

indexedDBTest(prepareDatabase, null, {"runAfterOpen": concurrentOpen});

function concurrentOpen()
{
    debug("calling open() - callback should wait until VERSION_CHANGE transaction is complete");
    var openRequest = evalAndLog("indexedDB.open(dbname)");
    openRequest.onsuccess = openAgainSuccess;
    openRequest.onerror = unexpectedErrorCallback;
}

function prepareDatabase()
{
    db = event.target.result;
    debug("setVersion() callback");
    debug("starting work in VERSION_CHANGE transaction");
    evalAndLog("self.state = 'VERSION_CHANGE started'");

    self.store = evalAndLog("store = db.createObjectStore('test-store')");
    evalAndExpectException("db.transaction('test-store')", "DOMException.INVALID_STATE_ERR", "'InvalidStateError'");
    self.count = 0;
    do_async_puts();

    function do_async_puts()
    {
        var req = evalAndLog("store.put(" + count + ", " + count + ")");
        req.onerror = unexpectedErrorCallback;
        req.onsuccess = function (e) {
            debug("in put's onsuccess");
            if (++self.count < 10) {
                do_async_puts();
            } else {
                debug("ending work in VERSION_CHANGE transaction");
                evalAndLog("self.state = 'VERSION_CHANGE finished'");
            }
        };
    }
}

function openAgainSuccess()
{
    debug("open() callback - this should appear after VERSION_CHANGE transaction ends");
    shouldBeEqualToString("self.state", "VERSION_CHANGE finished");
    finishJSTest();
}
