1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 function test() 6 { 7 indexedDBTest(prepareDatabase, testUnderLimit); 8 } 9 10 function prepareDatabase() 11 { 12 db = event.target.result; 13 debug('Creating object store'); 14 var store = db.createObjectStore('store'); 15 store.put("FIRST!!!111!", -Infinity); 16 } 17 18 function repeat(string, len) 19 { 20 return Array(len + 1).join(string); 21 } 22 23 var SEED = "\u0100"; // Encodes to 2 byte in UTF-8 and UTF-16 24 var BYTES_PER_CHAR = 2; 25 var CHARS_PER_MB = 1024 * 1024 / BYTES_PER_CHAR; 26 var SLOP = 1024; 27 var LIMIT_MB = 64; 28 var key = 0; 29 var value; 30 31 function testUnderLimit() 32 { 33 debug(""); 34 debug('Creating test value under limit'); 35 var underLimit; 36 setTimeout( 37 function () { 38 value = repeat(SEED, LIMIT_MB * CHARS_PER_MB - SLOP); // Just under limit 39 underLimit = value; 40 setTimeout(doStore, 0); 41 }, 0); 42 43 function doStore() { 44 var transaction = db.transaction("store", 'readwrite'); 45 var store = transaction.objectStore("store"); 46 var request; 47 48 debug("store.add underLimit"); 49 request = store.add(underLimit, key++); 50 request.onerror = unexpectedErrorCallback; 51 request.onsuccess = function () { 52 debug("store.add succeeded"); 53 storeAddSucceeded = true; 54 55 debug("store.put underLimit"); 56 request = store.put(underLimit, key++); 57 request.onerror = unexpectedErrorCallback; 58 request.onsuccess = function () { 59 debug("store.put succeeded"); 60 storePutSucceeded = true; 61 62 debug("cursor.update underLimit"); 63 request = store.openCursor(); 64 request.onerror = unexpectedErrorCallback; 65 request.onsuccess = function () { 66 var cursor = request.result; 67 request = cursor.update(underLimit); 68 request.onerror = unexpectedErrorCallback; 69 request.onsuccess = function () { 70 debug("cursor.update succeeded"); 71 cursorUpdateSucceeded = true; 72 73 transaction.abort(); 74 }; 75 }; 76 }; 77 }; 78 79 transaction.oncomplete = unexpectedCompleteCallback; 80 transaction.onabort = function() { 81 shouldBeTrue("storeAddSucceeded"); 82 shouldBeTrue("storePutSucceeded"); 83 shouldBeTrue("cursorUpdateSucceeded"); 84 testOverLimit(); 85 }; 86 } 87 } 88 89 function testOverLimit() 90 { 91 debug(""); 92 debug('Creating test value over limit'); 93 var overLimit; 94 setTimeout( 95 function () { 96 overLimit = value + repeat(SEED, SLOP * 2); 97 setTimeout(doStore, 0); 98 }, 0); 99 100 function doStore() { 101 var transaction = db.transaction("store", 'readwrite'); 102 var store = transaction.objectStore("store"); 103 var request; 104 105 debug("store.add overLimit"); 106 request = store.add(overLimit, key++); 107 request.onsuccess = unexpectedSuccessCallback; 108 request.onerror = function (e) { 109 debug("store.add failed: " + e.target.webkitErrorMessage); 110 storeAddFailed = true; 111 e.preventDefault(); 112 113 debug("store.put overLimit"); 114 request = store.put(overLimit, key++); 115 request.onsuccess = unexpectedSuccessCallback; 116 request.onerror = function (e) { 117 debug("store.put failed: " + e.target.webkitErrorMessage); 118 storePutFailed = true; 119 e.preventDefault(); 120 121 debug("cursor.update overLimit"); 122 request = store.openCursor(); 123 request.onerror = unexpectedErrorCallback; 124 request.onsuccess = function () { 125 var cursor = request.result; 126 request = cursor.update(overLimit); 127 request.onsuccess = unexpectedSuccessCallback; 128 request.onerror = function (e) { 129 debug("cursor.update failed: " + e.target.webkitErrorMessage); 130 cursorUpdateFailed = true; 131 }; 132 }; 133 }; 134 }; 135 136 transaction.oncomplete = unexpectedCompleteCallback; 137 transaction.onabort = function() { 138 shouldBeTrue("storeAddFailed"); 139 shouldBeTrue("storePutFailed"); 140 shouldBeTrue("cursorUpdateFailed"); 141 done(); 142 }; 143 } 144 } 145