| <!doctype html> |
| <meta charset="utf-8" /> |
| <title>IndexedDB: IDBCursor continuePrimaryKey() exception throwing</title> |
| <link rel="help" |
| href="https://w3c.github.io/IndexedDB/#dom-idbcursor-continueprimarykey" /> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script> |
| |
| async_test(function(t) { |
| var dbname = document.location + '-' + t.name; |
| var del = indexedDB.deleteDatabase(dbname); |
| del.onerror = t.unreached_func('deleteDatabase should succeed'); |
| var open = indexedDB.open(dbname); |
| open.onerror = t.unreached_func('open should succeed'); |
| |
| open.onupgradeneeded = t.step_func(function() { |
| var db = open.result; |
| t.add_cleanup(function() { |
| db.close(); |
| indexedDB.deleteDatabase(db.name); |
| }); |
| var store = db.createObjectStore('store'); |
| store.put('a', 1).onerror = t.unreached_func('put should not fail'); |
| var request = store.openCursor(); |
| request.onerror = t.unreached_func('openCursor should not fail'); |
| request.onsuccess = t.step_func(function() { |
| var cursor = request.result; |
| assert_class_string(cursor, 'IDBCursorWithValue', |
| 'result should be a cursor'); |
| |
| assert_throws('InvalidAccessError', function() { |
| cursor.continuePrimaryKey(2, 2); |
| }, 'continuePrimaryKey() should throw if source is not an index'); |
| }); |
| }); |
| |
| open.onsuccess = t.step_func(function() { |
| var db = open.result; |
| db.close(); |
| t.done(); |
| }); |
| |
| }, 'IDBCursor continuePrimaryKey() on object store cursor'); |
| |
| [ |
| { |
| 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' |
| } |
| ].forEach(function(testcase) { |
| async_test(function(t) { |
| var dbname = document.location + '-' + t.name; |
| var del = indexedDB.deleteDatabase(dbname); |
| del.onerror = t.unreached_func('deleteDatabase should succeed'); |
| var open = indexedDB.open(dbname); |
| open.onerror = t.unreached_func('open should succeed'); |
| |
| open.onupgradeneeded = t.step_func(function() { |
| var db = open.result; |
| t.add_cleanup(function() { |
| db.close(); |
| indexedDB.deleteDatabase(db.name); |
| }); |
| var store = db.createObjectStore('store', {keyPath: 'pk'}); |
| var 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'); |
| var request = index.openKeyCursor(null, testcase.direction); |
| request.onerror = t.unreached_func('openCursor should not fail'); |
| request.onsuccess = t.step_func(function() { |
| var 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('InvalidAccessError', function() { |
| cursor.continuePrimaryKey( |
| testcase.continue_key, |
| testcase.continue_primaryKey); |
| }, 'continuePrimaryKey() should throw if direction is unique'); |
| }); |
| }); |
| |
| open.onsuccess = t.step_func(function() { |
| var db = open.result; |
| db.close(); |
| t.done(); |
| }); |
| |
| }, 'IDBCursor continuePrimaryKey() on "' + testcase.direction + '" cursor'); |
| }); |
| |
| </script> |