[Webkit-unassigned] [Bug 189034] New: For-in over a proxy does not use getOwnPropertyDescriptor trap
bugzilla-daemon at webkit.org
bugzilla-daemon at webkit.org
Mon Aug 27 16:36:11 PDT 2018
https://bugs.webkit.org/show_bug.cgi?id=189034
Bug ID: 189034
Summary: For-in over a proxy does not use
getOwnPropertyDescriptor trap
Product: WebKit
Version: Safari Technology Preview
Hardware: Unspecified
OS: Unspecified
Status: NEW
Severity: Normal
Priority: P2
Component: JavaScriptCore
Assignee: webkit-unassigned at lists.webkit.org
Reporter: bakkot at gmail.com
Consider the following program:
```
if (typeof console === 'undefined') console = { log: print };
let a = Object.create(null, {
x: { enumerable: false, configurable: true, value: 0 },
});
let handler = {
getOwnPropertyDescriptor(t, p) {
console.log('gopd');
let o = Reflect.getOwnPropertyDescriptor(t, p);
o.enumerable = true;
return o;
},
};
let pa = new Proxy(a, handler);
for (let key in pa) {
console.log('reached');
}
```
This prints nothing. It should print `gopd` and `reached`, like every other browser. The spec, in #sec-enumerate-object-properties, requires that for-in enumeration determines enumerability by calling [[GetOwnProperty]], which on proxies means an observable invocation of the getOwnPropertyDescriptor trap.
JSC appears to be relying on the enumerability of the target's property directly, which is bad.
This only happens if the `ownKeys` handler is not present, even with the default behavior. That is, adding `ownKeys(target) { return Reflect.ownKeys(target); },` to the proxy's handler causes the program to behave correctly.
See also https://bugs.webkit.org/show_bug.cgi?id=189030. These two might have the same root cause - from the observable behavior, it looks like some code is assuming that `ownKeys` only returns enumerable properties, which is not its behavior (even in JSC).
See also (and please comment on) this open spec bug about more precisely specifying the behavior of for-in, which prompted the investigation which lead me to discovering these issues: https://github.com/tc39/ecma262/issues/1281
--
You are receiving this mail because:
You are the assignee for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.webkit.org/pipermail/webkit-unassigned/attachments/20180827/60f2e624/attachment.html>
More information about the webkit-unassigned
mailing list