tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }