<!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>
