test_maximal_serialized_object_size.js (2830B)
1 /** 2 * Any copyright is dedicated to the Public Domain. 3 * http://creativecommons.org/publicdomain/zero/1.0/ 4 */ 5 6 /* exported testGenerator, disableWorkerTest */ 7 var disableWorkerTest = "Need a way to set temporary prefs from a worker"; 8 9 var testGenerator = testSteps(); 10 11 function* testSteps() { 12 const name = this.window 13 ? window.location.pathname 14 : "test_maximal_serialized_object_size.js"; 15 const megaBytes = 1024 * 1024; 16 const kMessageOverhead = 1; // in MB 17 const kMaxIpcMessageSize = 20; // in MB 18 const kMaxIdbMessageSize = kMaxIpcMessageSize - kMessageOverhead; 19 20 let chunks = new Array(kMaxIdbMessageSize); 21 for (let i = 0; i < kMaxIdbMessageSize; i++) { 22 chunks[i] = new ArrayBuffer(1 * megaBytes); 23 } 24 25 if (this.window) { 26 SpecialPowers.pushPrefEnv( 27 { 28 set: [ 29 [ 30 "dom.indexedDB.maxSerializedMsgSize", 31 kMaxIpcMessageSize * megaBytes, 32 ], 33 ], 34 }, 35 continueToNextStep 36 ); 37 yield undefined; 38 } else { 39 setMaxSerializedMsgSize(kMaxIpcMessageSize * megaBytes); 40 } 41 42 let openRequest = indexedDB.open(name, 1); 43 openRequest.onerror = errorHandler; 44 openRequest.onupgradeneeded = grabEventAndContinueHandler; 45 openRequest.onsuccess = unexpectedSuccessHandler; 46 let event = yield undefined; 47 48 let db = event.target.result; 49 50 is(db.objectStoreNames.length, 0, "Correct objectStoreNames list"); 51 52 let objectStore = db.createObjectStore("test store", { keyPath: "id" }); 53 is(db.objectStoreNames.length, 1, "Correct objectStoreNames list"); 54 is( 55 db.objectStoreNames.item(0), 56 objectStore.name, 57 "Correct object store name" 58 ); 59 60 function testTooLargeError(aOperation, aObject) { 61 try { 62 objectStore[aOperation](aObject).onerror = errorHandler; 63 ok(false, "UnknownError is expected to be thrown!"); 64 } catch (e) { 65 ok(e instanceof DOMException, "got a DOM exception"); 66 is(e.name, "UnknownError", "correct error"); 67 ok(!!e.message, "Error message: " + e.message); 68 ok( 69 e.message.startsWith( 70 `IDBObjectStore.${aOperation}: The serialized value is too large` 71 ), 72 "Correct error message prefix." 73 ); 74 } 75 } 76 77 info("Verify IDBObjectStore.add() - object key is too large"); 78 testTooLargeError("add", { id: chunks }); 79 80 objectStore.createIndex("index name", "index"); 81 ok(objectStore.index("index name"), "Index created."); 82 83 info("Verify IDBObjectStore.add() - index key is too large"); 84 testTooLargeError("add", { id: 2, index: chunks }); 85 86 info("Verify IDBObjectStore.add() - object key and index key are too large"); 87 let indexChunks = chunks.splice(0, 10); 88 testTooLargeError("add", { id: chunks, index: indexChunks }); 89 90 openRequest.onsuccess = continueToNextStep; 91 yield undefined; 92 93 db.close(); 94 95 finishTest(); 96 }