Documents such as iframes do not currently receive BeforeNavigate2 events.
-- v2: mshtml: Fire BeforeNavigate2 for documents in async_open. mshtml/tests: Add iframe event tests in htmldoc.c. mshtml/tests: Add call stacking to htmldoc test framework.
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 | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c index c64ed784897..a37d94c48c9 100644 --- a/dlls/mshtml/tests/htmldoc.c +++ b/dlls/mshtml/tests/htmldoc.c @@ -61,19 +61,22 @@ extern const IID IID_IActiveScriptSite; #define SET_EXPECT(func) \ expect_ ## func = TRUE
+#define SET_EXPECT_N(func, n) \ + do { called_ ## func = FALSE; expect_ ## func = n; } while(0) + #define SET_CALLED(func) \ called_ ## func = TRUE
#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) \ @@ -82,6 +85,12 @@ extern const IID IID_IActiveScriptSite; expect_ ## func = called_ ## func = FALSE; \ }while(0)
+#define CHECK_CALLED_N(func, n) \ + do { \ + ok(called_ ## func == n, "expected " #func "\n"); \ + expect_ ## func = called_ ## func = FALSE; \ + }while(0) + #define CHECK_NOT_CALLED(func) \ do { \ ok(!called_ ## func, "unexpected " #func "\n"); \
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 | 248 ++++++++++++++++++++++++++-- dlls/mshtml/tests/rsrc.rc | 3 + 3 files changed, 238 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 a37d94c48c9..bd36c65f02d 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,11 @@ 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) /* FIXME */ + { + 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)); + } 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 +3737,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 +3750,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 +3796,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 +5666,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 +5913,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 +5971,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 +6008,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 +8239,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 +8385,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 +9844,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 | 46 +++++++++++++++++++++++++++++++++++++ dlls/mshtml/tests/htmldoc.c | 2 +- 2 files changed, 47 insertions(+), 1 deletion(-)
diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c index a5564e1b6e4..9e9d3efd7d6 100644 --- a/dlls/mshtml/nsio.c +++ b/dlls/mshtml/nsio.c @@ -1000,12 +1000,51 @@ static void start_binding_task_destr(task_t *_task) IBindStatusCallback_Release(&task->bscallback->bsc.IBindStatusCallback_iface); }
+static HRESULT fire_beforenavigate2(nsChannel *This, IDocObjectService *doc_object_service, HTMLOuterWindow *window) +{ + BSTR frame_name = NULL, display_uri = NULL; + BOOL cancel = FALSE; + HRESULT hres; + IServiceProvider *service_provider = NULL; + IWebBrowser2 *web_browser = NULL; + + hres = IUri_GetDisplayUri(This->uri->uri, &display_uri); + if (FAILED(hres)) + return NS_ERROR_UNEXPECTED; + hres = IHTMLWindow2_get_name(&window->base.IHTMLWindow2_iface, &frame_name); + if (FAILED(hres)) + { + SysFreeString(display_uri); + return NS_ERROR_UNEXPECTED; + } + hres = IHTMLWindow2_QueryInterface(&window->base.IHTMLWindow2_iface, &IID_IServiceProvider, (void**)&service_provider); + if (SUCCEEDED(hres)) + { + hres = IServiceProvider_QueryService(service_provider, &SID_SWebBrowserApp, &IID_IWebBrowser2, (void**)&web_browser); + IServiceProvider_Release(service_provider); + } + if (FAILED(hres)) + { + SysFreeString(frame_name); + SysFreeString(display_uri); + return NS_ERROR_UNEXPECTED; + } + hres = IDocObjectService_FireBeforeNavigate2(doc_object_service, (IDispatch*)web_browser, display_uri, 0, frame_name, NULL, 0, NULL, FALSE, &cancel); + IWebBrowser2_Release(web_browser); + SysFreeString(display_uri); + 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) { nsChannelBSC *bscallback; IMoniker *mon = NULL; HRESULT hres; + IDocObjectService *doc_object_service;
hres = CreateURLMonikerEx2(NULL, This->uri->uri, &mon, 0); if(FAILED(hres)) { @@ -1024,6 +1063,13 @@ static nsresult async_open(nsChannel *This, HTMLOuterWindow *window, BOOL is_doc channelbsc_set_channel(bscallback, This, listener, context);
if(is_doc_channel) { + doc_object_service = window->base.outer_window->browser->doc->doc_object_service; + if (doc_object_service) + { + hres = fire_beforenavigate2(This, doc_object_service, window); + if (FAILED(hres)) + return hres; + } 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);
Ok, it should be good to go. Script.c fails under windows 10 in the pipeline, but it seems unrelated as I did not modify script.c.
Jacek Caban (@jacek) commented about dlls/mshtml/nsio.c:
channelbsc_set_channel(bscallback, This, listener, context); if(is_doc_channel) {
doc_object_service = window->base.outer_window->browser->doc->doc_object_service;
if (doc_object_service)
{
hres = fire_beforenavigate2(This, doc_object_service, window);
if (FAILED(hres))
return hres;
}
I think that with this patch we may fire the before-navigate event twice in cases when loading is initiated by us (like in `put_href` handler). In such case, we'd have `navigate_uri` call it too. It'd be tricky to somehow use common logic for those cases, but you could probably just check `This->uri->channel_bsc` for NULL to catch only Gecko-initiated binding here.
Jacek Caban (@jacek) commented about dlls/mshtml/nsio.c:
- hres = IUri_GetDisplayUri(This->uri->uri, &display_uri);
- if (FAILED(hres))
return NS_ERROR_UNEXPECTED;
- hres = IHTMLWindow2_get_name(&window->base.IHTMLWindow2_iface, &frame_name);
- if (FAILED(hres))
- {
SysFreeString(display_uri);
return NS_ERROR_UNEXPECTED;
- }
- hres = IHTMLWindow2_QueryInterface(&window->base.IHTMLWindow2_iface, &IID_IServiceProvider, (void**)&service_provider);
- if (SUCCEEDED(hres))
- {
hres = IServiceProvider_QueryService(service_provider, &SID_SWebBrowserApp, &IID_IWebBrowser2, (void**)&web_browser);
IServiceProvider_Release(service_provider);
- }
Could we use `window->browser->doc->doc_object_service` instead here?