Commit c05558a2 authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

ieframe: Store ShellBrowser in DocHost instead of creating it on every QueryService call.

parent dcf1a81d
...@@ -672,18 +672,17 @@ static HRESULT WINAPI ClServiceProvider_QueryService(IServiceProvider *iface, RE ...@@ -672,18 +672,17 @@ static HRESULT WINAPI ClServiceProvider_QueryService(IServiceProvider *iface, RE
} }
if(IsEqualGUID(&IID_IShellBrowser, guidService)) { if(IsEqualGUID(&IID_IShellBrowser, guidService)) {
IShellBrowser *sb;
HRESULT hres;
TRACE("(%p)->(IID_IShellBrowser %s %p)\n", This, debugstr_guid(riid), ppv); TRACE("(%p)->(IID_IShellBrowser %s %p)\n", This, debugstr_guid(riid), ppv);
hres = ShellBrowser_Create(&sb); if(!This->browser_service) {
HRESULT hres;
hres = create_browser_service(This, &This->browser_service);
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
}
hres = IShellBrowser_QueryInterface(sb, riid, ppv); return IShellBrowser_QueryInterface(&This->browser_service->IShellBrowser_iface, riid, ppv);
IShellBrowser_Release(sb);
return hres;
} }
FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(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) ...@@ -710,6 +709,8 @@ void DocHost_ClientSite_Init(DocHost *This)
void DocHost_ClientSite_Release(DocHost *This) void DocHost_ClientSite_Release(DocHost *This)
{ {
if(This->browser_service)
detach_browser_service(This->browser_service);
if(This->view) if(This->view)
IOleDocumentView_Release(This->view); IOleDocumentView_Release(This->view);
} }
...@@ -35,6 +35,8 @@ ...@@ -35,6 +35,8 @@
#include "exdisp.h" #include "exdisp.h"
#include "hlink.h" #include "hlink.h"
#include "htiframe.h" #include "htiframe.h"
#include "shdeprecated.h"
#include "docobjectservice.h"
#include "wine/unicode.h" #include "wine/unicode.h"
#include "wine/list.h" #include "wine/list.h"
...@@ -71,6 +73,16 @@ typedef struct _task_header_t { ...@@ -71,6 +73,16 @@ typedef struct _task_header_t {
task_destr_t destr; task_destr_t destr;
} task_header_t; } task_header_t;
typedef struct {
IShellBrowser IShellBrowser_iface;
IBrowserService IBrowserService_iface;
IDocObjectService IDocObjectService_iface;
LONG ref;
DocHost *doc_host;
} ShellBrowser;
typedef struct _IDocHostContainerVtbl typedef struct _IDocHostContainerVtbl
{ {
ULONG (*addref)(DocHost*); ULONG (*addref)(DocHost*);
...@@ -123,6 +135,8 @@ struct DocHost { ...@@ -123,6 +135,8 @@ struct DocHost {
DWORD prop_notif_cookie; DWORD prop_notif_cookie;
BOOL is_prop_notif; BOOL is_prop_notif;
ShellBrowser *browser_service;
ConnectionPointContainer cps; ConnectionPointContainer cps;
}; };
...@@ -213,7 +227,8 @@ void release_dochost_client(DocHost*) DECLSPEC_HIDDEN; ...@@ -213,7 +227,8 @@ void release_dochost_client(DocHost*) DECLSPEC_HIDDEN;
void HlinkFrame_Init(HlinkFrame*,IUnknown*,DocHost*) DECLSPEC_HIDDEN; void HlinkFrame_Init(HlinkFrame*,IUnknown*,DocHost*) DECLSPEC_HIDDEN;
BOOL HlinkFrame_QI(HlinkFrame*,REFIID,void**) 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_Init(ConnectionPointContainer*,IUnknown*) DECLSPEC_HIDDEN;
void ConnectionPointContainer_Destroy(ConnectionPointContainer*) DECLSPEC_HIDDEN; void ConnectionPointContainer_Destroy(ConnectionPointContainer*) DECLSPEC_HIDDEN;
......
...@@ -18,23 +18,14 @@ ...@@ -18,23 +18,14 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
#include "ieframe.h" #include <assert.h>
#include "shdeprecated.h" #include "ieframe.h"
#include "docobjectservice.h"
#include "wine/debug.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(ieframe); 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) static inline ShellBrowser *impl_from_IShellBrowser(IShellBrowser *iface)
{ {
return CONTAINING_RECORD(iface, ShellBrowser, IShellBrowser_iface); return CONTAINING_RECORD(iface, ShellBrowser, IShellBrowser_iface);
...@@ -77,16 +68,18 @@ static ULONG WINAPI ShellBrowser_AddRef( ...@@ -77,16 +68,18 @@ static ULONG WINAPI ShellBrowser_AddRef(
return ref; return ref;
} }
static ULONG WINAPI ShellBrowser_Release( static ULONG WINAPI ShellBrowser_Release(IShellBrowser* iface)
IShellBrowser* iface)
{ {
ShellBrowser *This = impl_from_IShellBrowser(iface); ShellBrowser *This = impl_from_IShellBrowser(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) {
assert(!This->doc_host);
heap_free(This); heap_free(This);
}
return ref; return ref;
} }
...@@ -759,7 +752,7 @@ static const IDocObjectServiceVtbl DocObjectServiceVtbl = { ...@@ -759,7 +752,7 @@ static const IDocObjectServiceVtbl DocObjectServiceVtbl = {
DocObjectService_IsErrorUrl DocObjectService_IsErrorUrl
}; };
HRESULT ShellBrowser_Create(IShellBrowser **ppv) HRESULT create_browser_service(DocHost *doc_host, ShellBrowser **ret)
{ {
ShellBrowser *sb; ShellBrowser *sb;
...@@ -772,7 +765,14 @@ HRESULT ShellBrowser_Create(IShellBrowser **ppv) ...@@ -772,7 +765,14 @@ HRESULT ShellBrowser_Create(IShellBrowser **ppv)
sb->IDocObjectService_iface.lpVtbl = &DocObjectServiceVtbl; sb->IDocObjectService_iface.lpVtbl = &DocObjectServiceVtbl;
sb->ref = 1; sb->ref = 1;
sb->doc_host = doc_host;
*ppv = &sb->IShellBrowser_iface; *ret = sb;
return S_OK; return S_OK;
} }
void detach_browser_service(ShellBrowser *sb)
{
sb->doc_host = NULL;
IShellBrowser_Release(&sb->IShellBrowser_iface);
}
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
#include "exdispid.h" #include "exdispid.h"
#include "mshtml.h" #include "mshtml.h"
#include "shdeprecated.h"
#include "wine/debug.h" #include "wine/debug.h"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment