<div dir="ltr">Yehuda and I just talked about this code and realized that we can allow this code to proceed on the success path without violating the invariants. However, this analysis reveals that the intent stated in the comment is unwarranted, but even that intent can be adequately honored in the scenario of interest.<div><br></div><div>The reason why the intent is unwarranted is that the descriptor omits "configurable:" rather than explicitly saying "configurable: true". If the owner object already has a configurable own property of the same name, then a defineProperty where the "configurable:" is omitted defines an own property preserving the configurability of the original own property.</div><div><br></div><div>Even if owner could not have already had an own property of this name, owner might be an ES6 proxy whose target is, say, an empty object. The handler's defineProperty trap could still first define a configurable own property of this name, and then proceed with the normal logic.</div><div><br></div><div>Since the WindowProxy is not a Proxy, or more relevantly, even if it were a Proxy, the underlying Window is not its target, we can even do the following:</div><div><br></div><div>When the WindowProxy sees the defineProperty with the omitted "configurable:" and determines that the underlying Window does not already have this property. WindowProxy can even preserve the unwarranted intent expressed in the comment by actually defining a *non-configurable* own property on the Window itself. However, the behavior of the WindowProxy is not observably different than our Proxy example: It acts as if it created a configurable own property on the WindowProxy of this same name, and then proceeds with the normal defineProperty behavior, which preserves that alleged configurability.</div><div><br></div><div><br></div><div><br></div><div><br><div><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jan 27, 2015 at 11:48 AM, Boris Zbarsky <span dir="ltr"><<a href="mailto:bzbarsky@mit.edu" target="_blank">bzbarsky@mit.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 12/4/14 11:49 AM, Mark S. Miller wrote:<br>
</span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">
On Thu, Dec 4, 2014 at 2:58 AM, Boris Zbarsky <<a href="mailto:bzbarsky@mit.edu" target="_blank">bzbarsky@mit.edu</a>> wrote:<br>
</span><span class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
OK.  What do we do if we discover that throwing from the defineProperty call<br>
with a non-configurable property descriptor is not web-compatible?<br>
</blockquote>
<br>
What we always do<br>
</span></blockquote>
<br>
So just for the record, jQuery (at least all the 2.* versions I've looked at) contains that following bits:<br>
<br>
  Data.prototype = {<br>
        key: function( owner ) {<br>
...<br>
                var descriptor = {},<br>
...<br>
                        // Secure it in a non-enumerable, non-writable property<br>
                        try {<br>
                                descriptor[ this.expando ] = { value: unlock };<br>
                                Object.defineProperties( owner, descriptor );<br>
<br>
                        // Support: Android < 4<br>
                        // Fallback to a less secure definition<br>
                        } catch ( e ) {<br>
                                descriptor[ this.expando ] = unlock;<br>
                                jQuery.extend( owner, descriptor );<br>
                        }<br>
<br>
This function is called from Data.prototype.get, which is called from jQuery.event.add.  So the upshot is that trying to add an event listener to the window via the jQuery API will hit this codepath.<br>
<br>
Now the good news is that the try/catch _is_ present there, so this doesn't immediately break sites.  But it's something to watch out for, and we _will_ be changing the behavior of jQuery here in a way that the jQuery developers clearly think is undesirable.<span class="HOEnZb"><font color="#888888"><br>
<br>
-Boris<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">    Cheers,<br>    --MarkM</div>
</div>