| Index: LayoutTests/imported/web-platform-tests/IndexedDB/keypath.htm
 | 
| diff --git a/LayoutTests/imported/web-platform-tests/IndexedDB/keypath.htm b/LayoutTests/imported/web-platform-tests/IndexedDB/keypath.htm
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..df997b35d528050fcb224e42fc2aef29c9c83d6c
 | 
| --- /dev/null
 | 
| +++ b/LayoutTests/imported/web-platform-tests/IndexedDB/keypath.htm
 | 
| @@ -0,0 +1,148 @@
 | 
| +<!DOCTYPE html>
 | 
| +<!--  Submitted from TestTWF Paris  -->
 | 
| +<meta charset="utf-8">
 | 
| +<title>Keypath</title>
 | 
| +<link rel=help href="http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#key-path-construct">
 | 
| +<link rel=assert title="A key path is a DOMString that defines how to extract a key from a value. A valid key path is either the empty string, a JavaScript identifier, or multiple Javascript identifiers separated by periods (ASCII character code 46) [ECMA-262].">
 | 
| +<script src="../../../resources/testharness.js"></script>
 | 
| +<script src="../../../resources/testharnessreport.js"></script>
 | 
| +<script src="support.js"></script>
 | 
| +
 | 
| +<script>
 | 
| +
 | 
| +    var global_db = createdb_for_multiple_tests();
 | 
| +
 | 
| +    function keypath(keypath, objects, expected_keys, desc) {
 | 
| +        var db,
 | 
| +            t = async_test(document.title + " - " + (desc ? desc : keypath)),
 | 
| +
 | 
| +            store_name = "store-"+(Date.now())+Math.random();
 | 
| +
 | 
| +        var open_rq = global_db.setTest(t);
 | 
| +        open_rq.onupgradeneeded = function(e) {
 | 
| +            db = e.target.result;
 | 
| +            var objStore = db.createObjectStore(store_name, { keyPath: keypath });
 | 
| +
 | 
| +            for (var i = 0; i < objects.length; i++)
 | 
| +                objStore.add(objects[i]);
 | 
| +        };
 | 
| +
 | 
| +        open_rq.onsuccess = function(e) {
 | 
| +            var actual_keys = [],
 | 
| +              rq = db.transaction(store_name)
 | 
| +                     .objectStore(store_name)
 | 
| +                     .openCursor();
 | 
| +
 | 
| +            rq.onsuccess = t.step_func(function(e) {
 | 
| +                var cursor = e.target.result;
 | 
| +
 | 
| +                if (cursor) {
 | 
| +                    actual_keys.push(cursor.key.valueOf());
 | 
| +                    cursor.continue();
 | 
| +                }
 | 
| +                else {
 | 
| +                    assert_equals(actual_keys.length, expected_keys.length, "array length");
 | 
| +                    assert_object_equals(actual_keys, expected_keys, "keyorder array");
 | 
| +
 | 
| +                    t.done();
 | 
| +                }
 | 
| +            });
 | 
| +        };
 | 
| +    }
 | 
| +
 | 
| +    keypath('my.key',
 | 
| +        [ { my: { key: 10 } } ],
 | 
| +        [ 10 ]);
 | 
| +
 | 
| +    keypath('my.køi',
 | 
| +        [ { my: { køi: 5 } } ],
 | 
| +        [ 5 ]);
 | 
| +
 | 
| +    keypath('my.key_ya',
 | 
| +        [ { my: { key_ya: 10 } } ],
 | 
| +        [ 10 ]);
 | 
| +
 | 
| +    keypath('public.key$ya',
 | 
| +        [ { public: { key$ya: 10 } } ],
 | 
| +        [ 10 ]);
 | 
| +
 | 
| +    keypath('true.$',
 | 
| +        [ { true: { $: 10 } } ],
 | 
| +        [ 10 ]);
 | 
| +
 | 
| +    keypath('my._',
 | 
| +        [ { my: { _: 10 } } ],
 | 
| +        [ 10 ]);
 | 
