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 static HRESULT create_content_window(HTMLIFrame *This, nsIDOMHTMLDocument *nsdoc, HTMLWindow **ret)
50 nsIDOMDocumentView *nsdocview;
51 nsIDOMAbstractView *nsview;
52 nsIDOMWindow *nswindow;
56 nsres = nsIDOMHTMLDocument_QueryInterface(nsdoc, &IID_nsIDOMDocumentView, (void**)&nsdocview);
57 if(NS_FAILED(nsres)) {
58 ERR("Could not get nsIDOMDocumentView: %08x\n", nsres);
62 nsres = nsIDOMDocumentView_GetDefaultView(nsdocview, &nsview);
63 nsIDOMDocumentView_Release(nsdocview);
64 if(NS_FAILED(nsres)) {
65 ERR("GetDefaultView failed: %08x\n", nsres);
69 nsres = nsIDOMAbstractView_QueryInterface(nsview, &IID_nsIDOMWindow, (void**)&nswindow);
70 nsIDOMAbstractView_Release(nsview);
71 if(NS_FAILED(nsres)) {
72 ERR("Coult not get nsIDOMWindow iface: %08x\n", nsres);
76 hres = HTMLWindow_Create(This->element.node.doc->basedoc.doc_obj, nswindow, ret);
78 nsIDOMWindow_Release(nswindow);
82 #define HTMLFRAMEBASE_THIS(iface) DEFINE_THIS(HTMLIFrame, IHTMLFrameBase, iface)
84 static HRESULT WINAPI HTMLIFrameBase_QueryInterface(IHTMLFrameBase *iface, REFIID riid, void **ppv)
86 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
88 return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->element.node), riid, ppv);
91 static ULONG WINAPI HTMLIFrameBase_AddRef(IHTMLFrameBase *iface)
93 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
95 return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node));
98 static ULONG WINAPI HTMLIFrameBase_Release(IHTMLFrameBase *iface)
100 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
102 return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node));
105 static HRESULT WINAPI HTMLIFrameBase_GetTypeInfoCount(IHTMLFrameBase *iface, UINT *pctinfo)
107 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
109 return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->element.node.dispex), pctinfo);
112 static HRESULT WINAPI HTMLIFrameBase_GetTypeInfo(IHTMLFrameBase *iface, UINT iTInfo,
113 LCID lcid, ITypeInfo **ppTInfo)
115 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
117 return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->element.node.dispex), iTInfo, lcid, ppTInfo);
120 static HRESULT WINAPI HTMLIFrameBase_GetIDsOfNames(IHTMLFrameBase *iface, REFIID riid,
121 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
123 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
125 return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->element.node.dispex), riid, rgszNames,
126 cNames, lcid, rgDispId);
129 static HRESULT WINAPI HTMLIFrameBase_Invoke(IHTMLFrameBase *iface, DISPID dispIdMember,
130 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
131 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
133 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
135 return IDispatchEx_Invoke(DISPATCHEX(&This->element.node.dispex), dispIdMember, riid, lcid,
136 wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
139 static HRESULT WINAPI HTMLIFrameBase_put_src(IHTMLFrameBase *iface, BSTR v)
141 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
142 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
146 static HRESULT WINAPI HTMLIFrameBase_get_src(IHTMLFrameBase *iface, BSTR *p)
148 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
149 FIXME("(%p)->(%p)\n", This, p);
153 static HRESULT WINAPI HTMLIFrameBase_put_name(IHTMLFrameBase *iface, BSTR v)
155 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
156 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
160 static HRESULT WINAPI HTMLIFrameBase_get_name(IHTMLFrameBase *iface, BSTR *p)
162 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
163 FIXME("(%p)->(%p)\n", This, p);
167 static HRESULT WINAPI HTMLIFrameBase_put_border(IHTMLFrameBase *iface, VARIANT v)
169 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
170 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
174 static HRESULT WINAPI HTMLIFrameBase_get_border(IHTMLFrameBase *iface, VARIANT *p)
176 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
177 FIXME("(%p)->(%p)\n", This, p);
181 static HRESULT WINAPI HTMLIFrameBase_put_frameBorder(IHTMLFrameBase *iface, BSTR v)
183 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
184 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
188 static HRESULT WINAPI HTMLIFrameBase_get_frameBorder(IHTMLFrameBase *iface, BSTR *p)
190 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
191 FIXME("(%p)->(%p)\n", This, p);
195 static HRESULT WINAPI HTMLIFrameBase_put_frameSpacing(IHTMLFrameBase *iface, VARIANT v)
197 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
198 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
202 static HRESULT WINAPI HTMLIFrameBase_get_frameSpacing(IHTMLFrameBase *iface, VARIANT *p)
204 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
205 FIXME("(%p)->(%p)\n", This, p);
209 static HRESULT WINAPI HTMLIFrameBase_put_marginWidth(IHTMLFrameBase *iface, VARIANT v)
211 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
212 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
216 static HRESULT WINAPI HTMLIFrameBase_get_marginWidth(IHTMLFrameBase *iface, VARIANT *p)
218 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
219 FIXME("(%p)->(%p)\n", This, p);
223 static HRESULT WINAPI HTMLIFrameBase_put_marginHeight(IHTMLFrameBase *iface, VARIANT v)
225 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
226 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
230 static HRESULT WINAPI HTMLIFrameBase_get_marginHeight(IHTMLFrameBase *iface, VARIANT *p)
232 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
233 FIXME("(%p)->(%p)\n", This, p);
237 static HRESULT WINAPI HTMLIFrameBase_put_noResize(IHTMLFrameBase *iface, VARIANT_BOOL v)
239 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
240 FIXME("(%p)->(%x)\n", This, v);
244 static HRESULT WINAPI HTMLIFrameBase_get_noResize(IHTMLFrameBase *iface, VARIANT_BOOL *p)
246 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
247 FIXME("(%p)->(%p)\n", This, p);
251 static HRESULT WINAPI HTMLIFrameBase_put_scrolling(IHTMLFrameBase *iface, BSTR v)
253 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
254 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
258 static HRESULT WINAPI HTMLIFrameBase_get_scrolling(IHTMLFrameBase *iface, BSTR *p)
260 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
261 FIXME("(%p)->(%p)\n", This, p);
265 static const IHTMLFrameBaseVtbl HTMLIFrameBaseVtbl = {
266 HTMLIFrameBase_QueryInterface,
267 HTMLIFrameBase_AddRef,
268 HTMLIFrameBase_Release,
269 HTMLIFrameBase_GetTypeInfoCount,
270 HTMLIFrameBase_GetTypeInfo,
271 HTMLIFrameBase_GetIDsOfNames,
272 HTMLIFrameBase_Invoke,
273 HTMLIFrameBase_put_src,
274 HTMLIFrameBase_get_src,
275 HTMLIFrameBase_put_name,
276 HTMLIFrameBase_get_name,
277 HTMLIFrameBase_put_border,
278 HTMLIFrameBase_get_border,
279 HTMLIFrameBase_put_frameBorder,
280 HTMLIFrameBase_get_frameBorder,
281 HTMLIFrameBase_put_frameSpacing,
282 HTMLIFrameBase_get_frameSpacing,
283 HTMLIFrameBase_put_marginWidth,
284 HTMLIFrameBase_get_marginWidth,
285 HTMLIFrameBase_put_marginHeight,
286 HTMLIFrameBase_get_marginHeight,
287 HTMLIFrameBase_put_noResize,
288 HTMLIFrameBase_get_noResize,
289 HTMLIFrameBase_put_scrolling,
290 HTMLIFrameBase_get_scrolling
293 #define HTMLFRAMEBASE2_THIS(iface) DEFINE_THIS(HTMLIFrame, IHTMLFrameBase2, iface)
295 static HRESULT WINAPI HTMLIFrameBase2_QueryInterface(IHTMLFrameBase2 *iface, REFIID riid, void **ppv)
297 HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface);
299 return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->element.node), riid, ppv);
302 static ULONG WINAPI HTMLIFrameBase2_AddRef(IHTMLFrameBase2 *iface)
304 HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface);
306 return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node));
309 static ULONG WINAPI HTMLIFrameBase2_Release(IHTMLFrameBase2 *iface)
311 HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface);
313 return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node));
316 static HRESULT WINAPI HTMLIFrameBase2_GetTypeInfoCount(IHTMLFrameBase2 *iface, UINT *pctinfo)
318 HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface);
319 FIXME("(%p)\n", This);
323 static HRESULT WINAPI HTMLIFrameBase2_GetTypeInfo(IHTMLFrameBase2 *iface, UINT iTInfo,
324 LCID lcid, ITypeInfo **ppTInfo)
326 HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface);
327 FIXME("(%p)\n", This);
331 static HRESULT WINAPI HTMLIFrameBase2_GetIDsOfNames(IHTMLFrameBase2 *iface, REFIID riid,
332 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
334 HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface);
335 FIXME("(%p)\n", This);
339 static HRESULT WINAPI HTMLIFrameBase2_Invoke(IHTMLFrameBase2 *iface, DISPID dispIdMember,
340 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
341 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
343 HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface);
344 FIXME("(%p)\n", This);
348 static HRESULT WINAPI HTMLIFrameBase2_get_contentWindow(IHTMLFrameBase2 *iface, IHTMLWindow2 **p)
350 HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface);
352 TRACE("(%p)->(%p)\n", This, p);
354 if(!This->content_window) {
355 nsIDOMHTMLDocument *nshtmldoc;
356 HTMLDocumentNode *content_doc;
357 nsIDOMDocument *nsdoc;
362 nsres = nsIDOMHTMLIFrameElement_GetContentDocument(This->nsiframe, &nsdoc);
363 if(NS_FAILED(nsres)) {
364 ERR("GetContentDocument failed: %08x\n", nsres);
369 FIXME("NULL contentDocument\n");
373 nsres = nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMHTMLDocument, (void**)&nshtmldoc);
374 nsIDOMDocument_Release(nsdoc);
375 if(NS_FAILED(nsres)) {
376 ERR("Could not get nsIDOMHTMLDocument iface: %08x\n", nsres);
380 hres = create_content_window(This, nshtmldoc, &window);
382 nsIDOMHTMLDocument_Release(nshtmldoc);
386 hres = create_doc_from_nsdoc(nshtmldoc, This->element.node.doc->basedoc.doc_obj, window, &content_doc);
387 nsIDOMHTMLDocument_Release(nshtmldoc);
389 window_set_docnode(window, content_doc);
391 IHTMLWindow2_Release(HTMLWINDOW2(window));
392 htmldoc_release(&content_doc->basedoc);
396 This->content_window = window;
399 IHTMLWindow2_AddRef(HTMLWINDOW2(This->content_window));
400 *p = HTMLWINDOW2(This->content_window);
404 static HRESULT WINAPI HTMLIFrameBase2_put_onload(IHTMLFrameBase2 *iface, VARIANT v)
406 HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface);
407 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
411 static HRESULT WINAPI HTMLIFrameBase2_get_onload(IHTMLFrameBase2 *iface, VARIANT *p)
413 HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface);
414 FIXME("(%p)->(%p)\n", This, p);
418 static HRESULT WINAPI HTMLIFrameBase2_put_onreadystatechange(IHTMLFrameBase2 *iface, VARIANT v)
420 HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface);
421 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
425 static HRESULT WINAPI HTMLIFrameBase2_get_onreadystatechange(IHTMLFrameBase2 *iface, VARIANT *p)
427 HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface);
428 FIXME("(%p)->(%p)\n", This, p);
432 static HRESULT WINAPI HTMLIFrameBase2_get_readyState(IHTMLFrameBase2 *iface, BSTR *p)
434 HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface);
435 FIXME("(%p)->(%p)\n", This, p);
439 static HRESULT WINAPI HTMLIFrameBase2_put_allowTransparency(IHTMLFrameBase2 *iface, VARIANT_BOOL v)
441 HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface);
442 FIXME("(%p)->(%x)\n", This, v);
446 static HRESULT WINAPI HTMLIFrameBase2_get_allowTransparency(IHTMLFrameBase2 *iface, VARIANT_BOOL *p)
448 HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface);
449 FIXME("(%p)->(%p)\n", This, p);
453 #undef HTMLFRAMEBASE2_THIS
455 static const IHTMLFrameBase2Vtbl HTMLIFrameBase2Vtbl = {
456 HTMLIFrameBase2_QueryInterface,
457 HTMLIFrameBase2_AddRef,
458 HTMLIFrameBase2_Release,
459 HTMLIFrameBase2_GetTypeInfoCount,
460 HTMLIFrameBase2_GetTypeInfo,
461 HTMLIFrameBase2_GetIDsOfNames,
462 HTMLIFrameBase2_Invoke,
463 HTMLIFrameBase2_get_contentWindow,
464 HTMLIFrameBase2_put_onload,
465 HTMLIFrameBase2_get_onload,
466 HTMLIFrameBase2_put_onreadystatechange,
467 HTMLIFrameBase2_get_onreadystatechange,
468 HTMLIFrameBase2_get_readyState,
469 HTMLIFrameBase2_put_allowTransparency,
470 HTMLIFrameBase2_get_allowTransparency
473 #define HTMLIFRAME_NODE_THIS(iface) DEFINE_THIS2(HTMLIFrame, element.node, iface)
475 static HRESULT HTMLIFrame_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
477 HTMLIFrame *This = HTMLIFRAME_NODE_THIS(iface);
481 if(IsEqualGUID(&IID_IHTMLFrameBase, riid)) {
482 TRACE("(%p)->(IID_IHTMLFrameBase %p)\n", This, ppv);
483 *ppv = HTMLFRAMEBASE(This);
484 }else if(IsEqualGUID(&IID_IHTMLFrameBase2, riid)) {
485 TRACE("(%p)->(IID_IHTMLFrameBase2 %p)\n", This, ppv);
486 *ppv = HTMLFRAMEBASE2(This);
488 return HTMLElement_QI(&This->element.node, riid, ppv);
491 IUnknown_AddRef((IUnknown*)*ppv);
495 static void HTMLIFrame_destructor(HTMLDOMNode *iface)
497 HTMLIFrame *This = HTMLIFRAME_NODE_THIS(iface);
499 if(This->content_window)
500 IHTMLWindow2_Release(HTMLWINDOW2(This->content_window));
502 nsIDOMHTMLIFrameElement_Release(This->nsiframe);
504 HTMLElement_destructor(&This->element.node);
507 #undef HTMLIFRAME_NODE_THIS
509 static const NodeImplVtbl HTMLIFrameImplVtbl = {
511 HTMLIFrame_destructor
514 static const tid_t HTMLIFrame_iface_tids[] = {
525 static dispex_static_data_t HTMLIFrame_dispex = {
529 HTMLIFrame_iface_tids
532 HTMLElement *HTMLIFrame_Create(nsIDOMHTMLElement *nselem)
537 ret = heap_alloc_zero(sizeof(HTMLIFrame));
539 ret->lpIHTMLFrameBaseVtbl = &HTMLIFrameBaseVtbl;
540 ret->lpIHTMLFrameBase2Vtbl = &HTMLIFrameBase2Vtbl;
541 ret->element.node.vtbl = &HTMLIFrameImplVtbl;
543 HTMLElement_Init(&ret->element, &HTMLIFrame_dispex);
545 nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLIFrameElement, (void**)&ret->nsiframe);
547 ERR("Could not get nsIDOMHTMLIFrameElement iface: %08x\n", nsres);
549 return &ret->element;