tor-browser

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

test_blob_simple.html (8427B)


      1 <!--
      2  Any copyright is dedicated to the Public Domain.
      3  http://creativecommons.org/publicdomain/zero/1.0/
      4 -->
      5 <html>
      6 <head>
      7  <title>Indexed Database Property Test</title>
      8 
      9  <script src="/tests/SimpleTest/SimpleTest.js"></script>
     10  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
     11 
     12  <script type="text/javascript">
     13  function* testSteps()
     14  {
     15    info("Setting up test fixtures: create an IndexedDB database and object store.");
     16 
     17    let request = indexedDB.open(window.location.pathname, 1);
     18    request.onerror = errorHandler;
     19    request.onupgradeneeded = grabEventAndContinueHandler;
     20    request.onsuccess = unexpectedSuccessHandler;
     21    let event = yield undefined;
     22 
     23    let db = event.target.result;
     24    db.onerror = errorHandler;
     25 
     26    let objectStore = db.createObjectStore("foo", { autoIncrement: true });
     27    let index = objectStore.createIndex("foo", "index");
     28 
     29    request.onsuccess = grabEventAndContinueHandler;
     30    event = yield undefined;
     31 
     32 
     33    info("Let's create a blob and store it in IndexedDB twice.");
     34 
     35    const BLOB_DATA = ["fun ", "times ", "all ", "around!"];
     36    const INDEX_KEY = 5;
     37    let blob = new Blob(BLOB_DATA, { type: "text/plain" });
     38    let data = { blob, index: INDEX_KEY };
     39 
     40    objectStore = db.transaction("foo", "readwrite").objectStore("foo");
     41    objectStore.add(data).onsuccess = grabEventAndContinueHandler;
     42    event = yield undefined;
     43 
     44    info("Added blob to database once");
     45 
     46    let key = event.target.result;
     47 
     48    objectStore.add(data).onsuccess = grabEventAndContinueHandler;
     49    event = yield undefined;
     50 
     51    info("Added blob to database twice");
     52 
     53    info("Let's retrieve the blob again and verify the contents is the same.");
     54 
     55    objectStore = db.transaction("foo").objectStore("foo");
     56    objectStore.get(key).onsuccess = grabEventAndContinueHandler;
     57    event = yield undefined;
     58 
     59    info("Got blob from database");
     60 
     61    let fileReader = new FileReader();
     62    fileReader.onload = grabEventAndContinueHandler;
     63    fileReader.readAsText(event.target.result.blob);
     64    event = yield undefined;
     65 
     66    is(event.target.result, BLOB_DATA.join(""), "Correct text");
     67 
     68 
     69    info("Let's retrieve it again, create an object URL for the blob, load" +
     70         "it via an XMLHttpRequest, and verify the contents is the same.");
     71 
     72    objectStore = db.transaction("foo").objectStore("foo");
     73    objectStore.get(key).onsuccess = grabEventAndContinueHandler;
     74    event = yield undefined;
     75 
     76    info("Got blob from database");
     77 
     78    let blobURL = URL.createObjectURL(event.target.result.blob);
     79 
     80    let xhr = new XMLHttpRequest();
     81    xhr.open("GET", blobURL);
     82    xhr.onload = grabEventAndContinueHandler;
     83    xhr.send();
     84    yield undefined;
     85 
     86    URL.revokeObjectURL(blobURL);
     87 
     88    is(xhr.responseText, BLOB_DATA.join(""), "Correct responseText");
     89 
     90 
     91    info("Retrieve both blob entries from the database and verify contents.");
     92 
     93    objectStore = db.transaction("foo").objectStore("foo");
     94    objectStore.mozGetAll().onsuccess = grabEventAndContinueHandler;
     95    event = yield undefined;
     96 
     97    is(event.target.result.length, 2, "Got right number of items");
     98 
     99    fileReader = new FileReader();
    100    fileReader.onload = grabEventAndContinueHandler;
    101    fileReader.readAsText(event.target.result[0].blob);
    102    event = yield undefined;
    103 
    104    is(event.target.result, BLOB_DATA.join(""), "Correct text");
    105 
    106    let cursorResults = [];
    107 
    108    objectStore = db.transaction("foo").objectStore("foo");
    109    objectStore.openCursor().onsuccess = function(event) {
    110      let cursor = event.target.result;
    111      if (cursor) {
    112        info("Got item from cursor");
    113        cursorResults.push(cursor.value);
    114        cursor.continue();
    115      }
    116      else {
    117        info("Finished cursor");
    118        continueToNextStep();
    119      }
    120    };
    121    yield undefined;
    122 
    123    is(cursorResults.length, 2, "Got right number of items");
    124 
    125    fileReader = new FileReader();
    126    fileReader.onload = grabEventAndContinueHandler;
    127    fileReader.readAsText(cursorResults[0].blob);
    128    event = yield undefined;
    129 
    130    is(event.target.result, BLOB_DATA.join(""), "Correct text");
    131 
    132 
    133    info("Retrieve blobs from database via index and verify contents.");
    134 
    135    index = db.transaction("foo").objectStore("foo").index("foo");
    136    index.get(INDEX_KEY).onsuccess = grabEventAndContinueHandler;
    137    event = yield undefined;
    138 
    139    info("Got blob from database");
    140 
    141    fileReader = new FileReader();
    142    fileReader.onload = grabEventAndContinueHandler;
    143    fileReader.readAsText(event.target.result.blob);
    144    event = yield undefined;
    145 
    146    is(event.target.result, BLOB_DATA.join(""), "Correct text");
    147 
    148    index = db.transaction("foo").objectStore("foo").index("foo");
    149    index.mozGetAll().onsuccess = grabEventAndContinueHandler;
    150    event = yield undefined;
    151 
    152    is(event.target.result.length, 2, "Got right number of items");
    153 
    154    fileReader = new FileReader();
    155    fileReader.onload = grabEventAndContinueHandler;
    156    fileReader.readAsText(event.target.result[0].blob);
    157    event = yield undefined;
    158 
    159    is(event.target.result, BLOB_DATA.join(""), "Correct text");
    160 
    161    cursorResults = [];
    162 
    163    index = db.transaction("foo").objectStore("foo").index("foo");
    164    index.openCursor().onsuccess = function(event) {
    165      let cursor = event.target.result;
    166      if (cursor) {
    167        info("Got item from cursor");
    168        cursorResults.push(cursor.value);
    169        cursor.continue();
    170      }
    171      else {
    172        info("Finished cursor");
    173        continueToNextStep();
    174      }
    175    };
    176    yield undefined;
    177 
    178    is(cursorResults.length, 2, "Got right number of items");
    179 
    180    fileReader = new FileReader();
    181    fileReader.onload = grabEventAndContinueHandler;
    182    fileReader.readAsText(cursorResults[0].blob);
    183    event = yield undefined;
    184 
    185    is(event.target.result, BLOB_DATA.join(""), "Correct text");
    186 
    187    fileReader = new FileReader();
    188    fileReader.onload = grabEventAndContinueHandler;
    189    fileReader.readAsText(cursorResults[1].blob);
    190    event = yield undefined;
    191 
    192    is(event.target.result, BLOB_DATA.join(""), "Correct text");
    193 
    194 
    195    info("Slice the the retrieved blob and verify its contents.");
    196 
    197    let slice = cursorResults[1].blob.slice(0, BLOB_DATA[0].length);
    198 
    199    fileReader = new FileReader();
    200    fileReader.onload = grabEventAndContinueHandler;
    201    fileReader.readAsText(slice);
    202    event = yield undefined;
    203 
    204    is(event.target.result, BLOB_DATA[0], "Correct text");
    205 
    206 
    207    info("Send blob to a worker, read its contents there, and verify results.");
    208 
    209    function workerScript() {
    210      /* eslint-env worker */
    211      onmessage = function(event) {
    212        var reader = new FileReaderSync();
    213        postMessage(reader.readAsText(event.data));
    214 
    215        var slice = event.data.slice(1, 2);
    216        postMessage(reader.readAsText(slice));
    217      };
    218    }
    219 
    220    let url =
    221      URL.createObjectURL(new Blob(["(", workerScript.toString(), ")()"]));
    222 
    223    let worker = new Worker(url);
    224    worker.postMessage(slice);
    225    worker.onmessage = grabEventAndContinueHandler;
    226    event = yield undefined;
    227 
    228    is(event.data, BLOB_DATA[0], "Correct text");
    229    event = yield undefined;
    230 
    231    is(event.data, BLOB_DATA[0][1], "Correct text");
    232 
    233 
    234    info("Store a blob back in the database, and keep holding on to the " +
    235         "blob, verifying that it still can be read.");
    236 
    237    objectStore = db.transaction("foo").objectStore("foo");
    238    objectStore.get(key).onsuccess = grabEventAndContinueHandler;
    239    event = yield undefined;
    240 
    241    let blobFromDB = event.target.result.blob;
    242    info("Got blob from database");
    243 
    244    let txn = db.transaction("foo", "readwrite");
    245    txn.objectStore("foo").put(event.target.result, key);
    246    txn.oncomplete = grabEventAndContinueHandler;
    247    event = yield undefined;
    248 
    249    info("Stored blob back into database");
    250 
    251    fileReader = new FileReader();
    252    fileReader.onload = grabEventAndContinueHandler;
    253    fileReader.readAsText(blobFromDB);
    254    event = yield undefined;
    255 
    256    is(event.target.result, BLOB_DATA.join(""), "Correct text");
    257 
    258    blobURL = URL.createObjectURL(blobFromDB);
    259 
    260    xhr = new XMLHttpRequest();
    261    xhr.open("GET", blobURL);
    262    xhr.onload = grabEventAndContinueHandler;
    263    xhr.send();
    264    yield undefined;
    265 
    266    URL.revokeObjectURL(blobURL);
    267 
    268    is(xhr.responseText, BLOB_DATA.join(""), "Correct responseText");
    269 
    270 
    271    finishTest();
    272  }
    273  </script>
    274  <script type="text/javascript" src="helpers.js"></script>
    275 
    276 </head>
    277 
    278 <body onload="runTest();"></body>
    279 
    280 </html>