tor-browser

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

idbobjectstore_put.any.js (12077B)


      1 // META: global=window,worker
      2 // META: title=IDBObjectStore.put()
      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 async_test(t => {
     10    let db;
     11    const record = { key: 1, property: "data" };
     12 
     13    const open_rq = createdb(t);
     14    open_rq.onupgradeneeded = function(e) {
     15        db = e.target.result;
     16        const objStore = db.createObjectStore("store", { keyPath: "key" });
     17 
     18        objStore.put(record);
     19    };
     20 
     21    open_rq.onsuccess = function(e) {
     22        const rq = db.transaction("store", "readonly")
     23                   .objectStore("store")
     24                   .get(record.key);
     25 
     26        rq.onsuccess = t.step_func(function(e) {
     27            assert_equals(e.target.result.property, record.property);
     28            assert_equals(e.target.result.key, record.key);
     29            t.done();
     30        });
     31    };
     32 }, 'put() with an inline key');
     33 
     34 async_test(t => {
     35    let db;
     36    const key = 1;
     37    const record = { property: "data" };
     38 
     39    const open_rq = createdb(t);
     40    open_rq.onupgradeneeded = function(e) {
     41        db = e.target.result;
     42        const objStore = db.createObjectStore("store");
     43 
     44        objStore.put(record, key);
     45    };
     46 
     47    open_rq.onsuccess = function(e) {
     48        const rq = db.transaction("store", "readonly")
     49                   .objectStore("store")
     50                   .get(key);
     51 
     52        rq.onsuccess = t.step_func(function(e) {
     53            assert_equals(e.target.result.property, record.property);
     54 
     55            t.done();
     56        });
     57    };
     58 },'put() with an out-of-line key');
     59 
     60 async_test(t => {
     61    let db;
     62    let success_event;
     63    const record = { key: 1, property: "data" };
     64    const record_put = { key: 1, property: "changed", more: ["stuff", 2] };
     65 
     66    const open_rq = createdb(t);
     67    open_rq.onupgradeneeded = function(e) {
     68        db = e.target.result;
     69        const objStore = db.createObjectStore("store", { keyPath: "key" });
     70        objStore.put(record);
     71 
     72        const rq = objStore.put(record_put);
     73        rq.onerror = fail(t, "error on put");
     74 
     75        rq.onsuccess = t.step_func(function(e) {
     76            success_event = true;
     77        });
     78    };
     79 
     80    open_rq.onsuccess = function(e) {
     81        assert_true(success_event);
     82 
     83        const rq = db.transaction("store", "readonly")
     84                   .objectStore("store")
     85                   .get(1);
     86 
     87        rq.onsuccess = t.step_func(function(e) {
     88            const rec = e.target.result;
     89 
     90            assert_equals(rec.key, record_put.key);
     91            assert_equals(rec.property, record_put.property);
     92            assert_array_equals(rec.more, record_put.more);
     93 
     94            t.done();
     95        });
     96    };
     97 }, 'put() record with key already exists');
     98 
     99 async_test(t => {
    100    const record = { key: 1, property: "data" };
    101 
    102    const open_rq = createdb(t);
    103    open_rq.onupgradeneeded = function(e) {
    104        let db = e.target.result;
    105        const objStore = db.createObjectStore("store", {
    106             autoIncrement: true });
    107        objStore.createIndex("i1", "property", { unique: true });
    108        objStore.put(record);
    109 
    110        const rq = objStore.put(record);
    111        rq.onsuccess = fail(t, "success on putting duplicate indexed record");
    112 
    113        rq.onerror = t.step_func(function(e) {
    114            assert_equals(rq.error.name, "ConstraintError");
    115            assert_equals(e.target.error.name, "ConstraintError");
    116 
    117            assert_equals(e.type, "error");
    118 
    119            e.preventDefault();
    120            e.stopPropagation();
    121        });
    122    };
    123 
    124    // Defer done, giving a spurious rq.onsuccess a chance to run
    125    open_rq.onsuccess = function(e) {
    126        t.done();
    127    };
    128 }, 'put() where an index has unique:true specified');
    129 
    130 async_test(t => {
    131    let db;
    132    const record = { test: { obj: { key: 1 } }, property: "data" };
    133 
    134    const open_rq = createdb(t);
    135    open_rq.onupgradeneeded = function(e) {
    136        db = e.target.result;
    137        const objStore = db.createObjectStore("store",
    138        { keyPath: "test.obj.key" });
    139        objStore.put(record);
    140    };
    141 
    142    open_rq.onsuccess = function(e) {
    143        const rq = db.transaction("store", "readonly")
    144                   .objectStore("store")
    145                   .get(record.test.obj.key);
    146 
    147        rq.onsuccess = t.step_func(function(e) {
    148            assert_equals(e.target.result.property, record.property);
    149 
    150            t.done();
    151        });
    152    };
    153 }, 'Object store\'s key path is an object attribute');
    154 
    155 async_test(t => {
    156    let db;
    157    const record = { property: "data" };
    158    const expected_keys = [1, 2, 3, 4];
    159 
    160    const open_rq = createdb(t);
    161    open_rq.onupgradeneeded = function(e) {
    162      db = e.target.result;
    163      const objStore = db.createObjectStore("store", { keyPath: "key",
    164      autoIncrement: true });
    165 
    166      objStore.put(record);
    167      objStore.put(record);
    168      objStore.put(record);
    169      objStore.put(record);
    170    };
    171 
    172    open_rq.onsuccess = function(e) {
    173      let actual_keys = [];
    174      const rq = db.transaction("store", "readonly")
    175          .objectStore("store")
    176          .openCursor();
    177 
    178      rq.onsuccess = t.step_func(function(e) {
    179        const cursor = e.target.result;
    180 
    181        if (cursor) {
    182          actual_keys.push(cursor.value.key);
    183          cursor.continue();
    184        } else {
    185          assert_array_equals(actual_keys, expected_keys);
    186          t.done();
    187        }
    188      });
    189    };
    190  }, 'autoIncrement and inline keys');
    191 
    192 async_test(t => {
    193    let db;
    194    const record = { property: "data" };
    195    const expected_keys = [1, 2, 3, 4];
    196 
    197    const open_rq = createdb(t);
    198    open_rq.onupgradeneeded = function(e) {
    199        db = e.target.result;
    200        const objStore = db.createObjectStore("store", { keyPath: "key",
    201        autoIncrement: true });
    202 
    203        objStore.put(record);
    204        objStore.put(record);
    205        objStore.put(record);
    206        objStore.put(record);
    207    };
    208 
    209    open_rq.onsuccess = function(e) {
    210        const actual_keys = [];
    211        const rq = db.transaction("store", "readonly")
    212                   .objectStore("store")
    213                   .openCursor();
    214 
    215        rq.onsuccess = t.step_func(function(e) {
    216            const cursor = e.target.result;
    217 
    218            if(cursor) {
    219                actual_keys.push(cursor.value.key);
    220                cursor.continue();
    221            } else {
    222                assert_array_equals(actual_keys, expected_keys);
    223                t.done();
    224            }
    225        });
    226    };
    227 }, 'autoIncrement and out-of-line keys');
    228 
    229 async_test(t => {
    230    let db;
    231    const record = { property: "data" };
    232    const expected_keys = [1, 2, 3, 4];
    233 
    234    const open_rq = createdb(t);
    235    open_rq.onupgradeneeded = function(e) {
    236        db = e.target.result;
    237        const objStore = db.createObjectStore("store",
    238        { keyPath: "test.obj.key", autoIncrement: true });
    239 
    240        objStore.put(record);
    241        objStore.put(record);
    242        objStore.put(record);
    243        objStore.put(record);
    244    };
    245 
    246    open_rq.onsuccess = function(e) {
    247        const actual_keys = [];
    248        const rq = db.transaction("store", "readonly")
    249            .objectStore("store")
    250            .openCursor();
    251 
    252        rq.onsuccess = t.step_func(function(e) {
    253            const cursor = e.target.result;
    254 
    255            if (cursor) {
    256                actual_keys.push(cursor.value.test.obj.key);
    257                cursor.continue();
    258            } else {
    259                assert_array_equals(actual_keys, expected_keys);
    260                t.done();
    261            }
    262        });
    263    };
    264 }, 'Object store has autoIncrement:true and the key path is an object \
    265 attribute');
    266 
    267 async_test(t => {
    268    const record = { key: 1, property: "data" };
    269 
    270    const open_rq = createdb(t);
    271    open_rq.onupgradeneeded = function(e) {
    272        let rq;
    273        const db = e.target.result;
    274        const objStore = db.createObjectStore("store", { keyPath: "key" });
    275 
    276        assert_throws_dom("DataError", function() {
    277            rq = objStore.put(record, 1);
    278        });
    279 
    280        assert_equals(rq, undefined);
    281        t.done();
    282    };
    283 }, 'Attempt to put() a record that does not meet the constraints of an object \
    284 store\'s inline key requirements');
    285 
    286 async_test(t => {
    287    const record = { property: "data" };
    288 
    289    const open_rq = createdb(t);
    290    open_rq.onupgradeneeded = function(e) {
    291        let db = e.target.result;
    292 
    293        let rq;
    294        const objStore = db.createObjectStore("store", { keyPath: "key" });
    295 
    296        assert_throws_dom("DataError", function() {
    297            rq = objStore.put(record);
    298        });
    299 
    300        assert_equals(rq, undefined);
    301        t.done();
    302    };
    303 }, 'Attempt to call put() without an key parameter when the object store uses \
    304 out-of-line keys');
    305 
    306 async_test(t => {
    307    const record = { key: { value: 1 }, property: "data" };
    308 
    309    const open_rq = createdb(t);
    310    open_rq.onupgradeneeded = function(e) {
    311        const db = e.target.result;
    312 
    313        let rq;
    314        const objStore = db.createObjectStore("store", { keyPath: "key" });
    315 
    316        assert_throws_dom("DataError", function() {
    317            rq = objStore.put(record);
    318        });
    319 
    320        assert_equals(rq, undefined);
    321        t.done();
    322    };
    323 }, 'Attempt to put() a record where the record\'s key does not meet the \
    324 constraints of a valid key');
    325 
    326 async_test(t => {
    327    const record = { property: "data" };
    328 
    329    const open_rq = createdb(t);
    330    open_rq.onupgradeneeded = function(e) {
    331        const db = e.target.result;
    332 
    333        let rq;
    334        const objStore = db.createObjectStore("store", { keyPath: "key" });
    335 
    336        assert_throws_dom("DataError", function() {
    337            rq = objStore.put(record);
    338        });
    339 
    340        assert_equals(rq, undefined);
    341        t.done();
    342    };
    343 }, 'Attempt to put() a record where the record\'s in-line key is not defined');
    344 
    345 async_test(t => {
    346    const record = { property: "data" };
    347 
    348    const open_rq = createdb(t);
    349    open_rq.onupgradeneeded = function(e) {
    350        const db = e.target.result;
    351 
    352        let rq;
    353        const objStore = db.createObjectStore("store");
    354 
    355        assert_throws_dom("DataError", function() {
    356            rq = objStore.put(record, { value: 1 });
    357        });
    358 
    359        assert_equals(rq, undefined);
    360        t.done();
    361    };
    362 }, 'Attempt to put() a record where the out of line key provided does not \
    363 meet the constraints of a valid key');
    364 
    365 async_test(t => {
    366    const record = { key: 1, indexedProperty: { property: "data" } };
    367 
    368    const open_rq = createdb(t);
    369    open_rq.onupgradeneeded = function(e) {
    370        const db = e.target.result;
    371 
    372        let rq;
    373        const objStore = db.createObjectStore("store", { keyPath: "key" });
    374 
    375        objStore.createIndex("index", "indexedProperty");
    376 
    377        rq = objStore.put(record);
    378 
    379        assert_true(rq instanceof IDBRequest);
    380        rq.onsuccess = function() {
    381            t.done();
    382        };
    383    };
    384 }, 'put() a record where a value being indexed does not meet the constraints \
    385 of a valid key');
    386 
    387 async_test(t => {
    388    let db;
    389    const open_rq = createdb(t);
    390    open_rq.onupgradeneeded = function(event) {
    391        db = event.target.result;
    392        db.createObjectStore("store", { keyPath: "pKey" });
    393    };
    394 
    395    open_rq.onsuccess = function(event) {
    396        const txn = db.transaction("store", "readonly");
    397        const ostore = txn.objectStore("store");
    398        t.step(function() {
    399            assert_throws_dom("ReadOnlyError", function() {
    400                ostore.put({ pKey: "primaryKey_0" });
    401            });
    402        });
    403        t.done();
    404    };
    405 }, 'If the transaction this IDBObjectStore belongs to has its mode set to \
    406 readonly, throw ReadOnlyError');
    407 
    408 async_test(t => {
    409    let ostore;
    410    const open_rq = createdb(t);
    411    open_rq.onupgradeneeded = function(event) {
    412        const db = event.target.result;
    413        ostore = db.createObjectStore("store", { keyPath: "pKey" });
    414        db.deleteObjectStore("store");
    415        assert_throws_dom("InvalidStateError", function() {
    416            ostore.put({ pKey: "primaryKey_0" });
    417        });
    418        t.done();
    419    };
    420 }, 'If the object store has been deleted, the implementation must throw a \
    421 DOMException of type InvalidStateError');