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

View File

@ -169,9 +169,20 @@ struct wintype_stringsA {
}; };
typedef struct { 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; IWebBrowser2 *web_browser;
IOleObject *wb_object; HWND hwndWindow;
} WebBrowserContainer;
typedef struct {
WebBrowserContainer *web_browser;
HH_WINTYPEW WinType; HH_WINTYPEW WinType;
@ -197,7 +208,7 @@ typedef struct {
BOOL InitWebBrowser(HHInfo*,HWND) DECLSPEC_HIDDEN; BOOL InitWebBrowser(HHInfo*,HWND) DECLSPEC_HIDDEN;
void ReleaseWebBrowser(HHInfo*) DECLSPEC_HIDDEN; void ReleaseWebBrowser(HHInfo*) DECLSPEC_HIDDEN;
void ResizeWebBrowser(HHInfo*,DWORD,DWORD) 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 InitContent(HHInfo*) DECLSPEC_HIDDEN;
void ReleaseContent(HHInfo*) DECLSPEC_HIDDEN; void ReleaseContent(HHInfo*) DECLSPEC_HIDDEN;

View File

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