Verify that that cursors weakly hold request, and work if request is GC'd

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


indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;

indexedDB.deleteDatabase(dbname)
indexedDB.open(dbname)

prepareDatabase():
db = event.target.result
store = db.createObjectStore('store')

onOpen():
db = event.target.result
tx = db.transaction('store', 'readonly')
store = tx.objectStore('store')
Create 1000 cursorRequests and check their results in otherRequestSuccess().
otherRequest = store.get(0)

otherRequestSuccess():
Verify that results of openCursor requests can be accessed lazily.
gc()
Ensure requests are not released if cursors are still around.
cursorRequests = null
gc()
PASS isAnyCollected(cursorRequestObservers) is false
Ensure requests are not released if they are pending.
cursors = null
gc()
PASS isAnyCollected(cursorObservers) is false
PASS isAnyCollected(cursorRequestObservers) is false
finalRequest = store.get(0)

finalRequestSuccess():
Ensure requests and cursors are released.
PASS cursors is non-null.
PASS cursors.length is 1000
cursors = null
gc()
PASS isAnyCollected(cursorObservers) is true
PASS isAnyCollected(cursorRequestObservers) is true
PASS successfullyParsed is true

TEST COMPLETE

