chromium/third_party/blink/web_tests/storage/indexeddb/resources/createIndex-after-failure.js

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

description("Test IndexedDB's basics.");

indexedDBTest(prepareDatabase);
function prepareDatabase(event)
{
    trans = event.target.transaction;
    db = event.target.result;

    db.createObjectStore("objectStore");
    objectStore = trans.objectStore("objectStore");
    var req1 = objectStore.put({"key": "value"}, "object1");
    var req2 = objectStore.put({"key": "value"}, "object2");

    waitForRequests([req1, req2], createIndex);
}

function createIndex() {
    // This will asynchronously abort in the backend because of constraint failures.
    evalAndLog("objectStore.createIndex('index', 'key', {unique: true})");
    // Now immediately delete it.
    evalAndLog("objectStore.deleteIndex('index')");
    // Delete it again: backend may have asynchronously aborted the
    // index creation, but this makes sure the frontend doesn't get
    // confused and crash, or think the index still exists.
    evalAndExpectException("objectStore.deleteIndex('index')", "DOMException.NOT_FOUND_ERR", "'NotFoundError'");
    debug("Now requesting object2");
    var req3 = objectStore.get("object2");
    req3.onsuccess = unexpectedSuccessCallback;
    req3.onerror = deleteIndexAfterGetError;
    debug("now we wait.");
}

function deleteIndexAfterGetError() {
    debug("deleteIndexAfterGetError()");
    // the index should still be gone, and this should not crash.
    evalAndExpectException("objectStore.deleteIndex('index')", "11", "'InvalidStateError'");
    evalAndExpectException("objectStore.deleteIndex('index')", "11", "'InvalidStateError'");

    finishJSTest();
}