| Index: third_party/WebKit/LayoutTests/imported/web-platform-tests/IndexedDB/idbobjectstore_openKeyCursor.htm | 
| diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/IndexedDB/idbobjectstore_openKeyCursor.htm b/third_party/WebKit/LayoutTests/imported/web-platform-tests/IndexedDB/idbobjectstore_openKeyCursor.htm | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..d1f467e4d23fe1cc88b5bb4cfac3881ba19ee106 | 
| --- /dev/null | 
| +++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/IndexedDB/idbobjectstore_openKeyCursor.htm | 
| @@ -0,0 +1,139 @@ | 
| +<!DOCTYPE html> | 
| +<title>IDBObjectStore.openKeyCursor()</title> | 
| +<script src="../../../resources/testharness.js"></script> | 
| +<script src="../../../resources/testharnessreport.js"></script> | 
| +<script> | 
| +function store_test(func, name) { | 
| +    async_test(function(t) { | 
| +        var del = indexedDB.deleteDatabase(name); | 
| +        del.onerror = t.unreached_func("deleteDatabase failed"); | 
| +        var open = indexedDB.open(name); | 
| +        open.onupgradeneeded = t.step_func(function() { | 
| +            var db = open.result; | 
| +            var store = db.createObjectStore("store"); | 
| +            for (var i = 0; i < 10; ++i) { | 
| +                store.put("value: " + i, i); | 
| +            } | 
| +        }); | 
| + | 
| +        open.onsuccess = t.step_func(function() { | 
| +            var db = open.result; | 
| +            var tx = db.transaction("store"); | 
| +            var store = tx.objectStore("store"); | 
| +            func(t, db, tx, store); | 
| +        }); | 
| +    }, name); | 
| +} | 
| + | 
| +store_test(function(t, db, tx, store) { | 
| +    var expected = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; | 
| +    var actual = []; | 
| +    var request = store.openKeyCursor(); | 
| +    request.onsuccess = t.step_func(function() { | 
| +        var cursor = request.result; | 
| +        if (!cursor) | 
| +            return; | 
| +        assert_equals(cursor.direction, "next"); | 
| +        assert_false("value" in cursor); | 
| +        assert_equals(indexedDB.cmp(cursor.key, cursor.primaryKey), 0); | 
| +        actual.push(cursor.key); | 
| +        cursor.continue(); | 
| +    }); | 
| + | 
| +    tx.onabort = t.unreached_func("transaction aborted"); | 
| +    tx.oncomplete = t.step_func(function() { | 
| +        assert_array_equals(expected, actual, "keys should match"); | 
| +        t.done(); | 
| +    }); | 
| + | 
| +}, "IDBObjectStore.openKeyCursor() - forward iteration"); | 
| + | 
| +store_test(function(t, db, tx, store) { | 
| +    var expected = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]; | 
| +    var actual = []; | 
| +    var request = store.openKeyCursor(null, "prev"); | 
| +    request.onsuccess = t.step_func(function() { | 
| +        var cursor = request.result; | 
| +        if (!cursor) | 
| +            return; | 
| +        assert_equals(cursor.direction, "prev"); | 
| +        assert_false("value" in cursor); | 
| +        assert_equals(indexedDB.cmp(cursor.key, cursor.primaryKey), 0); | 
| +        actual.push(cursor.key); | 
| +        cursor.continue(); | 
| +    }); | 
| + | 
| +    tx.onabort = t.unreached_func("transaction aborted"); | 
| +    tx.oncomplete = t.step_func(function() { | 
| +        assert_array_equals(expected, actual, "keys should match"); | 
| +        t.done(); | 
| +    }); | 
| + | 
| +}, "IDBObjectStore.openKeyCursor() - reverse iteration"); | 
| + | 
| +store_test(function(t, db, tx, store) { | 
| +    var expected = [4, 5, 6]; | 
| +    var actual = []; | 
| +    var request = store.openKeyCursor(IDBKeyRange.bound(4, 6)); | 
| +    request.onsuccess = t.step_func(function() { | 
| +        var cursor = request.result; | 
| +        if (!cursor) | 
| +            return; | 
| +        assert_equals(cursor.direction, "next"); | 
| +        assert_false("value" in cursor); | 
| +        assert_equals(indexedDB.cmp(cursor.key, cursor.primaryKey), 0); | 
| +        actual.push(cursor.key); | 
| +        cursor.continue(); | 
| +    }); | 
| + | 
| +    tx.onabort = t.unreached_func("transaction aborted"); | 
| +    tx.oncomplete = t.step_func(function() { | 
| +        assert_array_equals(expected, actual, "keys should match"); | 
| +        t.done(); | 
| +    }); | 
| + | 
| +}, "IDBObjectStore.openKeyCursor() - forward iteration with range"); | 
| + | 
| +store_test(function(t, db, tx, store) { | 
| +    var expected = [6, 5, 4]; | 
| +    var actual = []; | 
| +    var request = store.openKeyCursor(IDBKeyRange.bound(4, 6), "prev"); | 
| +    request.onsuccess = t.step_func(function() { | 
| +        var cursor = request.result; | 
| +        if (!cursor) | 
| +            return; | 
| +        assert_equals(cursor.direction, "prev"); | 
| +        assert_false("value" in cursor); | 
| +        assert_equals(indexedDB.cmp(cursor.key, cursor.primaryKey), 0); | 
| +        actual.push(cursor.key); | 
| +        cursor.continue(); | 
| +    }); | 
| + | 
| +    tx.onabort = t.unreached_func("transaction aborted"); | 
| +    tx.oncomplete = t.step_func(function() { | 
| +        assert_array_equals(expected, actual, "keys should match"); | 
| +        t.done(); | 
| +    }); | 
| + | 
| +}, "IDBObjectStore.openKeyCursor() - reverse iteration with range"); | 
| + | 
| +store_test(function(t, db, tx, store) { | 
| +    assert_throws("DataError", function() { store.openKeyCursor(NaN); }, | 
| +        "openKeyCursor should throw on invalid number key"); | 
| +    assert_throws("DataError", function() { store.openKeyCursor(new Date(NaN)); }, | 
| +        "openKeyCursor should throw on invalid date key"); | 
| +    assert_throws("DataError", function() { | 
| +        var cycle = []; | 
| +        cycle.push(cycle); | 
| +        store.openKeyCursor(cycle); | 
| +    }, "openKeyCursor should throw on invalid array key"); | 
| +    assert_throws("DataError", function() { store.openKeyCursor({}); }, | 
| +        "openKeyCursor should throw on invalid key type"); | 
| +    setTimeout(t.step_func(function() { | 
| +        assert_throws("TransactionInactiveError", function() { store.openKeyCursor(); }, | 
| +            "openKeyCursor should throw if transaction is inactive"); | 
| +        t.done(); | 
| +    }), 0); | 
| + | 
| +}, "IDBObjectStore.openKeyCursor() - invalid inputs"); | 
| +</script> | 
|  |