From: Jacob Czekalla jczekalla@codeweavers.com
Documents such as iframes do not currently receive BeforeNavigate2 events. --- dlls/mshtml/nsio.c | 25 +++++++++++++++++++++++++ dlls/mshtml/tests/htmldoc.c | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c index a5564e1b6e4..cc88adf1af7 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)) { @@ -1024,6 +1027,28 @@ static nsresult async_open(nsChannel *This, HTMLOuterWindow *window, BOOL is_doc channelbsc_set_channel(bscallback, This, listener, context);
if(is_doc_channel) { + browser = window->base.outer_window->browser; + 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; + } + hres = IDocObjectService_FireBeforeNavigate2(browser->doc->doc_object_service, NULL, display_uri, 0, frame_name, NULL, 0, NULL, TRUE, &cancel); + SysFreeString(display_uri); + SysFreeString(frame_name); + if (cancel) + { + IBindStatusCallback_Release(&bscallback->bsc.IBindStatusCallback_iface); + return NS_BINDING_ABORTED; + } hres = create_pending_window(window, bscallback); if(SUCCEEDED(hres)) async_start_doc_binding(window, window->pending_window, (load_type & LOAD_CMD_RELOAD) ? BINDING_REFRESH : BINDING_NAVIGATED); diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c index bd36c65f02d..7b17a98e242 100644 --- a/dlls/mshtml/tests/htmldoc.c +++ b/dlls/mshtml/tests/htmldoc.c @@ -8342,7 +8342,7 @@ static void test_iframe_download(int flags) todo_wine CHECK_CALLED_N(FireDownloadBegin, total_iframes); todo_wine CHECK_CALLED_N(FireDownloadComplete, total_iframes);
- todo_wine CHECK_CALLED_N(FireBeforeNavigate2, total_iframes); + CHECK_CALLED_N(FireBeforeNavigate2, total_iframes); todo_wine CHECK_CALLED_N(FireNavigateComplete2, total_documents); todo_wine CHECK_CALLED_N(FireDocumentComplete, total_documents);