1 var jsTestIsAsync = true;
2 if (self.importScripts && !self.postMessage) {
3 // Shared worker. Make postMessage send to the newest client, which in
4 // our tests is the only client.
6 // Store messages for sending until we have somewhere to send them.
7 self.postMessage = function(message)
9 if (typeof self.pendingMessages === "undefined")
10 self.pendingMessages = [];
11 self.pendingMessages.push(message);
13 self.onconnect = function(event)
15 self.postMessage = function(message)
17 event.ports[0].postMessage(message);
19 // Offload any stored messages now that someone has connected to us.
20 if (typeof self.pendingMessages === "undefined")
22 while (self.pendingMessages.length)
23 event.ports[0].postMessage(self.pendingMessages.shift());
27 function removeVendorPrefixes()
29 indexedDB = evalAndLog("indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;");
33 function unexpectedSuccessCallback()
35 testFailed("Success function called unexpectedly.");
39 function unexpectedErrorCallback(event)
41 testFailed("Error function called unexpectedly: (" + event.target.error.name + ") " + event.target.error.message);
45 function unexpectedAbortCallback(e)
47 testFailed("Abort function called unexpectedly! Message: [" + e.target.error.message + "]");
51 function unexpectedCompleteCallback()
53 testFailed("oncomplete function called unexpectedly!");
57 function unexpectedBlockedCallback(e)
59 testFailed("onblocked called unexpectedly. oldVersion = " + e.oldVersion + ", newVersion = " + e.newVersion);
63 function unexpectedUpgradeNeededCallback()
65 testFailed("onupgradeneeded called unexpectedly");
69 function unexpectedVersionChangeCallback(e)
71 testFailed("onversionchange called unexpectedly. oldVersion = " + e.oldVersion + ". newVersion = " + e.newVersion);
75 function evalAndExpectException(cmd, exceptionCode, exceptionName, _quiet)
78 debug("Expecting exception from " + cmd);
81 testFailed("No exception thrown! Should have been " + exceptionCode);
85 testPassed("Exception was thrown.");
86 shouldBe("code", exceptionCode, _quiet);
89 shouldBe("ename", exceptionName, _quiet);
92 debug("Exception message: " + e.message);
96 function evalAndExpectExceptionClass(cmd, expected)
98 debug("Expecting " + expected + " exception from " + cmd);
101 testFailed("No exception thrown!" );
103 testPassed("Exception was thrown.");
104 if (eval("e instanceof " + expected))
105 testPassed(cmd + " threw " + e);
107 testFailed("Expected " + expected + " but saw " + e);
111 function evalAndLogCallback(cmd) {
112 function callback() {
118 // If this function is deleted, a standalone layout test exercising its
119 // functionality should be added.
120 function deleteAllObjectStores(db)
122 while (db.objectStoreNames.length)
123 db.deleteObjectStore(db.objectStoreNames.item(0));
124 debug("Deleted all object stores.");
127 function setDBNameFromPath(suffix) {
128 var name = self.location.pathname.substring(1 + self.location.pathname.lastIndexOf("/"));
131 evalAndLog('dbname = "' + name + '"');
134 function preamble(evt)
139 debug(preamble.caller.name + "():");
143 if (!self.DOMException) {
144 self.DOMException = {
146 DOMSTRING_SIZE_ERR: 2,
147 HIERARCHY_REQUEST_ERR: 3,
148 WRONG_DOCUMENT_ERR: 4,
149 INVALID_CHARACTER_ERR: 5,
150 NO_DATA_ALLOWED_ERR: 6,
151 NO_MODIFICATION_ALLOWED_ERR: 7,
153 NOT_SUPPORTED_ERR: 9,
154 INUSE_ATTRIBUTE_ERR: 10,
155 INVALID_STATE_ERR: 11,
157 INVALID_MODIFICATION_ERR: 13,
159 INVALID_ACCESS_ERR: 15,
161 TYPE_MISMATCH_ERR: 17,
165 URL_MISMATCH_ERR: 21,
166 QUOTA_EXCEEDED_ERR: 22,
168 INVALID_NODE_TYPE_ERR: 24,
173 function indexedDBTest(upgradeCallback, optionalOpenCallback, optionalParameters) {
174 removeVendorPrefixes();
175 if (optionalParameters && 'suffix' in optionalParameters) {
176 setDBNameFromPath(optionalParameters['suffix']);
180 var deleteRequest = evalAndLog("indexedDB.deleteDatabase(dbname)");
181 deleteRequest.onerror = unexpectedErrorCallback;
182 deleteRequest.onblocked = unexpectedBlockedCallback;
183 deleteRequest.onsuccess = function() {
184 self.openRequest = null;
185 if (optionalParameters && 'version' in optionalParameters)
186 openRequest = evalAndLog("indexedDB.open(dbname, " + optionalParameters['version'] + ")");
188 openRequest = evalAndLog("indexedDB.open(dbname)");
189 shouldBe("openRequest.readyState", "'pending'", true/*quiet*/);
190 openRequest.onerror = unexpectedErrorCallback;
191 openRequest.onupgradeneeded = upgradeCallback;
192 openRequest.onblocked = unexpectedBlockedCallback;
193 if (optionalOpenCallback)
194 openRequest.onsuccess = optionalOpenCallback;
195 delete self.openRequest;
196 if (optionalParameters && 'runAfterOpen' in optionalParameters)
197 (optionalParameters['runAfterOpen'])();
201 function waitForRequests(requests, callback) {
202 var count = requests.length;
209 requests.forEach(function(req) {
210 req.onsuccess = function() {
215 req.onerror = unexpectedErrorCallback;