push 52d6b63ba2f2d4f9b02b6b922d27bff05a60596f
[wine/hacks.git] / dlls / mshtml / htmliframe.c
blob8b7c4f10d46d1ae33006dc2bb8bc8a93f9d5112f
1 /*
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
19 #include <stdarg.h>
21 #define COBJMACROS
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winuser.h"
26 #include "ole2.h"
28 #include "mshtml_private.h"
30 #include "wine/debug.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
34 typedef struct {
35 HTMLElement element;
36 const IHTMLFrameBaseVtbl *lpIHTMLFrameBaseVtbl;
37 const IHTMLFrameBase2Vtbl *lpIHTMLFrameBase2Vtbl;
39 LONG ref;
41 nsIDOMHTMLIFrameElement *nsiframe;
42 HTMLWindow *content_window;
43 } HTMLIFrame;
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));
109 return E_NOTIMPL;
112 static HRESULT WINAPI HTMLIFrameBase_get_src(IHTMLFrameBase *iface, BSTR *p)
114 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
115 FIXME("(%p)->(%p)\n", This, p);
116 return E_NOTIMPL;
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));
123 return E_NOTIMPL;
126 static HRESULT WINAPI HTMLIFrameBase_get_name(IHTMLFrameBase *iface, BSTR *p)
128 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
129 FIXME("(%p)->(%p)\n", This, p);
130 return E_NOTIMPL;
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));
137 return E_NOTIMPL;
140 static HRESULT WINAPI HTMLIFrameBase_get_border(IHTMLFrameBase *iface, VARIANT *p)
142 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
143 FIXME("(%p)->(%p)\n", This, p);
144 return E_NOTIMPL;
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));
151 return E_NOTIMPL;
154 static HRESULT WINAPI HTMLIFrameBase_get_frameBorder(IHTMLFrameBase *iface, BSTR *p)
156 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
157 FIXME("(%p)->(%p)\n", This, p);
158 return E_NOTIMPL;
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));
165 return E_NOTIMPL;
168 static HRESULT WINAPI HTMLIFrameBase_get_frameSpacing(IHTMLFrameBase *iface, VARIANT *p)
170 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
171 FIXME("(%p)->(%p)\n", This, p);
172 return E_NOTIMPL;
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));
179 return E_NOTIMPL;
182 static HRESULT WINAPI HTMLIFrameBase_get_marginWidth(IHTMLFrameBase *iface, VARIANT *p)
184 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
185 FIXME("(%p)->(%p)\n", This, p);
186 return E_NOTIMPL;
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));
193 return E_NOTIMPL;
196 static HRESULT WINAPI HTMLIFrameBase_get_marginHeight(IHTMLFrameBase *iface, VARIANT *p)
198 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
199 FIXME("(%p)->(%p)\n", This, p);
200 return E_NOTIMPL;
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);
207 return E_NOTIMPL;
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);
214 return E_NOTIMPL;
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));
221 return E_NOTIMPL;
224 static HRESULT WINAPI HTMLIFrameBase_get_scrolling(IHTMLFrameBase *iface, BSTR *p)
226 HTMLIFrame *This = HTMLFRAMEBASE_THIS(iface);
227 FIXME("(%p)->(%p)\n", This, p);
228 return E_NOTIMPL;
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);
286 return E_NOTIMPL;
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);
294 return E_NOTIMPL;
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);
302 return E_NOTIMPL;
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);
311 return E_NOTIMPL;
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;
323 nsresult nsres;
325 nsres = nsIDOMHTMLIFrameElement_GetContentDocument(This->nsiframe, &nsdoc);
326 if(NS_FAILED(nsres)) {
327 ERR("GetContentDocument failed: %08x\n", nsres);
328 return E_FAIL;
331 if(!nsdoc) {
332 FIXME("NULL contentDocument\n");
333 return E_FAIL;
336 nswindow = get_nsdoc_window(nsdoc);
337 nsIDOMDocument_Release(nsdoc);
338 if(!nswindow)
339 return E_FAIL;
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");
345 return E_FAIL;
348 IHTMLWindow2_AddRef(HTMLWINDOW2(This->content_window));
351 IHTMLWindow2_AddRef(HTMLWINDOW2(This->content_window));
352 *p = HTMLWINDOW2(This->content_window);
353 return S_OK;
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));
360 return E_NOTIMPL;
363 static HRESULT WINAPI HTMLIFrameBase2_get_onload(IHTMLFrameBase2 *iface, VARIANT *p)
365 HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface);
366 FIXME("(%p)->(%p)\n", This, p);
367 return E_NOTIMPL;
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));
374 return E_NOTIMPL;
377 static HRESULT WINAPI HTMLIFrameBase2_get_onreadystatechange(IHTMLFrameBase2 *iface, VARIANT *p)
379 HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface);
380 FIXME("(%p)->(%p)\n", This, p);
381 return E_NOTIMPL;
384 static HRESULT WINAPI HTMLIFrameBase2_get_readyState(IHTMLFrameBase2 *iface, BSTR *p)
386 HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface);
387 FIXME("(%p)->(%p)\n", This, p);
388 return E_NOTIMPL;
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);
395 return E_NOTIMPL;
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);
402 return E_NOTIMPL;
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);
431 *ppv = NULL;
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);
439 }else {
440 return HTMLElement_QI(&This->element.node, riid, ppv);
443 IUnknown_AddRef((IUnknown*)*ppv);
444 return S_OK;
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));
453 if(This->nsiframe)
454 nsIDOMHTMLIFrameElement_Release(This->nsiframe);
456 HTMLElement_destructor(&This->element.node);
459 #undef HTMLIFRAME_NODE_THIS
461 static const NodeImplVtbl HTMLIFrameImplVtbl = {
462 HTMLIFrame_QI,
463 HTMLIFrame_destructor
466 static const tid_t HTMLIFrame_iface_tids[] = {
467 IHTMLDOMNode_tid,
468 IHTMLDOMNode2_tid,
469 IHTMLElement_tid,
470 IHTMLElement2_tid,
471 IHTMLElement3_tid,
472 IHTMLFrameBase_tid,
473 IHTMLFrameBase2_tid,
477 static dispex_static_data_t HTMLIFrame_dispex = {
478 NULL,
479 DispHTMLIFrame_tid,
480 NULL,
481 HTMLIFrame_iface_tids
484 HTMLElement *HTMLIFrame_Create(nsIDOMHTMLElement *nselem)
486 HTMLIFrame *ret;
487 nsresult nsres;
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);
498 if(NS_FAILED(nsres))
499 ERR("Could not get nsIDOMHTMLIFrameElement iface: %08x\n", nsres);
501 return &ret->element;