From 0adfeb28696aacf426977c578012bfa84e257cbc Mon Sep 17 00:00:00 2001 From: David Hedberg Date: Wed, 17 Nov 2010 13:12:21 +0100 Subject: [PATCH] shdocvw: Implement ControlSite::TranslateAccelerator. --- dlls/shdocvw/client.c | 27 ++++++- dlls/shdocvw/tests/webbrowser.c | 125 +++++++++++++++++++++++++++++++- 2 files changed, 149 insertions(+), 3 deletions(-) diff --git a/dlls/shdocvw/client.c b/dlls/shdocvw/client.c index bb569aa0b0c..5c5da44e1e0 100644 --- a/dlls/shdocvw/client.c +++ b/dlls/shdocvw/client.c @@ -415,8 +415,31 @@ static HRESULT WINAPI ControlSite_TranslateAccelerator(IOleControlSite *iface, M DWORD grfModifiers) { DocHost *This = impl_from_IOleControlSite(iface); - FIXME("(%p)->(%p, %08x)\n", This, pMsg, grfModifiers); - return E_NOTIMPL; + IOleObject *wb_obj; + IOleClientSite *clientsite; + IOleControlSite *controlsite; + HRESULT hr; + + TRACE("(%p)->(%p, %08x)\n", This, pMsg, grfModifiers); + + hr = IDispatch_QueryInterface(This->disp, &IID_IOleObject, (void**)&wb_obj); + if(SUCCEEDED(hr)) { + hr = IOleObject_GetClientSite(wb_obj, &clientsite); + if(SUCCEEDED(hr)) { + hr = IOleClientSite_QueryInterface(clientsite, &IID_IOleControlSite, (void**)&controlsite); + if(SUCCEEDED(hr)) { + hr = IOleControlSite_TranslateAccelerator(controlsite, pMsg, grfModifiers); + IOleControlSite_Release(controlsite); + } + IOleClientSite_Release(clientsite); + } + IOleObject_Release(wb_obj); + } + + if(FAILED(hr)) + return S_FALSE; + else + return hr; } static HRESULT WINAPI ControlSite_OnFocus(IOleControlSite *iface, BOOL fGotFocus) diff --git a/dlls/shdocvw/tests/webbrowser.c b/dlls/shdocvw/tests/webbrowser.c index 7f9a24ae6bc..6f84eee360f 100644 --- a/dlls/shdocvw/tests/webbrowser.c +++ b/dlls/shdocvw/tests/webbrowser.c @@ -130,6 +130,8 @@ DEFINE_EXPECT(TranslateUrl); DEFINE_EXPECT(ShowUI); DEFINE_EXPECT(HideUI); DEFINE_EXPECT(RequestUIActivate); +DEFINE_EXPECT(ControlSite_TranslateAccelerator); +DEFINE_EXPECT(OnFocus); static const WCHAR wszItem[] = {'i','t','e','m',0}; static const WCHAR emptyW[] = {0}; @@ -140,6 +142,7 @@ static IWebBrowser2 *wb; static HWND container_hwnd, shell_embedding_hwnd; static BOOL is_downloading, is_first_load; static HRESULT hr_dochost_TranslateAccelerator = E_NOTIMPL; +static HRESULT hr_site_TranslateAccelerator = E_NOTIMPL; static const char *current_url; #define DWL_EXPECT_BEFORE_NAVIGATE 0x01 @@ -852,6 +855,85 @@ static const IOleClientSiteVtbl ClientSiteVtbl = { static IOleClientSite ClientSite = { &ClientSiteVtbl }; +static HRESULT WINAPI IOleControlSite_fnQueryInterface(IOleControlSite *iface, REFIID riid, void **ppv) +{ + *ppv = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI IOleControlSite_fnAddRef(IOleControlSite *iface) +{ + return 2; +} + +static ULONG WINAPI IOleControlSite_fnRelease(IOleControlSite *iface) +{ + return 1; +} + +static HRESULT WINAPI IOleControlSite_fnOnControlInfoChanged(IOleControlSite* This) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI IOleControlSite_fnLockInPlaceActive(IOleControlSite* This, + BOOL fLock) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI IOleControlSite_fnGetExtendedControl(IOleControlSite* This, + IDispatch **ppDisp) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI IOleControlSite_fnTransformCoords(IOleControlSite* This, + POINTL *pPtlHimetric, + POINTF *pPtfContainer, + DWORD dwFlags) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI IOleControlSite_fnTranslateAccelerator(IOleControlSite* This, MSG *pMsg, + DWORD grfModifiers) +{ + CHECK_EXPECT(ControlSite_TranslateAccelerator); + return hr_site_TranslateAccelerator; +} + +static HRESULT WINAPI IOleControlSite_fnOnFocus(IOleControlSite* This, BOOL fGotFocus) +{ + CHECK_EXPECT2(OnFocus); + return E_NOTIMPL; +} + +static HRESULT WINAPI IOleControlSite_fnShowPropertyFrame(IOleControlSite* This) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static IOleControlSiteVtbl ControlSiteVtbl = { + IOleControlSite_fnQueryInterface, + IOleControlSite_fnAddRef, + IOleControlSite_fnRelease, + IOleControlSite_fnOnControlInfoChanged, + IOleControlSite_fnLockInPlaceActive, + IOleControlSite_fnGetExtendedControl, + IOleControlSite_fnTransformCoords, + IOleControlSite_fnTranslateAccelerator, + IOleControlSite_fnOnFocus, + IOleControlSite_fnShowPropertyFrame +}; + +static IOleControlSite ControlSite = { &ControlSiteVtbl }; + static HRESULT WINAPI InPlaceUIWindow_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, void **ppv) { @@ -1433,7 +1515,7 @@ static HRESULT QueryInterface(REFIID riid, void **ppv) else if(IsEqualGUID(&IID_IDocHostShowUI, riid)) trace("interface IID_IDocHostShowUI\n"); else if(IsEqualGUID(&IID_IOleControlSite, riid)) - trace("interface IID_IOleControlSite\n"); + *ppv = &ControlSite; else if(IsEqualGUID(&IID_IOleCommandTarget, riid)) trace("interface IID_IOleCommandTarget\n"); @@ -1494,6 +1576,7 @@ static void test_DoVerb(IUnknown *unk) SET_EXPECT(Frame_SetActiveObject); SET_EXPECT(UIWindow_SetActiveObject); SET_EXPECT(SetMenu); + SET_EXPECT(OnFocus); hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite, 0, (HWND)0xdeadbeef, &rect); @@ -1510,6 +1593,7 @@ static void test_DoVerb(IUnknown *unk) CHECK_CALLED(Frame_SetActiveObject); CHECK_CALLED(UIWindow_SetActiveObject); CHECK_CALLED(SetMenu); + todo_wine CHECK_CALLED(OnFocus); hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite, 0, (HWND)0xdeadbeef, &rect); @@ -2539,6 +2623,7 @@ static void test_TranslateAccelerator(IUnknown *unk) ok(hres == S_OK, "Got 0x%08x\n", hres); if(SUCCEEDED(hres)) { IDocHostUIHandler2 *dochost; + IOleControlSite *doc_controlsite; IUnknown *unk_test; hres = IOleClientSite_QueryInterface(doc_clientsite, &IID_IOleInPlaceFrame, (void**)&unk_test); @@ -2575,6 +2660,44 @@ static void test_TranslateAccelerator(IUnknown *unk) IDocHostUIHandler2_Release(dochost); } + hres = IOleClientSite_QueryInterface(doc_clientsite, &IID_IOleControlSite, (void**)&doc_controlsite); + ok(hres == S_OK, "Got 0x%08x\n", hres); + if(SUCCEEDED(hres)) { + + msg_a.message = WM_KEYDOWN; + hr_site_TranslateAccelerator = 0xdeadbeef; + for(keycode = 0; keycode < 0x100; keycode++) { + msg_a.wParam = keycode; + SET_EXPECT(ControlSite_TranslateAccelerator); + hres = IOleControlSite_TranslateAccelerator(doc_controlsite, &msg_a, 0); + if(keycode == 0x9 || keycode == 0x75) + todo_wine ok(hres == S_OK, "Got 0x%08x (keycode: %04x)\n", hres, keycode); + else + ok(hres == S_FALSE, "Got 0x%08x (keycode: %04x)\n", hres, keycode); + + CHECK_CALLED(ControlSite_TranslateAccelerator); + } + msg_a.wParam = VK_LEFT; + SET_EXPECT(ControlSite_TranslateAccelerator); + hres = IOleControlSite_TranslateAccelerator(doc_controlsite, &msg_a, 0); + ok(hres == S_FALSE, "Got 0x%08x (keycode: %04x)\n", hres, keycode); + CHECK_CALLED(ControlSite_TranslateAccelerator); + + hr_site_TranslateAccelerator = S_OK; + SET_EXPECT(ControlSite_TranslateAccelerator); + hres = IOleControlSite_TranslateAccelerator(doc_controlsite, &msg_a, 0); + ok(hres == S_OK, "Got 0x%08x (keycode: %04x)\n", hres, keycode); + CHECK_CALLED(ControlSite_TranslateAccelerator); + + hr_site_TranslateAccelerator = E_NOTIMPL; + SET_EXPECT(ControlSite_TranslateAccelerator); + hres = IOleControlSite_TranslateAccelerator(doc_controlsite, &msg_a, 0); + ok(hres == S_FALSE, "Got 0x%08x (keycode: %04x)\n", hres, keycode); + CHECK_CALLED(ControlSite_TranslateAccelerator); + + IOleControlSite_Release(doc_controlsite); + } + IOleClientSite_Release(doc_clientsite); } IOleObject_Release(obj_doc);