| +
 | 
| +    keypath('delete.a7',
 | 
| +        [ { delete: { a7: 10 } } ],
 | 
| +        [ 10 ]);
 | 
| +
 | 
| +    keypath('p.p.p.p.p.p.p.p.p.p.p.p.p.p',
 | 
| +        [ {p:{p:{p:{p:{p:{p:{p:{p:{p:{p:{p:{p:{p:{p:10}}}}}}}}}}}}}} ],
 | 
| +        [ 10 ]);
 | 
| +
 | 
| +    keypath('str.length',
 | 
| +        [ { str: "pony" }, { str: "my" }, { str: "little" }, { str: "" } ],
 | 
| +        [ 0, 2, 4, 6 ]);
 | 
| +
 | 
| +    keypath('arr.length',
 | 
| +        [ {arr: [0, 0, 0, 0]}, {arr: [{}, 0, "hei", "length", Infinity, []]}, {arr: [10, 10]}, { arr: []} ],
 | 
| +        [ 0, 2, 4, 6 ]);
 | 
| +
 | 
| +    keypath('length',
 | 
| +        [ [10, 10], "123", { length: 20 } ],
 | 
| +        [ 2, 3, 20 ]);
 | 
| +
 | 
| +    keypath('',
 | 
| +        [ ["bags"], "bean", 10 ],
 | 
| +        [ 10, "bean", ["bags"] ],
 | 
| +        "'' uses value as key");
 | 
| +
 | 
| +    keypath([''],
 | 
| +        [ ["bags"], "bean", 10 ],
 | 
| +        [ [10], ["bean"] , [["bags"]] ],
 | 
| +        "[''] uses value as [key]");
 | 
| +
 | 
| +    keypath(['x', 'y'],
 | 
| +        [ {x:10, y:20}, {y:1.337, x:100} ],
 | 
| +        [ [10, 20], [100, 1.337] ],
 | 
| +        "['x', 'y']");
 | 
| +
 | 
| +    keypath([['x'], ['y']],
 | 
| +        [ {x:10, y:20}, {y:1.337, x:100} ],
 | 
| +        [ [10, 20], [100, 1.337] ],
 | 
| +        "[['x'], 'y'] (stringifies)");
 | 
| +
 | 
| +    keypath(['x', {toString:function(){return 'y'}}],
 | 
| +        [ {x:10, y:20}, {y:1.337, x:100} ],
 | 
| +        [ [10, 20], [100, 1.337] ],
 | 
| +        "['x', {toString->'y'}] (stringifies)");
 | 
| +
 | 
| +    if (false) {
 | 
| +        var myblob = Blob(["Yoda"], {type:'suprawsum'});
 | 
| +        keypath(['length', 'type'],
 | 
| +            [ myblob ],
 | 
| +            [ 4, 'suprawsum' ],
 | 
| +            "[Blob.length, Blob.type]");
 | 
| +    }
 | 
| +
 | 
| +    // File.name and File.lastModifiedDate is not testable automatically
 | 
| +
 | 
| +    keypath(['name', 'type'],
 | 
| +        [ { name: "orange", type: "fruit" }, { name: "orange", type: ["telecom", "french"] } ],
 | 
| +        [ ["orange", "fruit"], ["orange", ["telecom", "french"]] ]);
 | 
| +
 | 
| +    keypath(['name', 'type.name'],
 | 
| +        [ { name: "orange", type: { name: "fruit" }}, { name: "orange", type: { name: "telecom" }} ],
 | 
| +        [ ["orange", "fruit"], ["orange", "telecom" ] ]);
 | 
| +
 | 
| +    loop_array = [];
 | 
| +    loop_array.push(loop_array);
 | 
| +    keypath(loop_array,
 | 
| +        [ "a", 1, ["k"] ],
 | 
| +        [ [1], ["a"], [["k"]] ],
 | 
| +        "array loop -> stringify becomes ['']");
 | 
| +</script>
 | 
| +
 | 
| +<div id=log></div>
 | 
| 
 |