| <!DOCTYPE html> |
| <meta charset="utf-8"> |
| <title>Key Generator behavior with explicit keys generator overflow</title> |
| <link rel=help href="https://w3c.github.io/IndexedDB/#key-generator-construct"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="support.js"></script> |
| <script> |
| |
| function big_key_test(key, description) { |
| indexeddb_test( |
| (t, db) => { |
| assert_equals(indexedDB.cmp(key, key), 0, 'Key is valid'); |
| |
| db.createObjectStore('store', {autoIncrement: true}); |
| }, |
| (t, db) => { |
| const tx = db.transaction('store', 'readwrite'); |
| const store = tx.objectStore('store'); |
| const value = 0; |
| let request; |
| |
| request = store.put(value); |
| request.onerror = t.unreached_func('put should succeed'); |
| request.onsuccess = t.step_func(e => { |
| assert_equals(e.target.result, 1, |
| 'Key generator should initially be 1'); |
| }); |
| |
| request = store.put(value); |
| request.onerror = t.unreached_func('put should succeed'); |
| request.onsuccess = t.step_func(e => { |
| assert_equals(e.target.result, 2, |
| 'Key generator should increment'); |
| }); |
| |
| request = store.put(value, 1000); |
| request.onerror = t.unreached_func('put should succeed'); |
| request.onsuccess = t.step_func(e => { |
| assert_equals(e.target.result, 1000, |
| 'Explicit key should be used'); |
| }); |
| |
| request = store.put(value); |
| request.onerror = t.unreached_func('put should succeed'); |
| request.onsuccess = t.step_func(e => { |
| assert_equals(e.target.result, 1001, |
| 'Key generator should have updated'); |
| }); |
| |
| request = store.put(value, key); |
| request.onerror = t.unreached_func('put should succeed'); |
| request.onsuccess = t.step_func(e => { |
| assert_equals(e.target.result, key, |
| 'Explicit key should be used'); |
| }); |
| |
| if (key >= 0) { |
| // Large positive values will max out the key generator, so it |
| // can no longer produce keys. |
| request = store.put(value); |
| request.onsuccess = t.unreached_func('put should fail'); |
| request.onerror = t.step_func(e => { |
| e.preventDefault(); |
| assert_equals(e.target.error.name, 'ConstraintError', |
| 'Key generator should have returned failure'); |
| }); |
| } else { |
| // Large negative values are always lower than the key generator's |
| // current number, so have no effect on the generator. |
| request = store.put(value); |
| request.onerror = t.unreached_func('put should succeed'); |
| request.onsuccess = t.step_func(e => { |
| assert_equals(e.target.result, 1002, |
| 'Key generator should have updated'); |
| }); |
| } |
| |
| request = store.put(value, 2000); |
| request.onerror = t.unreached_func('put should succeed'); |
| request.onsuccess = t.step_func(e => { |
| assert_equals(e.target.result, 2000, |
| 'Explicit key should be used'); |
| }); |
| |
| tx.onabort = t.step_func(() => { |
| assert_unreached(`Transaction aborted: ${tx.error.message}`); |
| }); |
| tx.oncomplete = t.step_func(() => { t.done(); }); |
| }, |
| description); |
| } |
| |
| [ |
| { |
| key: Number.MAX_SAFE_INTEGER + 1, |
| description: '53 bits' |
| }, |
| { |
| key: Math.pow(2, 60), |
| description: 'greater than 53 bits, less than 64 bits' |
| }, |
| { |
| key: -Math.pow(2, 60), |
| description: 'greater than 53 bits, less than 64 bits (negative)' |
| }, |
| { |
| key: Math.pow(2, 63), |
| description: '63 bits' |
| }, |
| { |
| key: -Math.pow(2, 63), |
| description: '63 bits (negative)' |
| }, |
| { |
| key: Math.pow(2, 64), |
| description: '64 bits' |
| }, |
| { |
| key: -Math.pow(2, 64), |
| description: '64 bits (negative)' |
| }, |
| { |
| key: Math.pow(2, 70), |
| description: 'greater than 64 bits, but still finite' |
| }, |
| { |
| key: -Math.pow(2, 70), |
| description: 'greater than 64 bits, but still finite (negative)' |
| }, |
| { |
| key: Infinity, |
| description: 'equal to Infinity' |
| }, |
| { |
| key: -Infinity, |
| description: 'equal to -Infinity' |
| } |
| ].forEach(function(testCase) { |
| big_key_test(testCase.key, |
| `Key generator vs. explicit key ${testCase.description}`); |
| }); |
| |
| |
| |
| </script> |