Solving the "how do I tell whether I have an HTML element?" (or image element, or whatever) problem

Note: es-discuss is bcced, but please reply to public-script-coord.

The fact that instanceof for "standard classes" is completely broken 
when multiple globals are involved has come up yet again, as Gecko 
converts to WebIDL bindings.

The reason for that is that currently in Gecko's DOM bindings instanceof 
where the RHS is a DOM interface object does magic that returns true if 
the LHS is a platform object implementing that interface (in the WebIDL 
sense).  We initially tried to not do that for the WebIDL bindings and 
have had to put it back in for now because it turned out that there was 
a fair bit of Gecko-specific content that relied on this behavior.

That said, I would like to figure out a way forward here, and figure it 
out sooner rather than later so we don't have to change said 
Gecko-specific content more than once.

The obvious options seem to be:

1)  Hack instanceof as Gecko has in the past.  This is actually a bit of 
a pain to implement even in Gecko, without changes to SpiderMonkey, 
because function objects can't have the magic behavior the RHS needs 
above in SpiderMonkey at the moment.

2)  Add something like Array.isArray to all WebIDL interface objects. 
HTMLImageElement.isHTMLImageElement is a bit wordy, though... 
HTMLImageElement.isInstance() would be simpler, but doesn't match the 
existing isArray pattern.

3)  Do something else.  What?

Thoughts?  I'm particularly interested in things that other UAs are 
willing to implement (e.g. if #1 above is a non-starter for them, 
there's no point even discussing it in terms of specs).

-Boris

P.S.  The obvious "foo instanceof 
foo.ownerDocument.defaultView.HTMLImageElement" hack only works for 
nodes, and even then fails if foo.ownerDocument is an XHR response 
document or something else without a Window, so it's not a viable 
solution even if it were too not convoluted to really recommend with a 
straight face.

Received on Tuesday, 1 January 2013 04:33:37 UTC