Jacek Caban (@jacek) commented about dlls/mshtml/task.c:
* other major browsers don't, including IE, so we have to filter them out during Send.
*
* They will need to be queued and dispatched later, after Send returns, otherwise it
* breaks JavaScript single-threaded expectations (js code will switch from blocking in
* Send to executing some event handler, then returning back to Send, messing its state).
*
* Of course we can't just delay dispatching the events, because the state won't match
* for each event later on to what it's supposed to be (most notably, XHR's readyState).
* So unfortunately we have to hardcode and snapshot the XHR state for async events...
*
* While queuing an event this way would not work correctly with their default behavior
* in Gecko (preventDefault() can't be called because we need to *delay* the default,
* rather than prevent it completely), Gecko does suppress events reaching the document
* during the sync XHR event loop, so all the element/node events should be safe. If we
* find an event that has defaults on Gecko's side and isn't delayed by Gecko, we need
* to figure out a way to handle it...
Since you no longer modify dispatch_event itself, this part of the comment does not seem relevant anymore.