- From: David Bruant <bruant.d@gmail.com>
- Date: Mon, 23 Sep 2013 23:43:54 +0200
- To: Boris Zbarsky <bzbarsky@MIT.EDU>, "public-script-coord@w3.org" <public-script-coord@w3.org>
Le 23/09/2013 18:39, Boris Zbarsky a écrit :
> Consider this testcase:
>
> test.html:
>
> <!DOCTYPE html>
> <html>
> <iframe src="test2.html"></iframe>
> <script>
> window.onload = function() {
> frames[0].addEventListener.call(undefined, "click",
> function(e) {
> alert("clicked. This: " + e.currentTarget.type)
> });
> }
> var type = 'Parent';
> </script>
> Or click me.
> </html>
>
> test2.html:
>
> <!DOCTYPE html>
> <html>
> <script>var type = 'subframe'</script>Click me
> </html>
>
> Which window is the click listener added to? That is, which global is
> the undefined thisArg coerced to?
> In Firefox (recent nightly), Chrome (recent dev build), and IE10 the
> answer is the subframe's global.
>
> In Safari 6, Opera (12.16), and a WebKit nightly, the answer is the
> parent page's global.
>
> In IE9, the .call() throws an exception about the this value not being
> an object, as far as I can tell. But of course bareword
> addEventListener() works in IE9... somehow.
Maybe IE9 has a form of self-hosted addEventListener, somthing like:
EventTarget.prototype.addEventListener = function(type, listener){
// use |this| as an object
}
IE9 has no support for strict mode, so the code would be non-strict and
"this" has the global object as value by default when the function is
called as a function (as opposed to as a method). That could explain why
"addEventListener()" works, but "addEventListener.call(undefined)" doesn't.
This sort of reverse-engineering is fun :-) But if someone from
Microsoft wants to jump in to spoil the answer, that'd be great too!
> So I suspect in practice this pattern is not used on the web so far.
> The question is what we should define it to do for the inevitable
> situation when some clever soul decides to use it.
The sane behavior would be for
"something.addEventListener.call(undefined, ..." to throw a TypeError
(on the basis that undefined is not a platform object). But I imagine IE
moved away from that behavior for web compat?
> Conceptually, using the global of the realm of the function involved
> (i.e. the Chrome/Firefox/IE10 behavior) makes sense to me.
Assuming throwing a TypeError isn't an option, if by "the function"
you're referring to addEventListener, I agree with you. In that
instance, the addEventListener is the frame's one, so the currentTarget
should be the frame, agreed.
David
Received on Monday, 23 September 2013 21:44:24 UTC