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: michael@0: var testGenerator = testSteps(); michael@0: michael@0: function testSteps() michael@0: { michael@0: const name = this.window ? window.location.pathname : "Splendid Test"; michael@0: michael@0: // Open a datbase for the first time. michael@0: let request = indexedDB.open(name, 1); michael@0: michael@0: // Sanity checks michael@0: ok(request instanceof IDBRequest, "Request should be an IDBRequest"); michael@0: ok(request instanceof IDBOpenDBRequest, "Request should be an IDBOpenDBRequest"); michael@0: //ok(request instanceof EventTarget, "Request should be an EventTarget"); michael@0: is(request.source, null, "Request should have no source"); michael@0: try { michael@0: request.result; michael@0: ok(false, "Getter should have thrown!"); michael@0: } catch (e if e.result == 0x80660006 /* NS_ERROR_DOM_INDEXEDDB_NOTALLOWED_ERR */) { michael@0: ok(true, "Getter threw the right exception"); michael@0: } michael@0: michael@0: request.onerror = errorHandler; michael@0: request.onsuccess = grabEventAndContinueHandler; michael@0: let event = yield undefined; michael@0: michael@0: let versionChangeEventCount = 0; michael@0: let db1, db2, db3; michael@0: michael@0: db1 = event.target.result; michael@0: db1.addEventListener("versionchange", function(event) { michael@0: ok(true, "Got version change event"); michael@0: ok(event instanceof IDBVersionChangeEvent, "Event is of the right type"); michael@0: is(event.target.source, null, "Correct source"); michael@0: is(event.target, db1, "Correct target"); michael@0: is(event.target.version, 1, "Correct db version"); michael@0: is(event.oldVersion, 1, "Correct event oldVersion"); michael@0: is(event.newVersion, 2, "Correct event newVersion"); michael@0: is(versionChangeEventCount++, 0, "Correct count"); michael@0: db1.close(); michael@0: }, false); michael@0: michael@0: // Open the database again and trigger an upgrade that should succeed michael@0: request = indexedDB.open(name, 2); michael@0: request.onerror = errorHandler; michael@0: request.onsuccess = errorHandler; michael@0: request.onupgradeneeded = grabEventAndContinueHandler; michael@0: if (SpecialPowers.isMainProcess()) { michael@0: request.onblocked = errorHandler; michael@0: } michael@0: else { michael@0: todo(false, "Need to fix blocked events in child processes!"); michael@0: } michael@0: event = yield undefined; michael@0: michael@0: // Test the upgradeneeded event. michael@0: ok(event instanceof IDBVersionChangeEvent, "Event is of the right type"); michael@0: ok(event.target.result instanceof IDBDatabase, "Good result"); michael@0: db2 = event.target.result; michael@0: is(event.target.transaction.mode, "versionchange", michael@0: "Correct mode"); michael@0: is(db2.version, 2, "Correct db version"); michael@0: is(event.oldVersion, 1, "Correct event oldVersion"); michael@0: is(event.newVersion, 2, "Correct event newVersion"); michael@0: michael@0: request.onupgradeneeded = errorHandler; michael@0: request.onsuccess = grabEventAndContinueHandler; michael@0: event = yield undefined; michael@0: michael@0: db2.addEventListener("versionchange", function(event) { michael@0: ok(true, "Got version change event"); michael@0: ok(event instanceof IDBVersionChangeEvent, "Event is of the right type"); michael@0: is(event.target.source, null, "Correct source"); michael@0: is(event.target, db2, "Correct target"); michael@0: is(event.target.version, 2, "Correct db version"); michael@0: is(event.oldVersion, 2, "Correct event oldVersion"); michael@0: is(event.newVersion, 3, "Correct event newVersion"); michael@0: is(versionChangeEventCount++, 1, "Correct count"); michael@0: }, false); michael@0: michael@0: // Test opening the existing version again michael@0: request = indexedDB.open(name, 2); michael@0: request.onerror = errorHandler; michael@0: request.onsuccess = grabEventAndContinueHandler; michael@0: if (SpecialPowers.isMainProcess()) { michael@0: request.onblocked = errorHandler; michael@0: } michael@0: else { michael@0: todo(false, "Need to fix blocked events in child processes!"); michael@0: } michael@0: event = yield undefined; michael@0: michael@0: db3 = event.target.result; michael@0: michael@0: // Test an upgrade that should fail michael@0: request = indexedDB.open(name, 3); michael@0: request.onerror = errorHandler; michael@0: request.onsuccess = errorHandler; michael@0: request.onupgradeneeded = errorHandler; michael@0: request.onblocked = grabEventAndContinueHandler; michael@0: michael@0: event = yield undefined; michael@0: ok(true, "Got version change blocked event"); michael@0: ok(event instanceof IDBVersionChangeEvent, "Event is of the right type"); michael@0: is(event.target.source, null, "Correct source"); michael@0: is(event.target.transaction, null, "Correct transaction"); michael@0: is(event.target, request, "Correct target"); michael@0: is(db3.version, 2, "Correct db version"); michael@0: is(event.oldVersion, 2, "Correct event oldVersion"); michael@0: is(event.newVersion, 3, "Correct event newVersion"); michael@0: versionChangeEventCount++; michael@0: db2.close(); michael@0: db3.close(); michael@0: michael@0: request.onupgradeneeded = grabEventAndContinueHandler; michael@0: request.onsuccess = grabEventAndContinueHandler; michael@0: michael@0: event = yield undefined; michael@0: event = yield undefined; michael@0: michael@0: db3 = event.target.result; michael@0: db3.close(); michael@0: michael@0: // Test another upgrade that should succeed. michael@0: request = indexedDB.open(name, 4); michael@0: request.onerror = errorHandler; michael@0: request.onsuccess = errorHandler; michael@0: request.onupgradeneeded = grabEventAndContinueHandler; michael@0: if (SpecialPowers.isMainProcess()) { michael@0: request.onblocked = errorHandler; michael@0: } michael@0: else { michael@0: todo(false, "Need to fix blocked events in child processes!"); michael@0: } michael@0: michael@0: event = yield undefined; michael@0: michael@0: ok(event instanceof IDBVersionChangeEvent, "Event is of the right type"); michael@0: ok(event.target.result instanceof IDBDatabase, "Good result"); michael@0: is(event.target.transaction.mode, "versionchange", michael@0: "Correct mode"); michael@0: is(event.oldVersion, 3, "Correct event oldVersion"); michael@0: is(event.newVersion, 4, "Correct event newVersion"); michael@0: michael@0: request.onsuccess = grabEventAndContinueHandler; michael@0: michael@0: event = yield undefined; michael@0: ok(event.target.result instanceof IDBDatabase, "Expect a database here"); michael@0: is(event.target.result.version, 4, "Right version"); michael@0: is(db3.version, 3, "After closing the version should not change!"); michael@0: is(db2.version, 2, "After closing the version should not change!"); michael@0: is(db1.version, 1, "After closing the version should not change!"); michael@0: michael@0: is(versionChangeEventCount, 3, "Saw all expected events"); michael@0: michael@0: event = new IDBVersionChangeEvent("versionchange"); michael@0: ok(event, "Should be able to create an event with just passing in the type"); michael@0: event = new IDBVersionChangeEvent("versionchange", {oldVersion: 1}); michael@0: ok(event, "Should be able to create an event with just the old version"); michael@0: is(event.oldVersion, 1, "Correct old version"); michael@0: is(event.newVersion, null, "Correct new version"); michael@0: event = new IDBVersionChangeEvent("versionchange", {newVersion: 1}); michael@0: ok(event, "Should be able to create an event with just the new version"); michael@0: is(event.oldVersion, 0, "Correct old version"); michael@0: is(event.newVersion, 1, "Correct new version"); michael@0: event = new IDBVersionChangeEvent("versionchange", {oldVersion: 1, newVersion: 2}); michael@0: ok(event, "Should be able to create an event with both versions"); michael@0: is(event.oldVersion, 1, "Correct old version"); michael@0: is(event.newVersion, 2, "Correct new version"); michael@0: michael@0: finishTest(); michael@0: yield undefined; michael@0: } michael@0: