test_maximal_structured_clone_size.js (2609B)
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_structured_clone_size.js"; 15 const megaBytes = 1024 * 1024; 16 const kMaxIdbMessageSize = 20; // in MB 17 18 let chunks = new Array(kMaxIdbMessageSize); 19 for (let i = 0; i < kMaxIdbMessageSize; i++) { 20 chunks[i] = new ArrayBuffer(1 * megaBytes); 21 } 22 23 if (this.window) { 24 SpecialPowers.pushPrefEnv( 25 { 26 set: [ 27 [ 28 "dom.indexedDB.maxStructuredCloneSize", 29 kMaxIdbMessageSize * megaBytes, 30 ], 31 ], 32 }, 33 continueToNextStep 34 ); 35 yield undefined; 36 } else { 37 setMaxStructuredCloneSize(kMaxIdbMessageSize * megaBytes); 38 } 39 40 let openRequest = indexedDB.open(name, 1); 41 openRequest.onerror = errorHandler; 42 openRequest.onupgradeneeded = grabEventAndContinueHandler; 43 openRequest.onsuccess = unexpectedSuccessHandler; 44 let event = yield undefined; 45 46 let db = event.target.result; 47 48 is(db.objectStoreNames.length, 0, "Correct objectStoreNames list"); 49 50 let objectStore = db.createObjectStore("test store", { keyPath: "id" }); 51 is(db.objectStoreNames.length, 1, "Correct objectStoreNames list"); 52 is( 53 db.objectStoreNames.item(0), 54 objectStore.name, 55 "Correct object store name" 56 ); 57 58 function testTooLargeError(aOperation, aObject) { 59 try { 60 objectStore[aOperation](aObject).onerror = errorHandler; 61 ok(false, "UnknownError is expected to be thrown!"); 62 } catch (e) { 63 ok(e instanceof DOMException, "got a DOM exception"); 64 is(e.name, "UnknownError", "correct error"); 65 ok(!!e.message, "Error message: " + e.message); 66 ok( 67 e.message.startsWith( 68 `IDBObjectStore.${aOperation}: The structured clone is too large` 69 ), 70 "Correct error message prefix." 71 ); 72 } 73 } 74 75 info("Verify IDBObjectStore.add() - object is too large"); 76 testTooLargeError("add", { id: 1, data: chunks }); 77 78 info( 79 "Verify IDBObjectStore.add() - object size is closed to the maximal size." 80 ); 81 chunks.length = chunks.length - 1; 82 let request = objectStore.add({ id: 1, data: chunks }); 83 request.onerror = errorHandler; 84 request.onsuccess = grabEventAndContinueHandler; 85 yield undefined; 86 87 openRequest.onsuccess = continueToNextStep; 88 yield undefined; 89 90 db.close(); 91 92 finishTest(); 93 }