chromium/third_party/blink/web_tests/storage/indexeddb/resources/index-unique.js

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

description("Test features of IndexedDB's unique indices.");

indexedDBTest(prepareDatabase, setVersionCompleted);
function prepareDatabase()
{
    db = event.target.result;
    event.target.transaction.onabort = unexpectedAbortCallback;

    self.store = evalAndLog("db.createObjectStore('store')");
    self.indexObject = evalAndLog("store.createIndex('index', 'x', {unique: true})");
}

function setVersionCompleted()
{
    debug("setVersionCompleted():");
    self.transaction = evalAndLog("transaction = db.transaction(['store'], 'readwrite')");

    request = evalAndLog("transaction.objectStore('store').put({x: 1}, 'foo')");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = addMoreData;
}

function addMoreData()
{
    debug("addMoreData():");

    // The x value violates the uniqueness constraint of the index.
    request = evalAndLog("transaction.objectStore('store').put({x: 1}, 'bar')");
    request.onerror = addMoreDataFailed;
    request.onsuccess = unexpectedSuccessCallback;
}

function addMoreDataFailed()
{
    debug("addMoreDataFailed():");

    // Don't abort the transaction.
    evalAndLog("event.preventDefault()");

    shouldBe("event.target.error.name", "'ConstraintError'");

    // Update the 'foo' entry in object store, changing the value of x.
    request = evalAndLog("transaction.objectStore('store').put({x: 0}, 'foo')");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = changeDataSuccess;
}

function changeDataSuccess()
{
    debug("changeDataSuccess():");

    // An index cursor starting at 1 should not find anything.
    var request = evalAndLog("transaction.objectStore('store').index('index').openCursor(IDBKeyRange.lowerBound(1))");
    request.onsuccess = cursorSuccess;
    request.onerror = unexpectedErrorCallback;
}

function cursorSuccess()
{
    debug("cursorSuccess():");
    shouldBeNull("event.target.result");

    // A key cursor starting at 1 should not find anything.
    var request = evalAndLog("transaction.objectStore('store').index('index').openKeyCursor(IDBKeyRange.lowerBound(1))");
    request.onsuccess = keyCursorSuccess;
    request.onerror = unexpectedErrorCallback;
}

function keyCursorSuccess()
{
    debug("keyCursorSuccess():");
    shouldBeNull("event.target.result");

    // Now we should be able to add a value with x: 1.
    request = evalAndLog("transaction.objectStore('store').put({x: 1}, 'bar')");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = addMoreDataSucces;
}

function addMoreDataSucces()
{
    debug("addMoreDataSucces():");

    request = evalAndLog("transaction.objectStore('store').delete('bar')");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = deleteSuccess;
}

function deleteSuccess()
{
    debug("deleteSuccess():");

    // Now we should be able to add a value with x: 1 again.
    request = evalAndLog("transaction.objectStore('store').put({x: 1}, 'baz')");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = finalAddSuccess;
}

function finalAddSuccess() {
    debug("finalAddSuccess():");

    // An overwrite should be ok.
    request = evalAndLog("transaction.objectStore('store').put({x: 1}, 'baz')");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = finishJSTest;
}