tor-browser

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

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 }