| // Copyright 2015 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Flags: --harmony-proxies |
| |
| var target = { |
| "target_one": 1 |
| }; |
| target.__proto__ = { |
| "target_two": 2 |
| }; |
| var handler = { |
| enumerate: function(target) { |
| function* keys() { |
| yield "foo"; |
| yield "bar"; |
| } |
| return keys(); |
| } |
| } |
| |
| var proxy = new Proxy(target, handler); |
| |
| function TestForIn(receiver, expected) { |
| var result = []; |
| for (var k in receiver) { |
| result.push(k); |
| } |
| assertEquals(expected, result); |
| } |
| |
| TestForIn(proxy, ["foo", "bar"]); |
| |
| // Properly call traps on proxies on the prototype chain. |
| var receiver = { |
| "receiver_one": 1 |
| }; |
| receiver.__proto__ = proxy; |
| // TODO(jkummerow): Needs proper 'has' trap; implement that and enable this! |
| // TestForIn(receiver, ["receiver_one", "foo", "bar"]); |
| |
| // Fall through to default behavior when trap is undefined. |
| handler.enumerate = undefined; |
| TestForIn(proxy, ["target_one", "target_two"]); |
| delete handler.enumerate; |
| TestForIn(proxy, ["target_one", "target_two"]); |
| |
| // Non-string keys must be filtered. |
| function TestNonStringKey(key) { |
| handler.enumerate = function(target) { |
| function* keys() { yield key; } |
| return keys(); |
| } |
| assertThrows("for (var k in proxy) {}", TypeError); |
| } |
| |
| TestNonStringKey(1); |
| TestNonStringKey(3.14); |
| TestNonStringKey(Symbol("foo")); |
| TestNonStringKey({bad: "value"}); |
| TestNonStringKey(null); |
| TestNonStringKey(undefined); |
| TestNonStringKey(true); |