50 lines
1.6 KiB
JavaScript
50 lines
1.6 KiB
JavaScript
if (this.importScripts) {
|
|
importScripts('../../../resources/js-test.js');
|
|
importScripts('shared.js');
|
|
}
|
|
|
|
description("Verify that that requests weakly hold script value properties");
|
|
|
|
if (window.internals) {
|
|
indexedDBTest(prepareDatabase, onOpen);
|
|
} else {
|
|
testFailed('This test requires access to the Internals object');
|
|
finishJSTest();
|
|
}
|
|
|
|
function prepareDatabase(evt)
|
|
{
|
|
preamble(evt);
|
|
evalAndLog("db = event.target.result");
|
|
evalAndLog("store = db.createObjectStore('store')");
|
|
evalAndLog("store.put({value: 'value'}, 'key')");
|
|
}
|
|
|
|
function onOpen(evt)
|
|
{
|
|
preamble(evt);
|
|
evalAndLog("db = event.target.result");
|
|
evalAndLog("tx = db.transaction('store')");
|
|
evalAndLog("store = tx.objectStore('store')");
|
|
evalAndLog("request = store.get('key')");
|
|
tx.oncomplete = function onTransactionComplete() {
|
|
preamble();
|
|
evalAndLog("db.close()");
|
|
shouldBeEqualToString("typeof request.result", "object");
|
|
|
|
// Verify that the same object is returned on each access to request.result.
|
|
evalAndLog("request.result.x = 123");
|
|
shouldBe("request.result.x", "123");
|
|
|
|
// Try and induce a leak by a reference cycle from DOM to V8 and back.
|
|
// If the v8 value of request.result (etc) is only held by the requests's
|
|
// V8 wrapper then there will be no leak.
|
|
evalAndLog("request.result.leak = request");
|
|
evalAndLog("observer = internals.observeGC(request)");
|
|
evalAndLog("request = null");
|
|
evalAndLog("gc()");
|
|
shouldBeTrue("observer.wasCollected");
|
|
finishJSTest();
|
|
};
|
|
}
|