2 * Copyright 2008 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
28 #include "mshtml_private.h"
30 #include "wine/debug.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(mshtml
);
35 HTMLFrameBase framebase
;
36 const IHTMLIFrameElementVtbl
*lpIHTMLIFrameElementVtbl
;
39 #define HTMLIFRAMEELEM(x) ((IHTMLIFrameElement*) &(x)->lpIHTMLIFrameElementVtbl)
41 #define HTMLIFRAME_THIS(iface) DEFINE_THIS(HTMLIFrame, IHTMLIFrameElement, iface)
43 static HRESULT WINAPI
HTMLIFrameElement_QueryInterface(IHTMLIFrameElement
*iface
,
44 REFIID riid
, void **ppv
)
46 HTMLIFrame
*This
= HTMLIFRAME_THIS(iface
);
48 return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This
->framebase
.element
.node
), riid
, ppv
);
51 static ULONG WINAPI
HTMLIFrameElement_AddRef(IHTMLIFrameElement
*iface
)
53 HTMLIFrame
*This
= HTMLIFRAME_THIS(iface
);
55 return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This
->framebase
.element
.node
));
58 static ULONG WINAPI
HTMLIFrameElement_Release(IHTMLIFrameElement
*iface
)
60 HTMLIFrame
*This
= HTMLIFRAME_THIS(iface
);
62 return IHTMLDOMNode_Release(HTMLDOMNODE(&This
->framebase
.element
.node
));
65 static HRESULT WINAPI
HTMLIFrameElement_GetTypeInfoCount(IHTMLIFrameElement
*iface
, UINT
*pctinfo
)
67 HTMLIFrame
*This
= HTMLIFRAME_THIS(iface
);
68 return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This
->framebase
.element
.node
.dispex
), pctinfo
);
71 static HRESULT WINAPI
HTMLIFrameElement_GetTypeInfo(IHTMLIFrameElement
*iface
, UINT iTInfo
,
72 LCID lcid
, ITypeInfo
**ppTInfo
)
74 HTMLIFrame
*This
= HTMLIFRAME_THIS(iface
);
75 return IDispatchEx_GetTypeInfo(DISPATCHEX(&This
->framebase
.element
.node
.dispex
), iTInfo
, lcid
, ppTInfo
);
78 static HRESULT WINAPI
HTMLIFrameElement_GetIDsOfNames(IHTMLIFrameElement
*iface
, REFIID riid
,
79 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
81 HTMLIFrame
*This
= HTMLIFRAME_THIS(iface
);
82 return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This
->framebase
.element
.node
.dispex
), riid
, rgszNames
, cNames
, lcid
, rgDispId
);
85 static HRESULT WINAPI
HTMLIFrameElement_Invoke(IHTMLIFrameElement
*iface
, DISPID dispIdMember
,
86 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
87 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
89 HTMLIFrame
*This
= HTMLIFRAME_THIS(iface
);
90 return IDispatchEx_Invoke(DISPATCHEX(&This
->framebase
.element
.node
.dispex
), dispIdMember
, riid
,
91 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
94 static HRESULT WINAPI
HTMLIFrameElement_put_vspace(IHTMLIFrameElement
*iface
, LONG v
)
96 HTMLIFrame
*This
= HTMLIFRAME_THIS(iface
);
97 FIXME("(%p)->(%d)\n", This
, v
);
101 static HRESULT WINAPI
HTMLIFrameElement_get_vspace(IHTMLIFrameElement
*iface
, LONG
*p
)
103 HTMLIFrame
*This
= HTMLIFRAME_THIS(iface
);
104 FIXME("(%p)->(%p)\n", This
, p
);
108 static HRESULT WINAPI
HTMLIFrameElement_put_hspace(IHTMLIFrameElement
*iface
, LONG v
)
110 HTMLIFrame
*This
= HTMLIFRAME_THIS(iface
);
111 FIXME("(%p)->(%d)\n", This
, v
);
115 static HRESULT WINAPI
HTMLIFrameElement_get_hspace(IHTMLIFrameElement
*iface
, LONG
*p
)
117 HTMLIFrame
*This
= HTMLIFRAME_THIS(iface
);
118 FIXME("(%p)->(%p)\n", This
, p
);
122 static HRESULT WINAPI
HTMLIFrameElement_put_align(IHTMLIFrameElement
*iface
, BSTR v
)
124 HTMLIFrame
*This
= HTMLIFRAME_THIS(iface
);
125 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
129 static HRESULT WINAPI
HTMLIFrameElement_get_align(IHTMLIFrameElement
*iface
, BSTR
*p
)
131 HTMLIFrame
*This
= HTMLIFRAME_THIS(iface
);
132 FIXME("(%p)->(%p)\n", This
, p
);
136 #undef HTMLIFRAME_THIS
138 static const IHTMLIFrameElementVtbl HTMLIFrameElementVtbl
= {
139 HTMLIFrameElement_QueryInterface
,
140 HTMLIFrameElement_AddRef
,
141 HTMLIFrameElement_Release
,
142 HTMLIFrameElement_GetTypeInfoCount
,
143 HTMLIFrameElement_GetTypeInfo
,
144 HTMLIFrameElement_GetIDsOfNames
,
145 HTMLIFrameElement_Invoke
,
146 HTMLIFrameElement_put_vspace
,
147 HTMLIFrameElement_get_vspace
,
148 HTMLIFrameElement_put_hspace
,
149 HTMLIFrameElement_get_hspace
,
150 HTMLIFrameElement_put_align
,
151 HTMLIFrameElement_get_align
154 #define HTMLIFRAME_NODE_THIS(iface) DEFINE_THIS2(HTMLIFrame, framebase.element.node, iface)
156 static HRESULT
HTMLIFrame_QI(HTMLDOMNode
*iface
, REFIID riid
, void **ppv
)
158 HTMLIFrame
*This
= HTMLIFRAME_NODE_THIS(iface
);
160 if(IsEqualGUID(&IID_IHTMLIFrameElement
, riid
)) {
161 TRACE("(%p)->(IID_IHTMLIFrameElement %p)\n", This
, ppv
);
162 *ppv
= HTMLIFRAMEELEM(This
);
164 return HTMLFrameBase_QI(&This
->framebase
, riid
, ppv
);
167 IUnknown_AddRef((IUnknown
*)*ppv
);
171 static void HTMLIFrame_destructor(HTMLDOMNode
*iface
)
173 HTMLIFrame
*This
= HTMLIFRAME_NODE_THIS(iface
);
175 HTMLFrameBase_destructor(&This
->framebase
);
178 static HRESULT
HTMLIFrame_get_document(HTMLDOMNode
*iface
, IDispatch
**p
)
180 HTMLIFrame
*This
= HTMLIFRAME_NODE_THIS(iface
);
182 if(!This
->framebase
.content_window
|| !This
->framebase
.content_window
->doc
) {
187 *p
= (IDispatch
*)HTMLDOC(&This
->framebase
.content_window
->doc
->basedoc
);
188 IDispatch_AddRef(*p
);
192 static HRESULT
HTMLIFrame_get_dispid(HTMLDOMNode
*iface
, BSTR name
,
193 DWORD grfdex
, DISPID
*pid
)
195 HTMLIFrame
*This
= HTMLIFRAME_NODE_THIS(iface
);
197 if(!This
->framebase
.content_window
)
198 return DISP_E_UNKNOWNNAME
;
200 return search_window_props(This
->framebase
.content_window
, name
, grfdex
, pid
);
203 static HRESULT
HTMLIFrame_invoke(HTMLDOMNode
*iface
, DISPID id
, LCID lcid
,
204 WORD flags
, DISPPARAMS
*params
, VARIANT
*res
, EXCEPINFO
*ei
, IServiceProvider
*caller
)
206 HTMLIFrame
*This
= HTMLIFRAME_NODE_THIS(iface
);
208 if(!This
->framebase
.content_window
) {
209 ERR("no content window to invoke on\n");
213 return IDispatchEx_InvokeEx(DISPATCHEX(This
->framebase
.content_window
), id
, lcid
, flags
, params
, res
, ei
, caller
);
216 static HRESULT
HTMLIFrame_get_readystate(HTMLDOMNode
*iface
, BSTR
*p
)
218 HTMLIFrame
*This
= HTMLIFRAME_NODE_THIS(iface
);
220 return IHTMLFrameBase2_get_readyState(HTMLFRAMEBASE2(&This
->framebase
), p
);
223 static HRESULT
HTMLIFrame_bind_to_tree(HTMLDOMNode
*iface
)
225 HTMLIFrame
*This
= HTMLIFRAME_NODE_THIS(iface
);
226 nsIDOMDocument
*nsdoc
;
230 nsres
= nsIDOMHTMLIFrameElement_GetContentDocument(This
->framebase
.nsiframe
, &nsdoc
);
231 if(NS_FAILED(nsres
) || !nsdoc
) {
232 ERR("GetContentDocument failed: %08x\n", nsres
);
236 hres
= set_frame_doc(&This
->framebase
, nsdoc
);
237 nsIDOMDocument_Release(nsdoc
);
241 #undef HTMLIFRAME_NODE_THIS
243 static const NodeImplVtbl HTMLIFrameImplVtbl
= {
245 HTMLIFrame_destructor
,
250 HTMLIFrame_get_document
,
251 HTMLIFrame_get_readystate
,
252 HTMLIFrame_get_dispid
,
254 HTMLIFrame_bind_to_tree
257 static const tid_t HTMLIFrame_iface_tids
[] = {
261 IHTMLIFrameElement_tid
,
265 static dispex_static_data_t HTMLIFrame_dispex
= {
269 HTMLIFrame_iface_tids
272 HTMLElement
*HTMLIFrame_Create(HTMLDocumentNode
*doc
, nsIDOMHTMLElement
*nselem
)
276 ret
= heap_alloc_zero(sizeof(HTMLIFrame
));
278 ret
->lpIHTMLIFrameElementVtbl
= &HTMLIFrameElementVtbl
;
279 ret
->framebase
.element
.node
.vtbl
= &HTMLIFrameImplVtbl
;
281 HTMLFrameBase_Init(&ret
->framebase
, doc
, nselem
, &HTMLIFrame_dispex
);
283 return &ret
->framebase
.element
;