2 * Any copyright is dedicated to the Public Domain.
3 * http://creativecommons.org/publicdomain/zero/1.0/
6 /* exported testGenerator, disableWorkerTest */
7 var disableWorkerTest = "Need a way to set temporary prefs from a worker";
9 var testGenerator = testSteps();
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;
20 let chunks = new Array(kMaxIdbMessageSize);
21 for (let i = 0; i < kMaxIdbMessageSize; i++) {
22 chunks[i] = new ArrayBuffer(1 * megaBytes);
26 SpecialPowers.pushPrefEnv(
30 "dom.indexedDB.maxSerializedMsgSize",
31 kMaxIpcMessageSize * megaBytes,
39 setMaxSerializedMsgSize(kMaxIpcMessageSize * megaBytes);
42 let openRequest = indexedDB.open(name, 1);
43 openRequest.onerror = errorHandler;
44 openRequest.onupgradeneeded = grabEventAndContinueHandler;
45 openRequest.onsuccess = unexpectedSuccessHandler;
46 let event = yield undefined;
48 let db = event.target.result;
50 is(db.objectStoreNames.length, 0, "Correct objectStoreNames list");
52 let objectStore = db.createObjectStore("test store", { keyPath: "id" });
53 is(db.objectStoreNames.length, 1, "Correct objectStoreNames list");
55 db.objectStoreNames.item(0),
57 "Correct object store name"
60 function testTooLargeError(aOperation, aObject) {
62 objectStore[aOperation](aObject).onerror = errorHandler;
63 ok(false, "UnknownError is expected to be thrown!");
65 ok(e instanceof DOMException, "got a DOM exception");
66 is(e.name, "UnknownError", "correct error");
67 ok(!!e.message, "Error message: " + e.message);
70 `IDBObjectStore.${aOperation}: The serialized value is too large`
72 "Correct error message prefix."
77 info("Verify IDBObjectStore.add() - object is too large");
78 testTooLargeError("add", { id: 1, data: chunks });
81 "Verify IDBObjectStore.add() - object size is closed to the maximal size."
83 chunks.length = chunks.length - 1;
84 let request = objectStore.add({ id: 1, data: chunks });
85 request.onerror = errorHandler;
86 request.onsuccess = grabEventAndContinueHandler;
89 info("Verify IDBObjectStore.add() - object key is too large");
91 testTooLargeError("add", { id: chunks });
93 objectStore.createIndex("index name", "index");
94 ok(objectStore.index("index name"), "Index created.");
96 info("Verify IDBObjectStore.add() - index key is too large");
97 testTooLargeError("add", { id: 2, index: chunks });
99 info("Verify IDBObjectStore.add() - object key and index key are too large");
100 let indexChunks = chunks.splice(0, 5);
101 testTooLargeError("add", { id: chunks, index: indexChunks });
103 openRequest.onsuccess = continueToNextStep;