Ian Hickson wrote:
On Fri, 8 Aug 2008, Jonas Sicking wrote:
(We might want to add an onconnect property to WorkerGlobalScope, but it doesn't seem strictly needed)
How else would you connect to a shared worker?
That is done at an application level. For example:

worker = createSharedWorker("foo", "bar.js");
worker.addEventListener("message", handler, false);
worker.postMessage("wassup dude, i just connected");

How would the worker distinguish that from the original "parent" sending the same message?

Why would the original parent same the message twice? Of course applications following their own application level protocols is going to break themselves.

Actually, it seems like onconnect as defined in the current spec has a race condition. The shared worker example does the following:

   var worker = createSharedWorker('worker.js', 'core');
   function configure(event) {
     if (event.message.substr(0, 4) != 'cfg ') return;
     var name = event.message.substr(4).split(' ', 1);
     // update display to mention our name is name
     document.getElementsByTagName('h1')[0].textContent += ' ' + name;
     // no longer need this listener
     worker.port.removeEventListener('message', configure, false);
   }
   worker.port.addEventListener('message', configure, false);

However what's to say that the 'connect' event hasn't fired inside the worker before the 'worker.port.addEventListener' line executes?

Doesn't matter. MessagePorts queue up messages until they receiver either sets onmessage or calls start(). (This is explained just below the example.)

Note that there can already be other listeners to the port, so the port has been activated.

The port only activates if you set onmessage or call start(). Calling addEventListener() doesn't activate it.

Ah, i missed the fact that calling createSheredWorker always created a new Worker object, even if one already existed.

/ Jonas

Reply via email to