- From: David Bruant <bruant.d@gmail.com>
- Date: Thu, 13 Dec 2012 12:01:08 +0100
- To: "public-script-coord@w3.org" <public-script-coord@w3.org>
- Message-ID: <50C9B574.5050804@gmail.com>
Hi, It is not absolutely necessary, but for context, you can read the recent related es-discuss thread [1]. WindowProxy instances, when changing of underlying targets violate ES5 invariants (more because of under-specification than anything else I believe). These invariants apply to host objects too. For reference, section 8.6.2 [2]: " The [[GetOwnProperty]] internal method of a host object must conform to the following invariants for each property of the host object: If a property is described as a data property and it may return different values over time, then either or both of the [[Writable]] and [[Configurable] attributes must be true even if no mechanism to change the value is exposed via the other internal methods. If a property is described as a data property and its [[Writable]] and [[Configurable]] are both false, then the SameValue (according to 9.12) must be returned for the [[Value]] attribute of the property on all calls to [[GetOwnProperty]]. If the value of the host object's [[Extensible]] internal property is has been observed by ECMAScript code to be *false*, then if a call to [[GetOwnProperty]] describes a property as non-existent all subsequent calls must also describe that property as non-existent." I expose some of these violations in a script [3] (see the console). In this example, a WindowProxy instance is assigned a non-configurable, non-writable property, but when the underlying Window is changed, this property disappears violating the above invariant. Some agreement has started to emerged on es-discuss [4] and the main idea would be the following: whenever the underlying window of a WindowProxy can change, the internal operations ([[DefineOwnProperty]], [[GetOwnProperty]]) must throw whenever they're about to commit to an invariant. More concretely, it means that a WindowProxy which can has its window changed can't be made non-extensible and can't have non-configurable properties defined on it. Any attempt to make the object non-extensible must throw as well as any attempt to set a property as non-configurable or report a property as non-configurable (with Object.getOwnPropertyDescriptor). This change is not compatible with what's currently implemented in both Chrome and Firefox, but I'm confident ES5 Object methods are not used a lot in content and even less likely on WindowProxy instances, so I think it's worth trying. It's been pointed that a script can add a non-configurable property to its global object [5] and there is no reason to prevent that. So from the spec perspective, there would bit 2 types of WindowProxy: * Those which are guaranteed to never change the underlying window (and can add non-configurable properties) * Those which can change the underlying window (and should never do anything committing to invariants) From an ES6 perspective, different WindowProxies would be ES6 proxies with different handlers (if you're unfamiliar with ES6 direct proxies, feel free to ask questions) What do you think of the problem? What do you think of the suggested solution? I'd like to write tests to be added to the webapps test mercurial. But before doing so, I'd like to know the exhaustive list of cases and conditions where: * one has access to a WindowProxy which is guaranteed to never have its underlying window changed * one has access to a WindowProxy which may have its underlying window changed David [1] https://mail.mozilla.org/pipermail/es-discuss/2012-December/027080.html [2] http://es5.github.com/#x8.6.2 [3] http://davidbruant.github.com/iframeProxyIssueDemo/ [4] https://mail.mozilla.org/pipermail/es-discuss/2012-December/027114.html [5] last point of https://mail.mozilla.org/pipermail/es-discuss/2012-December/027092.html
Received on Thursday, 13 December 2012 11:01:41 UTC