<html> <head> <link rel="stylesheet" href="../../fast/js/resources/js-test-style.css"> <script src="../../fast/js/resources/js-test-pre.js"></script> <script src="../../fast/js/resources/js-test-post-function.js"></script> <script src="resources/shared.js"></script> </head> <body> <p id="description"></p> <div id="console"></div> <script> description("4 open connections try to setVersion at the same time. 3 connections eventually close, allowing 1 setVersion call to proceed."); if (window.layoutTestController) layoutTestController.waitUntilDone(); connections = [] function test() { if ('webkitIndexedDB' in window) IndexedDB = webkitIndexedDB; else if ('mozIndexedDB' in window) IndexedDB = mozIndexedDB; shouldBeFalse("IndexedDB == null"); openDBConnection(); } function openDBConnection() { result = evalAndLog("IndexedDB.open('set-version-queue')"); result.onsuccess = openSuccess; result.onerror = unexpectedErrorCallback; } function openSuccess() { connection = event.target.result; connection.onversionchange = generateVersionChangeHandler(); connections.push(connection); if (connections.length < 4) openDBConnection(); else { request = evalAndLog("connections[0].setVersion('version 0')"); request.onerror = function(event){ connectionError(event, 0) }; request.onsuccess = unexpectedSuccessCallback; request.onblocked = blocked0; request1 = evalAndLog("connections[1].setVersion('version 1')"); request1.onerror = unexpectedErrorCallback; request1.onsuccess = inSetVersion1; request1.onblocked = blocked1; request2 = evalAndLog("connections[2].setVersion('version 2')"); request2.onerror = function(event){ connectionError(event, 2) }; request2.onsuccess = unexpectedSuccessCallback; request2.onblocked = blocked2; request3 = evalAndLog("connections[3].setVersion('version 3')"); request3.onerror = function(event){ connectionError(event, 3) }; request3.onsuccess = unexpectedSuccessCallback; request3.onblocked = blocked3; debug(""); } } function generateVersionChangeHandler() { var connectionNum = connections.length; return function(event) { shouldBeTrue("event.version.length > 0"); debug("connection[" + connectionNum + "] received versionChangeEvent: " + event.version); } } blocked0fired = false; blocked2fired = false; function blocked0(event) { debug(""); testPassed("connection[0] got blocked event"); shouldBeEqualToString("event.version", "version 0"); debug("Close the connection that received the block event:"); evalAndLog("connections[0].close()"); debug("Close another connection as well, to test 4.7.4-note:"); evalAndLog("connections[3].close()"); evalAndLog("blocked0fired = true"); debug(""); } function blocked1(event) { debug("") testPassed("connection[1] got blocked event"); debug("Ensure that this blocked event is in order:"); shouldBeTrue("blocked0fired"); shouldBeFalse("blocked2fired"); debug("") } function blocked2(event) { debug("") testPassed("connection[2] got blocked event"); shouldBeEqualToString("event.version", "version 2"); evalAndLog("connections[2].close()"); evalAndLog("blocked2fired = true"); debug("") } function blocked3(event) { debug("") testPassed("connection[3] got blocked event"); debug("Note: This means that a connection can receive a blocked event after its close() method has been called. Spec is silent on the issue and this is easiest to implement."); shouldBeEqualToString("event.version", "version 3"); } function connectionError(event, connectionId) { debug("") testPassed("connection[" + connectionId + "] got error event"); shouldBe("event.target.errorCode", "13") if ('webkitIndexedDB' in window) { shouldBe("event.target.webkitErrorMessage.length > 0", "true"); debug(event.target.webkitErrorMessage); } } function inSetVersion1(event) { debug("") testPassed("connection[1] got into SetVersion"); done(); } var successfullyParsed = true; test(); </script> </body> </html>