Agreed, there's not a good way to determine that a port is disentangled. Currently the main solution I know of is to have your document post a message to your shared worker in their onunload handler.<div><br></div><div>
I think some kind of MessagePort.onclose event or "entangled" attribute could be useful - this was originally part of the spec, and the issue with that was that it's hard to define onclose in such a way that doesn't make it highly dependent on garbage collection.</div>
<div><br></div><div>As an example:</div><div><br></div><div>var channel = new MessageChannel();</div><div>channel.port1.onclose = channel.port2.onclose = function() {alert("port closed");};</div><div>channel = null;</div>
<div><br></div><div>What should happen in this case? At what point (if ever) should the onclose handler be invoked?</div><div><br></div><div>I'm just leery of any situation where the garbage collected state of an unreferenced object is exposed to script, as it seems like this causes interoperability issues. For example, if you ran the script above in Chrome, the onclose handler would likely not be invoked until the parent Document was closed. In Safari, it would get invoked when the JS heap is next garbage collected. An application that relied on onclose() being called in a timely manner would break on Chrome.</div>
<div><br></div><div>The only option that comes to mind that doesn't expose compatibility issues would be to only issue onclose events if close() is explicitly called on the entangled port, but if you're doing that you might as well just have the code calling close() post a "I'm closing" message first.</div>
<div><br></div><div>-atw</div><div><div><br></div><div><br><div class="gmail_quote">On Mon, Mar 15, 2010 at 5:13 PM, ATSUSHI TAKAYAMA <span dir="ltr"><<a href="mailto:taka.atsushi@googlemail.com">taka.atsushi@googlemail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Hi all,<br>
<br>
Consider a case where I have a SharedWorker script like below, and I<br>
open two tabs that use this SharedWorker. Now myPorts.length is 2. If<br>
I reload one of the two tabs, then myPorts.length is 3, isn't it? But<br>
one of the three ports is already disconnected from the counterpart,<br>
so postMessage'ing to the port is meaningless and I want to discard<br>
reference to that port.<br>
<br>
=== <JS> ===<br>
var myPorts = [];<br>
<br>
onconnect = function(e) {<br>
  var port = e.ports[0];<br>
  myPorts.push(port);<br>
<br>
  port.onmessage = function(e) {<br>
    myPorts.forEach(function(p) {<br>
      if (p !== port)<br>
        p.postMessage = e.data;<br>
    });<br>
  }<br>
}<br>
=== </JS> ===<br>
<br>
It seems like the only way to know if a MessagePort is connected is to<br>
actually send a message and wait for a reply. So<br>
MessagePort.isConnected or MessagePort.ondisconnect would be nice to<br>
have.<br>
<br>
A. TAKAYAMA<br>
</blockquote></div><br></div></div>