1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/indexedDB/test/exceptions_in_events_iframe.html Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,180 @@ 1.4 +<!-- 1.5 + Any copyright is dedicated to the Public Domain. 1.6 + http://creativecommons.org/publicdomain/zero/1.0/ 1.7 +--> 1.8 +<html> 1.9 +<head> 1.10 + <title>Indexed Database Property Test</title> 1.11 + 1.12 + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> 1.13 + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 1.14 + 1.15 + <script type="text/javascript;version=1.7"> 1.16 + let testGenerator = testSteps(); 1.17 + 1.18 + function ok(val, message) { 1.19 + val = val ? "true" : "false"; 1.20 + window.parent.postMessage("SimpleTest.ok(" + val + ", '" + message + 1.21 + "');", "*"); 1.22 + } 1.23 + 1.24 + function is(a, b, message) { 1.25 + ok(a == b, message); 1.26 + } 1.27 + 1.28 + function grabEventAndContinueHandler(event) { 1.29 + testGenerator.send(event); 1.30 + } 1.31 + 1.32 + function errorHandler(event) { 1.33 + ok(false, "indexedDB error, code " + event.target.error.name); 1.34 + finishTest(); 1.35 + } 1.36 + 1.37 + function unexpectedSuccessHandler(event) { 1.38 + ok(false, "got success when it was not expected!"); 1.39 + finishTest(); 1.40 + } 1.41 + 1.42 + function finishTest() { 1.43 + // Let window.onerror have a chance to fire 1.44 + setTimeout(function() { 1.45 + setTimeout(function() { 1.46 + testGenerator.close(); 1.47 + window.parent.postMessage("SimpleTest.finish();", "*"); 1.48 + }, 0); 1.49 + }, 0); 1.50 + } 1.51 + 1.52 + window.onerror = function() { 1.53 + return false; 1.54 + }; 1.55 + 1.56 + function testSteps() { 1.57 + // Test 1: Throwing an exception in an upgradeneeded handler should 1.58 + // abort the versionchange transaction and fire an error at the request. 1.59 + let request = indexedDB.open(window.location.pathname, 1); 1.60 + request.onerror = errorHandler; 1.61 + request.onsuccess = unexpectedSuccessHandler; 1.62 + request.onupgradeneeded = function () { 1.63 + let transaction = request.transaction; 1.64 + transaction.oncomplete = unexpectedSuccessHandler; 1.65 + transaction.onabort = grabEventAndContinueHandler 1.66 + throw "STOP"; 1.67 + }; 1.68 + 1.69 + let event = yield undefined; 1.70 + is(event.type, "abort", 1.71 + "Throwing during an upgradeneeded event should abort the transaction."); 1.72 + is(event.target.error.name, "AbortError", "Got AbortError object"); 1.73 + 1.74 + request.onerror = grabEventAndContinueHandler; 1.75 + event = yield undefined; 1.76 + 1.77 + is(event.type, "error", 1.78 + "Throwing during an upgradeneeded event should fire an error."); 1.79 + 1.80 + // Test 2: Throwing during a request's success handler should abort the 1.81 + // transaction. 1.82 + let request = indexedDB.open(window.location.pathname, 1); 1.83 + request.onerror = errorHandler; 1.84 + request.onblocked = errorHandler; 1.85 + request.onupgradeneeded = grabEventAndContinueHandler; 1.86 + request.onsuccess = unexpectedSuccessHandler; 1.87 + let openrequest = request; 1.88 + let event = yield undefined; 1.89 + 1.90 + request.onupgradeneeded = unexpectedSuccessHandler; 1.91 + 1.92 + let db = event.target.result; 1.93 + db.onerror = function(event) { 1.94 + event.preventDefault(); 1.95 + }; 1.96 + 1.97 + event.target.transaction.oncomplete = unexpectedSuccessHandler; 1.98 + event.target.transaction.onabort = grabEventAndContinueHandler; 1.99 + 1.100 + is(db.version, 1, "Correct version"); 1.101 + is(db.objectStoreNames.length, 0, "Correct objectStoreNames length"); 1.102 + 1.103 + let objectStore = db.createObjectStore("foo"); 1.104 + 1.105 + is(db.objectStoreNames.length, 1, "Correct objectStoreNames length"); 1.106 + ok(db.objectStoreNames.contains("foo"), "Has correct objectStore"); 1.107 + 1.108 + request = objectStore.add({}, 1); 1.109 + request.onsuccess = function(event) { 1.110 + throw "foo"; 1.111 + }; 1.112 + 1.113 + event = yield undefined; 1.114 + 1.115 + is(event.type, "abort", "Got transaction abort event"); 1.116 + is(event.target.error.name, "AbortError", "Got AbortError object"); 1.117 + openrequest.onerror = grabEventAndContinueHandler; 1.118 + 1.119 + event = yield undefined; 1.120 + 1.121 + is(event.type, "error", "Got IDBOpenDBRequest error event"); 1.122 + is(event.target, openrequest, "Right event target"); 1.123 + is(event.target.error.name, "AbortError", "Right error name"); 1.124 + 1.125 + // Test 3: Throwing during a request's error handler should abort the 1.126 + // transaction, even if preventDefault is called on the error event. 1.127 + let request = indexedDB.open(window.location.pathname, 1); 1.128 + request.onerror = errorHandler; 1.129 + request.onblocked = errorHandler; 1.130 + request.onupgradeneeded = grabEventAndContinueHandler; 1.131 + request.onsuccess = unexpectedSuccessHandler; 1.132 + let openrequest = request; 1.133 + let event = yield undefined; 1.134 + 1.135 + request.onupgradeneeded = unexpectedSuccessHandler; 1.136 + 1.137 + let db = event.target.result; 1.138 + db.onerror = function(event) { 1.139 + event.preventDefault(); 1.140 + }; 1.141 + 1.142 + event.target.transaction.oncomplete = unexpectedSuccessHandler; 1.143 + event.target.transaction.onabort = grabEventAndContinueHandler; 1.144 + 1.145 + is(db.version, 1, "Correct version"); 1.146 + is(db.objectStoreNames.length, 0, "Correct objectStoreNames length"); 1.147 + 1.148 + let objectStore = db.createObjectStore("foo"); 1.149 + 1.150 + is(db.objectStoreNames.length, 1, "Correct objectStoreNames length"); 1.151 + ok(db.objectStoreNames.contains("foo"), "Has correct objectStore"); 1.152 + 1.153 + request = objectStore.add({}, 1); 1.154 + request.onerror = errorHandler; 1.155 + request = objectStore.add({}, 1); 1.156 + request.onsuccess = unexpectedSuccessHandler; 1.157 + request.onerror = function (event) { 1.158 + event.preventDefault(); 1.159 + throw "STOP"; 1.160 + }; 1.161 + 1.162 + event = yield undefined; 1.163 + 1.164 + is(event.type, "abort", "Got transaction abort event"); 1.165 + is(event.target.error.name, "AbortError", "Got AbortError object"); 1.166 + openrequest.onerror = grabEventAndContinueHandler; 1.167 + 1.168 + event = yield undefined; 1.169 + 1.170 + is(event.type, "error", "Got IDBOpenDBRequest error event"); 1.171 + is(event.target, openrequest, "Right event target"); 1.172 + is(event.target.error.name, "AbortError", "Right error name"); 1.173 + 1.174 + finishTest(); 1.175 + yield undefined; 1.176 + } 1.177 + </script> 1.178 + 1.179 +</head> 1.180 + 1.181 +<body onload="testGenerator.next();"></body> 1.182 + 1.183 +</html>