It sounds tempting to say that the postMessage should be queued until the newly opened window is loaded, but what point in time is that exactly?  Is that after the load event is dispatched on the newly opened window?<div><br>
</div><div>Note: a newly opened window can begin communicating with its opener much earlier (via inline script execution).</div><div><br></div><div>However, if we try to dispatch the postMessage events before the load event then the newly opened window may not have registered its event handlers yet.  (A future <script> tag may define the event handler.)  So, I think we would have to delay until the load event for the semantics to be sane.</div>
<div><br></div><div>There is perhaps a more critical issue that we should consider.  What happens if the named window already exists?</div><div><br></div><div>Consider this case:</div><div><br></div><div>window.open("<a href="http://a/">http://a/</a>", "foo");</div>
<div>...</div><div>var w = window.open("<a href="http://b/">http://b/</a>", "foo");</div><div>w.postMessage("bar", "*");</div><div><br></div><div>I suspect the postMessage would be dispatched in this case, but the event dispatch would probably go to the document at <a href="http://a/">http://a/</a> instead of <a href="http://b/">http://b/</a>.  This is because the browser has no way of knowing if <a href="http://b/">http://b/</a> will actually be displayable content.  It could be of a mime type that should just be downloaded (in which case the indicated window is not navigated).</div>
<div><div><div><br></div><div>So, queuing is probably not a good idea.  Workers do not have this issue since they cannot be "navigated" like a window.</div><div><br></div><div>-Darin</div><div><br><br><div class="gmail_quote">
On Tue, Jan 5, 2010 at 8:29 PM, Dirk Pranke <span dir="ltr"><<a href="mailto:dpranke@chromium.org">dpranke@chromium.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
I understand the rationale, and the workaround you suggest does work,<br>
(I have tested it, in FF, Safari and Chrome). But, as Jonas mentioned,<br>
this isn't what we do with workers, and it feels counter-intuitive to<br>
me (I'm having trouble thinking of other async messaging models that<br>
require an application-level handshake like this before messaging can<br>
commence). Are there reasons other than implementation complexity (an<br>
okay reason) or backwards-compatibility (a better reason) not to have<br>
the post work in this case? Put differently, would anything break<br>
(other than a rather oddly written app that explicitly counted on this<br>
behavior) if this did work?<br>
<br>
As an alternative, would it be possible to create an onChildLoad()<br>
event in the parent so that the parent could reliably send a message<br>
without needing the child's cooperation? These seems only marginally<br>
better than having the child post to the parent, so it may not be<br>
worth it ...<br>
<font color="#888888"><br>
-- Dirk<br>
</font><div class="im"><br>
On Tue, Jan 5, 2010 at 5:00 PM, Darin Fisher <<a href="mailto:darin@chromium.org">darin@chromium.org</a>> wrote:<br>
</div><div><div></div><div class="h5">> The window doesn't open synchronously, so you should have to wait for<br>
> <a href="http://x/" target="_blank">http://x/</a> to load (or for its document to at least be created) before you<br>
> can start communicating with it.<br>
> Note: If you instead open "about:blank" you should be able to communicate<br>
> with it synchronously since "about:blank" is loaded synchronously.  It is<br>
> special-cased.<br>
> From the newly opened window, you could try posting a message to its opener.<br>
>  The opener could then handle that event and use it as a signal to know that<br>
> it can know begin communicating with the newly opened window.<br>
> I haven't tested any of this ;-)<br>
> -Darin<br>
><br>
> On Mon, Dec 21, 2009 at 7:24 PM, Dirk Pranke <<a href="mailto:dpranke@chromium.org">dpranke@chromium.org</a>> wrote:<br>
>><br>
>> Hi all,<br>
>><br>
>> In the course of testing something today, I attempted to create a<br>
>> window and immediately post a message to it, and was surprised that it<br>
>> didn't seem to work.<br>
>><br>
>> E.g.:<br>
>><br>
>> var w = window.open("<a href="http://x" target="_blank">http://x</a>");<br>
>> w.postMessage("hello, world", "*");<br>
>><br>
>> w never got the message - this seemed to be consistent across Safari,<br>
>> Chrome, and FF (all I had installed on my Mac at the time, so<br>
>> apologies to Opera, IE, and anyone else I've left out).<br>
>><br>
>> Is this supposed to work? If not, is there a reliable way for the the<br>
>> source to know when it is safe to send a message to the target? The<br>
>> only way I can think of is for the target to send a message back to<br>
>> the source, which only works if the target can get a reference to the<br>
>> source using window.opener, which may or may not be possible or<br>
>> desirable ...<br>
>><br>
>> If this isn't supposed to work, can we state this explicitly in the spec?<br>
>><br>
>> -- dirk<br>
><br>
><br>
</div></div></blockquote></div><br></div></div></div>