hhctrl.ocx: Store WebBrowser container struct instead of interfaces in HHInfo.

This commit is contained in:
Jacek Caban 2015-02-20 14:32:49 +01:00 committed by Alexandre Julliard
parent dd2dbde625
commit efe4be6571
3 changed files with 97 additions and 120 deletions

View File

@ -196,7 +196,7 @@ static HRESULT navigate_url(HHInfo *info, LPCWSTR surl)
V_VT(&url) = VT_BSTR;
V_BSTR(&url) = SysAllocString(surl);
hres = IWebBrowser2_Navigate2(info->web_browser, &url, 0, 0, 0, 0);
hres = IWebBrowser2_Navigate2(info->web_browser->web_browser, &url, 0, 0, 0, 0);
VariantClear(&url);
@ -268,7 +268,7 @@ static void DoSync(HHInfo *info)
HRESULT hres;
BSTR url;
hres = IWebBrowser2_get_LocationURL(info->web_browser, &url);
hres = IWebBrowser2_get_LocationURL(info->web_browser->web_browser, &url);
if (FAILED(hres))
{
@ -874,22 +874,22 @@ static void TB_OnClick(HWND hWnd, DWORD dwID)
switch (dwID)
{
case IDTB_STOP:
DoPageAction(info, WB_STOP);
DoPageAction(info->web_browser, WB_STOP);
break;
case IDTB_REFRESH:
DoPageAction(info, WB_REFRESH);
DoPageAction(info->web_browser, WB_REFRESH);
break;
case IDTB_BACK:
DoPageAction(info, WB_GOBACK);
DoPageAction(info->web_browser, WB_GOBACK);
break;
case IDTB_HOME:
NavigateToChm(info, info->pCHMInfo->szFile, info->WinType.pszHome);
break;
case IDTB_FORWARD:
DoPageAction(info, WB_GOFORWARD);
DoPageAction(info->web_browser, WB_GOFORWARD);
break;
case IDTB_PRINT:
DoPageAction(info, WB_PRINT);
DoPageAction(info->web_browser, WB_PRINT);
break;
case IDTB_EXPAND:
case IDTB_CONTRACT:

View File

@ -169,9 +169,20 @@ struct wintype_stringsA {
};
typedef struct {
IOleClientSite *client_site;
IOleClientSite IOleClientSite_iface;
IOleInPlaceSite IOleInPlaceSite_iface;
IOleInPlaceFrame IOleInPlaceFrame_iface;
IDocHostUIHandler IDocHostUIHandler_iface;
LONG ref;
IOleObject *ole_obj;
IWebBrowser2 *web_browser;
IOleObject *wb_object;
HWND hwndWindow;
} WebBrowserContainer;
typedef struct {
WebBrowserContainer *web_browser;
HH_WINTYPEW WinType;
@ -197,7 +208,7 @@ typedef struct {
BOOL InitWebBrowser(HHInfo*,HWND) DECLSPEC_HIDDEN;
void ReleaseWebBrowser(HHInfo*) DECLSPEC_HIDDEN;
void ResizeWebBrowser(HHInfo*,DWORD,DWORD) DECLSPEC_HIDDEN;
void DoPageAction(HHInfo*,DWORD) DECLSPEC_HIDDEN;
void DoPageAction(WebBrowserContainer*,DWORD) DECLSPEC_HIDDEN;
void InitContent(HHInfo*) DECLSPEC_HIDDEN;
void ReleaseContent(HHInfo*) DECLSPEC_HIDDEN;

View File

@ -24,31 +24,14 @@
WINE_DEFAULT_DEBUG_CHANNEL(htmlhelp);
typedef struct IOleClientSiteImpl
static inline WebBrowserContainer *impl_from_IOleClientSite(IOleClientSite *iface)
{
IOleClientSite IOleClientSite_iface;
IOleInPlaceSite IOleInPlaceSite_iface;
IOleInPlaceFrame IOleInPlaceFrame_iface;
IDocHostUIHandler IDocHostUIHandler_iface;
/* IOleClientSiteImpl data */
IOleObject *pBrowserObject;
LONG ref;
/* IOleInPlaceFrame data */
HWND hwndWindow;
} IOleClientSiteImpl;
static inline IOleClientSiteImpl *impl_from_IOleClientSite(IOleClientSite *iface)
{
return CONTAINING_RECORD(iface, IOleClientSiteImpl, IOleClientSite_iface);
return CONTAINING_RECORD(iface, WebBrowserContainer, IOleClientSite_iface);
}
static HRESULT STDMETHODCALLTYPE Site_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppvObj)
{
IOleClientSiteImpl *This = impl_from_IOleClientSite(iface);
*ppvObj = NULL;
WebBrowserContainer *This = impl_from_IOleClientSite(iface);
if (IsEqualIID(riid, &IID_IUnknown)) {
TRACE("(%p)->(IID_IUnknown %p)\n", This, ppvObj);
@ -67,6 +50,7 @@ static HRESULT STDMETHODCALLTYPE Site_QueryInterface(IOleClientSite *iface, REFI
*ppvObj = &This->IDocHostUIHandler_iface;
}else {
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObj);
*ppvObj = NULL;
return E_NOINTERFACE;
}
@ -76,7 +60,7 @@ static HRESULT STDMETHODCALLTYPE Site_QueryInterface(IOleClientSite *iface, REFI
static ULONG STDMETHODCALLTYPE Site_AddRef(IOleClientSite *iface)
{
IOleClientSiteImpl *This = impl_from_IOleClientSite(iface);
WebBrowserContainer *This = impl_from_IOleClientSite(iface);
LONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
@ -86,13 +70,18 @@ static ULONG STDMETHODCALLTYPE Site_AddRef(IOleClientSite *iface)
static ULONG STDMETHODCALLTYPE Site_Release(IOleClientSite *iface)
{
IOleClientSiteImpl *This = impl_from_IOleClientSite(iface);
WebBrowserContainer *This = impl_from_IOleClientSite(iface);
LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
if(!ref)
if(!ref) {
if(This->ole_obj)
IOleObject_Release(This->ole_obj);
if(This->web_browser)
IWebBrowser2_Release(This->web_browser);
heap_free(This);
}
return ref;
}
@ -129,7 +118,7 @@ static HRESULT STDMETHODCALLTYPE Site_RequestNewObjectLayout(IOleClientSite *ifa
return E_NOTIMPL;
}
static const IOleClientSiteVtbl MyIOleClientSiteTable =
static const IOleClientSiteVtbl OleClientSiteVtbl =
{
Site_QueryInterface,
Site_AddRef,
@ -142,28 +131,28 @@ static const IOleClientSiteVtbl MyIOleClientSiteTable =
Site_RequestNewObjectLayout
};
static inline IOleClientSiteImpl *impl_from_IDocHostUIHandler(IDocHostUIHandler *iface)
static inline WebBrowserContainer *impl_from_IDocHostUIHandler(IDocHostUIHandler *iface)
{
return CONTAINING_RECORD(iface, IOleClientSiteImpl, IDocHostUIHandler_iface);
return CONTAINING_RECORD(iface, WebBrowserContainer, IDocHostUIHandler_iface);
}
static HRESULT STDMETHODCALLTYPE UI_QueryInterface(IDocHostUIHandler *iface, REFIID riid, LPVOID *ppvObj)
{
IOleClientSiteImpl *This = impl_from_IDocHostUIHandler(iface);
WebBrowserContainer *This = impl_from_IDocHostUIHandler(iface);
return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppvObj);
}
static ULONG STDMETHODCALLTYPE UI_AddRef(IDocHostUIHandler *iface)
{
IOleClientSiteImpl *This = impl_from_IDocHostUIHandler(iface);
WebBrowserContainer *This = impl_from_IDocHostUIHandler(iface);
return IOleClientSite_AddRef(&This->IOleClientSite_iface);
}
static ULONG STDMETHODCALLTYPE UI_Release(IDocHostUIHandler * iface)
{
IOleClientSiteImpl *This = impl_from_IDocHostUIHandler(iface);
WebBrowserContainer *This = impl_from_IDocHostUIHandler(iface);
return IOleClientSite_Release(&This->IOleClientSite_iface);
}
@ -250,7 +239,7 @@ static HRESULT STDMETHODCALLTYPE UI_FilterDataObject(IDocHostUIHandler *iface, I
return S_FALSE;
}
static const IDocHostUIHandlerVtbl MyIDocHostUIHandlerTable =
static const IDocHostUIHandlerVtbl DocHostUIHandlerVtbl =
{
UI_QueryInterface,
UI_AddRef,
@ -272,37 +261,37 @@ static const IDocHostUIHandlerVtbl MyIDocHostUIHandlerTable =
UI_FilterDataObject
};
static inline IOleClientSiteImpl *impl_from_IOleInPlaceSite(IOleInPlaceSite *iface)
static inline WebBrowserContainer *impl_from_IOleInPlaceSite(IOleInPlaceSite *iface)
{
return CONTAINING_RECORD(iface, IOleClientSiteImpl, IOleInPlaceSite_iface);
return CONTAINING_RECORD(iface, WebBrowserContainer, IOleInPlaceSite_iface);
}
static HRESULT STDMETHODCALLTYPE InPlace_QueryInterface(IOleInPlaceSite *iface, REFIID riid, LPVOID *ppvObj)
{
IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
WebBrowserContainer *This = impl_from_IOleInPlaceSite(iface);
return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppvObj);
}
static ULONG STDMETHODCALLTYPE InPlace_AddRef(IOleInPlaceSite *iface)
{
IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
WebBrowserContainer *This = impl_from_IOleInPlaceSite(iface);
return IOleClientSite_AddRef(&This->IOleClientSite_iface);
}
static ULONG STDMETHODCALLTYPE InPlace_Release(IOleInPlaceSite *iface)
{
IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
WebBrowserContainer *This = impl_from_IOleInPlaceSite(iface);
return IOleClientSite_Release(&This->IOleClientSite_iface);
}
static HRESULT STDMETHODCALLTYPE InPlace_GetWindow(IOleInPlaceSite *iface, HWND *lphwnd)
{
IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
*lphwnd = This->hwndWindow;
WebBrowserContainer *This = impl_from_IOleInPlaceSite(iface);
*lphwnd = This->hwndWindow;
return S_OK;
}
@ -328,7 +317,7 @@ static HRESULT STDMETHODCALLTYPE InPlace_OnUIActivate(IOleInPlaceSite *iface)
static HRESULT STDMETHODCALLTYPE InPlace_GetWindowContext(IOleInPlaceSite *iface, LPOLEINPLACEFRAME *lplpFrame, LPOLEINPLACEUIWINDOW *lplpDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
{
IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
WebBrowserContainer *This = impl_from_IOleInPlaceSite(iface);
*lplpFrame = &This->IOleInPlaceFrame_iface;
IOleInPlaceFrame_AddRef(&This->IOleInPlaceFrame_iface);
@ -370,10 +359,10 @@ static HRESULT STDMETHODCALLTYPE InPlace_DeactivateAndUndo(IOleInPlaceSite *ifac
static HRESULT STDMETHODCALLTYPE InPlace_OnPosRectChange(IOleInPlaceSite *iface, LPCRECT lprcPosRect)
{
IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface);
WebBrowserContainer *This = impl_from_IOleInPlaceSite(iface);
IOleInPlaceObject *inplace;
if (IOleObject_QueryInterface(This->pBrowserObject, &IID_IOleInPlaceObject,
if (IOleObject_QueryInterface(This->ole_obj, &IID_IOleInPlaceObject,
(void **)&inplace) == S_OK)
{
IOleInPlaceObject_SetObjectRects(inplace, lprcPosRect, lprcPosRect);
@ -383,7 +372,7 @@ static HRESULT STDMETHODCALLTYPE InPlace_OnPosRectChange(IOleInPlaceSite *iface,
return S_OK;
}
static const IOleInPlaceSiteVtbl MyIOleInPlaceSiteTable =
static const IOleInPlaceSiteVtbl OleInPlaceSiteVtbl =
{
InPlace_QueryInterface,
InPlace_AddRef,
@ -402,37 +391,37 @@ static const IOleInPlaceSiteVtbl MyIOleInPlaceSiteTable =
InPlace_OnPosRectChange
};
static inline IOleClientSiteImpl *impl_from_IOleInPlaceFrame(IOleInPlaceFrame *iface)
static inline WebBrowserContainer *impl_from_IOleInPlaceFrame(IOleInPlaceFrame *iface)
{
return CONTAINING_RECORD(iface, IOleClientSiteImpl, IOleInPlaceFrame_iface);
return CONTAINING_RECORD(iface, WebBrowserContainer, IOleInPlaceFrame_iface);
}
static HRESULT STDMETHODCALLTYPE Frame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, LPVOID *ppvObj)
{
IOleClientSiteImpl *This = impl_from_IOleInPlaceFrame(iface);
WebBrowserContainer *This = impl_from_IOleInPlaceFrame(iface);
return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppvObj);
}
static ULONG STDMETHODCALLTYPE Frame_AddRef(IOleInPlaceFrame *iface)
{
IOleClientSiteImpl *This = impl_from_IOleInPlaceFrame(iface);
WebBrowserContainer *This = impl_from_IOleInPlaceFrame(iface);
return IOleClientSite_AddRef(&This->IOleClientSite_iface);
}
static ULONG STDMETHODCALLTYPE Frame_Release(IOleInPlaceFrame *iface)
{
IOleClientSiteImpl *This = impl_from_IOleInPlaceFrame(iface);
WebBrowserContainer *This = impl_from_IOleInPlaceFrame(iface);
return IOleClientSite_Release(&This->IOleClientSite_iface);
}
static HRESULT STDMETHODCALLTYPE Frame_GetWindow(IOleInPlaceFrame *iface, HWND *lphwnd)
{
IOleClientSiteImpl *This = impl_from_IOleInPlaceFrame(iface);
*lphwnd = This->hwndWindow;
WebBrowserContainer *This = impl_from_IOleInPlaceFrame(iface);
*lphwnd = This->hwndWindow;
return S_OK;
}
@ -491,7 +480,7 @@ static HRESULT STDMETHODCALLTYPE Frame_TranslateAccelerator(IOleInPlaceFrame *if
return E_NOTIMPL;
}
static const IOleInPlaceFrameVtbl MyIOleInPlaceFrameTable =
static const IOleInPlaceFrameVtbl OleInPlaceFrameVtbl =
{
Frame_QueryInterface,
Frame_AddRef,
@ -626,97 +615,76 @@ static IStorage MyIStorage = { &MyIStorageTable };
BOOL InitWebBrowser(HHInfo *info, HWND hwndParent)
{
IOleClientSiteImpl *iOleClientSiteImpl;
WebBrowserContainer *container;
IOleInPlaceObject *inplace;
IOleObject *browserObject;
IWebBrowser2 *webBrowser2;
HRESULT hr;
RECT rc;
iOleClientSiteImpl = heap_alloc_zero(sizeof(IOleClientSiteImpl));
if (!iOleClientSiteImpl)
container = heap_alloc_zero(sizeof(*container));
if (!container)
return FALSE;
iOleClientSiteImpl->ref = 1;
iOleClientSiteImpl->IOleClientSite_iface.lpVtbl = &MyIOleClientSiteTable;
iOleClientSiteImpl->IOleInPlaceSite_iface.lpVtbl = &MyIOleInPlaceSiteTable;
iOleClientSiteImpl->IOleInPlaceFrame_iface.lpVtbl = &MyIOleInPlaceFrameTable;
iOleClientSiteImpl->hwndWindow = hwndParent;
iOleClientSiteImpl->IDocHostUIHandler_iface.lpVtbl = &MyIDocHostUIHandlerTable;
container->IOleClientSite_iface.lpVtbl = &OleClientSiteVtbl;
container->IOleInPlaceSite_iface.lpVtbl = &OleInPlaceSiteVtbl;
container->IOleInPlaceFrame_iface.lpVtbl = &OleInPlaceFrameVtbl;
container->IDocHostUIHandler_iface.lpVtbl = &DocHostUIHandlerVtbl;
container->ref = 1;
container->hwndWindow = hwndParent;
info->web_browser = container;
hr = OleCreate(&CLSID_WebBrowser, &IID_IOleObject, OLERENDER_DRAW, 0,
&iOleClientSiteImpl->IOleClientSite_iface, &MyIStorage,
(void **)&browserObject);
info->client_site = &iOleClientSiteImpl->IOleClientSite_iface;
info->wb_object = browserObject;
&container->IOleClientSite_iface, &MyIStorage,
(void **)&container->ole_obj);
if (FAILED(hr)) goto error;
/* make the browser object accessible to the IOleClientSite implementation */
iOleClientSiteImpl->pBrowserObject = browserObject;
GetClientRect(hwndParent, &rc);
hr = OleSetContainedObject((struct IUnknown *)browserObject, TRUE);
hr = OleSetContainedObject((struct IUnknown *)container->ole_obj, TRUE);
if (FAILED(hr)) goto error;
hr = IOleObject_DoVerb(browserObject, OLEIVERB_SHOW, NULL,
&iOleClientSiteImpl->IOleClientSite_iface,
-1, hwndParent, &rc);
hr = IOleObject_DoVerb(container->ole_obj, OLEIVERB_SHOW, NULL,
&container->IOleClientSite_iface, -1, hwndParent, &rc);
if (FAILED(hr)) goto error;
hr = IOleObject_QueryInterface(browserObject, &IID_IOleInPlaceObject, (void**)&inplace);
hr = IOleObject_QueryInterface(container->ole_obj, &IID_IOleInPlaceObject, (void**)&inplace);
if (FAILED(hr)) goto error;
IOleInPlaceObject_SetObjectRects(inplace, &rc, &rc);
IOleInPlaceObject_Release(inplace);
hr = IOleObject_QueryInterface(browserObject, &IID_IWebBrowser2,
(void **)&webBrowser2);
hr = IOleObject_QueryInterface(container->ole_obj, &IID_IWebBrowser2, (void **)&container->web_browser);
if (SUCCEEDED(hr))
{
info->web_browser = webBrowser2;
return TRUE;
}
error:
ReleaseWebBrowser(info);
heap_free(iOleClientSiteImpl);
return FALSE;
}
void ReleaseWebBrowser(HHInfo *info)
{
WebBrowserContainer *container = info->web_browser;
HRESULT hres;
if (info->web_browser)
{
IWebBrowser2_Release(info->web_browser);
info->web_browser = NULL;
}
if(!container)
return;
if (info->client_site)
{
IOleClientSite_Release(info->client_site);
info->client_site = NULL;
}
if(info->wb_object) {
if(container->ole_obj) {
IOleInPlaceSite *inplace;
hres = IOleObject_QueryInterface(info->wb_object, &IID_IOleInPlaceSite, (void**)&inplace);
hres = IOleObject_QueryInterface(container->ole_obj, &IID_IOleInPlaceSite, (void**)&inplace);
if(SUCCEEDED(hres)) {
IOleInPlaceSite_OnInPlaceDeactivate(inplace);
IOleInPlaceSite_Release(inplace);
}
IOleObject_SetClientSite(info->wb_object, NULL);
IOleObject_Release(info->wb_object);
info->wb_object = NULL;
IOleObject_SetClientSite(container->ole_obj, NULL);
}
info->web_browser = NULL;
IOleClientSite_Release(&container->IOleClientSite_iface);
}
void ResizeWebBrowser(HHInfo *info, DWORD dwWidth, DWORD dwHeight)
@ -724,39 +692,37 @@ void ResizeWebBrowser(HHInfo *info, DWORD dwWidth, DWORD dwHeight)
if (!info->web_browser)
return;
IWebBrowser2_put_Width(info->web_browser, dwWidth);
IWebBrowser2_put_Height(info->web_browser, dwHeight);
IWebBrowser2_put_Width(info->web_browser->web_browser, dwWidth);
IWebBrowser2_put_Height(info->web_browser->web_browser, dwHeight);
}
void DoPageAction(HHInfo *info, DWORD dwAction)
void DoPageAction(WebBrowserContainer *container, DWORD dwAction)
{
IWebBrowser2 *pWebBrowser2 = info->web_browser;
if (!pWebBrowser2)
if (!container || !container->web_browser)
return;
switch (dwAction)
{
case WB_GOBACK:
IWebBrowser2_GoBack(pWebBrowser2);
IWebBrowser2_GoBack(container->web_browser);
break;
case WB_GOFORWARD:
IWebBrowser2_GoForward(pWebBrowser2);
IWebBrowser2_GoForward(container->web_browser);
break;
case WB_GOHOME:
IWebBrowser2_GoHome(pWebBrowser2);
IWebBrowser2_GoHome(container->web_browser);
break;
case WB_SEARCH:
IWebBrowser2_GoSearch(pWebBrowser2);
IWebBrowser2_GoSearch(container->web_browser);
break;
case WB_REFRESH:
IWebBrowser2_Refresh(pWebBrowser2);
IWebBrowser2_Refresh(container->web_browser);
break;
case WB_STOP:
IWebBrowser2_Stop(pWebBrowser2);
IWebBrowser2_Stop(container->web_browser);
break;
case WB_PRINT:
IWebBrowser2_ExecWB(pWebBrowser2, OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, 0, 0);
IWebBrowser2_ExecWB(container->web_browser, OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, 0, 0);
break;
}
}