3 <script src="../../fast/js/resources/js-test-pre.js"></script>
\r
4 <script src="resources/shared.js"></script>
\r
7 <p id="description"></p>
\r
8 <div id="console"></div>
\r
11 description("4 open connections try to setVersion at the same time. 3 connections eventually close, allowing 1 setVersion call to proceed.");
\r
12 if (window.layoutTestController)
\r
13 layoutTestController.waitUntilDone();
\r
18 if ('webkitIndexedDB' in window)
\r
19 IndexedDB = webkitIndexedDB;
\r
20 else if ('mozIndexedDB' in window)
\r
21 IndexedDB = mozIndexedDB;
\r
22 shouldBeFalse("IndexedDB == null");
\r
26 function openDBConnection()
\r
28 result = evalAndLog("IndexedDB.open('set-version-queue')");
\r
29 result.onsuccess = openSuccess;
\r
30 result.onerror = unexpectedErrorCallback;
\r
33 function openSuccess()
\r
35 connection = event.target.result;
\r
36 connection.onversionchange = generateVersionChangeHandler();
\r
37 connections.push(connection);
\r
38 if (connections.length < 4)
\r
41 request = evalAndLog("connections[0].setVersion('version 0')");
\r
42 request.onerror = function(event){ connectionError(event, 0) };
\r
43 request.onsuccess = unexpectedSuccessCallback;
\r
44 request.onblocked = blocked0;
\r
45 request1 = evalAndLog("connections[1].setVersion('version 1')");
\r
46 request1.onerror = unexpectedErrorCallback;
\r
47 request1.onsuccess = inSetVersion1;
\r
48 request1.onblocked = blocked1;
\r
49 request2 = evalAndLog("connections[2].setVersion('version 2')");
\r
50 request2.onerror = function(event){ connectionError(event, 2) };
\r
51 request2.onsuccess = unexpectedSuccessCallback;
\r
52 request2.onblocked = blocked2;
\r
53 request3 = evalAndLog("connections[3].setVersion('version 3')");
\r
54 request3.onerror = function(event){ connectionError(event, 3) };
\r
55 request3.onsuccess = unexpectedSuccessCallback;
\r
56 request3.onblocked = blocked3;
\r
61 function generateVersionChangeHandler()
\r
63 var connectionNum = connections.length;
\r
64 return function(event)
\r
66 shouldBeTrue("event.version.length > 0");
\r
67 debug("connection[" + connectionNum + "] received versionChangeEvent: " + event.version);
\r
71 blocked0fired = false;
\r
72 blocked2fired = false;
\r
73 function blocked0(event)
\r
76 testPassed("connection[0] got blocked event");
\r
77 shouldBeEqualToString("event.version", "version 0");
\r
78 debug("Close the connection that received the block event:");
\r
79 evalAndLog("connections[0].close()");
\r
80 debug("Close another connection as well, to test 4.7.4-note:");
\r
81 evalAndLog("connections[3].close()");
\r
82 evalAndLog("blocked0fired = true");
\r
86 function blocked1(event)
\r
89 testPassed("connection[1] got blocked event");
\r
90 debug("Ensure that this blocked event is in order:");
\r
91 shouldBeTrue("blocked0fired");
\r
92 shouldBeFalse("blocked2fired");
\r
96 function blocked2(event)
\r
99 testPassed("connection[2] got blocked event");
\r
100 shouldBeEqualToString("event.version", "version 2");
\r
101 evalAndLog("connections[2].close()");
\r
102 evalAndLog("blocked2fired = true");
\r
106 function blocked3(event)
\r
109 testPassed("connection[3] got blocked event");
\r
110 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.");
\r
111 shouldBeEqualToString("event.version", "version 3");
\r
114 function connectionError(event, connectionId)
\r
117 testPassed("connection[" + connectionId + "] got error event");
\r
118 shouldBe("event.target.errorCode", "13")
\r
119 if ('webkitIndexedDB' in window) {
\r
120 shouldBe("event.target.webkitErrorMessage.length > 0", "true");
\r
121 debug(event.target.webkitErrorMessage);
\r
125 function inSetVersion1(event)
\r
128 testPassed("connection[1] got into SetVersion");
\r