From 2e52c61c4c08291710c2b4c320517b0ffd723a07 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 7 Oct 2008 14:44:36 -0500 Subject: [PATCH] mshtml: Added HTMLIFrame stub implementation. --- dlls/mshtml/Makefile.in | 1 + dlls/mshtml/htmlelem.c | 3 + dlls/mshtml/htmliframe.c | 229 +++++++++++++++++++++++++++++++++++++++++++ dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/nsiface.idl | 31 ++++++ dlls/mshtml/tests/dom.c | 22 ++++- 6 files changed, 284 insertions(+), 3 deletions(-) create mode 100644 dlls/mshtml/htmliframe.c diff --git a/dlls/mshtml/Makefile.in b/dlls/mshtml/Makefile.in index c7695dc68f0..119540b367c 100644 --- a/dlls/mshtml/Makefile.in +++ b/dlls/mshtml/Makefile.in @@ -25,6 +25,7 @@ C_SRCS = \ htmlelemcol.c \ htmlevent.c \ htmlgeneric.c \ + htmliframe.c \ htmlimg.c \ htmlinput.c \ htmllocation.c \ diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 22423126a9c..f11c2356880 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -1410,6 +1410,7 @@ HTMLElement *HTMLElement_Create(HTMLDocument *doc, nsIDOMNode *nsnode, BOOL use_ static const WCHAR wszA[] = {'A',0}; static const WCHAR wszBODY[] = {'B','O','D','Y',0}; + static const WCHAR wszIFRAME[] = {'I','F','R','A','M','E',0}; static const WCHAR wszIMG[] = {'I','M','G',0}; static const WCHAR wszINPUT[] = {'I','N','P','U','T',0}; static const WCHAR wszOPTION[] = {'O','P','T','I','O','N',0}; @@ -1432,6 +1433,8 @@ HTMLElement *HTMLElement_Create(HTMLDocument *doc, nsIDOMNode *nsnode, BOOL use_ ret = HTMLAnchorElement_Create(nselem); else if(!strcmpW(class_name, wszBODY)) ret = HTMLBodyElement_Create(nselem); + else if(!strcmpW(class_name, wszIFRAME)) + ret = HTMLIFrame_Create(nselem); else if(!strcmpW(class_name, wszIMG)) ret = HTMLImgElement_Create(nselem); else if(!strcmpW(class_name, wszINPUT)) diff --git a/dlls/mshtml/htmliframe.c b/dlls/mshtml/htmliframe.c new file mode 100644 index 00000000000..5d1fff72e84 --- /dev/null +++ b/dlls/mshtml/htmliframe.c @@ -0,0 +1,229 @@ +/* + * Copyright 2008 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 + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "ole2.h" + +#include "mshtml_private.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mshtml); + +typedef struct { + HTMLElement element; + const IHTMLFrameBase2Vtbl *lpIHTMLFrameBase2Vtbl; + + LONG ref; + + nsIDOMHTMLIFrameElement *nsiframe; +} HTMLIFrame; + +#define HTMLFRAMEBASE2(x) ((IHTMLFrameBase2*) &(x)->lpIHTMLFrameBase2Vtbl) + +#define HTMLFRAMEBASE2_THIS(iface) DEFINE_THIS(HTMLIFrame, IHTMLFrameBase2, iface) + +static HRESULT WINAPI HTMLIFrameBase2_QueryInterface(IHTMLFrameBase2 *iface, REFIID riid, void **ppv) +{ + HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); + + return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->element.node), riid, ppv); +} + +static ULONG WINAPI HTMLIFrameBase2_AddRef(IHTMLFrameBase2 *iface) +{ + HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); + + return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node)); +} + +static ULONG WINAPI HTMLIFrameBase2_Release(IHTMLFrameBase2 *iface) +{ + HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); + + return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node)); +} + +static HRESULT WINAPI HTMLIFrameBase2_GetTypeInfoCount(IHTMLFrameBase2 *iface, UINT *pctinfo) +{ + HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLIFrameBase2_GetTypeInfo(IHTMLFrameBase2 *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLIFrameBase2_GetIDsOfNames(IHTMLFrameBase2 *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLIFrameBase2_Invoke(IHTMLFrameBase2 *iface, DISPID dispIdMember, + REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, + VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLIFrameBase2_get_contentWindow(IHTMLFrameBase2 *iface, IHTMLWindow2 **p) +{ + HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLIFrameBase2_put_onload(IHTMLFrameBase2 *iface, VARIANT v) +{ + HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLIFrameBase2_get_onload(IHTMLFrameBase2 *iface, VARIANT *p) +{ + HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLIFrameBase2_put_onreadystatechange(IHTMLFrameBase2 *iface, VARIANT v) +{ + HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLIFrameBase2_get_onreadystatechange(IHTMLFrameBase2 *iface, VARIANT *p) +{ + HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLIFrameBase2_get_readyState(IHTMLFrameBase2 *iface, BSTR *p) +{ + HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLIFrameBase2_put_allowTransparency(IHTMLFrameBase2 *iface, VARIANT_BOOL v) +{ + HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)->(%x)\n", This, v); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLIFrameBase2_get_allowTransparency(IHTMLFrameBase2 *iface, VARIANT_BOOL *p) +{ + HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +#undef HTMLFRAMEBASE2_THIS + +static const IHTMLFrameBase2Vtbl HTMLIFrameBase2Vtbl = { + HTMLIFrameBase2_QueryInterface, + HTMLIFrameBase2_AddRef, + HTMLIFrameBase2_Release, + HTMLIFrameBase2_GetTypeInfoCount, + HTMLIFrameBase2_GetTypeInfo, + HTMLIFrameBase2_GetIDsOfNames, + HTMLIFrameBase2_Invoke, + HTMLIFrameBase2_get_contentWindow, + HTMLIFrameBase2_put_onload, + HTMLIFrameBase2_get_onload, + HTMLIFrameBase2_put_onreadystatechange, + HTMLIFrameBase2_get_onreadystatechange, + HTMLIFrameBase2_get_readyState, + HTMLIFrameBase2_put_allowTransparency, + HTMLIFrameBase2_get_allowTransparency +}; + +#define HTMLIFRAME_NODE_THIS(iface) DEFINE_THIS2(HTMLIFrame, element.node, iface) + +static HRESULT HTMLIFrame_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +{ + HTMLIFrame *This = HTMLIFRAME_NODE_THIS(iface); + + *ppv = NULL; + + if(IsEqualGUID(&IID_IHTMLFrameBase2, riid)) { + TRACE("(%p)->(IID_IHTMLFrameBase2 %p)\n", This, ppv); + *ppv = HTMLFRAMEBASE2(This); + }else { + return HTMLElement_QI(&This->element.node, riid, ppv); + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static void HTMLIFrame_destructor(HTMLDOMNode *iface) +{ + HTMLIFrame *This = HTMLIFRAME_NODE_THIS(iface); + + if(This->nsiframe) + nsIDOMHTMLIFrameElement_Release(This->nsiframe); + + HTMLElement_destructor(&This->element.node); +} + +#undef HTMLIFRAME_NODE_THIS + +static const NodeImplVtbl HTMLIFrameImplVtbl = { + HTMLIFrame_QI, + HTMLIFrame_destructor +}; + +HTMLElement *HTMLIFrame_Create(nsIDOMHTMLElement *nselem) +{ + HTMLIFrame *ret; + nsresult nsres; + + ret = heap_alloc_zero(sizeof(HTMLIFrame)); + + ret->lpIHTMLFrameBase2Vtbl = &HTMLIFrameBase2Vtbl; + ret->element.node.vtbl = &HTMLIFrameImplVtbl; + + HTMLElement_Init(&ret->element); + + nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLIFrameElement, (void**)&ret->nsiframe); + if(NS_FAILED(nsres)) + ERR("Could not get nsIDOMHTMLIFrameElement iface: %08x\n", nsres); + + return &ret->element; +} diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index e148232ee8e..55ea9c5aa0c 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -561,6 +561,7 @@ HTMLElement *HTMLElement_Create(HTMLDocument*,nsIDOMNode*,BOOL); HTMLElement *HTMLCommentElement_Create(HTMLDocument*,nsIDOMNode*); HTMLElement *HTMLAnchorElement_Create(nsIDOMHTMLElement*); HTMLElement *HTMLBodyElement_Create(nsIDOMHTMLElement*); +HTMLElement *HTMLIFrame_Create(nsIDOMHTMLElement*); HTMLElement *HTMLImgElement_Create(nsIDOMHTMLElement*); HTMLElement *HTMLInputElement_Create(nsIDOMHTMLElement*); HTMLElement *HTMLOptionElement_Create(nsIDOMHTMLElement*); diff --git a/dlls/mshtml/nsiface.idl b/dlls/mshtml/nsiface.idl index 93e25f11cbe..21f8cd7244e 100644 --- a/dlls/mshtml/nsiface.idl +++ b/dlls/mshtml/nsiface.idl @@ -1447,6 +1447,37 @@ interface nsIDOMHTMLTableRowElement : nsIDOMHTMLElement [ object, + uuid(a6cf90ba-15b3-11d2-932e-00805f8add32), + local + /* FROZEN */ +] +interface nsIDOMHTMLIFrameElement : nsIDOMHTMLElement +{ + nsresult GetAlign(nsAString *aAlign); + nsresult SetAlign(const nsAString *aAlign); + nsresult GetFrameBorder(nsAString *aFrameBorder); + nsresult SetFrameBorder(const nsAString *aFrameBorder); + nsresult GetHeight(nsAString *aHeight); + nsresult SetHeight(const nsAString *aHeight); + nsresult GetLongDesc(nsAString *aLongDesc); + nsresult SetLongDesc(const nsAString *aLongDesc); + nsresult GetMarginHeight(nsAString *aMarginHeight); + nsresult SetMarginHeight(const nsAString *aMarginHeight); + nsresult GetMarginWidth(nsAString *aMarginWidth); + nsresult SetMarginWidth(const nsAString *aMarginWidth); + nsresult GetName(nsAString *aName); + nsresult SetName(const nsAString *aName); + nsresult GetScrolling(nsAString *aScrolling); + nsresult SetScrolling(const nsAString *aScrolling); + nsresult GetSrc(nsAString *aSrc); + nsresult SetSrc(const nsAString *aSrc); + nsresult GetWidth(nsAString *aWidth); + nsresult SetWidth(const nsAString *aWidth); + nsresult GetContentDocument(nsIDOMDocument **aContentDocument); +} + +[ + object, uuid(94928ab3-8b63-11d3-989d-001083010e9b), local /* FROZEN */ diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index dd13ad3875a..0415d0800a0 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -49,6 +49,7 @@ static const char elem_test_str[] = "" "" "" + "" ""; static const char indent_test_str[] = "testabc
123"; @@ -86,7 +87,8 @@ typedef enum { ET_COMMENT, ET_IMG, ET_TR, - ET_TD + ET_TD, + ET_IFRAME } elem_type_t; static const IID * const none_iids[] = { @@ -271,6 +273,18 @@ static const IID * const td_iids[] = { NULL }; +static const IID * const iframe_iids[] = { + &IID_IHTMLDOMNode, + &IID_IHTMLDOMNode2, + &IID_IHTMLElement, + &IID_IHTMLElement2, + &IID_IHTMLElement3, + &IID_IHTMLFrameBase2, + &IID_IDispatchEx, + &IID_IConnectionPointContainer, + NULL +}; + static const IID * const generic_iids[] = { &IID_IHTMLDOMNode, &IID_IHTMLDOMNode2, @@ -329,7 +343,8 @@ static const elem_type_info_t elem_type_infos[] = { {"!", comment_iids, &DIID_DispHTMLCommentElement}, {"IMG", img_iids, &DIID_DispHTMLImg}, {"TR", tr_iids, &DIID_DispHTMLTableRow}, - {"TD", td_iids, NULL} + {"TD", td_iids, NULL}, + {"IFRAME", iframe_iids, NULL} }; static const char *dbgstr_w(LPCWSTR str) @@ -2642,7 +2657,8 @@ static void test_elems(IHTMLDocument2 *doc) ET_TD, ET_SCRIPT, ET_TEST, - ET_IMG + ET_IMG, + ET_IFRAME }; static const elem_type_t item_types[] = { -- 2.11.4.GIT