| <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> |