Jacek Caban : mshtml: Store client site in HTMLDocumentObj as soon as possible in SetClientSite.
Alexandre Julliard
julliard at winehq.org
Mon Jun 28 11:01:20 CDT 2010
Module: wine
Branch: master
Commit: 95a53a9ff61c3aa5f74a3dd4560bba9da804fd8c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=95a53a9ff61c3aa5f74a3dd4560bba9da804fd8c
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Jun 28 12:51:11 2010 +0200
mshtml: Store client site in HTMLDocumentObj as soon as possible in SetClientSite.
---
dlls/mshtml/oleobj.c | 26 ++++----
dlls/mshtml/tests/htmldoc.c | 150 +++++++++++++++++++++++-------------------
2 files changed, 95 insertions(+), 81 deletions(-)
diff --git a/dlls/mshtml/oleobj.c b/dlls/mshtml/oleobj.c
index a33f479..eab76bf 100644
--- a/dlls/mshtml/oleobj.c
+++ b/dlls/mshtml/oleobj.c
@@ -96,8 +96,10 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite
HTMLDocument *This = OLEOBJ_THIS(iface);
IDocHostUIHandler *pDocHostUIHandler = NULL;
IOleCommandTarget *cmdtrg = NULL;
+ IOleWindow *ole_window;
BOOL hostui_setup;
VARIANT silent;
+ HWND hwnd;
HRESULT hres;
TRACE("(%p)->(%p)\n", This, pClientSite);
@@ -121,6 +123,9 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite
if(!pClientSite)
return S_OK;
+ IOleClientSite_AddRef(pClientSite);
+ This->doc_obj->client = pClientSite;
+
hostui_setup = This->doc_obj->hostui_setup;
hres = IOleObject_QueryInterface(pClientSite, &IID_IDocHostUIHandler, (void**)&pDocHostUIHandler);
@@ -129,6 +134,8 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite
LPOLESTR key_path = NULL, override_key_path = NULL;
IDocHostUIHandler2 *pDocHostUIHandler2;
+ This->doc_obj->hostui = pDocHostUIHandler;
+
memset(&hostinfo, 0, sizeof(DOCHOSTUIINFO));
hostinfo.cbSize = sizeof(DOCHOSTUIINFO);
hres = IDocHostUIHandler_GetHostInfo(pDocHostUIHandler, &hostinfo);
@@ -166,19 +173,16 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite
This->doc_obj->hostui_setup = TRUE;
}
+ }else {
+ This->doc_obj->hostui = NULL;
}
/* Native calls here GetWindow. What is it for?
* We don't have anything to do with it here (yet). */
- if(pClientSite) {
- IOleWindow *pOleWindow = NULL;
- HWND hwnd;
-
- hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleWindow, (void**)&pOleWindow);
- if(SUCCEEDED(hres)) {
- IOleWindow_GetWindow(pOleWindow, &hwnd);
- IOleWindow_Release(pOleWindow);
- }
+ hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleWindow, (void**)&ole_window);
+ if(SUCCEEDED(hres)) {
+ IOleWindow_GetWindow(ole_window, &hwnd);
+ IOleWindow_Release(ole_window);
}
hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleCommandTarget, (void**)&cmdtrg);
@@ -204,10 +208,6 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite
IOleCommandTarget_Release(cmdtrg);
}
- IOleClientSite_AddRef(pClientSite);
- This->doc_obj->client = pClientSite;
- This->doc_obj->hostui = pDocHostUIHandler;
-
if(This->doc_obj->usermode == UNKNOWN_USERMODE)
IOleControl_OnAmbientPropertyChange(CONTROL(This), DISPID_AMBIENT_USERMODE);
diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c
index 2d51262..65451b1 100644
--- a/dlls/mshtml/tests/htmldoc.c
+++ b/dlls/mshtml/tests/htmldoc.c
@@ -1368,6 +1368,74 @@ static const IOleContainerVtbl OleContainerVtbl = {
static IOleContainer OleContainer = { &OleContainerVtbl };
+static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
+{
+ return QueryInterface(riid, ppv);
+}
+
+static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
+{
+ return 2;
+}
+
+static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
+{
+ return 1;
+}
+
+static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign, DWORD dwWhichMoniker,
+ IMoniker **ppmon)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
+{
+ CHECK_EXPECT(GetContainer);
+ ok(ppContainer != NULL, "ppContainer = NULL\n");
+ *ppContainer = &OleContainer;
+ return S_OK;
+}
+
+static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static const IOleClientSiteVtbl ClientSiteVtbl = {
+ ClientSite_QueryInterface,
+ ClientSite_AddRef,
+ ClientSite_Release,
+ ClientSite_SaveObject,
+ ClientSite_GetMoniker,
+ ClientSite_GetContainer,
+ ClientSite_ShowObject,
+ ClientSite_OnShowWindow,
+ ClientSite_RequestNewObjectLayout
+};
+
+static IOleClientSite ClientSite = { &ClientSiteVtbl };
+
static HRESULT WINAPI InPlaceFrame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, void **ppv)
{
static const GUID undocumented_frame_iid = {0xfbece6c9,0x48d7,0x4a37,{0x8f,0xe3,0x6a,0xd4,0x27,0x2f,0xdd,0xac}};
@@ -1558,9 +1626,23 @@ static ULONG WINAPI InPlaceSiteWindowless_Release(IOleInPlaceSiteWindowless *ifa
static HRESULT WINAPI InPlaceSiteWindowless_GetWindow(
IOleInPlaceSiteWindowless *iface, HWND *phwnd)
{
+ IOleClientSite *client_site;
+ IOleObject *ole_obj;
+ HRESULT hres;
+
CHECK_EXPECT2(GetWindow);
ok(phwnd != NULL, "phwnd = NULL\n");
*phwnd = container_hwnd;
+
+ hres = IUnknown_QueryInterface(doc_unk, &IID_IOleObject, (void**)&ole_obj);
+ ok(hres == S_OK, "Could not get IOleObject: %08x\n", hres);
+
+ hres = IOleObject_GetClientSite(ole_obj, &client_site);
+ IOleObject_Release(ole_obj);
+ ok(hres == S_OK, "GetClientSite failed: %08x\n", hres);
+ ok(client_site == &ClientSite, "client_site != ClientSite\n");
+ IOleClientSite_Release(client_site);
+
return S_OK;
}
@@ -1821,74 +1903,6 @@ static const IOleInPlaceSiteWindowlessVtbl InPlaceSiteWindowlessVtbl = {
static IOleInPlaceSiteWindowless InPlaceSiteWindowless = { &InPlaceSiteWindowlessVtbl };
-static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
-{
- return QueryInterface(riid, ppv);
-}
-
-static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
-{
- return 2;
-}
-
-static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
-{
- return 1;
-}
-
-static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
-{
- ok(0, "unexpected call\n");
- return E_NOTIMPL;
-}
-
-static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign, DWORD dwWhichMoniker,
- IMoniker **ppmon)
-{
- ok(0, "unexpected call\n");
- return E_NOTIMPL;
-}
-
-static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
-{
- CHECK_EXPECT(GetContainer);
- ok(ppContainer != NULL, "ppContainer = NULL\n");
- *ppContainer = &OleContainer;
- return S_OK;
-}
-
-static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
-{
- ok(0, "unexpected call\n");
- return E_NOTIMPL;
-}
-
-static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
-{
- ok(0, "unexpected call\n");
- return E_NOTIMPL;
-}
-
-static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
-{
- ok(0, "unexpected call\n");
- return E_NOTIMPL;
-}
-
-static const IOleClientSiteVtbl ClientSiteVtbl = {
- ClientSite_QueryInterface,
- ClientSite_AddRef,
- ClientSite_Release,
- ClientSite_SaveObject,
- ClientSite_GetMoniker,
- ClientSite_GetContainer,
- ClientSite_ShowObject,
- ClientSite_OnShowWindow,
- ClientSite_RequestNewObjectLayout
-};
-
-static IOleClientSite ClientSite = { &ClientSiteVtbl };
-
static HRESULT WINAPI DocumentSite_QueryInterface(IOleDocumentSite *iface, REFIID riid, void **ppv)
{
return QueryInterface(riid, ppv);
More information about the wine-cvs
mailing list