chromium/third_party/blink/web_tests/storage/indexeddb/resources/pending-activity.js

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

description("Checks that garbage collection doesn't reclaim objects with pending activity");

indexedDBTest(prepareDatabase, testTransaction);
function prepareDatabase(evt)
{
    preamble(evt);
    db = event.target.result;
    event.target.transaction.onabort = unexpectedAbortCallback;
    evalAndLog("store = db.createObjectStore('store')");
    evalAndLog("store.put(0, 0)");
}

function testTransaction()
{
    preamble();
    evalAndLog("transaction = db.transaction('store', 'readonly', {durability: 'relaxed'})");
    evalAndLog("transaction.oncomplete = transactionOnComplete");
    evalAndLog("transaction = null");
    evalAndLog("self.gc()");
}

function transactionOnComplete()
{
    testPassed("Transaction 'complete' event fired.");
    testRequest();
}

function testRequest()
{
    preamble();
    evalAndLog("transaction = db.transaction('store', 'readonly', {durability: 'relaxed'})");
    evalAndLog("store = transaction.objectStore('store')");
    evalAndLog("request = store.get(0)");
    evalAndLog("request.onsuccess = requestOnSuccess");
    evalAndLog("request = null");
    evalAndLog("self.gc()");
}

function requestOnSuccess()
{
    testPassed("Request 'success' event fired.");
    testCursorRequest();
}

function testCursorRequest()
{
    preamble();
    evalAndLog("transaction = db.transaction('store', 'readonly', {durability: 'relaxed'})");
    evalAndLog("store = transaction.objectStore('store')");
    evalAndLog("request = store.openCursor()");
    evalAndLog("request.onsuccess = cursorRequestOnFirstSuccess");
}

function cursorRequestOnFirstSuccess()
{
    testPassed("Request 'success' event fired.");
    evalAndLog("cursor = request.result");
    evalAndLog("cursor.continue()");
    evalAndLog("request.onsuccess = cursorRequestOnSecondSuccess");
    evalAndLog("request = null");
    evalAndLog("self.gc()");
}

function cursorRequestOnSecondSuccess()
{
    testPassed("Request 'success' event fired.");

    debug("");
    finishJSTest();
}