| if (this.importScripts) { |
| importScripts('../../../resources/js-test.js'); |
| importScripts('shared.js'); |
| } |
| |
| description("Ensure IDBDatabase wrapper isn't prematurely collected."); |
| |
| test(); |
| |
| function test() |
| { |
| setDBNameFromPath(); |
| var deleteRequest = evalAndLog("indexedDB.deleteDatabase(dbname)"); |
| deleteRequest.onblocked = unexpectedBlockedCallback; |
| deleteRequest.onerror = unexpectedErrorCallback; |
| deleteRequest.onsuccess = openDB; |
| } |
| |
| function openDB() |
| { |
| preamble(); |
| |
| var openRequest = evalAndLog("indexedDB.open(dbname, 1)"); |
| openRequest.onblocked = unexpectedBlockedCallback; |
| openRequest.onerror = unexpectedErrorCallback; |
| openRequest.onupgradeneeded = onUpgradeNeeded; |
| openRequest.onsuccess = openSuccess; |
| } |
| |
| function onUpgradeNeeded(evt) { |
| preamble(evt); |
| evalAndLog("db = event.target.result"); |
| evalAndLog("db.createObjectStore('store').createIndex('index', 'keyPath')"); |
| evalAndLog("db = null"); |
| } |
| |
| function openSuccess(evt) |
| { |
| preamble(evt); |
| var db = event.target.result; |
| db.onversionchange = onVersionChange; |
| evalAndLog("sawVersionChangeEvent = false"); |
| |
| // All these local references should get collected, but the database's |
| // wrapper shouldn't get collected before the database itself. |
| var transaction = db.transaction('store', 'readonly'); |
| var objectStore = transaction.objectStore('store'); |
| var request = objectStore.get(0); |
| request.onsuccess = function() { |
| setTimeout(collectGarbage, 0); |
| }; |
| } |
| |
| function onVersionChange(evt) |
| { |
| preamble(evt); |
| evalAndLog("event.target.close()"); |
| evalAndLog("sawVersionChangeEvent = true"); |
| } |
| |
| function collectGarbage() |
| { |
| preamble(); |
| evalAndLog("self.gc()"); |
| |
| setTimeout(openAgain, 0); |
| } |
| |
| function openAgain() |
| { |
| preamble(); |
| |
| var openRequest = evalAndLog("indexedDB.open(dbname, 2)"); |
| openRequest.onblocked = onBlocked; |
| openRequest.onerror = unexpectedErrorCallback; |
| openRequest.onsuccess = openAgainSuccess; |
| } |
| |
| function onBlocked() |
| { |
| preamble(); |
| debug("FIXME: Blocked event shouldn't fire. http://crbug.com/100123"); |
| } |
| |
| function openAgainSuccess(evt) |
| { |
| preamble(evt); |
| shouldBeTrue("sawVersionChangeEvent"); |
| finishJSTest(); |
| } |