diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c index 95b8814fb8f..ed726857527 100644 --- a/dlls/mshtml/tests/htmldoc.c +++ b/dlls/mshtml/tests/htmldoc.c @@ -204,6 +204,7 @@ DEFINE_EXPECT(EnumConnections_Next); DEFINE_EXPECT(WindowClosing); DEFINE_EXPECT(NavigateWithBindCtx); +static BOOL is_ie9plus; static IUnknown *doc_unk; static IMoniker *doc_mon; static BOOL expect_LockContainer_fLock; @@ -4259,6 +4260,19 @@ static const IConnectionPointContainerVtbl ConnectionPointContainerVtbl = { static IConnectionPointContainer ConnectionPointContainer = { &ConnectionPointContainerVtbl }; +static void test_NavigateWithBindCtx(BSTR uri, VARIANT *flags, VARIANT *target_frame, VARIANT *post_data, + VARIANT *headers, IBindCtx *bind_ctx, LPOLESTR url_fragment) +{ + ok(!strcmp_wa(uri, nav_url), "uri = %s\n", wine_dbgstr_w(uri)); + ok(V_VT(flags) == VT_I4, "V_VT(flags) = %d\n", V_VT(flags)); + ok(V_I4(flags) == navHyperlink, "V_I4(flags) = %x\n", V_I4(flags)); + ok(!target_frame, "target_frame != NULL\n"); + ok(!post_data, "post_data != NULL\n"); + ok(!headers, "headers != NULL\n"); + ok(bind_ctx != NULL, "bind_ctx == NULL\n"); + ok(!url_fragment, "url_dragment = %s\n", wine_dbgstr_w(url_fragment)); +} + static HRESULT wb_qi(REFIID riid, void **ppv); static HRESULT WINAPI WebBrowserPriv_QueryInterface(IWebBrowserPriv *iface, REFIID riid, void **ppv) @@ -4284,15 +4298,7 @@ static HRESULT WINAPI WebBrowserPriv_NavigateWithBindCtx(IWebBrowserPriv *iface, CHECK_EXPECT(NavigateWithBindCtx); ok(V_VT(uri) == VT_BSTR, "V_VT(uri) = %d\n", V_VT(uri)); - ok(!strcmp_wa(V_BSTR(uri), nav_url), "V_BSTR(uri) = %s\n", wine_dbgstr_w(V_BSTR(uri))); - ok(V_VT(flags) == VT_I4, "V_VT(flags) = %d\n", V_VT(flags)); - ok(V_I4(flags) == navHyperlink, "V_I4(flags) = %x\n", V_I4(flags)); - ok(!target_frame, "target_frame != NULL\n"); - ok(!post_data, "post_data != NULL\n"); - ok(!headers, "headers != NULL\n"); - ok(bind_ctx != NULL, "bind_ctx == NULL\n"); - ok(!url_fragment, "url_dragment = %s\n", wine_dbgstr_w(url_fragment)); - + test_NavigateWithBindCtx(V_BSTR(uri), flags, target_frame, post_data, headers, bind_ctx, url_fragment); return S_OK; } @@ -4333,23 +4339,14 @@ static HRESULT WINAPI WebBrowserPriv2IE8_NavigateWithBindCtx2(IWebBrowserPriv2IE BSTR str; HRESULT hres; - trace("NavigateWithBindCtx2\n"); + trace("IE8: NavigateWithBindCtx2\n"); CHECK_EXPECT(NavigateWithBindCtx); hres = IUri_GetDisplayUri(uri, &str); ok(hres == S_OK, "GetDisplayUri failed: %08x\n", hres); - ok(!strcmp_wa(str, nav_url), "V_BSTR(uri) = %s\n", wine_dbgstr_w(str)); + test_NavigateWithBindCtx(str, flags, target_frame, post_data, headers, bind_ctx, url_fragment); SysFreeString(str); - - ok(V_VT(flags) == VT_I4, "V_VT(flags) = %d\n", V_VT(flags)); - ok(V_I4(flags) == navHyperlink, "V_I4(flags) = %x\n", V_I4(flags)); - ok(!target_frame, "target_frame != NULL\n"); - ok(!post_data, "post_data != NULL\n"); - ok(!headers, "headers != NULL\n"); - ok(bind_ctx != NULL, "bind_ctx == NULL\n"); - ok(!url_fragment, "url_dragment = %s\n", wine_dbgstr_w(url_fragment)); - return S_OK; } @@ -4418,6 +4415,47 @@ static const IWebBrowserPriv2IE8Vtbl WebBrowserPriv2IE8Vtbl = { static IWebBrowserPriv2IE8 WebBrowserPriv2IE8 = { &WebBrowserPriv2IE8Vtbl }; +static HRESULT WINAPI WebBrowserPriv2IE9_QueryInterface(IWebBrowserPriv2IE9 *iface, REFIID riid, void **ppv) +{ + return wb_qi(riid, ppv); +} + +static ULONG WINAPI WebBrowserPriv2IE9_AddRef(IWebBrowserPriv2IE9 *iface) +{ + return 2; +} + +static ULONG WINAPI WebBrowserPriv2IE9_Release(IWebBrowserPriv2IE9 *iface) +{ + return 1; +} + +static HRESULT WINAPI WebBrowserPriv2IE9_NavigateWithBindCtx2(IWebBrowserPriv2IE9 *iface, IUri *uri, VARIANT *flags, + VARIANT *target_frame, VARIANT *post_data, VARIANT *headers, IBindCtx *bind_ctx, LPOLESTR url_fragment, DWORD unknown) +{ + BSTR str; + HRESULT hres; + + trace("IE9: NavigateWithBindCtx2\n"); + + CHECK_EXPECT(NavigateWithBindCtx); + + hres = IUri_GetDisplayUri(uri, &str); + ok(hres == S_OK, "GetDisplayUri failed: %08x\n", hres); + test_NavigateWithBindCtx(str, flags, target_frame, post_data, headers, bind_ctx, url_fragment); + SysFreeString(str); + return S_OK; +} + +static const IWebBrowserPriv2IE9Vtbl WebBrowserPriv2IE9Vtbl = { + WebBrowserPriv2IE9_QueryInterface, + WebBrowserPriv2IE9_AddRef, + WebBrowserPriv2IE9_Release, + WebBrowserPriv2IE9_NavigateWithBindCtx2 +}; + +static IWebBrowserPriv2IE9 WebBrowserPriv2IE9 = { &WebBrowserPriv2IE9Vtbl }; + static HRESULT WINAPI WebBrowser_QueryInterface(IWebBrowser2 *iface, REFIID riid, void **ppv) { return wb_qi(riid, ppv); @@ -4956,7 +4994,8 @@ static HRESULT wb_qi(REFIID riid, void **ppv) } if(IsEqualGUID(riid, &IID_IWebBrowserPriv2IE8)) { - *ppv = &WebBrowserPriv2IE8; + /* IE8 and IE9 versions use the same IID, but have different declarations. */ + *ppv = is_ie9plus ? (void*)&WebBrowserPriv2IE9 : (void*)&WebBrowserPriv2IE8; return S_OK; } @@ -8316,12 +8355,21 @@ static BOOL check_ie(void) { IHTMLDocument2 *doc; IHTMLDocument5 *doc5; + IHTMLDocument7 *doc7; HRESULT hres; doc = create_document(); if(!doc) return FALSE; + hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument7, (void**)&doc7); + if(SUCCEEDED(hres)) { + is_ie9plus = TRUE; + IHTMLDocument7_Release(doc7); + } + + trace("is_ie9plus %x\n", is_ie9plus); + hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5); if(SUCCEEDED(hres)) IHTMLDocument5_Release(doc5); diff --git a/include/mshtml.idl b/include/mshtml.idl index 3e1424ceac2..0c5a8746ec8 100644 --- a/include/mshtml.idl +++ b/include/mshtml.idl @@ -19172,3 +19172,18 @@ interface IWebBrowserPriv2IE8 : IUnknown HRESULT GetSearchTerm(BSTR *term); HRESULT GetCurrentDocument(IDispatch** doc); } + +/***************************************************************************** + * IWebBrowserPriv2IE9 interface + */ +[ + object, + uuid(3ed72303-6ffc-4214-ba90-faf1862dec8a), + local +] +interface IWebBrowserPriv2IE9 : IUnknown +{ + HRESULT NavigateWithBindCtx2(IUri *uri, VARIANT *flags, VARIANT *target_frame, VARIANT *post_data, + VARIANT *headers, IBindCtx *bind_ctx, LPOLESTR url_fragment, DWORD unused); + /* Probably more */ +}