W3C home > Mailing lists > Public > www-dom@w3.org > July to September 2009

Re: Can Dispatch canDispatch()?

From: Garrett Smith <dhtmlkitchen@gmail.com>
Date: Fri, 4 Sep 2009 22:28:34 -0700
Message-ID: <c9e12660909042228w45632ee1i381f776bc1da356a@mail.gmail.com>
To: Olli@pettay.fi
Cc: Sean Hogan <shogun70@westnet.com.au>, DOM public list <www-dom@w3.org>
On Mon, Aug 31, 2009 at 10:54 PM, Garrett Smith<dhtmlkitchen@gmail.com> wrote:
> On Mon, Aug 31, 2009 at 2:58 AM, Olli Pettay<Olli.Pettay@helsinki.fi> wrote:
>> On 8/29/09 10:44 PM, Garrett Smith wrote:
>>>
>>> On Sat, Aug 29, 2009 at 11:54 AM, Olli Pettay<Olli.Pettay@helsinki.fi>
>>>  wrote:
>>>>
>>>>
>>>> Garrett Smith wrote:
>>>>>
>>>>> On Sat, Aug 29, 2009 at 7:07 AM, Olli Pettay<Olli.Pettay@helsinki.fi>
>>>>> wrote:
>>>>>>
>>>>>> Garrett Smith wrote:
>>>>>>>
>>>>>>> On Fri, Aug 28, 2009 at 2:54 AM, Olli Pettay<Olli.Pettay@helsinki.fi>
>>>>>>> wrote:
>>>>>>>>
>>>>>>>> On 8/28/09 10:01 AM, Garrett Smith wrote:
>>>>>>>>>
>>>>>>>>> On Thu, Aug 27, 2009 at 9:50 PM, Sean Hogan<shogun70@westnet.com.au>
>>>>>>>>>  wrote:
>>>>>>>>>>
>>>>>>>>>> Garrett Smith wrote:
>>>>>>>>>>>
>>>>>>>>>>> On Thu, Aug 27, 2009 at 12:28 AM, Sean
>>>>>>>>>>> Hogan<shogun70@westnet.com.au>
>>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Actually, I've changed my mind on canDispatch() and I would
>>>>>>>>>>>> propose
>>>>>>>>>>>> we
>>>>>>>>>>>> keep
>>>>>>>>>>>> it (but maybe change the name to hasEvent() as suggested by
>>>>>>>>>>>> Garrett
>>>>>>>>>>>> Smith.)
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>> That wasn't a name change proposal; it was a straw man. really,
>>>>>>>>>>> anElement.hasEvent wouldn't tell a whole lot about the event.
>>>>>>>>>>>
>>>>>>>>>>> canDispatch is something that reminds me very much of hasFeature.
>>>>>>>>>>> It
>>>>>>>>>>> operates on a document level and portends what feature is
>>>>>>>>>>> supported.
>>>>>>>>>>> Method hasFeature never was trustworthy, and so I think that
>>>>>>>>>>> canDispatch would have the same tendency. It is too far removed
>>>>>>>>>>> from
>>>>>>>>>>> the actual problem.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>> Yes, it is like hasFeature, but there are a few differences which
>>>>>>>>>> may
>>>>>>>>>> mean vendors try to keep it trustworthy:
>>>>>>>>>>
>>>>>>>>>> - basically hasEvent() is finer grained. It is more like<code>if
>>>>>>>>>> (document['addEventListener'])</code>
>>>>>>>>>>  than<code>if document.hasFeature("Events", "3.0")</code>.
>>>>>>>>>>
>>>>>>>>>> - if hasFeature() gives a negative, that doesn't give you any
>>>>>>>>>> information about how much of the spec is missing. So devs don't
>>>>>>>>>> bother
>>>>>>>>>> checking it. So vendors don't bother keeping it valid.
>>>>>>>>>>  If hasEvent() gives a negative then you just use your fallback. If
>>>>>>>>>> it is a false negative then you also lodge a bug report with the
>>>>>>>>>> vendor.
>>>>>>>>>>
>>>>>>>>>> - if hasFeature() gives a false positive, unless it is a major
>>>>>>>>>> omission
>>>>>>>>>> it seems pointless (and petty) to complain to the vendor (about the
>>>>>>>>>> false positive).
>>>>>>>>>>  If hasEvent() gives a false positive then you could justifiably
>>>>>>>>>> lodge a bug report with the vendor and not bother with
>>>>>>>>>> work-arounds.
>>>>>>>>>> This would put the onus on the vendor to report the right value.
>>>>>>>>>>
>>>>>>>>> Explanation of what the proposed - EventTarget - method - hasEvent -
>>>>>>>>> would potentially do, before weighing pros and cons.
>>>>>>>>>
>>>>>>>>> 1. document.body.hasEvent("click")
>>>>>>>>> 2. document.documentElement.hasEvent("submit")
>>>>>>>>> 3. document.forms[0].hasEvent("focus")
>>>>>>>>>
>>>>>>>>> 1. true  -- the body will fire click
>>>>>>>>> 2. false -- this element does not fire "submit" events
>>>>>>>>> 3. true  -- this element can, if it has a tabIdex, fire focus events
>>>>>>>>>
>>>>>>>> So hasEvent/firesEvent means "an event called XXX may be dispatched
>>>>>>>> to
>>>>>>>> this event target at some point".
>>>>>>>> Sounds like that could lead to similar problem what
>>>>>>>> DOMSubtreeModified
>>>>>>>> has. A browser may say it supports DOMSubtreeModified, if it even
>>>>>>>> theoretically dispatches the event once.
>>>>>>>>
>>>>>>> That could be a problem, yes. I would not generally rely on mutation
>>>>>>> events for production code.
>>>>>>>
>>>>>>> What you've touched upon is more an issue of the object having
>>>>>>> potential to fire the event, but not knowing under what conditions
>>>>>>> that will or will not happen. It's a limitation to the method. I
>>>>>>> suppose - canFireEvent - is perhaps more apt.
>>>>>>>
>>>>>>> I've elaborated a little more below.
>>>>>>>
>>>>>>>> (And because extensions/plugins/greasemonkey may dispatch random
>>>>>>>> events,
>>>>>>>> hasEvent/firesEvent could always return true.)
>>>>>>>>
>>>>>>> I don't understand how greasemonkey could affect the outcome of -
>>>>>>> firesEvent -. Can you explain that? I don't understand the problem of
>>>>>>> plugins dispatching random events causes issues, either.
>>>>>>
>>>>>> greasemonkey/extensions/plugins can all run scripts, so they can create
>>>>>> new events. So perhaps some greasemonkey script or plugin adds support
>>>>>> for a new event type. Let's say "mouseenter". The browser might not
>>>>>> support that event, but because the greasemonkey script listens for
>>>>>> other mouse events, it can add support for mouseenter and dispatch the
>>>>>> event when needed. How could firesEvent() detect such case?
>>>>>>
>>>>>
>>>>> So greasemonkey can actually modify the event target so that it
>>>>> supports "mouseenter", thereby allowing document code to listen to
>>>>> that using:-
>>>>>
>>>>> evTarg.addEventListener("mouseenter", cb, false);
>>>>>
>>>>> ?
>>>>
>>>>
>>>> Why would the script need to modify "the event target" in any way?
>>>> The script can dispatch any events using normal DOM Events methods:
>>>> vat evt = document.createEvent(...); evt.initXXXEvent(...);
>>>> someEventTarget.dispatchEvent(evt);
>>>>
>>>>>
>>>>> I could see why someone might want to try that, so that an IE-only
>>>>> site might have a chance at getting past a certain part of the code.
>>>>>
>>>>> How does it work?
>>>>>
>>>>>> And note, this is not just a theoretical case. For example Firefox
>>>>>> XForms extension dispatches many events, which Firefox itself doesn't
>>>>>> dispatch.
>>>>>>
>>>>>
>>>>> I see.
>>>>>
>>>>> Following that, the question is: If greasemonkey or a third party
>>>>> script modifies an event target, is that event detected by -
>>>>> firesEvent -?
>>>>>
>>>>> It would seem to be related to the underlying mechanism how an event
>>>>> is registered and/or dispatched by the extension,and the browser.
>>>>
>>>> I don't quite understand the "event is registered" part.
>>>> Events are just dispatched to some event target.
>>>>
>>>>> This
>>>>> might vary between implementations. It's possible that implementing a
>>>>> - firesEvent - won't fit into Gecko's event model. Would it? Can you
>>>>> explain Gecko's events implementation or point to a document that
>>>>> explains it?
>>>>
>>>> I'm not quite sure what kind of documentation you'd need.
>>>> In the simplest case, event dispatching in Gecko works just like what DOM
>>>> Events defines: createEvent, init the event, dispatch to some event
>>>> target.
>>>>
>>>
>>> It would not be possible for - firesEvent - to know that. Is detecting
>>> native event support possible in Gecko?
>>
>> If native means not-dispatched by a script, then no, since so far
>> there hasn't been any need to detect if some event might be dispatched
>
> How about detecting "mouseenter" and "mouseleave", or "onfocusin" or
> the contending analogue "domfocusin" (which seems to be missing a
> corresponding event handler property 'ondomfocusin"). Analog. Makes me
> think of the old Black Sabbath record I used to listen as a kid. Whoa,
> way OT now...
>
> How can a program know if an event will fire?
>

Is it possible for the browser to provide information about which
events an EventTarget is designed to fire?

>> to a event target. (And in fact there are cases when "valid" events are
>> dispatched by Firefox UI's javascript.)
>
> I guess that would mean specified by a standard somewhere.
>
>>
>> I wonder what is your definition for "native event".
>>
>
> I'm trying to describe something that doesn't yet exist.
>
> Native = browser generated, not generated by a program running in the
> browsers. Not "native ES object", not necessarily standard. Does that
> make sense? I don't think there's any proper terminology for it.
>
> I did not use the words "standard" or "specified" because detecting
> proprietary, nonstandard events is desirable, too.
>

Was I unclear?

> Regards,
>
> Garrett
>
Received on Saturday, 5 September 2009 05:29:14 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Friday, 22 June 2012 06:14:03 GMT