[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