W3C home > Mailing lists > Public > www-dom@w3.org > April to June 2013

Re: Exceptions in event listeners triggered by dispatchEvent().

From: John Barton <johnjbarton@google.com>
Date: Mon, 3 Jun 2013 20:48:23 -0700
Message-ID: <CA+2jLu+-KVnEu95Ag8y801Qx9OjnvsgvodKF0n1EUVW-YSVong@mail.gmail.com>
To: Glenn Maynard <glenn@zewt.org>
Cc: johnjbarton <johnjbarton@chromium.org>, "www-dom@w3.org" <www-dom@w3.org>, Anne van Kesteren <annevk@annevk.nl>
On Mon, Jun 3, 2013 at 6:00 PM, Glenn Maynard <glenn@zewt.org> wrote:

> On Mon, Jun 3, 2013 at 7:36 PM, John Barton <johnjbarton@google.com>wrote:
>>  Well the current API only gives our part of the result state: why don't
>> the exceptions propagate?
>> Why can't we have "dispatch(event)" that both returns your boolean and
>> propagates exceptions?
> Sorry, I don't follow.  If it returns the boolean, then the event
> listeners must be run before the function returns.  (The return value tells
> you whether any event listener called event.preventDefault().)  I don't
> know what "propagating exceptions" would mean here, since multiple
> exceptions might be thrown (multiple listeners).  I suppose it could mean
> "run all listeners, then rethrow the first seen exception", but that seems
> weird to me.

The current API is weird. It's just a hodgepodge of rules "run all of the
listeners, ignore any exceptions, join the return values of the rest".

Ultimately targetElement.dispatchEvent(event) has a primary job: queue
events for processing in the same way that events are queued when we
interact with the UI. (We don't need dispatchEvent(), we could call the
handlers directly if we want, so why don't we? Because we want to emulate
the event handling). That primary job got compromised when the the
fundamentally asynchronous mission was shoe horned in to a synchronous call
with a return value. We cannot achieve a consistent result from two
fundamentally inconsistent goals.

If we want all of the listener to run independent of the outcome of the
other listener invocations, then we should use the wonderfully successful
event loop to achieve this goal.

event.preventDefault() should queue up just like the event handlers; the
caller wants the handle preventDefault() they register an event listener on
the element and handle it.

The system is event driven, we should use events.

> (This is probably academic--I doubt that would be web-compatible
> either--but I'm just trying to understand what you mean.)

Indeed, and I'm just trying to articulate an approach that makes sense if

>  I thought we established that dispatchEvent()'s behavior is not
>> documented. What experience would I use other that years of experience in
>> JavaScript?
> I'm not sure what you're arguing, but improving documentation and specs is
> much simpler than changing or adding new APIs (which would itself require
> changes to specs).
> You can do some of it yourself; MDN appears to be open to public editing:
> https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.dispatchEvent
> (I suspect MDN is used by web developers much more often than reading the
> spec, so if it's author confusion you're worried about, adding a sentence
> in here will probably have more effect than any change to the spec.)

Thanks for the suggestion. Unfortunately when I attempt save my change,
that site reports "An unhandled error occurred in the application. ". I
guess their try/catch does not work either :-(.


> --
> Glenn Maynard
Received on Tuesday, 4 June 2013 07:17:38 UTC

This archive was generated by hypermail 2.4.0 : Friday, 17 January 2020 22:37:02 UTC