// META: global=window,worker // META: title=IndexedDB: IDBCursor continuePrimaryKey() exception throwing // META: script=resources/support.js // Spec: https://w3c.github.io/IndexedDB/#dom-idbcursor-continueprimarykey 'use strict'; async_test(t => { const dbname = location + '-' + t.name; const del = indexedDB.deleteDatabase(dbname); del.onerror = t.unreached_func('deleteDatabase should succeed'); const open = indexedDB.open(dbname); open.onerror = t.unreached_func('open should succeed'); open.onupgradeneeded = t.step_func((e) => { const db = open.result; t.add_cleanup((e) => { db.close(); indexedDB.deleteDatabase(db.name); }); const store = db.createObjectStore('store'); store.put('a', 1).onerror = t.unreached_func('put should not fail'); const request = store.openCursor(); request.onerror = t.unreached_func('openCursor should not fail'); request.onsuccess = t.step_func((e) => { const cursor = request.result; assert_class_string( cursor, 'IDBCursorWithValue', 'result should be a cursor'); assert_throws_dom('InvalidAccessError', function() { cursor.continuePrimaryKey(2, 2); }, 'continuePrimaryKey() should throw if source is not an index'); }); }); open.onsuccess = t.step_func((e) => { const db = open.result; db.close(); t.done(); }); }, 'IDBCursor continuePrimaryKey() on object store cursor'); const testcases = [ { direction: 'nextunique', expected_key: 1, expected_primaryKey: 'a', continue_key: 2, continue_primaryKey: 'a' }, { direction: 'prevunique', expected_key: 3, expected_primaryKey: 'a', continue_key: 2, continue_primaryKey: 'a' } ]; testcases.forEach(function(testcase) { async_test(t => { const dbname = location + '-' + t.name; const del = indexedDB.deleteDatabase(dbname); del.onerror = t.unreached_func('deleteDatabase should succeed'); const open = indexedDB.open(dbname); open.onerror = t.unreached_func('open should succeed'); open.onupgradeneeded = t.step_func(() => { const db = open.result; t.add_cleanup((e) => { db.close(); indexedDB.deleteDatabase(db.name); }); const store = db.createObjectStore('store', {keyPath: 'pk'}); const index = store.createIndex('index', 'ik', {multiEntry: true}); store.put({pk: 'a', ik: [1, 2, 3]}).onerror = t.unreached_func('put should not fail'); store.put({pk: 'b', ik: [1, 2, 3]}).onerror = t.unreached_func('put should not fail'); const request = index.openKeyCursor(null, testcase.direction); request.onerror = t.unreached_func('openCursor should not fail'); request.onsuccess = t.step_func((e) => { const cursor = request.result; assert_class_string(cursor, 'IDBCursor', 'result should be a cursor'); assert_equals( cursor.direction, testcase.direction, 'direction should be as specified'); assert_equals(cursor.key, testcase.expected_key, 'key should match'); assert_equals( cursor.primaryKey, testcase.expected_primaryKey, 'primaryKey should match'); assert_throws_dom('InvalidAccessError', () => { cursor.continuePrimaryKey( testcase.continue_key, testcase.continue_primaryKey); }, 'continuePrimaryKey() should throw if direction is unique'); }); }); open.onsuccess = t.step_func(() => { const db = open.result; db.close(); t.done(); }); }, 'IDBCursor continuePrimaryKey() on "' + testcase.direction + '" cursor'); });