[PATCH 3/4] shdocvw: Implement ControlSite::TranslateAccelerator.
David Hedberg
dhedberg at codeweavers.com
Fri Nov 12 01:50:01 CST 2010
---
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 b693122..1d0149e 100644
--- a/dlls/shdocvw/client.c
+++ b/dlls/shdocvw/client.c
@@ -413,8 +413,31 @@ static HRESULT WINAPI ControlSite_TranslateAccelerator(IOleControlSite *iface, M
DWORD grfModifiers)
{
DocHost *This = CONTROLSITE_THIS(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 fd1c7f8..251a2a1 100644
--- a/dlls/shdocvw/tests/webbrowser.c
+++ b/dlls/shdocvw/tests/webbrowser.c
@@ -128,6 +128,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};
@@ -138,6 +140,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
@@ -844,6 +847,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)
{
@@ -1425,7 +1507,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");
@@ -1486,6 +1568,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);
@@ -1502,6 +1585,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);
@@ -2667,6 +2751,7 @@ static void test_TranslateAccelerator(IUnknown *unk)
ok(hr == S_OK, "Got 0x%08x\n", hr);
if(SUCCEEDED(hr)) {
IDocHostUIHandler2 *html_dochost;
+ IOleControlSite *html_controlsite;
IUnknown *punk_test;
hr = IOleClientSite_QueryInterface(the_site, &IID_IOleInPlaceFrame, (void**)&punk_test);
@@ -2703,6 +2788,44 @@ static void test_TranslateAccelerator(IUnknown *unk)
IDocHostUIHandler2_Release(html_dochost);
}
+
+ hr = IOleClientSite_QueryInterface(the_site, &IID_IOleControlSite, (void**)&html_controlsite);
+ ok(hr == S_OK, "Got 0x%08x\n", hr);
+ if(SUCCEEDED(hr)) {
+
+ msg_a.message = WM_KEYDOWN;
+ hr_site_TranslateAccelerator = 0xdeadbeef;
+ for(keycode = 0; keycode < 0x100; keycode++) {
+ msg_a.wParam = keycode;
+ SET_EXPECT(ControlSite_TranslateAccelerator);
+ hr = IOleControlSite_TranslateAccelerator(html_controlsite, &msg_a, 0);
+ if(keycode == 0x9 || keycode == 0x75)
+ todo_wine ok(hr == S_OK, "Got 0x%08x (keycode: %04x)\n", hr, keycode);
+ else
+ ok(hr == S_FALSE, "Got 0x%08x (keycode: %04x)\n", hr, keycode);
+
+ CHECK_CALLED(ControlSite_TranslateAccelerator);
+ }
+ msg_a.wParam = VK_LEFT;
+ SET_EXPECT(ControlSite_TranslateAccelerator);
+ hr = IOleControlSite_TranslateAccelerator(html_controlsite, &msg_a, 0);
+ ok(hr == S_FALSE, "Got 0x%08x (keycode: %04x)\n", hr, keycode);
+ CHECK_CALLED(ControlSite_TranslateAccelerator);
+
+ hr_site_TranslateAccelerator = S_OK;
+ SET_EXPECT(ControlSite_TranslateAccelerator);
+ hr = IOleControlSite_TranslateAccelerator(html_controlsite, &msg_a, 0);
+ ok(hr == S_OK, "Got 0x%08x (keycode: %04x)\n", hr, keycode);
+ CHECK_CALLED(ControlSite_TranslateAccelerator);
+
+ hr_site_TranslateAccelerator = E_NOTIMPL;
+ SET_EXPECT(ControlSite_TranslateAccelerator);
+ hr = IOleControlSite_TranslateAccelerator(html_controlsite, &msg_a, 0);
+ ok(hr == S_FALSE, "Got 0x%08x (keycode: %04x)\n", hr, keycode);
+ CHECK_CALLED(ControlSite_TranslateAccelerator);
+
+ IOleControlSite_Release(html_controlsite);
+ }
IOleClientSite_Release(the_site);
}
IOleObject_Release(html_obj);
--
1.7.3.2
More information about the wine-patches
mailing list