if (this.importScripts) { importScripts('../../../resources/js-test.js'); importScripts('shared.js'); } description("Verify that IDBRequest is not leaked when there is a reference cycle for result attribute"); indexedDBTest(prepareDatabase, onOpen); function prepareDatabase(evt) { preamble(evt); evalAndLog("db = event.target.result"); evalAndLog("store = db.createObjectStore('store')"); store.put({ value: 'value1' }, 'key1'); store.put({ value: 'value2' }, 'key2'); } function onOpen(evt) { preamble(evt); evalAndLog("db = event.target.result"); evalAndLog("tx = db.transaction('store')"); evalAndLog("store = tx.objectStore('store')"); evalAndLog("getRequest = store.get('key1')"); getRequest.onsuccess = (evt) => { preamble(evt); debug("Verify that the request's result can be accessed lazily:"); evalAndLog("gc()"); evalAndLog("result = getRequest.result"); shouldBeEqualToString("result.value", "value1"); evalAndLog("result.source = getRequest"); } evalAndLog("getRequest2 = store.get('key2')"); getRequest2.onsuccess = (evt) => { shouldBeEqualToString("getRequest2.result.value", "value2"); getRequestObervation = internals.observeGC(getRequest); resultObservation = internals.observeGC(result); evalAndLog("getRequest = null"); evalAndLog("gc()"); shouldBeFalse("getRequestObervation.wasCollected"); shouldBeFalse("resultObservation.wasCollected"); evalAndLog("result = null"); evalAndLog("gc()"); shouldBeTrue("getRequestObervation.wasCollected"); shouldBeTrue("resultObservation.wasCollected"); } tx.oncomplete = finishJSTest; }