Documents such as iframes do not currently receive BeforeNavigate2 events.
-- v6: mshtml: Fire BeforeNavigate2 for documents in async_open.
From: Jacob Czekalla jczekalla@codeweavers.com
This is to handle tests where events could be called multiple times.
For example, iframes being loaded during a navigate. --- dlls/mshtml/tests/htmldoc.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-)
diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c index c64ed784897..6d1bf25ef8d 100644 --- a/dlls/mshtml/tests/htmldoc.c +++ b/dlls/mshtml/tests/htmldoc.c @@ -56,46 +56,55 @@ DEFINE_GUID(outer_test_iid,0xabcabc00,0,0,0,0,0,0,0,0,0,0x66); extern const IID IID_IActiveScriptSite;
#define DEFINE_EXPECT(func) \ - static BOOL expect_ ## func = FALSE, called_ ## func = FALSE + static int expect_ ## func = 0, called_ ## func = 0
#define SET_EXPECT(func) \ - expect_ ## func = TRUE + expect_ ## func = 1 + +#define SET_EXPECT_N(func, n) \ + do { called_ ## func = 0; expect_ ## func = n; } while(0)
#define SET_CALLED(func) \ - called_ ## func = TRUE + called_ ## func = 1
#define CHECK_EXPECT2(func) \ do { \ ok(expect_ ##func, "unexpected call " #func "\n"); \ - called_ ## func = TRUE; \ + called_ ## func += 1; \ }while(0)
#define CHECK_EXPECT(func) \ do { \ CHECK_EXPECT2(func); \ - expect_ ## func = FALSE; \ + if (expect_ ## func > 0) expect_ ## func -= 1; \ }while(0)
#define CHECK_CALLED(func) \ do { \ ok(called_ ## func, "expected " #func "\n"); \ - expect_ ## func = called_ ## func = FALSE; \ + expect_ ## func = called_ ## func = 0; \ + }while(0) + +#define CHECK_CALLED_N(func, n) \ + do { \ + ok(called_ ## func == n, "expected " #func "\n"); \ + expect_ ## func = called_ ## func = 0; \ }while(0)
#define CHECK_NOT_CALLED(func) \ do { \ - ok(!called_ ## func, "unexpected " #func "\n"); \ - expect_ ## func = called_ ## func = FALSE; \ + ok(called_ ## func == 0, "unexpected " #func "\n"); \ + expect_ ## func = called_ ## func = 0; \ }while(0)
#define CHECK_CALLED_BROKEN(func) \ do { \ - ok(called_ ## func || broken(!called_ ## func), "expected " #func "\n"); \ - expect_ ## func = called_ ## func = FALSE; \ + ok(called_ ## func || broken(called_ ## func == 0), "expected " #func "\n"); \ + expect_ ## func = called_ ## func = 0; \ }while(0)
#define CLEAR_CALLED(func) \ - expect_ ## func = called_ ## func = FALSE + expect_ ## func = called_ ## func = 0
static IOleDocumentView *view = NULL;
From: Jacob Czekalla jczekalla@codeweavers.com
Some events are not fired for iframes, for example FireBeforeNavigate2. --- dlls/mshtml/tests/event_iframe.html | 4 + dlls/mshtml/tests/htmldoc.c | 250 ++++++++++++++++++++++++++-- dlls/mshtml/tests/rsrc.rc | 3 + 3 files changed, 240 insertions(+), 17 deletions(-) create mode 100644 dlls/mshtml/tests/event_iframe.html
diff --git a/dlls/mshtml/tests/event_iframe.html b/dlls/mshtml/tests/event_iframe.html new file mode 100644 index 00000000000..3c4fbff4490 --- /dev/null +++ b/dlls/mshtml/tests/event_iframe.html @@ -0,0 +1,4 @@ +<html><body> + <iframe src="http://test.winehq.org/tests/hello.html"></iframe> + <iframe src="http://test.winehq.org/tests/hello.html"></iframe> +</body></html> diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c index 6d1bf25ef8d..c17fd81e8a9 100644 --- a/dlls/mshtml/tests/htmldoc.c +++ b/dlls/mshtml/tests/htmldoc.c @@ -47,6 +47,7 @@ #include "exdispid.h" #include "mshtml_test.h" #include "mscoree.h" +#include "exdisp.h"
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); DEFINE_GUID(IID_IProxyManager,0x00000008,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); @@ -206,6 +207,8 @@ DEFINE_EXPECT(UpdateBackForwardState); DEFINE_EXPECT(FireBeforeNavigate2); DEFINE_EXPECT(FireNavigateComplete2); DEFINE_EXPECT(FireDocumentComplete); +DEFINE_EXPECT(FireDownloadBegin); +DEFINE_EXPECT(FireDownloadComplete); DEFINE_EXPECT(GetPendingUrl); DEFINE_EXPECT(ActiveElementChanged); DEFINE_EXPECT(IsErrorUrl); @@ -240,6 +243,7 @@ static BOOL is_error_url; static BOOL is_mhtml; static int stream_read, protocol_read; static IStream *history_stream; +static int documents_to_load; static enum load_state_t { LD_DOLOAD, LD_LOADING, @@ -2854,9 +2858,12 @@ static HRESULT WINAPI DocHostUIHandler_TranslateUrl(IDocHostUIHandler2 *iface, D CHECK_EXPECT(TranslateUrl); ok(iface == expect_uihandler_iface, "called on unexpected iface\n"); ok(!dwTranslate, "dwTranslate = %lx\n", dwTranslate); - todo_wine_if(loading_hash) - ok(!lstrcmpW(pchURLIn, nav_serv_url), "pchURLIn = %s, expected %s\n", wine_dbgstr_w(pchURLIn), - wine_dbgstr_w(nav_serv_url)); + if (documents_to_load <= 1) /* FIXME */ + { + todo_wine_if(loading_hash) + ok(!lstrcmpW(pchURLIn, nav_serv_url), "pchURLIn = %s, expected %s\n", wine_dbgstr_w(pchURLIn), + wine_dbgstr_w(nav_serv_url)); + } ok(ppchURLOut != NULL, "ppchURLOut == NULL\n"); ok(!*ppchURLOut, "*ppchURLOut = %p\n", *ppchURLOut);
@@ -3063,7 +3070,10 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID test_performance_timing(doc_unk, L"domComplete"); readystate_set_loading = FALSE; readystate_set_interactive = FALSE; - load_state = LD_COMPLETE; + if (documents_to_load > 1) + load_state = LD_LOADING; + else + load_state = LD_COMPLETE; return S_OK; case OLECMDID_SETDOWNLOADSTATE: ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08lx\n", nCmdexecopt); @@ -3177,6 +3187,9 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID return S_OK; /* TODO */ }
+ case 65: + return E_NOTIMPL; + case 67: CHECK_EXPECT(Exec_ShellDocView_67); ok(pvaIn != NULL, "pvaIn == NULL\n"); @@ -3704,8 +3717,13 @@ static HRESULT WINAPI DocObjectService_FireBeforeNavigate2(IDocObjectService *i { CHECK_EXPECT(FireBeforeNavigate2);
- ok(!pDispatch, "pDispatch = %p\n", pDispatch); - ok(!lstrcmpW(lpszUrl, nav_url), "lpszUrl = %s, expected %s\n", wine_dbgstr_w(lpszUrl), wine_dbgstr_w(nav_url)); + if (documents_to_load > 1) + todo_wine ok(pDispatch != NULL, "pDispatch = %p\n", pDispatch); + else + { + ok(!pDispatch, "pDispatch = %p\n", pDispatch); + ok(!lstrcmpW(lpszUrl, nav_url), "lpszUrl = %s, expected %s\n", wine_dbgstr_w(lpszUrl), wine_dbgstr_w(nav_url)); /* FIXME */ + } ok(dwFlags == 0x140 /* IE11*/ || dwFlags == 0x40 || !dwFlags || dwFlags == 0x50, "dwFlags = %lx\n", dwFlags); ok(!lpszFrameName, "lpszFrameName = %s\n", wine_dbgstr_w(lpszFrameName)); if(!testing_submit) { @@ -3721,7 +3739,8 @@ static HRESULT WINAPI DocObjectService_FireBeforeNavigate2(IDocObjectService *i "lpszHeaders = %s\n", wine_dbgstr_w(lpszHeaders));
} - ok(fPlayNavSound, "fPlayNavSound = %x\n", fPlayNavSound); + if (documents_to_load <= 1) + ok(fPlayNavSound, "fPlayNavSound = %x\n", fPlayNavSound); ok(pfCancel != NULL, "pfCancel = NULL\n"); ok(!*pfCancel, "*pfCancel = %x\n", *pfCancel);
@@ -3733,33 +3752,45 @@ static HRESULT WINAPI DocObjectService_FireNavigateComplete2( IHTMLWindow2 *pHTMLWindow2, DWORD dwFlags) { + IHTMLWindow2 *top_window = NULL, *self_window = NULL; + CHECK_EXPECT(FireNavigateComplete2); test_readyState(NULL); test_navigation_type(doc_unk); test_performance_timing(doc_unk, L"domInteractive");
+ IHTMLWindow2_get_top(pHTMLWindow2, &top_window); + IHTMLWindow2_get_self(pHTMLWindow2, &self_window); + if(loading_hash) ok(dwFlags == 0x10 || broken(!dwFlags), "dwFlags = %lx, expected 0x10\n", dwFlags); + else if (top_window == self_window && documents_to_load > 1) + ok(!dwFlags, "dwFlags = %lx\n", dwFlags); + else if (documents_to_load > 1) + ok(dwFlags == (navNoHistory | navNoReadFromCache), "dwFlags = %lx\n", dwFlags); else ok(!(dwFlags &~1), "dwFlags = %lx\n", dwFlags);
ok(pHTMLWindow2 != NULL, "pHTMLWindow2 = NULL\n");
+ IHTMLWindow2_Release(top_window); + IHTMLWindow2_Release(self_window); + return S_OK; }
static HRESULT WINAPI DocObjectService_FireDownloadBegin( IDocObjectService* This) { - ok(0, "unexpected call\n"); - return E_NOTIMPL; + CHECK_EXPECT(FireDownloadBegin); + return S_OK; }
static HRESULT WINAPI DocObjectService_FireDownloadComplete( IDocObjectService* This) { - ok(0, "unexpected call\n"); - return E_NOTIMPL; + CHECK_EXPECT(FireDownloadComplete); + return S_OK; }
static HRESULT WINAPI DocObjectService_FireDocumentComplete( @@ -3767,10 +3798,25 @@ static HRESULT WINAPI DocObjectService_FireDocumentComplete( IHTMLWindow2 *pHTMLWindow, DWORD dwFlags) { + IHTMLWindow2 *top_window = NULL, *self_window = NULL; + CHECK_EXPECT(FireDocumentComplete);
+ IHTMLWindow2_get_top(pHTMLWindow, &top_window); + IHTMLWindow2_get_self(pHTMLWindow, &self_window); + + if (documents_to_load > 0) + documents_to_load--; + ok(pHTMLWindow != NULL, "pHTMLWindow == NULL\n"); - ok(!dwFlags, "dwFlags = %lx\n", dwFlags); + + if (top_window != self_window) + ok(dwFlags == navNoHistory, "dwFlags = %lx\n", dwFlags); + else + ok(!dwFlags, "dwFlags = %lx\n", dwFlags); + + IHTMLWindow2_Release(top_window); + IHTMLWindow2_Release(self_window);
return S_OK; } @@ -5622,7 +5668,7 @@ static void _test_readyState(unsigned line, IUnknown *unk) L"uninitialized" };
- if(open_call || resetting_document) + if(open_call || resetting_document || documents_to_load > 1) return; /* FIXME */
if(!unk) @@ -5869,8 +5915,11 @@ static void test_Load(IPersistMoniker *persist, IMoniker *mon) SET_EXPECT(GetContainer); SET_EXPECT(LockContainer); } - SET_EXPECT(OnChanged_READYSTATE); - SET_EXPECT(Invoke_OnReadyStateChange_Loading); + if (documents_to_load <= 1) + { + SET_EXPECT(OnChanged_READYSTATE); + SET_EXPECT(Invoke_OnReadyStateChange_Loading); + } SET_EXPECT(IsSystemMoniker); if(!is_mhtml && mon == &Moniker) SET_EXPECT(BindToStorage); @@ -5924,8 +5973,11 @@ static void test_Load(IPersistMoniker *persist, IMoniker *mon) CHECK_CALLED(LockContainer); container_locked = TRUE; } - CHECK_CALLED(OnChanged_READYSTATE); - CHECK_CALLED(Invoke_OnReadyStateChange_Loading); + if (documents_to_load <= 1) + { + CHECK_CALLED(OnChanged_READYSTATE); + CHECK_CALLED(Invoke_OnReadyStateChange_Loading); + } CLEAR_CALLED(IsSystemMoniker); /* IE7 */ if(!is_mhtml && mon == &Moniker) CHECK_CALLED(BindToStorage); @@ -5958,6 +6010,9 @@ static void test_Load(IPersistMoniker *persist, IMoniker *mon)
IBindCtx_Release(bind);
+ if (documents_to_load > 1) + load_state = LD_LOADING; + test_readyState((IUnknown*)persist); }
@@ -8186,6 +8241,135 @@ static void test_mimeType(IHTMLDocument2 *doc, const WCHAR *content_type) SysFreeString(mime_type); }
+static BSTR get_res_url(const WCHAR *file) +{ + DWORD len; + BSTR bstr; + static const WCHAR res[] = { 'r','e','s',':','/','/' }; + WCHAR url[INTERNET_MAX_URL_LENGTH]; + + memcpy(url, res, sizeof(res)); + len = 6 + GetModuleFileNameW(NULL, url + ARRAY_SIZE(res), ARRAY_SIZE(url) - ARRAY_SIZE(res) - 1); + url[len++] = '/'; + lstrcpynW(url + len, file, ARRAY_SIZE(url) - len); + + bstr = SysAllocString(url); + return bstr; +} + +/* Assumes interal document with external iframes */ +static void test_iframe_download(int flags) +{ + MSG msg; + DWORD start; + int total_documents = documents_to_load, total_iframes = total_documents - 1; + const DWORD timeout_ms = 3000; + + if (!(flags & DWL_VERBDONE)) + return; + + expect_status_text = (LPWSTR)0xdeadbeef; + + SET_EXPECT_N(Exec_MSHTML_PARSECOMPLETE, 1); + SET_EXPECT_N(Exec_HTTPEQUIV_DONE, total_documents); + + SET_EXPECT(SetStatusText); + SET_EXPECT_N(GetDropTarget, 1); + SET_EXPECT_N(ActiveElementChanged, 1); + SET_EXPECT_N(IsErrorUrl, total_documents); + + SET_EXPECT_N(Invoke_AMBIENT_SILENT, total_iframes); + SET_EXPECT_N(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED, total_iframes); + SET_EXPECT_N(TranslateUrl, total_iframes); + + SET_EXPECT(Exec_SETPROGRESSMAX); + SET_EXPECT(Exec_SETPROGRESSPOS); + SET_EXPECT_N(Exec_SETDOWNLOADSTATE_1, 1); + SET_EXPECT_N(Exec_SETDOWNLOADSTATE_0, 1); + SET_EXPECT_N(Exec_ShellDocView_37, 1); + SET_EXPECT_N(Exec_SETTITLE, 1); + + SET_EXPECT_N(Exec_Explorer_69, 2 * total_documents); + SET_EXPECT_N(EnableModeless_TRUE, 1); /* IE7 */ + SET_EXPECT_N(Frame_EnableModeless_TRUE, 1); /* IE7 */ + SET_EXPECT_N(EnableModeless_FALSE, 1); /* IE7 */ + SET_EXPECT_N(Frame_EnableModeless_FALSE, 1); /* IE7 */ + + SET_EXPECT_N(FireDownloadBegin, total_iframes); + SET_EXPECT_N(FireDownloadComplete, total_iframes); + + SET_EXPECT_N(FireBeforeNavigate2, total_iframes); + SET_EXPECT_N(FireNavigateComplete2, total_documents); + SET_EXPECT_N(FireDocumentComplete, total_documents); + + /* WINE TODO */ + SET_EXPECT(Exec_ShellDocView_103); + + start = GetTickCount(); + while(documents_to_load > 0 && GetMessageW(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessageA(&msg); + if (GetTickCount() - start >= timeout_ms) + { + todo_wine ok(0, "Test timed out waiting for iframe completion.\n"); + break; + } + } + + todo_wine CHECK_CALLED_N(Exec_HTTPEQUIV_DONE, total_documents); + + CHECK_CALLED(SetStatusText); + CHECK_CALLED_N(GetDropTarget, 1); + todo_wine CHECK_CALLED_N(ActiveElementChanged, 1); + todo_wine CHECK_CALLED_N(IsErrorUrl, total_documents); + + todo_wine CHECK_CALLED_N(Invoke_AMBIENT_SILENT, total_iframes); + todo_wine CHECK_CALLED_N(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED, total_iframes); + todo_wine CHECK_CALLED_N(TranslateUrl, total_iframes); + + CHECK_CALLED(Exec_SETPROGRESSMAX); + CHECK_CALLED(Exec_SETPROGRESSPOS); + CHECK_CALLED_N(Exec_SETDOWNLOADSTATE_1, 1); + CHECK_CALLED_N(Exec_SETDOWNLOADSTATE_0, 1); + todo_wine CHECK_CALLED_N(Exec_ShellDocView_37, 1); + CHECK_CALLED_N(Exec_SETTITLE, 1); + + CLEAR_CALLED(Exec_Explorer_69); + CLEAR_CALLED(EnableModeless_TRUE); /* IE7 */ + CLEAR_CALLED(Frame_EnableModeless_TRUE); /* IE7 */ + CLEAR_CALLED(EnableModeless_FALSE); /* IE7 */ + CLEAR_CALLED(Frame_EnableModeless_FALSE); /* IE7 */ + + todo_wine CHECK_CALLED_N(FireDownloadBegin, total_iframes); + todo_wine CHECK_CALLED_N(FireDownloadComplete, total_iframes); + + todo_wine CHECK_CALLED_N(FireBeforeNavigate2, total_iframes); + todo_wine CHECK_CALLED_N(FireNavigateComplete2, total_documents); + todo_wine CHECK_CALLED_N(FireDocumentComplete, total_documents); + + todo_wine CHECK_NOT_CALLED(Exec_ShellDocView_103); +} + +static void test_iframe_load(IHTMLDocument2 *doc, const WCHAR *url) +{ + HRESULT hres; + IMoniker *mon; + BSTR moniker_url; + + moniker_url = get_res_url(url); + + hres = CreateURLMoniker(NULL, moniker_url, &mon); + ok(!hres, "Failed to create URL Moniker\n"); + nav_serv_url = nav_url = moniker_url; + + test_Persist(doc, mon); + IMoniker_Release(mon); + + test_iframe_download(DWL_VERBDONE); + SysFreeString(moniker_url); +} + static void init_test(enum load_state_t ls) { doc_unk = NULL; doc_hwnd = last_hwnd = NULL; @@ -8203,6 +8387,37 @@ static void init_test(enum load_state_t ls) { testing_submit = FALSE; expect_uihandler_iface = &DocHostUIHandler; is_mhtml = FALSE; + documents_to_load = 1; +} + +static void test_iframes(void) +{ + IHTMLDocument2 *doc; + IOleObject *oleobj; + HRESULT hres; + + init_test(LD_DOLOAD); + doc = create_document(); + doc_unk = (IUnknown*)doc; + support_wbapp = TRUE; + documents_to_load = 3; + + hres = IHTMLDocument2_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj); + ok(hres == S_OK, "QueryInterface(IID_IOleObject) failed: %08lx\n", hres); + test_ClientSite(oleobj, CLIENTSITE_EXPECTPATH); + test_DoVerb(oleobj); + IOleObject_Release(oleobj); + + test_iframe_load(doc, L"event_iframe.html"); + + test_InPlaceDeactivate(doc, TRUE); + test_Close(doc, TRUE); + + if (view) + IOleDocumentView_Release(view); + view = NULL; + + release_document(doc); }
static void test_HTMLDocument(BOOL do_load, BOOL mime) @@ -9631,6 +9846,7 @@ START_TEST(htmldoc) test_HTMLDoc_ISupportErrorInfo(); test_ServiceProvider(); test_com_aggregation(&CLSID_HTMLDocument); + test_iframes();
DestroyWindow(container_hwnd); CoUninitialize(); diff --git a/dlls/mshtml/tests/rsrc.rc b/dlls/mshtml/tests/rsrc.rc index 8ad850a66bc..777f67eaee9 100644 --- a/dlls/mshtml/tests/rsrc.rc +++ b/dlls/mshtml/tests/rsrc.rc @@ -91,6 +91,9 @@ iframe.html HTML "iframe.html" /* @makedep: xhr_iframe.html */ xhr_iframe.html HTML "xhr_iframe.html"
+/* @makedep: event_iframe.html */ +event_iframe.html HTML "event_iframe.html" + /* @makedep: utf8.css */ utf8.css HTML "utf8.css"
From: Jacob Czekalla jczekalla@codeweavers.com
Documents such as iframes do not currently receive BeforeNavigate2 events. --- dlls/mshtml/nsio.c | 39 ++++++++++++++++++++++++++++++++++--- dlls/mshtml/tests/htmldoc.c | 2 +- 2 files changed, 37 insertions(+), 4 deletions(-)
diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c index a5564e1b6e4..e89f333693d 100644 --- a/dlls/mshtml/nsio.c +++ b/dlls/mshtml/nsio.c @@ -1000,6 +1000,23 @@ static void start_binding_task_destr(task_t *_task) IBindStatusCallback_Release(&task->bscallback->bsc.IBindStatusCallback_iface); }
+static HRESULT fire_beforenavigate2(HTMLOuterWindow *window, BSTR url) +{ + BSTR frame_name = NULL; + BOOL cancel = FALSE; + HRESULT hres; + + hres = IHTMLWindow2_get_name(&window->base.IHTMLWindow2_iface, &frame_name); + if (FAILED(hres)) + return NS_ERROR_UNEXPECTED; + + hres = IDocObjectService_FireBeforeNavigate2(window->browser->doc->doc_object_service, NULL, url, 0, frame_name, NULL, 0, NULL, FALSE, &cancel); + SysFreeString(frame_name); + if (cancel) + return NS_BINDING_ABORTED; + return S_OK; +} + static nsresult async_open(nsChannel *This, HTMLOuterWindow *window, BOOL is_doc_channel, UINT32 load_type, nsIStreamListener *listener, nsISupports *context) { @@ -1058,6 +1075,8 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen BOOL is_document_channel; BOOL cancel = FALSE; nsresult nsres = NS_OK; + HRESULT hres; + BSTR uri_str;
TRACE("(%p)->(%p %p)\n", This, aListener, aContext);
@@ -1065,9 +1084,6 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen return NS_ERROR_FAILURE;
if(TRACE_ON(mshtml)) { - HRESULT hres; - BSTR uri_str; - hres = IUri_GetDisplayUri(This->uri->uri, &uri_str); if(SUCCEEDED(hres)) { TRACE("opening %s\n", debugstr_w(uri_str)); @@ -1104,6 +1120,23 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen This->content_type = strdupWtoA(window->browser->doc->mime); } } + + if (!cancel && !This->uri->channel_bsc && window->browser->doc->doc_object_service) + { + /* fire event for document navigations by Gecko */ + hres = IUri_GetDisplayUri(This->uri->uri, &uri_str); + if (SUCCEEDED(hres)) + { + hres = fire_beforenavigate2(window, uri_str); + SysFreeString(uri_str); + if (FAILED(hres)) + cancel = TRUE; + }else + { + cancel = TRUE; + WARN("GetDisplayUri failed: %08lx\n", hres); + } + } }
if(!cancel) diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c index c17fd81e8a9..86845ce4d84 100644 --- a/dlls/mshtml/tests/htmldoc.c +++ b/dlls/mshtml/tests/htmldoc.c @@ -8344,7 +8344,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);
Jacek Caban (@jacek) commented about dlls/mshtml/nsio.c:
IBindStatusCallback_Release(&task->bscallback->bsc.IBindStatusCallback_iface);
}
+static HRESULT fire_beforenavigate2(HTMLOuterWindow *window, BSTR url)
Sorry for not catching it earlier, but this should be `nsresult`. It's similar, but not the same to `HRESULT`, but has different codes so it shouldn't be mixed.
Jacek Caban (@jacek) commented about dlls/mshtml/nsio.c:
+static HRESULT fire_beforenavigate2(HTMLOuterWindow *window, BSTR url) +{
- BSTR frame_name = NULL;
- BOOL cancel = FALSE;
- HRESULT hres;
- hres = IHTMLWindow2_get_name(&window->base.IHTMLWindow2_iface, &frame_name);
- if (FAILED(hres))
return NS_ERROR_UNEXPECTED;
- hres = IDocObjectService_FireBeforeNavigate2(window->browser->doc->doc_object_service, NULL, url, 0, frame_name, NULL, 0, NULL, FALSE, &cancel);
- SysFreeString(frame_name);
- if (cancel)
return NS_BINDING_ABORTED;
- return S_OK;
That's `NS_OK`.
Jacek Caban (@jacek) commented about dlls/mshtml/nsio.c:
This->content_type = strdupWtoA(window->browser->doc->mime); } }
if (!cancel && !This->uri->channel_bsc && window->browser->doc->doc_object_service)
{
/* fire event for document navigations by Gecko */
hres = IUri_GetDisplayUri(This->uri->uri, &uri_str);
if (SUCCEEDED(hres))
{
hres = fire_beforenavigate2(window, uri_str);
`nsres = ...`, this way we will propagate the error.
Jacek Caban (@jacek) commented about dlls/mshtml/nsio.c:
This->content_type = strdupWtoA(window->browser->doc->mime); } }
if (!cancel && !This->uri->channel_bsc && window->browser->doc->doc_object_service)
{
/* fire event for document navigations by Gecko */
hres = IUri_GetDisplayUri(This->uri->uri, &uri_str);
if (SUCCEEDED(hres))
{
hres = fire_beforenavigate2(window, uri_str);
SysFreeString(uri_str);
if (FAILED(hres))
cancel = TRUE;
Maybe we should just pass `&cancel` pointer to `fire_beforenavigate2`.