mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 16:36:33 +00:00
[IEFRAME] Sync with Wine Staging 1.9.11. CORE-11368
svn path=/trunk/; revision=71551
This commit is contained in:
parent
6d8185db2f
commit
bdf05dfe65
6 changed files with 322 additions and 133 deletions
|
@ -381,8 +381,10 @@ static HRESULT WINAPI OleDocumentSite_ActivateMe(IOleDocumentSite *iface,
|
|||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
IOleDocument_CreateView(oledoc, (IOleInPlaceSite*) &This->IOleInPlaceSiteEx_iface, NULL, 0, &This->view);
|
||||
hres = IOleDocument_CreateView(oledoc, (IOleInPlaceSite*) &This->IOleInPlaceSiteEx_iface, NULL, 0, &This->view);
|
||||
IOleDocument_Release(oledoc);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
GetClientRect(This->hwnd, &rect);
|
||||
IOleDocumentView_SetRect(This->view, &rect);
|
||||
|
@ -657,6 +659,11 @@ static HRESULT WINAPI ClServiceProvider_QueryService(IServiceProvider *iface, RE
|
|||
return IWebBrowser2_QueryInterface(This->wb, riid, ppv);
|
||||
}
|
||||
|
||||
if(IsEqualGUID(&IID_ITargetFrame, guidService)) {
|
||||
TRACE("(%p)->(IID_ITargetFrame %s %p)\n", This, debugstr_guid(riid), ppv);
|
||||
return IWebBrowser2_QueryInterface(This->wb, riid, ppv);
|
||||
}
|
||||
|
||||
if(IsEqualGUID(&IID_IWebBrowserApp, guidService)) {
|
||||
TRACE("IWebBrowserApp service\n");
|
||||
return IWebBrowser2_QueryInterface(This->wb, riid, ppv);
|
||||
|
|
|
@ -72,6 +72,7 @@ typedef struct {
|
|||
|
||||
typedef struct {
|
||||
IHlinkFrame IHlinkFrame_iface;
|
||||
ITargetFrame ITargetFrame_iface;
|
||||
ITargetFrame2 ITargetFrame2_iface;
|
||||
ITargetFramePriv2 ITargetFramePriv2_iface;
|
||||
IWebBrowserPriv2IE9 IWebBrowserPriv2IE9_iface;
|
||||
|
@ -206,6 +207,7 @@ struct WebBrowser {
|
|||
INT version;
|
||||
|
||||
IOleClientSite *client;
|
||||
IOleClientSite *client_closed;
|
||||
IOleContainer *container;
|
||||
IOleInPlaceSiteEx *inplace;
|
||||
|
||||
|
|
|
@ -404,135 +404,119 @@ static HRESULT WINAPI PersistFile_IsDirty(IPersistFile *pFile)
|
|||
return This->isDirty ? S_OK : S_FALSE;
|
||||
}
|
||||
|
||||
/* A helper function: Allocate and fill rString. Return number of bytes read. */
|
||||
static DWORD get_profile_string(LPCWSTR lpAppName, LPCWSTR lpKeyName,
|
||||
/* Returns allocated profile string and a standard return code. */
|
||||
static HRESULT get_profile_string(LPCWSTR lpAppName, LPCWSTR lpKeyName,
|
||||
LPCWSTR lpFileName, WCHAR **rString )
|
||||
{
|
||||
DWORD r = 0;
|
||||
DWORD len = 128;
|
||||
WCHAR *buffer;
|
||||
|
||||
*rString = NULL;
|
||||
buffer = CoTaskMemAlloc(len * sizeof(*buffer));
|
||||
if (buffer != NULL)
|
||||
if (!buffer)
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
r = GetPrivateProfileStringW(lpAppName, lpKeyName, NULL, buffer, len, lpFileName);
|
||||
while (r == len-1)
|
||||
{
|
||||
r = GetPrivateProfileStringW(lpAppName, lpKeyName, NULL, buffer, len, lpFileName);
|
||||
while (r == len-1)
|
||||
WCHAR *realloc_buf;
|
||||
|
||||
len *= 2;
|
||||
realloc_buf = CoTaskMemRealloc(buffer, len * sizeof(*buffer));
|
||||
if (realloc_buf == NULL)
|
||||
{
|
||||
WCHAR *realloc_buf;
|
||||
|
||||
len *= 2;
|
||||
realloc_buf = CoTaskMemRealloc(buffer, len * sizeof(*buffer));
|
||||
if (realloc_buf == NULL)
|
||||
{
|
||||
CoTaskMemFree(buffer);
|
||||
*rString = NULL;
|
||||
return 0;
|
||||
}
|
||||
buffer = realloc_buf;
|
||||
|
||||
r = GetPrivateProfileStringW(lpAppName, lpKeyName, NULL, buffer, len, lpFileName);
|
||||
CoTaskMemFree(buffer);
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
buffer = realloc_buf;
|
||||
|
||||
r = GetPrivateProfileStringW(lpAppName, lpKeyName, NULL, buffer, len, lpFileName);
|
||||
}
|
||||
|
||||
*rString = buffer;
|
||||
return r;
|
||||
return r ? S_OK : E_FAIL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI PersistFile_Load(IPersistFile *pFile, LPCOLESTR pszFileName, DWORD dwMode)
|
||||
{
|
||||
WCHAR str_header[] = {'I','n','t','e','r','n','e','t','S','h','o','r','t','c','u','t',0};
|
||||
WCHAR str_URL[] = {'U','R','L',0};
|
||||
WCHAR str_iconfile[] = {'i','c','o','n','f','i','l','e',0};
|
||||
WCHAR str_iconindex[] = {'i','c','o','n','i','n','d','e','x',0};
|
||||
WCHAR *filename = NULL;
|
||||
HRESULT hr;
|
||||
InternetShortcut *This = impl_from_IPersistFile(pFile);
|
||||
static WCHAR str_header[] = {'I','n','t','e','r','n','e','t','S','h','o','r','t','c','u','t',0};
|
||||
static WCHAR str_URL[] = {'U','R','L',0};
|
||||
static WCHAR str_iconfile[] = {'i','c','o','n','f','i','l','e',0};
|
||||
static WCHAR str_iconindex[] = {'i','c','o','n','i','n','d','e','x',0};
|
||||
WCHAR *filename = NULL;
|
||||
WCHAR *url;
|
||||
HRESULT hr;
|
||||
IPropertyStorage *pPropStg;
|
||||
WCHAR *iconfile;
|
||||
WCHAR *iconindexstring;
|
||||
|
||||
TRACE("(%p, %s, 0x%x)\n", pFile, debugstr_w(pszFileName), dwMode);
|
||||
|
||||
if (dwMode != 0)
|
||||
FIXME("ignoring unimplemented mode 0x%x\n", dwMode);
|
||||
|
||||
filename = co_strdupW(pszFileName);
|
||||
if (filename != NULL)
|
||||
if (!filename)
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
if (FAILED(hr = get_profile_string(str_header, str_URL, pszFileName, &url)))
|
||||
{
|
||||
DWORD r;
|
||||
WCHAR *url;
|
||||
|
||||
r = get_profile_string(str_header, str_URL, pszFileName, &url);
|
||||
|
||||
if (url == NULL)
|
||||
{
|
||||
hr = E_OUTOFMEMORY;
|
||||
CoTaskMemFree(filename);
|
||||
}
|
||||
else if (r == 0)
|
||||
{
|
||||
hr = E_FAIL;
|
||||
CoTaskMemFree(filename);
|
||||
}
|
||||
else
|
||||
{
|
||||
hr = S_OK;
|
||||
CoTaskMemFree(This->currentFile);
|
||||
This->currentFile = filename;
|
||||
CoTaskMemFree(This->url);
|
||||
This->url = url;
|
||||
This->isDirty = FALSE;
|
||||
}
|
||||
|
||||
/* Now we're going to read in the iconfile and iconindex.
|
||||
If we don't find them, that's not a failure case -- it's possible
|
||||
that they just aren't in there. */
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
IPropertyStorage *pPropStg;
|
||||
WCHAR *iconfile;
|
||||
WCHAR *iconindexstring;
|
||||
hr = IPropertySetStorage_Open(This->property_set_storage, &FMTID_Intshcut,
|
||||
STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
|
||||
&pPropStg);
|
||||
|
||||
if (get_profile_string(str_header, str_iconfile, pszFileName, &iconfile))
|
||||
{
|
||||
PROPSPEC ps;
|
||||
PROPVARIANT pv;
|
||||
ps.ulKind = PRSPEC_PROPID;
|
||||
ps.u.propid = PID_IS_ICONFILE;
|
||||
pv.vt = VT_LPWSTR;
|
||||
pv.u.pwszVal = iconfile;
|
||||
hr = IPropertyStorage_WriteMultiple(pPropStg, 1, &ps, &pv, 0);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
TRACE("Failed to store the iconfile to our property storage. hr = 0x%x\n", hr);
|
||||
}
|
||||
}
|
||||
CoTaskMemFree(iconfile);
|
||||
|
||||
if (get_profile_string(str_header, str_iconindex, pszFileName, &iconindexstring))
|
||||
{
|
||||
int iconindex;
|
||||
PROPSPEC ps;
|
||||
PROPVARIANT pv;
|
||||
char *iconindexastring = co_strdupWtoA(iconindexstring);
|
||||
sscanf(iconindexastring, "%d", &iconindex);
|
||||
CoTaskMemFree(iconindexastring);
|
||||
ps.ulKind = PRSPEC_PROPID;
|
||||
ps.u.propid = PID_IS_ICONINDEX;
|
||||
pv.vt = VT_I4;
|
||||
pv.u.iVal = iconindex;
|
||||
hr = IPropertyStorage_WriteMultiple(pPropStg, 1, &ps, &pv, 0);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
TRACE("Failed to store the iconindex to our property storage. hr = 0x%x\n", hr);
|
||||
}
|
||||
}
|
||||
CoTaskMemFree(iconindexstring);
|
||||
|
||||
IPropertyStorage_Release(pPropStg);
|
||||
}
|
||||
else
|
||||
hr = E_OUTOFMEMORY;
|
||||
CoTaskMemFree(filename);
|
||||
return hr;
|
||||
}
|
||||
else
|
||||
hr = E_OUTOFMEMORY;
|
||||
|
||||
hr = IPropertySetStorage_Open(This->property_set_storage, &FMTID_Intshcut,
|
||||
STGM_READWRITE | STGM_SHARE_EXCLUSIVE, &pPropStg);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
CoTaskMemFree(filename);
|
||||
CoTaskMemFree(url);
|
||||
return hr;
|
||||
}
|
||||
|
||||
CoTaskMemFree(This->currentFile);
|
||||
This->currentFile = filename;
|
||||
CoTaskMemFree(This->url);
|
||||
This->url = url;
|
||||
This->isDirty = FALSE;
|
||||
|
||||
/* Now we're going to read in the iconfile and iconindex.
|
||||
If we don't find them, that's not a failure case -- it's possible
|
||||
that they just aren't in there. */
|
||||
|
||||
if (get_profile_string(str_header, str_iconfile, pszFileName, &iconfile) == S_OK)
|
||||
{
|
||||
PROPSPEC ps;
|
||||
PROPVARIANT pv;
|
||||
ps.ulKind = PRSPEC_PROPID;
|
||||
ps.u.propid = PID_IS_ICONFILE;
|
||||
pv.vt = VT_LPWSTR;
|
||||
pv.u.pwszVal = iconfile;
|
||||
hr = IPropertyStorage_WriteMultiple(pPropStg, 1, &ps, &pv, 0);
|
||||
if (FAILED(hr))
|
||||
TRACE("Failed to store the iconfile to our property storage. hr = 0x%x\n", hr);
|
||||
}
|
||||
CoTaskMemFree(iconfile);
|
||||
|
||||
if (get_profile_string(str_header, str_iconindex, pszFileName, &iconindexstring) == S_OK)
|
||||
{
|
||||
int iconindex;
|
||||
PROPSPEC ps;
|
||||
PROPVARIANT pv;
|
||||
iconindex = strtolW(iconindexstring, NULL, 10);
|
||||
ps.ulKind = PRSPEC_PROPID;
|
||||
ps.u.propid = PID_IS_ICONINDEX;
|
||||
pv.vt = VT_I4;
|
||||
pv.u.iVal = iconindex;
|
||||
hr = IPropertyStorage_WriteMultiple(pPropStg, 1, &ps, &pv, 0);
|
||||
if (FAILED(hr))
|
||||
TRACE("Failed to store the iconindex to our property storage. hr = 0x%x\n", hr);
|
||||
}
|
||||
CoTaskMemFree(iconindexstring);
|
||||
|
||||
IPropertyStorage_Release(pPropStg);
|
||||
return hr;
|
||||
}
|
||||
|
||||
|
|
|
@ -1228,9 +1228,152 @@ static const IHlinkFrameVtbl HlinkFrameVtbl = {
|
|||
HlinkFrame_UpdateHlink
|
||||
};
|
||||
|
||||
static inline HlinkFrame *impl_from_ITargetFrame(ITargetFrame *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, HlinkFrame, ITargetFrame_iface);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI TargetFrame_QueryInterface(ITargetFrame *iface, REFIID riid, void **ppv)
|
||||
{
|
||||
HlinkFrame *This = impl_from_ITargetFrame(iface);
|
||||
return IUnknown_QueryInterface(This->outer, riid, ppv);
|
||||
}
|
||||
|
||||
static ULONG WINAPI TargetFrame_AddRef(ITargetFrame *iface)
|
||||
{
|
||||
HlinkFrame *This = impl_from_ITargetFrame(iface);
|
||||
return IUnknown_AddRef(This->outer);
|
||||
}
|
||||
|
||||
static ULONG WINAPI TargetFrame_Release(ITargetFrame *iface)
|
||||
{
|
||||
HlinkFrame *This = impl_from_ITargetFrame(iface);
|
||||
return IUnknown_Release(This->outer);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI TargetFrame_SetFrameName(ITargetFrame *iface, LPCWSTR pszFrameName)
|
||||
{
|
||||
HlinkFrame *This = impl_from_ITargetFrame(iface);
|
||||
FIXME("(%p)->(%s)\n", This, debugstr_w(pszFrameName));
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI TargetFrame_GetFrameName(ITargetFrame *iface, LPWSTR *ppszFrameName)
|
||||
{
|
||||
HlinkFrame *This = impl_from_ITargetFrame(iface);
|
||||
FIXME("(%p)->(%p)\n", This, ppszFrameName);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI TargetFrame_GetParentFrame(ITargetFrame *iface, IUnknown **ppunkParent)
|
||||
{
|
||||
HlinkFrame *This = impl_from_ITargetFrame(iface);
|
||||
FIXME("(%p)->(%p)\n", This, ppunkParent);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI TargetFrame_FindFrame(ITargetFrame *iface, LPCWSTR pszTargetName,
|
||||
IUnknown *ppunkContextFrame, DWORD dwFlags, IUnknown **ppunkTargetFrame)
|
||||
{
|
||||
HlinkFrame *This = impl_from_ITargetFrame(iface);
|
||||
FIXME("(%p)->(%s %p %x %p)\n", This, debugstr_w(pszTargetName),
|
||||
ppunkContextFrame, dwFlags, ppunkTargetFrame);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI TargetFrame_SetFrameSrc(ITargetFrame *iface, LPCWSTR pszFrameSrc)
|
||||
{
|
||||
HlinkFrame *This = impl_from_ITargetFrame(iface);
|
||||
FIXME("(%p)->(%s)\n", This, debugstr_w(pszFrameSrc));
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI TargetFrame_GetFrameSrc(ITargetFrame *iface, LPWSTR *ppszFrameSrc)
|
||||
{
|
||||
HlinkFrame *This = impl_from_ITargetFrame(iface);
|
||||
FIXME("(%p)->(%p)\n", This, ppszFrameSrc);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI TargetFrame_GetFramesContainer(ITargetFrame *iface, IOleContainer **ppContainer)
|
||||
{
|
||||
HlinkFrame *This = impl_from_ITargetFrame(iface);
|
||||
FIXME("(%p)->(%p)\n", This, ppContainer);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI TargetFrame_SetFrameOptions(ITargetFrame *iface, DWORD dwFlags)
|
||||
{
|
||||
HlinkFrame *This = impl_from_ITargetFrame(iface);
|
||||
FIXME("(%p)->(%x)\n", This, dwFlags);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI TargetFrame_GetFrameOptions(ITargetFrame *iface, DWORD *pdwFlags)
|
||||
{
|
||||
HlinkFrame *This = impl_from_ITargetFrame(iface);
|
||||
FIXME("(%p)->(%p)\n", This, pdwFlags);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI TargetFrame_SetFrameMargins(ITargetFrame *iface, DWORD dwWidth, DWORD dwHeight)
|
||||
{
|
||||
HlinkFrame *This = impl_from_ITargetFrame(iface);
|
||||
FIXME("(%p)->(%d %d)\n", This, dwWidth, dwHeight);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI TargetFrame_GetFrameMargins(ITargetFrame *iface, DWORD *pdwWidth, DWORD *pdwHeight)
|
||||
{
|
||||
HlinkFrame *This = impl_from_ITargetFrame(iface);
|
||||
FIXME("(%p)->(%p %p)\n", This, pdwWidth, pdwHeight);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI TargetFrame_RemoteNavigate(ITargetFrame *iface, ULONG cLength, ULONG *pulData)
|
||||
{
|
||||
HlinkFrame *This = impl_from_ITargetFrame(iface);
|
||||
FIXME("(%p)->(%u %p)\n", This, cLength, pulData);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI TargetFrame_OnChildFrameActivate(ITargetFrame *iface, IUnknown *pUnkChildFrame)
|
||||
{
|
||||
HlinkFrame *This = impl_from_ITargetFrame(iface);
|
||||
FIXME("(%p)->(%p)\n", This, pUnkChildFrame);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI TargetFrame_OnChildFrameDeactivate(ITargetFrame *iface, IUnknown *pUnkChildFrame)
|
||||
{
|
||||
HlinkFrame *This = impl_from_ITargetFrame(iface);
|
||||
FIXME("(%p)->(%p)\n", This, pUnkChildFrame);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static const ITargetFrameVtbl TargetFrameVtbl = {
|
||||
TargetFrame_QueryInterface,
|
||||
TargetFrame_AddRef,
|
||||
TargetFrame_Release,
|
||||
TargetFrame_SetFrameName,
|
||||
TargetFrame_GetFrameName,
|
||||
TargetFrame_GetParentFrame,
|
||||
TargetFrame_FindFrame,
|
||||
TargetFrame_SetFrameSrc,
|
||||
TargetFrame_GetFrameSrc,
|
||||
TargetFrame_GetFramesContainer,
|
||||
TargetFrame_SetFrameOptions,
|
||||
TargetFrame_GetFrameOptions,
|
||||
TargetFrame_SetFrameMargins,
|
||||
TargetFrame_GetFrameMargins,
|
||||
TargetFrame_RemoteNavigate,
|
||||
TargetFrame_OnChildFrameActivate,
|
||||
TargetFrame_OnChildFrameDeactivate
|
||||
};
|
||||
|
||||
static inline HlinkFrame *impl_from_ITargetFrame2(ITargetFrame2 *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, HlinkFrame, IHlinkFrame_iface);
|
||||
return CONTAINING_RECORD(iface, HlinkFrame, ITargetFrame2_iface);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI TargetFrame2_QueryInterface(ITargetFrame2 *iface, REFIID riid, void **ppv)
|
||||
|
@ -1504,6 +1647,9 @@ BOOL HlinkFrame_QI(HlinkFrame *This, REFIID riid, void **ppv)
|
|||
if(IsEqualGUID(&IID_IHlinkFrame, riid)) {
|
||||
TRACE("(%p)->(IID_IHlinkFrame %p)\n", This, ppv);
|
||||
*ppv = &This->IHlinkFrame_iface;
|
||||
}else if(IsEqualGUID(&IID_ITargetFrame, riid)) {
|
||||
TRACE("(%p)->(IID_ITargetFrame %p)\n", This, ppv);
|
||||
*ppv = &This->ITargetFrame_iface;
|
||||
}else if(IsEqualGUID(&IID_ITargetFrame2, riid)) {
|
||||
TRACE("(%p)->(IID_ITargetFrame2 %p)\n", This, ppv);
|
||||
*ppv = &This->ITargetFrame2_iface;
|
||||
|
@ -1526,7 +1672,8 @@ BOOL HlinkFrame_QI(HlinkFrame *This, REFIID riid, void **ppv)
|
|||
|
||||
void HlinkFrame_Init(HlinkFrame *This, IUnknown *outer, DocHost *doc_host)
|
||||
{
|
||||
This->IHlinkFrame_iface.lpVtbl = &HlinkFrameVtbl;
|
||||
This->IHlinkFrame_iface.lpVtbl = &HlinkFrameVtbl;
|
||||
This->ITargetFrame_iface.lpVtbl = &TargetFrameVtbl;
|
||||
This->ITargetFrame2_iface.lpVtbl = &TargetFrame2Vtbl;
|
||||
This->ITargetFramePriv2_iface.lpVtbl = &TargetFramePriv2Vtbl;
|
||||
This->IWebBrowserPriv2IE9_iface.lpVtbl = &WebBrowserPriv2IE9Vtbl;
|
||||
|
|
|
@ -273,7 +273,7 @@ static HRESULT on_silent_change(WebBrowser *This)
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
static void release_client_site(WebBrowser *This)
|
||||
static void release_client_site(WebBrowser *This, BOOL destroy_win)
|
||||
{
|
||||
release_dochost_client(&This->doc_host);
|
||||
|
||||
|
@ -282,7 +282,12 @@ static void release_client_site(WebBrowser *This)
|
|||
This->client = NULL;
|
||||
}
|
||||
|
||||
if(This->shell_embedding_hwnd) {
|
||||
if(This->client_closed) {
|
||||
IOleClientSite_Release(This->client_closed);
|
||||
This->client_closed = NULL;
|
||||
}
|
||||
|
||||
if(destroy_win && This->shell_embedding_hwnd) {
|
||||
DestroyWindow(This->shell_embedding_hwnd);
|
||||
This->shell_embedding_hwnd = NULL;
|
||||
}
|
||||
|
@ -444,16 +449,29 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE
|
|||
WebBrowser *This = impl_from_IOleObject(iface);
|
||||
IDocHostUIHandler *hostui;
|
||||
IOleCommandTarget *olecmd;
|
||||
BOOL get_olecmd = TRUE;
|
||||
IOleContainer *container;
|
||||
IDispatch *disp;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("(%p)->(%p)\n", This, pClientSite);
|
||||
|
||||
if(This->client_closed) {
|
||||
IOleClientSite_Release(This->client_closed);
|
||||
This->client_closed = NULL;
|
||||
}
|
||||
|
||||
if(This->client == pClientSite)
|
||||
return S_OK;
|
||||
|
||||
release_client_site(This);
|
||||
if(This->client && pClientSite) {
|
||||
get_olecmd = FALSE;
|
||||
olecmd = This->doc_host.olecmd;
|
||||
if(olecmd)
|
||||
IOleCommandTarget_AddRef(olecmd);
|
||||
}
|
||||
|
||||
release_client_site(This, !pClientSite);
|
||||
|
||||
if(!pClientSite) {
|
||||
on_commandstate_change(&This->doc_host, CSC_NAVIGATEBACK, FALSE);
|
||||
|
@ -477,31 +495,46 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, LPOLECLIENTSITE
|
|||
if(SUCCEEDED(hres))
|
||||
This->doc_host.hostui = hostui;
|
||||
|
||||
hres = IOleClientSite_GetContainer(This->client, &container);
|
||||
if(SUCCEEDED(hres)) {
|
||||
ITargetContainer *target_container;
|
||||
|
||||
hres = IOleContainer_QueryInterface(container, &IID_ITargetContainer,
|
||||
(void**)&target_container);
|
||||
if(get_olecmd) {
|
||||
hres = IOleClientSite_GetContainer(This->client, &container);
|
||||
if(SUCCEEDED(hres)) {
|
||||
FIXME("Unsupported ITargetContainer\n");
|
||||
ITargetContainer_Release(target_container);
|
||||
ITargetContainer *target_container;
|
||||
|
||||
hres = IOleContainer_QueryInterface(container, &IID_ITargetContainer,
|
||||
(void**)&target_container);
|
||||
if(SUCCEEDED(hres)) {
|
||||
FIXME("Unsupported ITargetContainer\n");
|
||||
ITargetContainer_Release(target_container);
|
||||
}
|
||||
|
||||
hres = IOleContainer_QueryInterface(container, &IID_IOleCommandTarget, (void**)&olecmd);
|
||||
if(FAILED(hres))
|
||||
olecmd = NULL;
|
||||
|
||||
IOleContainer_Release(container);
|
||||
}else {
|
||||
hres = IOleClientSite_QueryInterface(This->client, &IID_IOleCommandTarget, (void**)&olecmd);
|
||||
if(FAILED(hres))
|
||||
olecmd = NULL;
|
||||
}
|
||||
|
||||
hres = IOleContainer_QueryInterface(container, &IID_IOleCommandTarget, (void**)&olecmd);
|
||||
if(FAILED(hres))
|
||||
olecmd = NULL;
|
||||
|
||||
IOleContainer_Release(container);
|
||||
}else {
|
||||
hres = IOleClientSite_QueryInterface(This->client, &IID_IOleCommandTarget, (void**)&olecmd);
|
||||
if(FAILED(hres))
|
||||
olecmd = NULL;
|
||||
}
|
||||
|
||||
This->doc_host.olecmd = olecmd;
|
||||
|
||||
create_shell_embedding_hwnd(This);
|
||||
if(This->shell_embedding_hwnd) {
|
||||
IOleInPlaceSite *inplace;
|
||||
HWND parent;
|
||||
|
||||
hres = IOleClientSite_QueryInterface(This->client, &IID_IOleInPlaceSite, (void**)&inplace);
|
||||
if(SUCCEEDED(hres)) {
|
||||
hres = IOleInPlaceSite_GetWindow(inplace, &parent);
|
||||
IOleInPlaceSite_Release(inplace);
|
||||
if(SUCCEEDED(hres))
|
||||
SHSetParentHwnd(This->shell_embedding_hwnd, parent);
|
||||
}
|
||||
}else {
|
||||
create_shell_embedding_hwnd(This);
|
||||
}
|
||||
|
||||
on_offlineconnected_change(This);
|
||||
on_silent_change(This);
|
||||
|
@ -539,6 +572,8 @@ static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szCont
|
|||
static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
|
||||
{
|
||||
WebBrowser *This = impl_from_IOleObject(iface);
|
||||
IOleClientSite *client;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("(%p)->(%d)\n", This, dwSaveOption);
|
||||
|
||||
|
@ -559,7 +594,13 @@ static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
|
|||
if(This->inplace)
|
||||
IOleInPlaceSiteEx_OnInPlaceDeactivate(This->inplace);
|
||||
|
||||
return IOleObject_SetClientSite(iface, NULL);
|
||||
/* store old client site - we need to restore it in DoVerb */
|
||||
client = This->client;
|
||||
if(This->client)
|
||||
IOleClientSite_AddRef(This->client);
|
||||
hres = IOleObject_SetClientSite(iface, NULL);
|
||||
This->client_closed = client;
|
||||
return hres;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker* pmk)
|
||||
|
@ -601,6 +642,14 @@ static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG iVerb, struct tag
|
|||
TRACE("(%p)->(%d %p %p %d %p %s)\n", This, iVerb, lpmsg, pActiveSite, lindex, hwndParent,
|
||||
wine_dbgstr_rect(lprcPosRect));
|
||||
|
||||
/* restore closed client site if we have one */
|
||||
if(!This->client && This->client_closed) {
|
||||
IOleClientSite *client = This->client_closed;
|
||||
This->client_closed = NULL;
|
||||
IOleObject_SetClientSite(iface, client);
|
||||
IOleClientSite_Release(client);
|
||||
}
|
||||
|
||||
switch (iVerb)
|
||||
{
|
||||
case OLEIVERB_SHOW:
|
||||
|
@ -1162,5 +1211,5 @@ void WebBrowser_OleObject_Init(WebBrowser *This)
|
|||
|
||||
void WebBrowser_OleObject_Destroy(WebBrowser *This)
|
||||
{
|
||||
release_client_site(This);
|
||||
release_client_site(This, TRUE);
|
||||
}
|
||||
|
|
|
@ -74,7 +74,7 @@ reactos/dll/win32/hlink # Synced to WineStaging-1.9.4
|
|||
reactos/dll/win32/hnetcfg # Synced to WineStaging-1.9.11
|
||||
reactos/dll/win32/httpapi # Synced to WineStaging-1.9.4
|
||||
reactos/dll/win32/iccvid # Synced to WineStaging-1.9.11
|
||||
reactos/dll/win32/ieframe # Synced to WineStaging-1.9.4
|
||||
reactos/dll/win32/ieframe # Synced to WineStaging-1.9.11
|
||||
reactos/dll/win32/imaadp32.acm # Synced to WineStaging-1.9.4
|
||||
reactos/dll/win32/imagehlp # Synced to WineStaging-1.9.4
|
||||
reactos/dll/win32/imm32 # Synced to Wine-1.7.27
|
||||
|
|
Loading…
Reference in a new issue