diff --git a/dlls/mshtml/Makefile.in b/dlls/mshtml/Makefile.in index 7f44bb16a1d..b1003593cb8 100644 --- a/dlls/mshtml/Makefile.in +++ b/dlls/mshtml/Makefile.in @@ -60,6 +60,7 @@ C_SRCS = \ persist.c \ protocol.c \ script.c \ + secmgr.c \ selection.c \ service.c \ task.c \ diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index f7c71902515..bfde79d53c6 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -28,6 +28,7 @@ #include "winuser.h" #include "ole2.h" #include "perhist.h" +#include "mshtmdid.h" #include "wine/debug.h" @@ -1756,7 +1757,15 @@ static HRESULT HTMLDocumentNode_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) if(htmldoc_qi(&This->basedoc, riid, ppv)) return *ppv ? S_OK : E_NOINTERFACE; - return HTMLDOMNode_QI(&This->node, riid, ppv); + if(IsEqualGUID(&IID_IInternetHostSecurityManager, riid)) { + TRACE("(%p)->(IID_IInternetHostSecurityManager %p)\n", This, ppv); + *ppv = HOSTSECMGR(This); + }else { + return HTMLDOMNode_QI(&This->node, riid, ppv); + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; } void HTMLDocumentNode_destructor(HTMLDOMNode *iface) @@ -1806,6 +1815,7 @@ HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_ob init_dispex(&doc->node.dispex, (IUnknown*)HTMLDOMNODE(&doc->node), &HTMLDocumentNode_dispex); init_doc(&doc->basedoc, (IUnknown*)HTMLDOMNODE(&doc->node), DISPATCHEX(&doc->node.dispex)); + HTMLDocumentNode_SecMgr_Init(doc); doc->ref = 1; nsIDOMHTMLDocument_AddRef(nsdoc); diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 73daf017aaf..17fa9715fbd 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -465,6 +465,8 @@ struct HTMLDocumentNode { HTMLDOMNode node; HTMLDocument basedoc; + const IInternetHostSecurityManagerVtbl *lpIInternetHostSecurityManagerVtbl; + LONG ref; HTMLDOMNode *nodes; @@ -540,6 +542,8 @@ struct HTMLDocumentNode { #define SUPPERRINFO(x) ((ISupportErrorInfo*) &(x)->lpSupportErrorInfoVtbl) +#define HOSTSECMGR(x) ((IInternetHostSecurityManager*) &(x)->lpIInternetHostSecurityManagerVtbl) + #define DEFINE_THIS2(cls,ifc,iface) ((cls*)((BYTE*)(iface)-offsetof(cls,ifc))) #define DEFINE_THIS(cls,ifc,iface) DEFINE_THIS2(cls,lp ## ifc ## Vtbl,iface) @@ -564,6 +568,8 @@ void HTMLDocument_Window_Init(HTMLDocument*); void HTMLDocument_Service_Init(HTMLDocument*); void HTMLDocument_Hlink_Init(HTMLDocument*); +void HTMLDocumentNode_SecMgr_Init(HTMLDocumentNode*); + HRESULT HTMLCurrentStyle_Create(HTMLElement*,IHTMLCurrentStyle**); void ConnectionPoint_Init(ConnectionPoint*,ConnectionPointContainer*,REFIID); diff --git a/dlls/mshtml/secmgr.c b/dlls/mshtml/secmgr.c new file mode 100644 index 00000000000..617cb230670 --- /dev/null +++ b/dlls/mshtml/secmgr.c @@ -0,0 +1,95 @@ +/* + * Copyright 2009 Jacek Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" + +#include +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "ole2.h" + +#include "wine/debug.h" + +#include "mshtml_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mshtml); + +#define HOSTSECMGR_THIS(iface) DEFINE_THIS(HTMLDocumentNode, IInternetHostSecurityManager, iface) + +static HRESULT WINAPI InternetHostSecurityManager_QueryInterface(IInternetHostSecurityManager *iface, REFIID riid, void **ppv) +{ + HTMLDocumentNode *This = HOSTSECMGR_THIS(iface); + return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->node), riid, ppv); +} + +static ULONG WINAPI InternetHostSecurityManager_AddRef(IInternetHostSecurityManager *iface) +{ + HTMLDocumentNode *This = HOSTSECMGR_THIS(iface); + return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->node)); +} + +static ULONG WINAPI InternetHostSecurityManager_Release(IInternetHostSecurityManager *iface) +{ + HTMLDocumentNode *This = HOSTSECMGR_THIS(iface); + return IHTMLDOMNode_Release(HTMLDOMNODE(&This->node)); +} + +static HRESULT WINAPI InternetHostSecurityManager_GetSecurityId(IInternetHostSecurityManager *iface, BYTE *pbSecurityId, + DWORD *pcbSecurityId, DWORD_PTR dwReserved) +{ + HTMLDocumentNode *This = HOSTSECMGR_THIS(iface); + FIXME("(%p)->(%p %p %lx)\n", This, pbSecurityId, pcbSecurityId, dwReserved); + return E_NOTIMPL; +} + +static HRESULT WINAPI InternetHostSecurityManager_ProcessUrlAction(IInternetHostSecurityManager *iface, DWORD dwAction, + BYTE *pPolicy, DWORD cbPolicy, BYTE *pContext, DWORD cbContext, DWORD dwFlags, DWORD dwReserved) +{ + HTMLDocumentNode *This = HOSTSECMGR_THIS(iface); + FIXME("%p)->(%d %p %d %p %d %x %x)\n", This, dwAction, pPolicy, cbPolicy, pContext, cbContext, dwFlags, dwReserved); + return E_NOTIMPL; +} + +static HRESULT WINAPI InternetHostSecurityManager_QueryCustomPolicy(IInternetHostSecurityManager *iface, REFGUID guidKey, + BYTE **ppPolicy, DWORD *pcbPolicy, BYTE *pContext, DWORD cbContext, DWORD dwReserved) +{ + HTMLDocumentNode *This = HOSTSECMGR_THIS(iface); + FIXME("(%p)->(%s %p %p %p %d %x)\n", This, debugstr_guid(guidKey), ppPolicy, pcbPolicy, pContext, cbContext, dwReserved); + return E_NOTIMPL; +} + +#undef HOSTSECMGR_THIS + +static const IInternetHostSecurityManagerVtbl InternetHostSecurityManagerVtbl = { + InternetHostSecurityManager_QueryInterface, + InternetHostSecurityManager_AddRef, + InternetHostSecurityManager_Release, + InternetHostSecurityManager_GetSecurityId, + InternetHostSecurityManager_ProcessUrlAction, + InternetHostSecurityManager_QueryCustomPolicy +}; + +void HTMLDocumentNode_SecMgr_Init(HTMLDocumentNode *This) +{ + This->lpIInternetHostSecurityManagerVtbl = &InternetHostSecurityManagerVtbl; +} diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index fd7cc44827f..626445ecb7d 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -105,6 +105,7 @@ static const IID * const doc_node_iids[] = { &IID_IHTMLDocument5, &IID_IDispatchEx, &IID_IConnectionPointContainer, + &IID_IInternetHostSecurityManager, NULL };