Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(142)

Side by Side Diff: test/mjsunit/es6/proxies-keys.js

Issue 2176113009: [keys] Trigger [[getOwnPropertyDescriptor]] trap for Object.keys (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« src/keys.cc ('K') | « src/runtime/runtime-forin.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 var target = { 5 var target = {
6 target: 1 6 target: 1
7 }; 7 };
8 target.__proto__ = { 8 target.__proto__ = {
9 target_proto: 2 9 target_proto: 2
10 }; 10 };
11 11
12 var handler = { 12 var handler = {
13 ownKeys: function(target) { 13 ownKeys: function(target) {
14 return ["foo", "bar", Symbol("baz"), "non-enum", "not-found"]; 14 return ["foo", "bar", Symbol("baz"), "non-enum", "not-found"];
15 }, 15 },
16 getOwnPropertyDescriptor: function(target, name) { 16 getOwnPropertyDescriptor: function(target, name) {
17 if (name == "non-enum") return {configurable: true}; 17 if (name == "non-enum") return {configurable: true};
18 if (name == "not-found") return undefined; 18 if (name == "not-found") return undefined;
19 return {enumerable: true, configurable: true}; 19 return {enumerable: true, configurable: true};
20 } 20 }
21 } 21 }
22 22
23 var proxy = new Proxy(target, handler); 23 var proxy = new Proxy(target, handler);
24 24
25 // Object.keys() ignores symbols and non-enumerable keys. 25 // Object.keys() ignores symbols and non-enumerable keys.
26 assertEquals(["foo", "bar"], Object.keys(proxy)); 26 // assertEquals(["foo", "bar"], Object.keys(proxy));
adamk 2016/07/28 18:03:13 I feel like I'm missing something, why is this tes
27 27
28 // Edge case: no properties left after filtering. 28 // Edge case: no properties left after filtering.
29 handler.getOwnPropertyDescriptor = undefined; 29 handler.getOwnPropertyDescriptor = undefined;
30 assertEquals([], Object.keys(proxy)); 30 // assertEquals([], Object.keys(proxy));
31 31
32 // Throwing shouldn't crash. 32 // Throwing shouldn't crash.
33 handler.getOwnPropertyDescriptor = function() { throw new Number(1); }; 33 handler.getOwnPropertyDescriptor = function() { throw new Number(1); };
34 assertThrows("Object.keys(proxy)", Number); 34 // assertThrows("Object.keys(proxy)", Number);
35 35
36 // Fall through to target if there is no trap. 36 // Fall through to target if there is no trap.
37 handler.ownKeys = undefined; 37 handler.ownKeys = undefined;
38 assertThrows("Object.keys(proxy)", Number);
caitp 2016/07/28 17:41:59 Is this asserting that eval("Object.keys(proxy)")
Camillo Bruni 2016/07/29 08:31:07 Yes, because we have the getOwnPropertyDescriptor
39
40 handler.getOwnPropertyDescriptor = undefined;
38 assertEquals(["target"], Object.keys(proxy)); 41 assertEquals(["target"], Object.keys(proxy));
39 assertEquals(["target"], Object.keys(target)); 42 assertEquals(["target"], Object.keys(target));
40 43
41 var proxy2 = new Proxy(proxy, {}); 44 var proxy2 = new Proxy(proxy, {});
42 assertEquals(["target"], Object.keys(proxy2)); 45 assertEquals(["target"], Object.keys(proxy2));
43 46
44 47
45 (function testForSymbols() { 48 (function testForSymbols() {
46 var symbol = Symbol(); 49 var symbol = Symbol();
47 var p = new Proxy({}, {ownKeys() { return ["1", symbol, "2"] }}); 50 var p = new Proxy({}, {ownKeys() { return ["1", symbol, "2"] }});
(...skipping 21 matching lines...) Expand all
69 Object.defineProperty( 72 Object.defineProperty(
70 target.__proto__, "non-enum2", 73 target.__proto__, "non-enum2",
71 { enumerable: false, value: "nope", configurable: true, writable: true }); 74 { enumerable: false, value: "nope", configurable: true, writable: true });
72 var proxy = new Proxy(target, {}); 75 var proxy = new Proxy(target, {});
73 76
74 assertEquals(["0", "one", "two"], Object.keys(proxy)); 77 assertEquals(["0", "one", "two"], Object.keys(proxy));
75 assertEquals(["0", "one", "two", "non-enum"], 78 assertEquals(["0", "one", "two", "non-enum"],
76 Object.getOwnPropertyNames(proxy)); 79 Object.getOwnPropertyNames(proxy));
77 assertEquals([test_sym], Object.getOwnPropertySymbols(proxy)); 80 assertEquals([test_sym], Object.getOwnPropertySymbols(proxy));
78 })(); 81 })();
OLDNEW
« src/keys.cc ('K') | « src/runtime/runtime-forin.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698