tor-browser

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

test_cleanup_transaction.js (3816B)


      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 spec = "http://foo.com";
     13  const name = this.window
     14    ? window.location.pathname
     15    : "test_quotaExceeded_recovery";
     16  const objectStoreName = "foo";
     17 
     18  // We want 32 MB database, but there's the group limit so we need to
     19  // multiply by 5.
     20  const tempStorageLimitKB = 32 * 1024 * 5;
     21 
     22  // Store in 1 MB chunks.
     23  const dataSize = 1024 * 1024;
     24 
     25  for (let blobs of [false, true]) {
     26    setTemporaryStorageLimit(tempStorageLimitKB);
     27 
     28    clearAllDatabases(continueToNextStepSync);
     29    yield undefined;
     30 
     31    info("Opening database");
     32 
     33    let request = indexedDB.openForPrincipal(getPrincipal(spec), name);
     34    request.onerror = errorHandler;
     35    request.onupgradeneeded = grabEventAndContinueHandler;
     36    request.onsuccess = unexpectedSuccessHandler;
     37 
     38    yield undefined;
     39 
     40    // upgradeneeded
     41    request.onupgradeneeded = unexpectedSuccessHandler;
     42    request.onsuccess = grabEventAndContinueHandler;
     43 
     44    info("Creating objectStore");
     45 
     46    request.result.createObjectStore(objectStoreName);
     47 
     48    yield undefined;
     49 
     50    // success
     51    let db = request.result;
     52    db.onerror = errorHandler;
     53 
     54    ok(true, "Adding data until quota is reached");
     55 
     56    let obj = {
     57      name: "foo",
     58    };
     59 
     60    if (!blobs) {
     61      obj.data = getRandomView(dataSize);
     62    }
     63 
     64    let i = 1;
     65    let j = 1;
     66    while (true) {
     67      if (blobs) {
     68        obj.data = getBlob(getView(dataSize));
     69      }
     70 
     71      let trans = db.transaction(objectStoreName, "readwrite");
     72      request = trans.objectStore(objectStoreName).add(obj, i);
     73      request.onerror = function (event) {
     74        event.stopPropagation();
     75      };
     76 
     77      trans.oncomplete = function () {
     78        i++;
     79        j++;
     80        testGenerator.next(true);
     81      };
     82      trans.onabort = function () {
     83        is(trans.error.name, "QuotaExceededError", "Reached quota limit");
     84        testGenerator.next(false);
     85      };
     86 
     87      let completeFired = yield undefined;
     88      if (completeFired) {
     89        ok(true, "Got complete event");
     90      } else {
     91        ok(true, "Got abort event");
     92 
     93        if (j == 1) {
     94          // Plain cleanup transaction (just vacuuming and checkpointing)
     95          // couldn't shrink database any further.
     96          break;
     97        }
     98 
     99        j = 1;
    100 
    101        trans = db.transaction(objectStoreName, "cleanup");
    102        trans.onabort = unexpectedSuccessHandler;
    103        trans.oncomplete = grabEventAndContinueHandler;
    104 
    105        yield undefined;
    106      }
    107    }
    108 
    109    info("Reopening database");
    110 
    111    db.close();
    112 
    113    request = indexedDB.openForPrincipal(getPrincipal(spec), name);
    114    request.onerror = errorHandler;
    115    request.onsuccess = grabEventAndContinueHandler;
    116 
    117    yield undefined;
    118 
    119    db = request.result;
    120    db.onerror = errorHandler;
    121 
    122    info("Deleting some data");
    123 
    124    let trans = db.transaction(objectStoreName, "cleanup");
    125    trans.objectStore(objectStoreName).delete(1);
    126 
    127    trans.onabort = unexpectedSuccessHandler;
    128    trans.oncomplete = grabEventAndContinueHandler;
    129 
    130    yield undefined;
    131 
    132    info("Adding data again");
    133 
    134    trans = db.transaction(objectStoreName, "readwrite");
    135    trans.objectStore(objectStoreName).add(obj, 1);
    136 
    137    trans.onabort = unexpectedSuccessHandler;
    138    trans.oncomplete = grabEventAndContinueHandler;
    139 
    140    yield undefined;
    141 
    142    info("Deleting database");
    143 
    144    db.close();
    145 
    146    request = indexedDB.deleteForPrincipal(getPrincipal(spec), name);
    147    request.onerror = errorHandler;
    148    request.onsuccess = grabEventAndContinueHandler;
    149 
    150    yield undefined;
    151  }
    152 
    153  finishTest();
    154  yield undefined;
    155 }