W3C home > Mailing lists > Public > public-script-coord@w3.org > July to September 2012

Re: Web IDL attributes and delegation

From: Boris Zbarsky <bzbarsky@MIT.EDU>
Date: Thu, 13 Sep 2012 02:53:14 +0100
Message-ID: <50513C8A.3070100@mit.edu>
To: public-script-coord@w3.org
On 9/13/12 2:39 AM, Colin Snover wrote:
> First, there seems to be an assumption here that I want to permanently
> alter the original event object. Sometimes this is OK, but sometimes it
> is not.

Ah, yes.  Then you do need some sort of delegation mechanism, if you 
want to filter access to the event object but not modify the event 
object itself.

> Second, if I am reading the spec correctly, [Unforgeable] means
> defineProperty *won’t* work in some cases. This flag may not be set on
> Event properties

This flag is only set on properties that must not be changed because it 
would break legacy code that does security checks based on those 
properties.  It's basically only used on members of Window and Document, 
and even then on very few members.

> No, though it sounds like using defineProperty would break these
> implementations now. Do you know offhand who implements this way and if
> this does, indeed, break them?

Safari and Chrome, and no idea what they do with defineProperty on DOM 
objects.

>>    var elem = document.createElement("span");
>>    elem.innerHTML = "<i>Something</i>"
>>    var obj = Object.create(elem);
>>    Object.defineProperty(obj, "firstChild", { value: elem; });
>>    alert(obj.innerHTML);
>>
>> What should happen and why?
>
> Line 1 creates a new DOM object as elem and initialises it. Line 2
> causes elem to create an internal DOM structure representing the
> provided string. Line 3 creates a new object using elem as its
> prototype. Line 4 sets the firstChild property of the object obj to
> elem. Line 5 calls elem’s innerHTML getter and alerts the result, which
> should be the same value provided in line 2, because Line 4 just defined
> a new property on obj (and firstChild is readonly, but even if it
> wasn’t, the firstChild setter would not be called because [[Put]] was
> not used).

The question is how one is supposed to implement this.  Keep in mind 
that the innerHTML getter is being called with "obj" as this.  Then what?

>> Which particular platform object?  Note that the getters live on the
>> prototype, not on the platform object itself.
>
> In your previous example, the elem object.

Well, the getter and setter can't be bound to an instance object; they 
live on the prototype and are shared across instances.  So what are you 
actually proposing to happen here?

> I realise that this is
> probably ugly from an implementation perspective but the current
> proposal is almost certainly worse from an authoring perspective.

I would still like to understand the authoring constraints here.  You 
mentioned that proxies are not an option.  Why not?  Do you think that 
getting multiple browser vendors to wholesale change how they implement 
their DOM bindings will take less time than them fixing whatever 
problems you see with proxies?

>> Again, this can already be done with Object.defineProperty in UAs that
>> actually implement WebIDL.
>
> Well, it can’t, or else we wouldn’t be having this discussion. :) The
> editor’s draft currently says an error must be thrown if |this| is not a
> platform object, so it is possible to either redefine *on the platform
> object itself* (if it’s allowed by the interface), *or* it is possible
> to create a perfectly worthless delegate object where only accessing
> overridden properties works. It is not possible to create a delegate to
> a platform object and have things function in a somewhat sane manner.

I'm not sure I follow.  You can, for example, define your delegate such 
that it imports all the properties from the prototype, rebinding them to 
the thing you're delegating in the process.  It does make delegate setup 
slower, but allows everything else in the DOM to be faster.

Or you can use a proxy for filtering property access, since that's what 
they're designed for.

Or we can introduce this hack that makes getters behave differently from 
methods and setters as a workaround for the fact that proxies have 
problems, whatever those problems are.  But I'd much rather fix the 
proxy problems, honestly.

-Boris
Received on Thursday, 13 September 2012 01:53:42 UTC

This archive was generated by hypermail 2.3.1 : Wednesday, 8 May 2013 19:30:07 UTC