whatwg / dom

DOM Standard
https://dom.spec.whatwg.org/
Other
1.58k stars 295 forks source link

"create an event" does not work with required members #600

Open annevk opened 6 years ago

annevk commented 6 years ago

In particular as defined today step 3

Let defaultEventInitDict be the result of converting the JavaScript value undefined to the dictionary type accepted by eventInterface’s constructor. (This dictionary type will either be EventInit or a dictionary that inherits from it.)

would throw, which is a problem as https://searchfox.org/mozilla-central/search?q=required&path=Event.webidl suggests there's various events out there that have a required dictionary member.

We can deal with it failing, but that does seem to suggest that if you have a required dictionary member, you need to supply defaults in some other way than IDL. Alternatively we need to allow passing these members in some way to "fire an event" et al which would be the second refactoring to that whole operation within a rather sad short time period.

marcoscaceres commented 6 years ago

Why not let "create an event" just take a dictionary override:

  1. let initDict be a new SomeKindOfEventInitDict.
  2. Set initDict["requiredThing"] be "the required thing".
  3. "Create an event" with MyEventInteface ... deal with optional realm ... and initDict, and set ev to the resulting event.

And then change:

If dictionary was not passed, let dictionary be the result of converting the JavaScript value undefined to the dictionary type accepted by eventInterface’s constructor. (This dictionary type will either be EventInit or a dictionary that inherits from it.)

So then it just use the passes dictionary?

annevk commented 6 years ago

That would probably work, but then you can't use "fire an event" for those events. And if we wanted to enable that, which would make sense, we'd have to redefine how the IDL attributes are initialized and refactor all callers.

(Multiple optional arguments also gets a little ugly and might warrant some refactoring of the callers.)