michael@0: /** michael@0: * Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ michael@0: */ michael@0: "use strict"; michael@0: michael@0: var self = this; michael@0: michael@0: var testGenerator = testSteps(); michael@0: michael@0: function testSteps() michael@0: { michael@0: const dbName = self.window ? window.location.pathname : "test_lowDiskSpace"; michael@0: const dbVersion = 1; michael@0: michael@0: const objectStoreName = "foo"; michael@0: const objectStoreOptions = { keyPath: "foo" }; michael@0: michael@0: const indexName = "bar"; michael@0: const indexOptions = { unique: true }; michael@0: michael@0: const dbData = [ michael@0: { foo: 0, bar: 0 }, michael@0: { foo: 1, bar: 10 }, michael@0: { foo: 2, bar: 20 }, michael@0: { foo: 3, bar: 30 }, michael@0: { foo: 4, bar: 40 }, michael@0: { foo: 5, bar: 50 }, michael@0: { foo: 6, bar: 60 }, michael@0: { foo: 7, bar: 70 }, michael@0: { foo: 8, bar: 80 }, michael@0: { foo: 9, bar: 90 } michael@0: ]; michael@0: michael@0: let lowDiskMode = false; michael@0: function setLowDiskMode(val) { michael@0: let data = val ? "full" : "free"; michael@0: michael@0: if (val == lowDiskMode) { michael@0: info("Low disk mode is: " + data); michael@0: } michael@0: else { michael@0: info("Changing low disk mode to: " + data); michael@0: SpecialPowers.notifyObserversInParentProcess(null, "disk-space-watcher", michael@0: data); michael@0: lowDiskMode = val; michael@0: } michael@0: } michael@0: michael@0: { // Make sure opening works from the beginning. michael@0: info("Test 1"); michael@0: michael@0: setLowDiskMode(false); michael@0: michael@0: let request = indexedDB.open(dbName, dbVersion); michael@0: request.onerror = errorHandler; michael@0: request.onsuccess = grabEventAndContinueHandler; michael@0: let event = yield undefined; michael@0: michael@0: is(event.type, "success", "Opened database without setting low disk mode"); michael@0: michael@0: let db = event.target.result; michael@0: db.close(); michael@0: } michael@0: michael@0: { // Make sure delete works in low disk mode. michael@0: info("Test 2"); michael@0: michael@0: setLowDiskMode(true); michael@0: michael@0: let request = indexedDB.deleteDatabase(dbName); michael@0: request.onerror = errorHandler; michael@0: request.onsuccess = grabEventAndContinueHandler; michael@0: let event = yield undefined; michael@0: michael@0: is(event.type, "success", "Deleted database after setting low disk mode"); michael@0: } michael@0: michael@0: { // Make sure creating a db in low disk mode fails. michael@0: info("Test 3"); michael@0: michael@0: setLowDiskMode(true); michael@0: michael@0: let request = indexedDB.open(dbName, dbVersion); michael@0: request.onerror = expectedErrorHandler("QuotaExceededError"); michael@0: request.onupgradeneeded = unexpectedSuccessHandler; michael@0: request.onsuccess = unexpectedSuccessHandler; michael@0: let event = yield undefined; michael@0: michael@0: is(event.type, "error", "Didn't create new database in low disk mode"); michael@0: } michael@0: michael@0: { // Make sure opening an already-existing db in low disk mode succeeds. michael@0: info("Test 4"); michael@0: michael@0: setLowDiskMode(false); michael@0: michael@0: let request = indexedDB.open(dbName, dbVersion); michael@0: request.onerror = errorHandler; michael@0: request.onupgradeneeded = grabEventAndContinueHandler; michael@0: request.onsuccess = unexpectedSuccessHandler; michael@0: let event = yield undefined; michael@0: michael@0: is(event.type, "upgradeneeded", "Upgrading database"); michael@0: michael@0: let db = event.target.result; michael@0: db.onerror = errorHandler; michael@0: michael@0: request.onupgradeneeded = unexpectedSuccessHandler; michael@0: request.onsuccess = grabEventAndContinueHandler; michael@0: event = yield undefined; michael@0: michael@0: is(event.type, "success", "Created database"); michael@0: ok(event.target.result === db, "Got the same database"); michael@0: michael@0: db.close(); michael@0: michael@0: setLowDiskMode(true); michael@0: michael@0: request = indexedDB.open(dbName); michael@0: request.onerror = errorHandler; michael@0: request.onupgradeneeded = unexpectedSuccessHandler; michael@0: request.onsuccess = grabEventAndContinueHandler; michael@0: event = yield undefined; michael@0: michael@0: is(event.type, "success", "Opened existing database in low disk mode"); michael@0: michael@0: db = event.target.result; michael@0: db.close(); michael@0: } michael@0: michael@0: { // Make sure upgrading an already-existing db in low disk mode succeeds. michael@0: info("Test 5"); michael@0: michael@0: setLowDiskMode(true); michael@0: michael@0: let request = indexedDB.open(dbName, dbVersion + 1); michael@0: request.onerror = errorHandler; michael@0: request.onupgradeneeded = grabEventAndContinueHandler; michael@0: request.onsuccess = unexpectedSuccessHandler; michael@0: michael@0: let event = yield undefined; michael@0: michael@0: is(event.type, "upgradeneeded", "Upgrading database"); michael@0: michael@0: let db = event.target.result; michael@0: db.onerror = errorHandler; michael@0: michael@0: request.onupgradeneeded = unexpectedSuccessHandler; michael@0: request.onsuccess = grabEventAndContinueHandler; michael@0: event = yield undefined; michael@0: michael@0: is(event.type, "success", "Created database"); michael@0: ok(event.target.result === db, "Got the same database"); michael@0: michael@0: db.close(); michael@0: } michael@0: michael@0: { // Make sure creating objectStores in low disk mode fails. michael@0: info("Test 6"); michael@0: michael@0: setLowDiskMode(true); michael@0: michael@0: let request = indexedDB.open(dbName, dbVersion + 2); michael@0: request.onerror = expectedErrorHandler("QuotaExceededError"); michael@0: request.onupgradeneeded = grabEventAndContinueHandler; michael@0: request.onsuccess = unexpectedSuccessHandler; michael@0: michael@0: let event = yield undefined; michael@0: michael@0: is(event.type, "upgradeneeded", "Upgrading database"); michael@0: michael@0: let db = event.target.result; michael@0: db.onerror = errorHandler; michael@0: michael@0: let objectStore = db.createObjectStore(objectStoreName, objectStoreOptions); michael@0: michael@0: request.onupgradeneeded = unexpectedSuccessHandler; michael@0: event = yield undefined; michael@0: michael@0: is(event.type, "error", "Failed database upgrade"); michael@0: } michael@0: michael@0: { // Make sure creating indexes in low disk mode fails. michael@0: info("Test 7"); michael@0: michael@0: setLowDiskMode(false); michael@0: michael@0: let request = indexedDB.open(dbName, dbVersion + 2); michael@0: request.onerror = errorHandler; michael@0: request.onupgradeneeded = grabEventAndContinueHandler; michael@0: request.onsuccess = unexpectedSuccessHandler; michael@0: michael@0: let event = yield undefined; michael@0: michael@0: is(event.type, "upgradeneeded", "Upgrading database"); michael@0: michael@0: let db = event.target.result; michael@0: db.onerror = errorHandler; michael@0: michael@0: let objectStore = db.createObjectStore(objectStoreName, objectStoreOptions); michael@0: michael@0: request.onupgradeneeded = unexpectedSuccessHandler; michael@0: request.onsuccess = grabEventAndContinueHandler; michael@0: event = yield undefined; michael@0: michael@0: is(event.type, "success", "Upgraded database"); michael@0: ok(event.target.result === db, "Got the same database"); michael@0: michael@0: db.close(); michael@0: michael@0: setLowDiskMode(true); michael@0: michael@0: request = indexedDB.open(dbName, dbVersion + 3); michael@0: request.onerror = expectedErrorHandler("QuotaExceededError"); michael@0: request.onupgradeneeded = grabEventAndContinueHandler; michael@0: request.onsuccess = unexpectedSuccessHandler; michael@0: event = yield undefined; michael@0: michael@0: is(event.type, "upgradeneeded", "Upgrading database"); michael@0: michael@0: db = event.target.result; michael@0: db.onerror = errorHandler; michael@0: michael@0: objectStore = event.target.transaction.objectStore(objectStoreName); michael@0: let index = objectStore.createIndex(indexName, indexName, indexOptions); michael@0: michael@0: request.onupgradeneeded = unexpectedSuccessHandler; michael@0: event = yield undefined; michael@0: michael@0: is(event.type, "error", "Failed database upgrade"); michael@0: } michael@0: michael@0: { // Make sure deleting indexes in low disk mode succeeds. michael@0: info("Test 8"); michael@0: michael@0: setLowDiskMode(false); michael@0: michael@0: let request = indexedDB.open(dbName, dbVersion + 3); michael@0: request.onerror = errorHandler; michael@0: request.onupgradeneeded = grabEventAndContinueHandler; michael@0: request.onsuccess = unexpectedSuccessHandler; michael@0: michael@0: let event = yield undefined; michael@0: michael@0: is(event.type, "upgradeneeded", "Upgrading database"); michael@0: michael@0: let db = event.target.result; michael@0: db.onerror = errorHandler; michael@0: michael@0: let objectStore = event.target.transaction.objectStore(objectStoreName); michael@0: let index = objectStore.createIndex(indexName, indexName, indexOptions); michael@0: michael@0: request.onupgradeneeded = unexpectedSuccessHandler; michael@0: request.onsuccess = grabEventAndContinueHandler; michael@0: event = yield undefined; michael@0: michael@0: is(event.type, "success", "Upgraded database"); michael@0: ok(event.target.result === db, "Got the same database"); michael@0: michael@0: db.close(); michael@0: michael@0: setLowDiskMode(true); michael@0: michael@0: request = indexedDB.open(dbName, dbVersion + 4); michael@0: request.onerror = errorHandler; michael@0: request.onupgradeneeded = grabEventAndContinueHandler; michael@0: request.onsuccess = unexpectedSuccessHandler; michael@0: event = yield undefined; michael@0: michael@0: is(event.type, "upgradeneeded", "Upgrading database"); michael@0: michael@0: db = event.target.result; michael@0: db.onerror = errorHandler; michael@0: michael@0: objectStore = event.target.transaction.objectStore(objectStoreName); michael@0: objectStore.deleteIndex(indexName); michael@0: michael@0: request.onupgradeneeded = unexpectedSuccessHandler; michael@0: request.onsuccess = grabEventAndContinueHandler; michael@0: event = yield undefined; michael@0: michael@0: is(event.type, "success", "Upgraded database"); michael@0: ok(event.target.result === db, "Got the same database"); michael@0: michael@0: db.close(); michael@0: } michael@0: michael@0: { // Make sure deleting objectStores in low disk mode succeeds. michael@0: info("Test 9"); michael@0: michael@0: setLowDiskMode(true); michael@0: michael@0: let request = indexedDB.open(dbName, dbVersion + 5); michael@0: request.onerror = errorHandler; michael@0: request.onupgradeneeded = grabEventAndContinueHandler; michael@0: request.onsuccess = unexpectedSuccessHandler; michael@0: michael@0: let event = yield undefined; michael@0: michael@0: is(event.type, "upgradeneeded", "Upgrading database"); michael@0: michael@0: let db = event.target.result; michael@0: db.onerror = errorHandler; michael@0: michael@0: db.deleteObjectStore(objectStoreName); michael@0: michael@0: request.onupgradeneeded = unexpectedSuccessHandler; michael@0: request.onsuccess = grabEventAndContinueHandler; michael@0: event = yield undefined; michael@0: michael@0: is(event.type, "success", "Upgraded database"); michael@0: ok(event.target.result === db, "Got the same database"); michael@0: michael@0: db.close(); michael@0: michael@0: // Reset everything. michael@0: indexedDB.deleteDatabase(dbName); michael@0: } michael@0: michael@0: michael@0: { // Add data that the rest of the tests will use. michael@0: info("Adding test data"); michael@0: michael@0: setLowDiskMode(false); michael@0: michael@0: let request = indexedDB.open(dbName, dbVersion); michael@0: request.onerror = errorHandler; michael@0: request.onupgradeneeded = grabEventAndContinueHandler; michael@0: request.onsuccess = unexpectedSuccessHandler; michael@0: let event = yield undefined; michael@0: michael@0: is(event.type, "upgradeneeded", "Upgrading database"); michael@0: michael@0: let db = event.target.result; michael@0: db.onerror = errorHandler; michael@0: michael@0: let objectStore = db.createObjectStore(objectStoreName, objectStoreOptions); michael@0: let index = objectStore.createIndex(indexName, indexName, indexOptions); michael@0: michael@0: for each (let data in dbData) { michael@0: objectStore.add(data); michael@0: } michael@0: michael@0: request.onupgradeneeded = unexpectedSuccessHandler; michael@0: request.onsuccess = grabEventAndContinueHandler; michael@0: event = yield undefined; michael@0: michael@0: is(event.type, "success", "Upgraded database"); michael@0: ok(event.target.result === db, "Got the same database"); michael@0: michael@0: db.close(); michael@0: } michael@0: michael@0: { // Make sure read operations in readonly transactions succeed in low disk michael@0: // mode. michael@0: info("Test 10"); michael@0: michael@0: setLowDiskMode(true); michael@0: michael@0: let request = indexedDB.open(dbName, dbVersion); michael@0: request.onerror = errorHandler; michael@0: request.onupgradeneeded = unexpectedSuccessHandler; michael@0: request.onsuccess = grabEventAndContinueHandler; michael@0: let event = yield undefined; michael@0: michael@0: let db = event.target.result; michael@0: db.onerror = errorHandler; michael@0: michael@0: let transaction = db.transaction(objectStoreName); michael@0: let objectStore = transaction.objectStore(objectStoreName); michael@0: let index = objectStore.index(indexName); michael@0: michael@0: let data = dbData[0]; michael@0: michael@0: let requestCounter = new RequestCounter(); michael@0: michael@0: objectStore.get(data.foo).onsuccess = requestCounter.handler(); michael@0: objectStore.mozGetAll().onsuccess = requestCounter.handler(); michael@0: objectStore.count().onsuccess = requestCounter.handler(); michael@0: index.get(data.bar).onsuccess = requestCounter.handler(); michael@0: index.mozGetAll().onsuccess = requestCounter.handler(); michael@0: index.getKey(data.bar).onsuccess = requestCounter.handler(); michael@0: index.mozGetAllKeys().onsuccess = requestCounter.handler(); michael@0: index.count().onsuccess = requestCounter.handler(); michael@0: michael@0: let objectStoreDataCount = 0; michael@0: michael@0: request = objectStore.openCursor(); michael@0: request.onsuccess = function(event) { michael@0: let cursor = event.target.result; michael@0: if (cursor) { michael@0: objectStoreDataCount++; michael@0: objectStoreDataCount % 2 ? cursor.continue() : cursor.advance(1); michael@0: } michael@0: else { michael@0: is(objectStoreDataCount, dbData.length, "Saw all data"); michael@0: requestCounter.decr(); michael@0: } michael@0: }; michael@0: requestCounter.incr(); michael@0: michael@0: let indexDataCount = 0; michael@0: michael@0: request = index.openCursor(); michael@0: request.onsuccess = function(event) { michael@0: let cursor = event.target.result; michael@0: if (cursor) { michael@0: indexDataCount++; michael@0: indexDataCount % 2 ? cursor.continue() : cursor.advance(1); michael@0: } michael@0: else { michael@0: is(indexDataCount, dbData.length, "Saw all data"); michael@0: requestCounter.decr(); michael@0: } michael@0: }; michael@0: requestCounter.incr(); michael@0: michael@0: let indexKeyDataCount = 0; michael@0: michael@0: request = index.openCursor(); michael@0: request.onsuccess = function(event) { michael@0: let cursor = event.target.result; michael@0: if (cursor) { michael@0: indexKeyDataCount++; michael@0: indexKeyDataCount % 2 ? cursor.continue() : cursor.advance(1); michael@0: } michael@0: else { michael@0: is(indexKeyDataCount, dbData.length, "Saw all data"); michael@0: requestCounter.decr(); michael@0: } michael@0: }; michael@0: requestCounter.incr(); michael@0: michael@0: // Wait for all requests. michael@0: yield undefined; michael@0: michael@0: transaction.oncomplete = grabEventAndContinueHandler; michael@0: event = yield undefined; michael@0: michael@0: is(event.type, "complete", "Transaction succeeded"); michael@0: michael@0: db.close(); michael@0: } michael@0: michael@0: { // Make sure read operations in readwrite transactions succeed in low disk michael@0: // mode. michael@0: info("Test 11"); michael@0: michael@0: setLowDiskMode(true); michael@0: michael@0: let request = indexedDB.open(dbName, dbVersion); michael@0: request.onerror = errorHandler; michael@0: request.onupgradeneeded = unexpectedSuccessHandler; michael@0: request.onsuccess = grabEventAndContinueHandler; michael@0: let event = yield undefined; michael@0: michael@0: let db = event.target.result; michael@0: db.onerror = errorHandler; michael@0: michael@0: let transaction = db.transaction(objectStoreName, "readwrite"); michael@0: let objectStore = transaction.objectStore(objectStoreName); michael@0: let index = objectStore.index(indexName); michael@0: michael@0: let data = dbData[0]; michael@0: michael@0: let requestCounter = new RequestCounter(); michael@0: michael@0: objectStore.get(data.foo).onsuccess = requestCounter.handler(); michael@0: objectStore.mozGetAll().onsuccess = requestCounter.handler(); michael@0: objectStore.count().onsuccess = requestCounter.handler(); michael@0: index.get(data.bar).onsuccess = requestCounter.handler(); michael@0: index.mozGetAll().onsuccess = requestCounter.handler(); michael@0: index.getKey(data.bar).onsuccess = requestCounter.handler(); michael@0: index.mozGetAllKeys().onsuccess = requestCounter.handler(); michael@0: index.count().onsuccess = requestCounter.handler(); michael@0: michael@0: let objectStoreDataCount = 0; michael@0: michael@0: request = objectStore.openCursor(); michael@0: request.onsuccess = function(event) { michael@0: let cursor = event.target.result; michael@0: if (cursor) { michael@0: objectStoreDataCount++; michael@0: objectStoreDataCount % 2 ? cursor.continue() : cursor.advance(1); michael@0: } michael@0: else { michael@0: is(objectStoreDataCount, dbData.length, "Saw all data"); michael@0: requestCounter.decr(); michael@0: } michael@0: }; michael@0: requestCounter.incr(); michael@0: michael@0: let indexDataCount = 0; michael@0: michael@0: request = index.openCursor(); michael@0: request.onsuccess = function(event) { michael@0: let cursor = event.target.result; michael@0: if (cursor) { michael@0: indexDataCount++; michael@0: indexDataCount % 2 ? cursor.continue() : cursor.advance(1); michael@0: } michael@0: else { michael@0: is(indexDataCount, dbData.length, "Saw all data"); michael@0: requestCounter.decr(); michael@0: } michael@0: }; michael@0: requestCounter.incr(); michael@0: michael@0: let indexKeyDataCount = 0; michael@0: michael@0: request = index.openCursor(); michael@0: request.onsuccess = function(event) { michael@0: let cursor = event.target.result; michael@0: if (cursor) { michael@0: indexKeyDataCount++; michael@0: indexKeyDataCount % 2 ? cursor.continue() : cursor.advance(1); michael@0: } michael@0: else { michael@0: is(indexKeyDataCount, dbData.length, "Saw all data"); michael@0: requestCounter.decr(); michael@0: } michael@0: }; michael@0: requestCounter.incr(); michael@0: michael@0: // Wait for all requests. michael@0: yield undefined; michael@0: michael@0: transaction.oncomplete = grabEventAndContinueHandler; michael@0: event = yield undefined; michael@0: michael@0: is(event.type, "complete", "Transaction succeeded"); michael@0: michael@0: db.close(); michael@0: } michael@0: michael@0: { // Make sure write operations in readwrite transactions fail in low disk michael@0: // mode. michael@0: info("Test 12"); michael@0: michael@0: setLowDiskMode(true); michael@0: michael@0: let request = indexedDB.open(dbName, dbVersion); michael@0: request.onerror = errorHandler; michael@0: request.onupgradeneeded = unexpectedSuccessHandler; michael@0: request.onsuccess = grabEventAndContinueHandler; michael@0: let event = yield undefined; michael@0: michael@0: let db = event.target.result; michael@0: db.onerror = errorHandler; michael@0: michael@0: let transaction = db.transaction(objectStoreName, "readwrite"); michael@0: let objectStore = transaction.objectStore(objectStoreName); michael@0: let index = objectStore.index(indexName); michael@0: michael@0: let data = dbData[0]; michael@0: let newData = { foo: 999, bar: 999 }; michael@0: michael@0: let requestCounter = new RequestCounter(); michael@0: michael@0: objectStore.add(newData).onerror = requestCounter.errorHandler(); michael@0: objectStore.put(newData).onerror = requestCounter.errorHandler(); michael@0: michael@0: objectStore.get(data.foo).onsuccess = requestCounter.handler(); michael@0: objectStore.mozGetAll().onsuccess = requestCounter.handler(); michael@0: objectStore.count().onsuccess = requestCounter.handler(); michael@0: index.get(data.bar).onsuccess = requestCounter.handler(); michael@0: index.mozGetAll().onsuccess = requestCounter.handler(); michael@0: index.getKey(data.bar).onsuccess = requestCounter.handler(); michael@0: index.mozGetAllKeys().onsuccess = requestCounter.handler(); michael@0: index.count().onsuccess = requestCounter.handler(); michael@0: michael@0: let objectStoreDataCount = 0; michael@0: michael@0: request = objectStore.openCursor(); michael@0: request.onsuccess = function(event) { michael@0: let cursor = event.target.result; michael@0: if (cursor) { michael@0: objectStoreDataCount++; michael@0: cursor.update(cursor.value).onerror = requestCounter.errorHandler(); michael@0: objectStoreDataCount % 2 ? cursor.continue() : cursor.advance(1); michael@0: } michael@0: else { michael@0: is(objectStoreDataCount, dbData.length, "Saw all data"); michael@0: requestCounter.decr(); michael@0: } michael@0: }; michael@0: requestCounter.incr(); michael@0: michael@0: let indexDataCount = 0; michael@0: michael@0: request = index.openCursor(); michael@0: request.onsuccess = function(event) { michael@0: let cursor = event.target.result; michael@0: if (cursor) { michael@0: indexDataCount++; michael@0: cursor.update(cursor.value).onerror = requestCounter.errorHandler(); michael@0: indexDataCount % 2 ? cursor.continue() : cursor.advance(1); michael@0: } michael@0: else { michael@0: is(indexDataCount, dbData.length, "Saw all data"); michael@0: requestCounter.decr(); michael@0: } michael@0: }; michael@0: requestCounter.incr(); michael@0: michael@0: let indexKeyDataCount = 0; michael@0: michael@0: request = index.openCursor(); michael@0: request.onsuccess = function(event) { michael@0: let cursor = event.target.result; michael@0: if (cursor) { michael@0: indexKeyDataCount++; michael@0: cursor.update(cursor.value).onerror = requestCounter.errorHandler(); michael@0: indexKeyDataCount % 2 ? cursor.continue() : cursor.advance(1); michael@0: } michael@0: else { michael@0: is(indexKeyDataCount, dbData.length, "Saw all data"); michael@0: requestCounter.decr(); michael@0: } michael@0: }; michael@0: requestCounter.incr(); michael@0: michael@0: // Wait for all requests. michael@0: yield undefined; michael@0: michael@0: transaction.oncomplete = grabEventAndContinueHandler; michael@0: event = yield undefined; michael@0: michael@0: is(event.type, "complete", "Transaction succeeded"); michael@0: michael@0: db.close(); michael@0: } michael@0: michael@0: { // Make sure deleting operations in readwrite transactions succeed in low michael@0: // disk mode. michael@0: info("Test 13"); michael@0: michael@0: setLowDiskMode(true); michael@0: michael@0: let request = indexedDB.open(dbName, dbVersion); michael@0: request.onerror = errorHandler; michael@0: request.onupgradeneeded = unexpectedSuccessHandler; michael@0: request.onsuccess = grabEventAndContinueHandler; michael@0: let event = yield undefined; michael@0: michael@0: let db = event.target.result; michael@0: db.onerror = errorHandler; michael@0: michael@0: let transaction = db.transaction(objectStoreName, "readwrite"); michael@0: let objectStore = transaction.objectStore(objectStoreName); michael@0: let index = objectStore.index(indexName); michael@0: michael@0: let dataIndex = 0; michael@0: let data = dbData[dataIndex++]; michael@0: michael@0: let requestCounter = new RequestCounter(); michael@0: michael@0: objectStore.delete(data.foo).onsuccess = requestCounter.handler(); michael@0: michael@0: objectStore.openCursor().onsuccess = function(event) { michael@0: let cursor = event.target.result; michael@0: if (cursor) { michael@0: cursor.delete().onsuccess = requestCounter.handler(); michael@0: } michael@0: requestCounter.decr(); michael@0: }; michael@0: requestCounter.incr(); michael@0: michael@0: index.openCursor(null, "prev").onsuccess = function(event) { michael@0: let cursor = event.target.result; michael@0: if (cursor) { michael@0: cursor.delete().onsuccess = requestCounter.handler(); michael@0: } michael@0: requestCounter.decr(); michael@0: }; michael@0: requestCounter.incr(); michael@0: michael@0: yield undefined; michael@0: michael@0: objectStore.count().onsuccess = grabEventAndContinueHandler; michael@0: event = yield undefined; michael@0: michael@0: is(event.target.result, dbData.length - 3, "Actually deleted something"); michael@0: michael@0: objectStore.clear(); michael@0: objectStore.count().onsuccess = grabEventAndContinueHandler; michael@0: event = yield undefined; michael@0: michael@0: is(event.target.result, 0, "Actually cleared"); michael@0: michael@0: transaction.oncomplete = grabEventAndContinueHandler; michael@0: event = yield undefined; michael@0: michael@0: is(event.type, "complete", "Transaction succeeded"); michael@0: michael@0: db.close(); michael@0: } michael@0: michael@0: finishTest(); michael@0: yield undefined; michael@0: } michael@0: michael@0: function RequestCounter(expectedType) { michael@0: this._counter = 0; michael@0: } michael@0: RequestCounter.prototype = { michael@0: incr: function() { michael@0: this._counter++; michael@0: }, michael@0: michael@0: decr: function() { michael@0: if (!--this._counter) { michael@0: continueToNextStepSync(); michael@0: } michael@0: }, michael@0: michael@0: handler: function(type, preventDefault) { michael@0: this.incr(); michael@0: return function(event) { michael@0: is(event.type, type || "success", "Correct type"); michael@0: this.decr(); michael@0: }.bind(this); michael@0: }, michael@0: michael@0: errorHandler: function(eventType, errorName) { michael@0: this.incr(); michael@0: return function(event) { michael@0: is(event.type, eventType || "error", "Correct type"); michael@0: is(event.target.error.name, errorName || "QuotaExceededError", michael@0: "Correct error name"); michael@0: event.preventDefault(); michael@0: event.stopPropagation(); michael@0: this.decr(); michael@0: }.bind(this); michael@0: } michael@0: };