Solving the "how do I tell whether I have an HTML element?" (or image element, or whatever) problem
bzbarsky at MIT.EDU
Mon Dec 31 20:33:06 PST 2012
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).
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
More information about the es-discuss