tor-browser

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

test_writableFileStream.js (8002B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 const allowCreate = { create: true };
      5 const denyCreate = { create: false };
      6 
      7 exported_symbols.test0 = async function () {
      8  let root = await navigator.storage.getDirectory();
      9  Assert.ok(!!root, "Can we access the root directory?");
     10 
     11  const testFile = await root.getFileHandle("test.txt", allowCreate);
     12  Assert.ok(!!testFile, "Can't access existing file");
     13  let writable = await testFile.createWritable();
     14  Assert.ok(!!writable, "Can't create WritableFileStream to existing file");
     15 
     16  // Write a sentence to the end of the file.
     17  const encoder = new TextEncoder();
     18  const writeBuffer = encoder.encode("Thank you for reading this.");
     19  try {
     20    dump("Trying to write...\n");
     21    await writable.write(writeBuffer);
     22    dump("closing...\n");
     23    await writable.close();
     24  } catch (e) {
     25    Assert.ok(false, "Couldn't write to WritableFileStream: " + e);
     26  }
     27 
     28  // Read it back
     29  // Get size of the file.
     30  let file = await testFile.getFile();
     31  Assert.ok(
     32    !!file,
     33    "Can't create File to file written with WritableFileStream"
     34  );
     35  let fileSize = file.size;
     36  Assert.ok(fileSize == writeBuffer.byteLength);
     37 };
     38 
     39 exported_symbols.quotaTest = async function () {
     40  const shrinkedStorageSizeKB = 5 * 1024;
     41  const defaultDatabaseSize = 491547;
     42 
     43  // Shrink storage size to 5MB.
     44  await Utils.shrinkStorageSize(shrinkedStorageSizeKB);
     45 
     46  let root = await navigator.storage.getDirectory();
     47  Assert.ok(root, "Can we access the root directory?");
     48 
     49  // Fill entire storage.
     50  const fileHandle = await root.getFileHandle("test.txt", allowCreate);
     51  Assert.ok(!!fileHandle, "Can we get file handle?");
     52 
     53  const writable = await fileHandle.createWritable();
     54  Assert.ok(!!writable, "Can we create writable file stream?");
     55 
     56  const buffer = new ArrayBuffer(
     57    shrinkedStorageSizeKB * 1024 - defaultDatabaseSize
     58  );
     59  Assert.ok(!!buffer, "Can we create array buffer?");
     60 
     61  const result = await writable.write(buffer);
     62  Assert.equal(result, undefined, "Can we write entire buffer?");
     63 
     64  // Try to write one more byte.
     65  const fileHandle2 = await root.getFileHandle("test2.txt", allowCreate);
     66  Assert.ok(!!fileHandle2, "Can we get file handle?");
     67 
     68  const writable2 = await fileHandle2.createWritable();
     69  Assert.ok(!!writable2, "Can we create writable file stream?");
     70 
     71  const buffer2 = new ArrayBuffer(1);
     72  Assert.ok(!!buffer2, "Can we create array buffer?");
     73 
     74  try {
     75    await writable2.write(buffer2);
     76    Assert.ok(false, "Should have thrown");
     77  } catch (ex) {
     78    Assert.ok(true, "Did throw");
     79    Assert.ok(DOMException.isInstance(ex), "Threw DOMException");
     80    Assert.equal(ex.name, "QuotaExceededError", "Threw right DOMException");
     81  }
     82 
     83  await writable.close();
     84  // writable2 is already closed because of the failed write above
     85 
     86  await Utils.restoreStorageSize();
     87 };
     88 
     89 exported_symbols.bug1823445 = async function () {
     90  const root = await navigator.storage.getDirectory();
     91  const testFileName = "test1823445.txt";
     92  let handle = await root.getFileHandle(testFileName, allowCreate);
     93  let writable = await handle.createWritable();
     94  await writable.write("abcdefghijklmnop");
     95  await writable.close();
     96 
     97  handle = await root.getFileHandle(testFileName);
     98  writable = await handle.createWritable({ keepExistingData: false });
     99  await writable.write("12345");
    100  await writable.close();
    101 
    102  handle = await root.getFileHandle(testFileName);
    103  const file = await handle.getFile();
    104  const text = await file.text();
    105  Assert.equal(text, "12345");
    106 };
    107 
    108 exported_symbols.bug1824993 = async function () {
    109  const root = await navigator.storage.getDirectory();
    110  const testFileName = "test1824993.txt";
    111  const handle = await root.getFileHandle(testFileName, allowCreate);
    112  {
    113    const writable = await handle.createWritable();
    114    await writable.write("test");
    115 
    116    {
    117      const file = await handle.getFile();
    118      const contents = await file.text();
    119      Assert.equal(contents, "");
    120    }
    121 
    122    await writable.abort();
    123  }
    124 
    125  const file = await handle.getFile();
    126  const contents = await file.text();
    127  Assert.equal(contents, "");
    128 };
    129 
    130 exported_symbols.bug1825018 = async function () {
    131  const root = await navigator.storage.getDirectory();
    132  const testFileName = "test1825018.txt";
    133  const handle = await root.getFileHandle(testFileName, allowCreate);
    134  const writable = await handle.createWritable();
    135  try {
    136    await writable.write({ type: "truncate" });
    137  } catch (e) {
    138    // Called write without size throws an error as expected
    139  }
    140 
    141  try {
    142    await writable.abort();
    143    await root.removeEntry(testFileName);
    144  } catch (e) {
    145    Assert.ok(false, e.message);
    146  }
    147 };
    148 
    149 exported_symbols.usageTest = async function () {
    150  const bufferSize = 1024;
    151  const keepData = { keepExistingData: true };
    152  const fromEmpty = { keepExistingData: false };
    153 
    154  let root = await navigator.storage.getDirectory();
    155  Assert.ok(root, "Can we access the root directory?");
    156 
    157  const baseUsage = await Utils.getCachedOriginUsage();
    158  Assert.ok(true, "Usage " + baseUsage);
    159  // Create a file.
    160  {
    161    const fileHandle = await root.getFileHandle("usagetest.txt", allowCreate);
    162    Assert.ok(!!fileHandle, "Can we get file handle?");
    163 
    164    const writable = await fileHandle.createWritable(fromEmpty);
    165    Assert.ok(!!writable, "Can we create writable file stream?");
    166 
    167    const buffer = new ArrayBuffer(bufferSize);
    168    Assert.ok(!!buffer, "Can we create array buffer?");
    169 
    170    const result = await writable.write(buffer);
    171    Assert.equal(result, undefined, "Can we write entire buffer?");
    172 
    173    await writable.close();
    174  }
    175 
    176  {
    177    const fileUsage = await Utils.getCachedOriginUsage();
    178    Assert.ok(true, "Usage " + fileUsage);
    179    Assert.ok(fileUsage >= baseUsage + bufferSize);
    180 
    181    const fileHandle = await root.getFileHandle("usagetest.txt", denyCreate);
    182    Assert.ok(!!fileHandle, "Can we get file handle?");
    183 
    184    {
    185      const usageNow = await Utils.getCachedOriginUsage();
    186      Assert.equal(usageNow, fileUsage);
    187    }
    188 
    189    const writableA = await fileHandle.createWritable(keepData);
    190    Assert.ok(!!writableA, "Can we create writable file stream?");
    191 
    192    {
    193      const usageNow = await Utils.getCachedOriginUsage();
    194      Assert.ok(true, "Usage " + usageNow.usage);
    195      Assert.equal(usageNow, fileUsage + bufferSize);
    196    }
    197 
    198    const writableB = await fileHandle.createWritable(keepData);
    199    Assert.ok(!!writableB, "Can we create writable file stream?");
    200 
    201    {
    202      const usageNow = await Utils.getCachedOriginUsage();
    203      Assert.equal(usageNow, fileUsage + 2 * bufferSize);
    204    }
    205 
    206    const writableC = await fileHandle.createWritable(keepData);
    207    Assert.ok(!!writableC, "Can we create writable file stream?");
    208 
    209    {
    210      const usageNow = await Utils.getCachedOriginUsage();
    211      Assert.equal(usageNow, fileUsage + 3 * bufferSize);
    212    }
    213 
    214    const writableD = await fileHandle.createWritable(fromEmpty);
    215    Assert.ok(!!writableD, "Can we create writable file stream?");
    216 
    217    {
    218      const usageNow = await Utils.getCachedOriginUsage();
    219      // We did not keep existing data for this writable
    220      Assert.equal(usageNow, fileUsage + 3 * bufferSize);
    221    }
    222 
    223    await writableA.abort();
    224 
    225    {
    226      const usageNow = await Utils.getCachedOriginUsage();
    227      Assert.equal(usageNow, fileUsage + 2 * bufferSize);
    228    }
    229 
    230    await writableB.close();
    231 
    232    {
    233      const usageNow = await Utils.getCachedOriginUsage();
    234      Assert.equal(usageNow, fileUsage + bufferSize);
    235    }
    236 
    237    await writableC.abort();
    238 
    239    {
    240      const usageNow = await Utils.getCachedOriginUsage();
    241      Assert.equal(usageNow, fileUsage);
    242    }
    243 
    244    await writableD.close();
    245 
    246    {
    247      const usageNow = await Utils.getCachedOriginUsage();
    248      // Buffer was overwritten with nothing.
    249      Assert.equal(usageNow, fileUsage - bufferSize);
    250    }
    251  }
    252 };
    253 
    254 for (const [key, value] of Object.entries(exported_symbols)) {
    255  Object.defineProperty(value, "name", {
    256    value: key,
    257    writable: false,
    258  });
    259 }