blob: b00a69a2ea8afb13484e0c78efd8fbc59f4452d4 [file] [log] [blame]
<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>