1<html> 2<head> 3<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css"> 4<script src="../../fast/js/resources/js-test-pre.js"></script> 5<script src="../../fast/js/resources/js-test-post-function.js"></script> 6<script src="resources/shared.js"></script> 7</head> 8<body> 9<p id="description"></p> 10<div id="console"></div> 11<script> 12 13description("4 open connections try to setVersion at the same time. 3 connections eventually close, allowing 1 setVersion call to proceed."); 14if (window.layoutTestController) 15 layoutTestController.waitUntilDone(); 16 17connections = [] 18function test() 19{ 20 if ('webkitIndexedDB' in window) 21 IndexedDB = webkitIndexedDB; 22 else if ('mozIndexedDB' in window) 23 IndexedDB = mozIndexedDB; 24 shouldBeFalse("IndexedDB == null"); 25 openDBConnection(); 26} 27 28function openDBConnection() 29{ 30 result = evalAndLog("IndexedDB.open('set-version-queue')"); 31 result.onsuccess = openSuccess; 32 result.onerror = unexpectedErrorCallback; 33} 34 35function openSuccess() 36{ 37 connection = event.target.result; 38 connection.onversionchange = generateVersionChangeHandler(); 39 connections.push(connection); 40 if (connections.length < 4) 41 openDBConnection(); 42 else { 43 request = evalAndLog("connections[0].setVersion('version 0')"); 44 request.onerror = function(event){ connectionError(event, 0) }; 45 request.onsuccess = unexpectedSuccessCallback; 46 request.onblocked = blocked0; 47 request1 = evalAndLog("connections[1].setVersion('version 1')"); 48 request1.onerror = unexpectedErrorCallback; 49 request1.onsuccess = inSetVersion1; 50 request1.onblocked = blocked1; 51 request2 = evalAndLog("connections[2].setVersion('version 2')"); 52 request2.onerror = function(event){ connectionError(event, 2) }; 53 request2.onsuccess = unexpectedSuccessCallback; 54 request2.onblocked = blocked2; 55 request3 = evalAndLog("connections[3].setVersion('version 3')"); 56 request3.onerror = function(event){ connectionError(event, 3) }; 57 request3.onsuccess = unexpectedSuccessCallback; 58 request3.onblocked = blocked3; 59 debug(""); 60 } 61} 62 63function generateVersionChangeHandler() 64{ 65 var connectionNum = connections.length; 66 return function(event) 67 { 68 shouldBeTrue("event.version.length > 0"); 69 debug("connection[" + connectionNum + "] received versionChangeEvent: " + event.version); 70 } 71} 72 73blocked0fired = false; 74blocked2fired = false; 75function blocked0(event) 76{ 77 debug(""); 78 testPassed("connection[0] got blocked event"); 79 shouldBeEqualToString("event.version", "version 0"); 80 debug("Close the connection that received the block event:"); 81 evalAndLog("connections[0].close()"); 82 debug("Close another connection as well, to test 4.7.4-note:"); 83 evalAndLog("connections[3].close()"); 84 evalAndLog("blocked0fired = true"); 85 debug(""); 86} 87 88function blocked1(event) 89{ 90 debug("") 91 testPassed("connection[1] got blocked event"); 92 debug("Ensure that this blocked event is in order:"); 93 shouldBeTrue("blocked0fired"); 94 shouldBeFalse("blocked2fired"); 95 debug("") 96} 97 98function blocked2(event) 99{ 100 debug("") 101 testPassed("connection[2] got blocked event"); 102 shouldBeEqualToString("event.version", "version 2"); 103 evalAndLog("connections[2].close()"); 104 evalAndLog("blocked2fired = true"); 105 debug("") 106} 107 108function blocked3(event) 109{ 110 debug("") 111 testPassed("connection[3] got blocked event"); 112 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."); 113 shouldBeEqualToString("event.version", "version 3"); 114} 115 116function connectionError(event, connectionId) 117{ 118 debug("") 119 testPassed("connection[" + connectionId + "] got error event"); 120 shouldBe("event.target.errorCode", "13") 121 if ('webkitIndexedDB' in window) { 122 shouldBe("event.target.webkitErrorMessage.length > 0", "true"); 123 debug(event.target.webkitErrorMessage); 124 } 125} 126 127function inSetVersion1(event) 128{ 129 debug("") 130 testPassed("connection[1] got into SetVersion"); 131 done(); 132} 133 134var successfullyParsed = true; 135 136test(); 137 138</script> 139</body> 140</html> 141