From c05558a245bb50169b5169195ca573fec70f0588 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 15 Nov 2011 13:28:15 +0100 Subject: [PATCH] ieframe: Store ShellBrowser in DocHost instead of creating it on every QueryService call. --- dlls/ieframe/client.c | 19 ++++++++++--------- dlls/ieframe/ieframe.h | 17 ++++++++++++++++- dlls/ieframe/shellbrowser.c | 32 ++++++++++++++++---------------- dlls/ieframe/webbrowser.c | 1 - 4 files changed, 42 insertions(+), 27 deletions(-) diff --git a/dlls/ieframe/client.c b/dlls/ieframe/client.c index 970e28d03ae..d74a303b10e 100644 --- a/dlls/ieframe/client.c +++ b/dlls/ieframe/client.c @@ -672,18 +672,17 @@ static HRESULT WINAPI ClServiceProvider_QueryService(IServiceProvider *iface, RE } if(IsEqualGUID(&IID_IShellBrowser, guidService)) { - IShellBrowser *sb; - HRESULT hres; - TRACE("(%p)->(IID_IShellBrowser %s %p)\n", This, debugstr_guid(riid), ppv); - hres = ShellBrowser_Create(&sb); - if(FAILED(hres)) - return hres; + if(!This->browser_service) { + HRESULT hres; - hres = IShellBrowser_QueryInterface(sb, riid, ppv); - IShellBrowser_Release(sb); - return hres; + hres = create_browser_service(This, &This->browser_service); + if(FAILED(hres)) + return hres; + } + + return IShellBrowser_QueryInterface(&This->browser_service->IShellBrowser_iface, riid, ppv); } FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv); @@ -710,6 +709,8 @@ void DocHost_ClientSite_Init(DocHost *This) void DocHost_ClientSite_Release(DocHost *This) { + if(This->browser_service) + detach_browser_service(This->browser_service); if(This->view) IOleDocumentView_Release(This->view); } diff --git a/dlls/ieframe/ieframe.h b/dlls/ieframe/ieframe.h index 89f69fade30..d81e166d117 100644 --- a/dlls/ieframe/ieframe.h +++ b/dlls/ieframe/ieframe.h @@ -35,6 +35,8 @@ #include "exdisp.h" #include "hlink.h" #include "htiframe.h" +#include "shdeprecated.h" +#include "docobjectservice.h" #include "wine/unicode.h" #include "wine/list.h" @@ -71,6 +73,16 @@ typedef struct _task_header_t { task_destr_t destr; } task_header_t; +typedef struct { + IShellBrowser IShellBrowser_iface; + IBrowserService IBrowserService_iface; + IDocObjectService IDocObjectService_iface; + + LONG ref; + + DocHost *doc_host; +} ShellBrowser; + typedef struct _IDocHostContainerVtbl { ULONG (*addref)(DocHost*); @@ -123,6 +135,8 @@ struct DocHost { DWORD prop_notif_cookie; BOOL is_prop_notif; + ShellBrowser *browser_service; + ConnectionPointContainer cps; }; @@ -213,7 +227,8 @@ void release_dochost_client(DocHost*) DECLSPEC_HIDDEN; void HlinkFrame_Init(HlinkFrame*,IUnknown*,DocHost*) DECLSPEC_HIDDEN; BOOL HlinkFrame_QI(HlinkFrame*,REFIID,void**) DECLSPEC_HIDDEN; -HRESULT ShellBrowser_Create(IShellBrowser**) DECLSPEC_HIDDEN; +HRESULT create_browser_service(DocHost*,ShellBrowser**) DECLSPEC_HIDDEN; +void detach_browser_service(ShellBrowser*) DECLSPEC_HIDDEN; void ConnectionPointContainer_Init(ConnectionPointContainer*,IUnknown*) DECLSPEC_HIDDEN; void ConnectionPointContainer_Destroy(ConnectionPointContainer*) DECLSPEC_HIDDEN; diff --git a/dlls/ieframe/shellbrowser.c b/dlls/ieframe/shellbrowser.c index c3ff6c85806..be15613b03d 100644 --- a/dlls/ieframe/shellbrowser.c +++ b/dlls/ieframe/shellbrowser.c @@ -18,23 +18,14 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "ieframe.h" +#include -#include "shdeprecated.h" -#include "docobjectservice.h" +#include "ieframe.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(ieframe); -typedef struct { - IShellBrowser IShellBrowser_iface; - IBrowserService IBrowserService_iface; - IDocObjectService IDocObjectService_iface; - - LONG ref; -} ShellBrowser; - static inline ShellBrowser *impl_from_IShellBrowser(IShellBrowser *iface) { return CONTAINING_RECORD(iface, ShellBrowser, IShellBrowser_iface); @@ -77,16 +68,18 @@ static ULONG WINAPI ShellBrowser_AddRef( return ref; } -static ULONG WINAPI ShellBrowser_Release( - IShellBrowser* iface) +static ULONG WINAPI ShellBrowser_Release(IShellBrowser* iface) { ShellBrowser *This = impl_from_IShellBrowser(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); - if(!ref) + if(!ref) { + assert(!This->doc_host); heap_free(This); + } + return ref; } @@ -759,7 +752,7 @@ static const IDocObjectServiceVtbl DocObjectServiceVtbl = { DocObjectService_IsErrorUrl }; -HRESULT ShellBrowser_Create(IShellBrowser **ppv) +HRESULT create_browser_service(DocHost *doc_host, ShellBrowser **ret) { ShellBrowser *sb; @@ -772,7 +765,14 @@ HRESULT ShellBrowser_Create(IShellBrowser **ppv) sb->IDocObjectService_iface.lpVtbl = &DocObjectServiceVtbl; sb->ref = 1; + sb->doc_host = doc_host; - *ppv = &sb->IShellBrowser_iface; + *ret = sb; return S_OK; } + +void detach_browser_service(ShellBrowser *sb) +{ + sb->doc_host = NULL; + IShellBrowser_Release(&sb->IShellBrowser_iface); +} diff --git a/dlls/ieframe/webbrowser.c b/dlls/ieframe/webbrowser.c index d1004df81b4..706600d6801 100644 --- a/dlls/ieframe/webbrowser.c +++ b/dlls/ieframe/webbrowser.c @@ -23,7 +23,6 @@ #include "exdispid.h" #include "mshtml.h" -#include "shdeprecated.h" #include "wine/debug.h" -- 2.11.4.GIT