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
);
36 const IHTMLFrameBaseVtbl
*lpIHTMLFrameBaseVtbl
;
37 const IHTMLFrameBase2Vtbl
*lpIHTMLFrameBase2Vtbl
;
41 nsIDOMHTMLIFrameElement
*nsiframe
;
42 HTMLWindow
*content_window
;
45 #define HTMLFRAMEBASE(x) (&(x)->lpIHTMLFrameBaseVtbl)
46 #define HTMLFRAMEBASE2(x) (&(x)->lpIHTMLFrameBase2Vtbl)
48 #define HTMLFRAMEBASE_THIS(iface) DEFINE_THIS(HTMLIFrame, IHTMLFrameBase, iface)
50 static HRESULT WINAPI
HTMLIFrameBase_QueryInterface(IHTMLFrameBase
*iface
, REFIID riid
, void **ppv
)
52 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
54 return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This
->element
.node
), riid
, ppv
);
57 static ULONG WINAPI
HTMLIFrameBase_AddRef(IHTMLFrameBase
*iface
)
59 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
61 return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This
->element
.node
));
64 static ULONG WINAPI
HTMLIFrameBase_Release(IHTMLFrameBase
*iface
)
66 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
68 return IHTMLDOMNode_Release(HTMLDOMNODE(&This
->element
.node
));
71 static HRESULT WINAPI
HTMLIFrameBase_GetTypeInfoCount(IHTMLFrameBase
*iface
, UINT
*pctinfo
)
73 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
75 return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This
->element
.node
.dispex
), pctinfo
);
78 static HRESULT WINAPI
HTMLIFrameBase_GetTypeInfo(IHTMLFrameBase
*iface
, UINT iTInfo
,
79 LCID lcid
, ITypeInfo
**ppTInfo
)
81 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
83 return IDispatchEx_GetTypeInfo(DISPATCHEX(&This
->element
.node
.dispex
), iTInfo
, lcid
, ppTInfo
);
86 static HRESULT WINAPI
HTMLIFrameBase_GetIDsOfNames(IHTMLFrameBase
*iface
, REFIID riid
,
87 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
89 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
91 return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This
->element
.node
.dispex
), riid
, rgszNames
,
92 cNames
, lcid
, rgDispId
);
95 static HRESULT WINAPI
HTMLIFrameBase_Invoke(IHTMLFrameBase
*iface
, DISPID dispIdMember
,
96 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
97 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
99 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
101 return IDispatchEx_Invoke(DISPATCHEX(&This
->element
.node
.dispex
), dispIdMember
, riid
, lcid
,
102 wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
105 static HRESULT WINAPI
HTMLIFrameBase_put_src(IHTMLFrameBase
*iface
, BSTR v
)
107 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
108 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
112 static HRESULT WINAPI
HTMLIFrameBase_get_src(IHTMLFrameBase
*iface
, BSTR
*p
)
114 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
115 FIXME("(%p)->(%p)\n", This
, p
);
119 static HRESULT WINAPI
HTMLIFrameBase_put_name(IHTMLFrameBase
*iface
, BSTR v
)
121 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
122 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
126 static HRESULT WINAPI
HTMLIFrameBase_get_name(IHTMLFrameBase
*iface
, BSTR
*p
)
128 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
129 FIXME("(%p)->(%p)\n", This
, p
);
133 static HRESULT WINAPI
HTMLIFrameBase_put_border(IHTMLFrameBase
*iface
, VARIANT v
)
135 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
136 FIXME("(%p)->(%s)\n", This
, debugstr_variant(&v
));
140 static HRESULT WINAPI
HTMLIFrameBase_get_border(IHTMLFrameBase
*iface
, VARIANT
*p
)
142 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
143 FIXME("(%p)->(%p)\n", This
, p
);
147 static HRESULT WINAPI
HTMLIFrameBase_put_frameBorder(IHTMLFrameBase
*iface
, BSTR v
)
149 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
150 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
154 static HRESULT WINAPI
HTMLIFrameBase_get_frameBorder(IHTMLFrameBase
*iface
, BSTR
*p
)
156 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
157 FIXME("(%p)->(%p)\n", This
, p
);
161 static HRESULT WINAPI
HTMLIFrameBase_put_frameSpacing(IHTMLFrameBase
*iface
, VARIANT v
)
163 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
164 FIXME("(%p)->(%s)\n", This
, debugstr_variant(&v
));
168 static HRESULT WINAPI
HTMLIFrameBase_get_frameSpacing(IHTMLFrameBase
*iface
, VARIANT
*p
)
170 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
171 FIXME("(%p)->(%p)\n", This
, p
);
175 static HRESULT WINAPI
HTMLIFrameBase_put_marginWidth(IHTMLFrameBase
*iface
, VARIANT v
)
177 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
178 FIXME("(%p)->(%s)\n", This
, debugstr_variant(&v
));
182 static HRESULT WINAPI
HTMLIFrameBase_get_marginWidth(IHTMLFrameBase
*iface
, VARIANT
*p
)
184 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
185 FIXME("(%p)->(%p)\n", This
, p
);
189 static HRESULT WINAPI
HTMLIFrameBase_put_marginHeight(IHTMLFrameBase
*iface
, VARIANT v
)
191 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
192 FIXME("(%p)->(%s)\n", This
, debugstr_variant(&v
));
196 static HRESULT WINAPI
HTMLIFrameBase_get_marginHeight(IHTMLFrameBase
*iface
, VARIANT
*p
)
198 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
199 FIXME("(%p)->(%p)\n", This
, p
);
203 static HRESULT WINAPI
HTMLIFrameBase_put_noResize(IHTMLFrameBase
*iface
, VARIANT_BOOL v
)
205 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
206 FIXME("(%p)->(%x)\n", This
, v
);
210 static HRESULT WINAPI
HTMLIFrameBase_get_noResize(IHTMLFrameBase
*iface
, VARIANT_BOOL
*p
)
212 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
213 FIXME("(%p)->(%p)\n", This
, p
);
217 static HRESULT WINAPI
HTMLIFrameBase_put_scrolling(IHTMLFrameBase
*iface
, BSTR v
)
219 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
220 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
224 static HRESULT WINAPI
HTMLIFrameBase_get_scrolling(IHTMLFrameBase
*iface
, BSTR
*p
)
226 HTMLIFrame
*This
= HTMLFRAMEBASE_THIS(iface
);
227 FIXME("(%p)->(%p)\n", This
, p
);
231 static const IHTMLFrameBaseVtbl HTMLIFrameBaseVtbl
= {
232 HTMLIFrameBase_QueryInterface
,
233 HTMLIFrameBase_AddRef
,
234 HTMLIFrameBase_Release
,
235 HTMLIFrameBase_GetTypeInfoCount
,
236 HTMLIFrameBase_GetTypeInfo
,
237 HTMLIFrameBase_GetIDsOfNames
,
238 HTMLIFrameBase_Invoke
,
239 HTMLIFrameBase_put_src
,
240 HTMLIFrameBase_get_src
,
241 HTMLIFrameBase_put_name
,
242 HTMLIFrameBase_get_name
,
243 HTMLIFrameBase_put_border
,
244 HTMLIFrameBase_get_border
,
245 HTMLIFrameBase_put_frameBorder
,
246 HTMLIFrameBase_get_frameBorder
,
247 HTMLIFrameBase_put_frameSpacing
,
248 HTMLIFrameBase_get_frameSpacing
,
249 HTMLIFrameBase_put_marginWidth
,
250 HTMLIFrameBase_get_marginWidth
,
251 HTMLIFrameBase_put_marginHeight
,
252 HTMLIFrameBase_get_marginHeight
,
253 HTMLIFrameBase_put_noResize
,
254 HTMLIFrameBase_get_noResize
,
255 HTMLIFrameBase_put_scrolling
,
256 HTMLIFrameBase_get_scrolling
259 #define HTMLFRAMEBASE2_THIS(iface) DEFINE_THIS(HTMLIFrame, IHTMLFrameBase2, iface)
261 static HRESULT WINAPI
HTMLIFrameBase2_QueryInterface(IHTMLFrameBase2
*iface
, REFIID riid
, void **ppv
)
263 HTMLIFrame
*This
= HTMLFRAMEBASE2_THIS(iface
);
265 return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This
->element
.node
), riid
, ppv
);
268 static ULONG WINAPI
HTMLIFrameBase2_AddRef(IHTMLFrameBase2
*iface
)
270 HTMLIFrame
*This
= HTMLFRAMEBASE2_THIS(iface
);
272 return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This
->element
.node
));
275 static ULONG WINAPI
HTMLIFrameBase2_Release(IHTMLFrameBase2
*iface
)
277 HTMLIFrame
*This
= HTMLFRAMEBASE2_THIS(iface
);
279 return IHTMLDOMNode_Release(HTMLDOMNODE(&This
->element
.node
));
282 static HRESULT WINAPI
HTMLIFrameBase2_GetTypeInfoCount(IHTMLFrameBase2
*iface
, UINT
*pctinfo
)
284 HTMLIFrame
*This
= HTMLFRAMEBASE2_THIS(iface
);
285 FIXME("(%p)\n", This
);
289 static HRESULT WINAPI
HTMLIFrameBase2_GetTypeInfo(IHTMLFrameBase2
*iface
, UINT iTInfo
,
290 LCID lcid
, ITypeInfo
**ppTInfo
)
292 HTMLIFrame
*This
= HTMLFRAMEBASE2_THIS(iface
);
293 FIXME("(%p)\n", This
);
297 static HRESULT WINAPI
HTMLIFrameBase2_GetIDsOfNames(IHTMLFrameBase2
*iface
, REFIID riid
,
298 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
300 HTMLIFrame
*This
= HTMLFRAMEBASE2_THIS(iface
);
301 FIXME("(%p)\n", This
);
305 static HRESULT WINAPI
HTMLIFrameBase2_Invoke(IHTMLFrameBase2
*iface
, DISPID dispIdMember
,
306 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
307 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
309 HTMLIFrame
*This
= HTMLFRAMEBASE2_THIS(iface
);
310 FIXME("(%p)\n", This
);
314 static HRESULT WINAPI
HTMLIFrameBase2_get_contentWindow(IHTMLFrameBase2
*iface
, IHTMLWindow2
**p
)
316 HTMLIFrame
*This
= HTMLFRAMEBASE2_THIS(iface
);
318 TRACE("(%p)->(%p)\n", This
, p
);
320 if(!This
->content_window
) {
321 nsIDOMWindow
*nswindow
;
322 nsIDOMDocument
*nsdoc
;
325 nsres
= nsIDOMHTMLIFrameElement_GetContentDocument(This
->nsiframe
, &nsdoc
);
326 if(NS_FAILED(nsres
)) {
327 ERR("GetContentDocument failed: %08x\n", nsres
);
332 FIXME("NULL contentDocument\n");
336 nswindow
= get_nsdoc_window(nsdoc
);
337 nsIDOMDocument_Release(nsdoc
);
341 This
->content_window
= nswindow_to_window(nswindow
);
342 nsIDOMWindow_Release(nswindow
);
343 if(!This
->content_window
) {
344 ERR("Could not get window object\n");
348 IHTMLWindow2_AddRef(HTMLWINDOW2(This
->content_window
));
351 IHTMLWindow2_AddRef(HTMLWINDOW2(This
->content_window
));
352 *p
= HTMLWINDOW2(This
->content_window
);
356 static HRESULT WINAPI
HTMLIFrameBase2_put_onload(IHTMLFrameBase2
*iface
, VARIANT v
)
358 HTMLIFrame
*This
= HTMLFRAMEBASE2_THIS(iface
);
359 FIXME("(%p)->(%s)\n", This
, debugstr_variant(&v
));
363 static HRESULT WINAPI
HTMLIFrameBase2_get_onload(IHTMLFrameBase2
*iface
, VARIANT
*p
)
365 HTMLIFrame
*This
= HTMLFRAMEBASE2_THIS(iface
);
366 FIXME("(%p)->(%p)\n", This
, p
);
370 static HRESULT WINAPI
HTMLIFrameBase2_put_onreadystatechange(IHTMLFrameBase2
*iface
, VARIANT v
)
372 HTMLIFrame
*This
= HTMLFRAMEBASE2_THIS(iface
);
373 FIXME("(%p)->(%s)\n", This
, debugstr_variant(&v
));
377 static HRESULT WINAPI
HTMLIFrameBase2_get_onreadystatechange(IHTMLFrameBase2
*iface
, VARIANT
*p
)
379 HTMLIFrame
*This
= HTMLFRAMEBASE2_THIS(iface
);
380 FIXME("(%p)->(%p)\n", This
, p
);
384 static HRESULT WINAPI
HTMLIFrameBase2_get_readyState(IHTMLFrameBase2
*iface
, BSTR
*p
)
386 HTMLIFrame
*This
= HTMLFRAMEBASE2_THIS(iface
);
387 FIXME("(%p)->(%p)\n", This
, p
);
391 static HRESULT WINAPI
HTMLIFrameBase2_put_allowTransparency(IHTMLFrameBase2
*iface
, VARIANT_BOOL v
)
393 HTMLIFrame
*This
= HTMLFRAMEBASE2_THIS(iface
);
394 FIXME("(%p)->(%x)\n", This
, v
);
398 static HRESULT WINAPI
HTMLIFrameBase2_get_allowTransparency(IHTMLFrameBase2
*iface
, VARIANT_BOOL
*p
)
400 HTMLIFrame
*This
= HTMLFRAMEBASE2_THIS(iface
);
401 FIXME("(%p)->(%p)\n", This
, p
);
405 #undef HTMLFRAMEBASE2_THIS
407 static const IHTMLFrameBase2Vtbl HTMLIFrameBase2Vtbl
= {
408 HTMLIFrameBase2_QueryInterface
,
409 HTMLIFrameBase2_AddRef
,
410 HTMLIFrameBase2_Release
,
411 HTMLIFrameBase2_GetTypeInfoCount
,
412 HTMLIFrameBase2_GetTypeInfo
,
413 HTMLIFrameBase2_GetIDsOfNames
,
414 HTMLIFrameBase2_Invoke
,
415 HTMLIFrameBase2_get_contentWindow
,
416 HTMLIFrameBase2_put_onload
,
417 HTMLIFrameBase2_get_onload
,
418 HTMLIFrameBase2_put_onreadystatechange
,
419 HTMLIFrameBase2_get_onreadystatechange
,
420 HTMLIFrameBase2_get_readyState
,
421 HTMLIFrameBase2_put_allowTransparency
,
422 HTMLIFrameBase2_get_allowTransparency
425 #define HTMLIFRAME_NODE_THIS(iface) DEFINE_THIS2(HTMLIFrame, element.node, iface)
427 static HRESULT
HTMLIFrame_QI(HTMLDOMNode
*iface
, REFIID riid
, void **ppv
)
429 HTMLIFrame
*This
= HTMLIFRAME_NODE_THIS(iface
);
433 if(IsEqualGUID(&IID_IHTMLFrameBase
, riid
)) {
434 TRACE("(%p)->(IID_IHTMLFrameBase %p)\n", This
, ppv
);
435 *ppv
= HTMLFRAMEBASE(This
);
436 }else if(IsEqualGUID(&IID_IHTMLFrameBase2
, riid
)) {
437 TRACE("(%p)->(IID_IHTMLFrameBase2 %p)\n", This
, ppv
);
438 *ppv
= HTMLFRAMEBASE2(This
);
440 return HTMLElement_QI(&This
->element
.node
, riid
, ppv
);
443 IUnknown_AddRef((IUnknown
*)*ppv
);
447 static void HTMLIFrame_destructor(HTMLDOMNode
*iface
)
449 HTMLIFrame
*This
= HTMLIFRAME_NODE_THIS(iface
);
451 if(This
->content_window
)
452 IHTMLWindow2_Release(HTMLWINDOW2(This
->content_window
));
454 nsIDOMHTMLIFrameElement_Release(This
->nsiframe
);
456 HTMLElement_destructor(&This
->element
.node
);
459 #undef HTMLIFRAME_NODE_THIS
461 static const NodeImplVtbl HTMLIFrameImplVtbl
= {
463 HTMLIFrame_destructor
466 static const tid_t HTMLIFrame_iface_tids
[] = {
477 static dispex_static_data_t HTMLIFrame_dispex
= {
481 HTMLIFrame_iface_tids
484 HTMLElement
*HTMLIFrame_Create(nsIDOMHTMLElement
*nselem
)
489 ret
= heap_alloc_zero(sizeof(HTMLIFrame
));
491 ret
->lpIHTMLFrameBaseVtbl
= &HTMLIFrameBaseVtbl
;
492 ret
->lpIHTMLFrameBase2Vtbl
= &HTMLIFrameBase2Vtbl
;
493 ret
->element
.node
.vtbl
= &HTMLIFrameImplVtbl
;
495 HTMLElement_Init(&ret
->element
, &HTMLIFrame_dispex
);
497 nsres
= nsIDOMHTMLElement_QueryInterface(nselem
, &IID_nsIDOMHTMLIFrameElement
, (void**)&ret
->nsiframe
);
499 ERR("Could not get nsIDOMHTMLIFrameElement iface: %08x\n", nsres
);
501 return &ret
->element
;