| <!DOCTYPE html> |
| <title>IndexedDB: Test IDBIndex.getAll.</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script> |
| setup({explicit_done: true}); |
| |
| var alphabet = 'abcdefghijklmnopqrstuvwxyz'.split(''); |
| var ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''); |
| |
| function doSetup(dbName, dbVersion, onsuccess) { |
| var delete_request = indexedDB.deleteDatabase(dbName); |
| delete_request.onerror = function() { |
| assert_unreached('deleteDatabase should not fail'); |
| }; |
| delete_request.onsuccess = function(e) { |
| var req = indexedDB.open(dbName, dbVersion); |
| req.onsuccess = onsuccess; |
| req.onerror = function() { |
| assert_unreached('open should not fail'); |
| }; |
| req.onupgradeneeded = function(evt) { |
| var connection = evt.target.result; |
| |
| var store = connection.createObjectStore('generated', |
| {autoIncrement: true, keyPath: 'id'}); |
| var index = store.createIndex('test_idx', 'upper'); |
| alphabet.forEach(function(letter) { |
| store.put({ch: letter, upper: letter.toUpperCase()}); |
| }); |
| |
| store = connection.createObjectStore('out-of-line', null); |
| index = store.createIndex('test_idx', 'upper'); |
| alphabet.forEach(function(letter) { |
| store.put({ch: letter, upper: letter.toUpperCase()}, letter); |
| }); |
| |
| store = connection.createObjectStore('out-of-line-not-unique', null); |
| index = store.createIndex('test_idx', 'half'); |
| alphabet.forEach(function(letter) { |
| if (letter <= 'm') |
| store.put({ch: letter, half: 'first'}, letter); |
| else |
| store.put({ch: letter, half: 'second'}, letter); |
| }); |
| |
| store = connection.createObjectStore('out-of-line-multi', null); |
| index = store.createIndex('test_idx', 'attribs', {multiEntry: true}); |
| alphabet.forEach(function(letter) { |
| attrs = []; |
| if (['a', 'e', 'i', 'o', 'u'].indexOf(letter) != -1) |
| attrs.push('vowel'); |
| else |
| attrs.push('consonant'); |
| if (letter == 'a') |
| attrs.push('first'); |
| if (letter == 'z') |
| attrs.push('last'); |
| store.put({ch: letter, attribs: attrs}, letter); |
| }); |
| |
| store = connection.createObjectStore('empty', null); |
| index = store.createIndex('test_idx', 'upper'); |
| }; |
| }; |
| } |
| |
| function createGetAllRequest(t, storeName, connection, range, maxCount) { |
| var transaction = connection.transaction(storeName, 'readonly'); |
| var store = transaction.objectStore(storeName); |
| var index = store.index('test_idx'); |
| var req = index.getAll(range, maxCount); |
| req.onerror = t.unreached_func('getAll request should succeed'); |
| return req; |
| } |
| |
| doSetup(location.pathname + '-IDBIndex.getAll', 1, function(evt) { |
| var connection = evt.target.result; |
| async_test(function(t) { |
| var req = createGetAllRequest(t, 'out-of-line', connection, 'C'); |
| req.onsuccess = t.step_func(function(evt) { |
| var data = evt.target.result; |
| assert_class_string(data, 'Array', 'result should be an array'); |
| assert_array_equals(data.map(function(e) { return e.ch; }), ['c']); |
| assert_array_equals(data.map(function(e) { return e.upper; }), ['C']); |
| t.done(); |
| }); |
| }, 'Single item get'); |
| |
| async_test(function(t) { |
| var req = createGetAllRequest(t, 'empty', connection); |
| req.onsuccess = t.step_func(function(evt) { |
| assert_array_equals(evt.target.result, [], |
| 'getAll() on empty object store should return an empty array'); |
| t.done(); |
| }); |
| }, 'Empty object store'); |
| |
| async_test(function(t) { |
| var req = createGetAllRequest(t, 'out-of-line', connection); |
| req.onsuccess = t.step_func(function(evt) { |
| var data = evt.target.result; |
| assert_class_string(data, 'Array', 'result should be an array'); |
| assert_array_equals(data.map(function(e) { return e.ch; }), alphabet); |
| assert_array_equals(data.map(function(e) { return e.upper; }), ALPHABET); |
| t.done(); |
| }); |
| }, 'Get all keys'); |
| |
| async_test(function(t) { |
| var req = createGetAllRequest(t, 'out-of-line', connection, undefined, |
| 10); |
| req.onsuccess = t.step_func(function(evt) { |
| var data = evt.target.result; |
| assert_class_string(data, 'Array', 'result should be an array'); |
| assert_array_equals(data.map(function(e) { return e.ch; }), 'abcdefghij'.split('')); |
| assert_array_equals(data.map(function(e) { return e.upper; }), 'ABCDEFGHIJ'.split('')); |
| t.done(); |
| }); |
| }, 'maxCount=10'); |
| |
| async_test(function(t) { |
| var req = createGetAllRequest(t, 'out-of-line', connection, |
| IDBKeyRange.bound('G', 'M')); |
| req.onsuccess = t.step_func(function(evt) { |
| var data = evt.target.result; |
| assert_array_equals(data.map(function(e) { return e.ch; }), 'ghijklm'.split('')); |
| assert_array_equals(data.map(function(e) { return e.upper; }), 'GHIJKLM'.split('')); |
| t.done(); |
| }); |
| }, 'Get bound range'); |
| |
| async_test(function(t) { |
| var req = createGetAllRequest(t, 'out-of-line', connection, |
| IDBKeyRange.bound('G', 'M'), 3); |
| req.onsuccess = t.step_func(function(evt) { |
| var data = evt.target.result; |
| assert_class_string(data, 'Array', 'result should be an array'); |
| assert_array_equals(data.map(function(e) { return e.ch; }), 'ghi'.split('')); |
| assert_array_equals(data.map(function(e) { return e.upper; }), 'GHI'.split('')); |
| t.done(); |
| }); |
| }, 'Get bound range with maxCount'); |
| |
| async_test(function(t) { |
| var req = createGetAllRequest(t, 'out-of-line', connection, |
| IDBKeyRange.bound('G', 'K', false, true)); |
| req.onsuccess = t.step_func(function(evt) { |
| var data = evt.target.result; |
| assert_class_string(data, 'Array', 'result should be an array'); |
| assert_array_equals(data.map(function(e) { return e.ch; }), 'ghij'.split('')); |
| assert_array_equals(data.map(function(e) { return e.upper; }), 'GHIJ'.split('')); |
| t.done(); |
| }); |
| }, 'Get upper excluded'); |
| |
| async_test(function(t) { |
| var req = createGetAllRequest(t, 'out-of-line', connection, |
| IDBKeyRange.bound('G', 'K', true, false)); |
| req.onsuccess = t.step_func(function(evt) { |
| var data = evt.target.result; |
| assert_class_string(data, 'Array', 'result should be an array'); |
| assert_array_equals(data.map(function(e) { return e.ch; }), 'hijk'.split('')); |
| assert_array_equals(data.map(function(e) { return e.upper; }), 'HIJK'.split('')); |
| t.done(); |
| }); |
| }, 'Get lower excluded'); |
| |
| async_test(function(t) { |
| var req = createGetAllRequest(t, 'generated', |
| connection, IDBKeyRange.bound(4, 15), 3); |
| req.onsuccess = t.step_func(function(evt) { |
| var data = evt.target.result; |
| assert_true(Array.isArray(data)); |
| assert_equals(data.length, 0); |
| t.done(); |
| }); |
| }, 'Get bound range (generated) with maxCount'); |
| |
| async_test(function(t) { |
| var req = createGetAllRequest(t, 'out-of-line', |
| connection, "Doesn't exist"); |
| req.onsuccess = t.step_func(function(evt) { |
| assert_array_equals(evt.target.result, [], |
| 'getAll() using a nonexistent key should return an empty array'); |
| t.done(); |
| req.onerror = t.unreached_func('getAll request should succeed'); |
| }); |
| }, 'Non existent key'); |
| |
| async_test(function(t) { |
| var req = createGetAllRequest(t, 'out-of-line', connection, |
| undefined, 0); |
| req.onsuccess = t.step_func(function(evt) { |
| var data = evt.target.result; |
| assert_class_string(data, 'Array', 'result should be an array'); |
| assert_array_equals(data.map(function(e) { return e.ch; }), alphabet); |
| assert_array_equals(data.map(function(e) { return e.upper; }), ALPHABET); |
| t.done(); |
| }); |
| }, 'maxCount=0'); |
| |
| async_test(function(t) { |
| var req = createGetAllRequest(t, 'out-of-line-not-unique', connection, |
| 'first'); |
| req.onsuccess = t.step_func(function(evt) { |
| var data = evt.target.result; |
| assert_class_string(data, 'Array', 'result should be an array'); |
| assert_array_equals(data.map(function(e) { return e.ch; }), 'abcdefghijklm'.split('')); |
| assert_true(data.every(function(e) { return e.half === 'first'; })); |
| t.done(); |
| }); |
| }, 'Retrieve multiEntry key'); |
| |
| async_test(function(t) { |
| var req = createGetAllRequest(t, 'out-of-line-multi', connection, |
| 'vowel'); |
| req.onsuccess = t.step_func(function(evt) { |
| var data = evt.target.result; |
| assert_class_string(data, 'Array', 'result should be an array'); |
| assert_array_equals(data.map(function(e) { return e.ch; }), ['a', 'e', 'i', 'o', 'u']); |
| assert_array_equals(data[0].attribs, ['vowel', 'first']); |
| assert_true(data.every(function(e) { return e.attribs[0] === 'vowel'; })); |
| t.done(); |
| }); |
| }, 'Retrieve one key multiple values'); |
| |
| // Explicit done needed in case async_test body fails synchronously. |
| done(); |
| }); |
| |
| </script> |