tor-browser

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

idbcursor_advance_objectstore.any.js (4586B)


      1 // META: global=window,worker
      2 // META: title=IDBCursor.advance()
      3 // META: script=resources/support.js
      4 // @author Microsoft <https://www.microsoft.com>
      5 // @author Intel <http://www.intel.com>
      6 
      7 'use strict';
      8 
      9 function createAndPopulateObjectStore(db, records) {
     10  let objStore = db.createObjectStore("store", { keyPath: "pKey" });
     11  for (let i = 0; i < records.length; i++) {
     12    objStore.add(records[i]);
     13  }
     14  return objStore;
     15 }
     16 
     17 function setOnUpgradeNeeded(dbObj, records) {
     18  return function (event) {
     19    dbObj.db = event.target.result;
     20    createAndPopulateObjectStore(dbObj.db, records);
     21  };
     22 }
     23 
     24 async_test(t => {
     25  let dbObj = {};
     26  let count = 0;
     27  const records = [
     28    { pKey: "primaryKey_0" },
     29    { pKey: "primaryKey_1" },
     30    { pKey: "primaryKey_2" },
     31    { pKey: "primaryKey_3" }
     32  ];
     33 
     34  let open_rq = createdb(t);
     35  open_rq.onupgradeneeded = setOnUpgradeNeeded(dbObj, records);
     36 
     37  open_rq.onsuccess = function (e) {
     38    let cursor_rq = dbObj.db.transaction("store", "readonly")
     39      .objectStore("store")
     40      .openCursor();
     41 
     42    cursor_rq.onsuccess = t.step_func(function (e) {
     43      let cursor = e.target.result;
     44      assert_true(cursor instanceof IDBCursor);
     45 
     46      switch (count) {
     47        case 0:
     48          count += 3;
     49          cursor.advance(3);
     50          break;
     51        case 3:
     52          assert_equals(cursor.value.pKey, records[count].pKey, "cursor.value.pKey");
     53          t.done();
     54          break;
     55        default:
     56          assert_unreached("unexpected count");
     57          break;
     58      }
     59    });
     60  }
     61 }, "object store - iterate cursor number of times specified by count");
     62 
     63 async_test(t => {
     64  let dbObj = {};
     65  const records = [
     66    { pKey: "primaryKey_0" },
     67    { pKey: "primaryKey_1" }
     68  ];
     69 
     70  let open_rq = createdb(t);
     71  open_rq.onupgradeneeded = setOnUpgradeNeeded(dbObj, records);
     72 
     73  open_rq.onsuccess = function (event) {
     74    let txn = dbObj.db.transaction("store", "readwrite");
     75    let rq = txn.objectStore("store").openCursor();
     76    rq.onsuccess = t.step_func(function (event) {
     77      let cursor = event.target.result;
     78      assert_true(cursor instanceof IDBCursor);
     79 
     80      assert_throws_js(TypeError,
     81        function () { cursor.advance(0); });
     82      t.done();
     83    });
     84  }
     85 },  "Calling advance() with count argument 0 should throw TypeError.");
     86 
     87 async_test(t => {
     88  let dbObj = {};
     89  const records = [
     90    { pKey: "primaryKey_0" },
     91    { pKey: "primaryKey_1" }
     92  ];
     93 
     94  let open_rq = createdb(t);
     95  open_rq.onupgradeneeded = setOnUpgradeNeeded(dbObj, records);
     96 
     97  open_rq.onsuccess = function (event) {
     98    let txn = dbObj.db.transaction("store", "readwrite");
     99    let rq = txn.objectStore("store").openCursor();
    100    rq.onsuccess = t.step_func(function (event) {
    101      let cursor = event.target.result;
    102      assert_true(cursor instanceof IDBCursor);
    103 
    104      event.target.transaction.abort();
    105      assert_throws_dom("TransactionInactiveError",
    106        function () { cursor.advance(1); });
    107      t.done();
    108    });
    109  }
    110 }, "Calling advance() should throws an exception TransactionInactiveError when the transaction is not active");
    111 
    112 async_test(t => {
    113  let dbObj = {};
    114  const records = [
    115    { pKey: "primaryKey_0" },
    116    { pKey: "primaryKey_1" }
    117  ];
    118 
    119  let open_rq = createdb(t);
    120  open_rq.onupgradeneeded = setOnUpgradeNeeded(dbObj, records);
    121 
    122  open_rq.onsuccess = function (event) {
    123    let txn = dbObj.db.transaction("store", "readwrite");
    124    let rq = txn.objectStore("store").openCursor();
    125    rq.onsuccess = t.step_func(function (event) {
    126      let cursor = event.target.result;
    127      assert_true(cursor instanceof IDBCursor);
    128 
    129      cursor.advance(1);
    130      assert_throws_dom("InvalidStateError",
    131        function () { cursor.advance(1); });
    132      t.done();
    133    });
    134  }
    135 }, "Calling advance() should throw DOMException when the cursor is currently being iterated.");
    136 
    137 async_test(t => {
    138  let db;
    139  const records = [
    140    { pKey: "primaryKey_0" },
    141    { pKey: "primaryKey_1" }
    142  ];
    143 
    144  let open_rq = createdb(t);
    145  open_rq.onupgradeneeded = function (event) {
    146    db = event.target.result;
    147    let objStore = createAndPopulateObjectStore(db, records);
    148    let rq = objStore.openCursor();
    149    rq.onsuccess = t.step_func(function (event) {
    150      let cursor = event.target.result;
    151      assert_true(cursor instanceof IDBCursor, "cursor exist");
    152 
    153      db.deleteObjectStore("store");
    154      assert_throws_dom("InvalidStateError",
    155        function () { cursor.advance(1); });
    156      t.done();
    157    });
    158  }
    159 }, "If the cursor's source or effective object store has been deleted, the implementation MUST throw a DOMException of type InvalidStateError");