html icon indicating copy to clipboard operation
html copied to clipboard

Can messageerror fire on Worker?

Open foolip opened this issue 1 year ago • 4 comments

What is the issue with the HTML Standard?

https://html.spec.whatwg.org/#dedicated-workers-and-the-worker-interface defines the onmessageerror event handler attribute for Worker, but can a "messageerror" event actually fire on a Worker object?

I have looked at all instances of "messageerror" and can't find any that seems to fire the event at an Worker instance, only other kinds of objects. Perhaps it happens implicitly through bubbling?

The only test I can find in WPT that listens for the event is https://wpt.fyi/results/webmessaging/broadcastchannel/workers.html, but only to fail the test if it is fired.

I'm trying to understand what behavior (if any) is required by the spec and how to test it, since it's not in Chrome but is in Firefox and Safari: https://developer.mozilla.org/en-US/docs/Web/API/Worker#browser_compatibility

foolip avatar Apr 08 '24 22:04 foolip

The Worker instance becomes a kind of proxy over the outside port MessagePort, so when that MessagePort would fire a messageerror event (i.e when the deserialization in the owner's side thrown), this event is expected to fire on the Worker instance.
However testing for this doesn't seem easy. The specs say that it may happen when a buffer can't be allocated, but I couldn't get one allocated in the worker thread that wouldn't be allocated in the owner's. It may also happen when posting an interface that doesn't exist on the receiving end, but once again I couldn't find a case where the serialization steps wouldn't throw before.

Kaiido avatar Apr 08 '24 23:04 Kaiido

Thank you @Kaiido, it seems this even can be fired then, in principle. If an event propagates from a MessagePort to a Worker, where are the steps for this? In the message port post message steps only see MessagePort as the event target, so is there some general language about how events are propagated here?

foolip avatar Apr 09 '24 10:04 foolip

It's hard to think of a case that would reliably fail as typically a dedicated worker is in the same agent cluster as its owner. And in the one case where that might not be the case (data: URLs and sandboxing) the dedicated worker is less privileged so you could not use SharedArrayBuffer as test. And beyond SharedArrayBuffer I'm not sure there's a good messageerror example, except for the theoretical one around OOO.

@foolip what you're looking for is described here: https://html.spec.whatwg.org/#dedicated-workers-and-the-worker-interface

All messages received by that port must immediately be retargeted at the Worker object.

annevk avatar Apr 09 '24 10:04 annevk

I've filed https://crbug.com/335744333 about adding onmessageerror in Blink, if the event can fire at all, which I'm not sure about.

foolip avatar Apr 19 '24 09:04 foolip