From: Jacob Czekalla jczekalla@codeweavers.com
This is for documents with multiple frames that are loaded asynchronously. --- dlls/mshtml/nsio.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+)
diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c index a5564e1b6e4..51e16c7812d 100644 --- a/dlls/mshtml/nsio.c +++ b/dlls/mshtml/nsio.c @@ -1006,6 +1006,9 @@ static nsresult async_open(nsChannel *This, HTMLOuterWindow *window, BOOL is_doc nsChannelBSC *bscallback; IMoniker *mon = NULL; HRESULT hres; + BSTR frame_name = NULL, display_uri = NULL; + GeckoBrowser *browser; + BOOL cancel = FALSE;
hres = CreateURLMonikerEx2(NULL, This->uri->uri, &mon, 0); if(FAILED(hres)) { @@ -1023,6 +1026,34 @@ static nsresult async_open(nsChannel *This, HTMLOuterWindow *window, BOOL is_doc
channelbsc_set_channel(bscallback, This, listener, context);
+ hres = IUri_GetDisplayUri(This->uri->uri, &display_uri); + if (FAILED(hres)) { + IBindStatusCallback_Release(&bscallback->bsc.IBindStatusCallback_iface); + return NS_ERROR_UNEXPECTED; + } + + hres = IHTMLWindow2_get_name(&window->base.IHTMLWindow2_iface, &frame_name); + if (FAILED(hres)) { + IBindStatusCallback_Release(&bscallback->bsc.IBindStatusCallback_iface); + SysFreeString(display_uri); + return NS_ERROR_UNEXPECTED; + } + + browser = window->base.outer_window->browser; + hres = IDocObjectService_FireBeforeNavigate2(browser->doc->doc_object_service, NULL, display_uri, 0, frame_name, NULL, 0, NULL, TRUE, &cancel); + SysFreeString(frame_name); + SysFreeString(display_uri); + if (FAILED(hres)) { + IBindStatusCallback_Release(&bscallback->bsc.IBindStatusCallback_iface); + return NS_ERROR_UNEXPECTED; + } + if (cancel) { + if (bscallback->bsc.binding) + IBinding_Abort(bscallback->bsc.binding); + IBindStatusCallback_Release(&bscallback->bsc.IBindStatusCallback_iface); + return NS_BINDING_ABORTED; + } + if(is_doc_channel) { hres = create_pending_window(window, bscallback); if(SUCCEEDED(hres))