[Worker] Checks that garbage collection doesn't reclaim objects with pending activity

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


Starting worker: resources/pending-activity.js
[Worker] indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
[Worker]
[Worker] indexedDB.deleteDatabase(dbname)
[Worker] indexedDB.open(dbname)
[Worker]
[Worker] prepareDatabase():
[Worker] store = db.createObjectStore('store')
[Worker] store.put(0, 0)
[Worker]
[Worker] testTransaction():
[Worker] transaction = db.transaction('store')
[Worker] transaction.oncomplete = transactionOnComplete
[Worker] transaction = null
[Worker] self.gc()
PASS [Worker] Transaction 'complete' event fired.
[Worker]
[Worker] testRequest():
[Worker] transaction = db.transaction('store')
[Worker] store = transaction.objectStore('store')
[Worker] request = store.get(0)
[Worker] request.onsuccess = requestOnSuccess
[Worker] request = null
[Worker] self.gc()
PASS [Worker] Request 'success' event fired.
[Worker]
[Worker] testCursorRequest():
[Worker] transaction = db.transaction('store')
[Worker] store = transaction.objectStore('store')
[Worker] request = store.openCursor()
[Worker] request.onsuccess = cursorRequestOnFirstSuccess
PASS [Worker] Request 'success' event fired.
[Worker] cursor = request.result
[Worker] cursor.continue()
[Worker] request.onsuccess = cursorRequestOnSecondSuccess
[Worker] request = null
[Worker] self.gc()
PASS [Worker] Request 'success' event fired.
[Worker]
PASS successfullyParsed is true

TEST COMPLETE

