d3d9: Fix Reset() with system memory buffers.
[wine.git] / dlls / mshtml / htmlframe.c
blob17a78e55a5f4bf7711ea57077a72192bca4e542e
1 /*
2 * Copyright 2008,2010 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>
20 #include <assert.h>
22 #define COBJMACROS
24 #include "windef.h"
25 #include "winbase.h"
26 #include "winuser.h"
27 #include "ole2.h"
29 #include "mshtml_private.h"
30 #include "binding.h"
31 #include "htmlevent.h"
33 #include "wine/debug.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
37 static const WCHAR autoW[] = {'a','u','t','o',0};
38 static const WCHAR yesW[] = {'y','e','s',0};
39 static const WCHAR noW[] = {'n','o',0};
40 static const WCHAR pxW[] = {'p','x',0};
42 static HRESULT set_frame_doc(HTMLFrameBase *frame, nsIDOMDocument *nsdoc)
44 mozIDOMWindowProxy *mozwindow;
45 HTMLOuterWindow *window;
46 nsresult nsres;
47 HRESULT hres = S_OK;
49 if(frame->content_window)
50 return S_OK;
52 nsres = nsIDOMDocument_GetDefaultView(nsdoc, &mozwindow);
53 if(NS_FAILED(nsres) || !mozwindow)
54 return E_FAIL;
56 window = mozwindow_to_window(mozwindow);
57 if(!window) {
58 nsIDOMWindow *nswindow;
59 nsres = mozIDOMWindowProxy_QueryInterface(mozwindow, &IID_nsIDOMWindow, (void**)&nswindow);
60 assert(nsres == NS_OK);
62 hres = HTMLOuterWindow_Create(frame->element.node.doc->basedoc.doc_obj, nswindow,
63 frame->element.node.doc->basedoc.window, &window);
64 nsIDOMWindow_Release(nswindow);
66 mozIDOMWindowProxy_Release(mozwindow);
67 if(FAILED(hres))
68 return hres;
70 frame->content_window = window;
71 window->frame_element = frame;
72 return S_OK;
75 static inline HTMLFrameBase *impl_from_IHTMLFrameBase(IHTMLFrameBase *iface)
77 return CONTAINING_RECORD(iface, HTMLFrameBase, IHTMLFrameBase_iface);
80 static HRESULT WINAPI HTMLFrameBase_QueryInterface(IHTMLFrameBase *iface, REFIID riid, void **ppv)
82 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
84 return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
87 static ULONG WINAPI HTMLFrameBase_AddRef(IHTMLFrameBase *iface)
89 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
91 return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
94 static ULONG WINAPI HTMLFrameBase_Release(IHTMLFrameBase *iface)
96 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
98 return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
101 static HRESULT WINAPI HTMLFrameBase_GetTypeInfoCount(IHTMLFrameBase *iface, UINT *pctinfo)
103 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
105 return IDispatchEx_GetTypeInfoCount(&This->element.node.event_target.dispex.IDispatchEx_iface, pctinfo);
108 static HRESULT WINAPI HTMLFrameBase_GetTypeInfo(IHTMLFrameBase *iface, UINT iTInfo,
109 LCID lcid, ITypeInfo **ppTInfo)
111 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
113 return IDispatchEx_GetTypeInfo(&This->element.node.event_target.dispex.IDispatchEx_iface, iTInfo, lcid,
114 ppTInfo);
117 static HRESULT WINAPI HTMLFrameBase_GetIDsOfNames(IHTMLFrameBase *iface, REFIID riid,
118 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
120 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
122 return IDispatchEx_GetIDsOfNames(&This->element.node.event_target.dispex.IDispatchEx_iface, riid, rgszNames,
123 cNames, lcid, rgDispId);
126 static HRESULT WINAPI HTMLFrameBase_Invoke(IHTMLFrameBase *iface, DISPID dispIdMember,
127 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
128 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
130 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
132 return IDispatchEx_Invoke(&This->element.node.event_target.dispex.IDispatchEx_iface, dispIdMember, riid,
133 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
136 static HRESULT WINAPI HTMLFrameBase_put_src(IHTMLFrameBase *iface, BSTR v)
138 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
140 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
142 if(!This->content_window || !This->element.node.doc || !This->element.node.doc->basedoc.window) {
143 nsAString nsstr;
144 nsresult nsres;
146 nsAString_InitDepend(&nsstr, v);
147 if(This->nsframe)
148 nsres = nsIDOMHTMLFrameElement_SetSrc(This->nsframe, &nsstr);
149 else
150 nsres = nsIDOMHTMLIFrameElement_SetSrc(This->nsiframe, &nsstr);
151 nsAString_Finish(&nsstr);
152 if(NS_FAILED(nsres)) {
153 ERR("SetSrc failed: %08x\n", nsres);
154 return E_FAIL;
157 return S_OK;
160 return navigate_url(This->content_window, v, This->element.node.doc->basedoc.window->uri, BINDING_NAVIGATED);
163 static HRESULT WINAPI HTMLFrameBase_get_src(IHTMLFrameBase *iface, BSTR *p)
165 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
166 nsAString nsstr;
167 nsresult nsres;
169 TRACE("(%p)->(%p)\n", This, p);
171 if(!This->nsframe && !This->nsiframe) {
172 ERR("No attached frame object\n");
173 return E_UNEXPECTED;
176 nsAString_Init(&nsstr, NULL);
177 if(This->nsframe)
178 nsres = nsIDOMHTMLFrameElement_GetSrc(This->nsframe, &nsstr);
179 else
180 nsres = nsIDOMHTMLIFrameElement_GetSrc(This->nsiframe, &nsstr);
181 return return_nsstr(nsres, &nsstr, p);
184 static HRESULT WINAPI HTMLFrameBase_put_name(IHTMLFrameBase *iface, BSTR v)
186 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
187 nsAString name_str;
188 nsresult nsres;
190 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
192 if(!This->nsframe && !This->nsiframe) {
193 ERR("No attached ns frame object\n");
194 return E_UNEXPECTED;
197 nsAString_InitDepend(&name_str, v);
198 if(This->nsframe)
199 nsres = nsIDOMHTMLFrameElement_SetName(This->nsframe, &name_str);
200 else
201 nsres = nsIDOMHTMLIFrameElement_SetName(This->nsiframe, &name_str);
202 nsAString_Finish(&name_str);
203 if(NS_FAILED(nsres)) {
204 ERR("SetName failed: %08x\n", nsres);
205 return E_FAIL;
208 return S_OK;
211 static HRESULT WINAPI HTMLFrameBase_get_name(IHTMLFrameBase *iface, BSTR *p)
213 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
214 nsAString nsstr;
215 nsresult nsres;
217 TRACE("(%p)->(%p)\n", This, p);
219 if(!This->nsframe && !This->nsiframe) {
220 ERR("No attached ns frame object\n");
221 return E_UNEXPECTED;
224 nsAString_Init(&nsstr, NULL);
225 if(This->nsframe)
226 nsres = nsIDOMHTMLFrameElement_GetName(This->nsframe, &nsstr);
227 else
228 nsres = nsIDOMHTMLIFrameElement_GetName(This->nsiframe, &nsstr);
229 return return_nsstr(nsres, &nsstr, p);
232 static HRESULT WINAPI HTMLFrameBase_put_border(IHTMLFrameBase *iface, VARIANT v)
234 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
235 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
236 return E_NOTIMPL;
239 static HRESULT WINAPI HTMLFrameBase_get_border(IHTMLFrameBase *iface, VARIANT *p)
241 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
242 FIXME("(%p)->(%p)\n", This, p);
243 return E_NOTIMPL;
246 static HRESULT WINAPI HTMLFrameBase_put_frameBorder(IHTMLFrameBase *iface, BSTR v)
248 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
249 nsAString nsstr;
250 nsresult nsres;
252 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
254 if(!This->nsframe && !This->nsiframe) {
255 ERR("No attached ns frame object\n");
256 return E_UNEXPECTED;
259 nsAString_InitDepend(&nsstr, v);
260 if(This->nsframe)
261 nsres = nsIDOMHTMLFrameElement_SetFrameBorder(This->nsframe, &nsstr);
262 else
263 nsres = nsIDOMHTMLIFrameElement_SetFrameBorder(This->nsiframe, &nsstr);
264 nsAString_Finish(&nsstr);
265 if(NS_FAILED(nsres)) {
266 ERR("SetFrameBorder failed: %08x\n", nsres);
267 return E_FAIL;
270 return S_OK;
273 static HRESULT WINAPI HTMLFrameBase_get_frameBorder(IHTMLFrameBase *iface, BSTR *p)
275 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
276 nsAString nsstr;
277 nsresult nsres;
279 TRACE("(%p)->(%p)\n", This, p);
281 if(!This->nsframe && !This->nsiframe) {
282 ERR("No attached ns frame object\n");
283 return E_UNEXPECTED;
286 nsAString_Init(&nsstr, NULL);
287 if(This->nsframe)
288 nsres = nsIDOMHTMLFrameElement_GetFrameBorder(This->nsframe, &nsstr);
289 else
290 nsres = nsIDOMHTMLIFrameElement_GetFrameBorder(This->nsiframe, &nsstr);
291 return return_nsstr(nsres, &nsstr, p);
294 static HRESULT WINAPI HTMLFrameBase_put_frameSpacing(IHTMLFrameBase *iface, VARIANT v)
296 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
297 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
298 return E_NOTIMPL;
301 static HRESULT WINAPI HTMLFrameBase_get_frameSpacing(IHTMLFrameBase *iface, VARIANT *p)
303 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
304 FIXME("(%p)->(%p)\n", This, p);
305 return E_NOTIMPL;
308 static HRESULT WINAPI HTMLFrameBase_put_marginWidth(IHTMLFrameBase *iface, VARIANT v)
310 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
311 nsAString nsstr;
312 nsresult nsres;
314 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
316 if(V_VT(&v) != VT_BSTR) {
317 FIXME("unsupported %s\n", debugstr_variant(&v));
318 return E_NOTIMPL;
321 nsAString_InitDepend(&nsstr, V_BSTR(&v));
322 if(This->nsframe)
323 nsres = nsIDOMHTMLFrameElement_SetMarginWidth(This->nsframe, &nsstr);
324 else
325 nsres = nsIDOMHTMLIFrameElement_SetMarginWidth(This->nsiframe, &nsstr);
326 nsAString_Finish(&nsstr);
327 return NS_SUCCEEDED(nsres) ? S_OK : E_FAIL;
330 static HRESULT WINAPI HTMLFrameBase_get_marginWidth(IHTMLFrameBase *iface, VARIANT *p)
332 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
333 nsAString nsstr;
334 nsresult nsres;
335 HRESULT hres = S_OK;
337 TRACE("(%p)->(%p)\n", This, p);
339 nsAString_Init(&nsstr, NULL);
340 if(This->nsframe)
341 nsres = nsIDOMHTMLFrameElement_GetMarginWidth(This->nsframe, &nsstr);
342 else
343 nsres = nsIDOMHTMLIFrameElement_GetMarginWidth(This->nsiframe, &nsstr);
344 if(NS_SUCCEEDED(nsres)) {
345 const PRUnichar *str, *end;
347 nsAString_GetData(&nsstr, &str);
349 if(*str) {
350 BSTR ret;
352 end = strstrW(str, pxW);
353 if(!end)
354 end = str+strlenW(str);
355 ret = SysAllocStringLen(str, end-str);
356 if(ret) {
357 V_VT(p) = VT_BSTR;
358 V_BSTR(p) = ret;
359 }else {
360 hres = E_OUTOFMEMORY;
362 }else {
363 V_VT(p) = VT_BSTR;
364 V_BSTR(p) = NULL;
366 }else {
367 ERR("GetMarginWidth failed: %08x\n", nsres);
368 hres = E_FAIL;
371 nsAString_Finish(&nsstr);
372 return hres;
375 static HRESULT WINAPI HTMLFrameBase_put_marginHeight(IHTMLFrameBase *iface, VARIANT v)
377 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
378 nsAString nsstr;
379 nsresult nsres;
381 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
383 if(V_VT(&v) != VT_BSTR) {
384 FIXME("unsupported %s\n", debugstr_variant(&v));
385 return E_NOTIMPL;
388 nsAString_InitDepend(&nsstr, V_BSTR(&v));
389 if(This->nsframe)
390 nsres = nsIDOMHTMLFrameElement_SetMarginHeight(This->nsframe, &nsstr);
391 else
392 nsres = nsIDOMHTMLIFrameElement_SetMarginHeight(This->nsiframe, &nsstr);
393 nsAString_Finish(&nsstr);
394 return NS_SUCCEEDED(nsres) ? S_OK : E_FAIL;
397 static HRESULT WINAPI HTMLFrameBase_get_marginHeight(IHTMLFrameBase *iface, VARIANT *p)
399 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
400 nsAString nsstr;
401 nsresult nsres;
402 HRESULT hres = S_OK;
404 TRACE("(%p)->(%p)\n", This, p);
406 nsAString_Init(&nsstr, NULL);
407 if(This->nsframe)
408 nsres = nsIDOMHTMLFrameElement_GetMarginHeight(This->nsframe, &nsstr);
409 else
410 nsres = nsIDOMHTMLIFrameElement_GetMarginHeight(This->nsiframe, &nsstr);
411 if(NS_SUCCEEDED(nsres)) {
412 const PRUnichar *str, *end;
414 nsAString_GetData(&nsstr, &str);
416 if(*str) {
417 BSTR ret;
419 end = strstrW(str, pxW);
420 if(!end)
421 end = str+strlenW(str);
422 ret = SysAllocStringLen(str, end-str);
423 if(ret) {
424 V_VT(p) = VT_BSTR;
425 V_BSTR(p) = ret;
426 }else {
427 hres = E_OUTOFMEMORY;
429 }else {
430 V_VT(p) = VT_BSTR;
431 V_BSTR(p) = NULL;
433 }else {
434 ERR("SetMarginHeight failed: %08x\n", nsres);
435 hres = E_FAIL;
438 nsAString_Finish(&nsstr);
439 return hres;
442 static HRESULT WINAPI HTMLFrameBase_put_noResize(IHTMLFrameBase *iface, VARIANT_BOOL v)
444 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
445 FIXME("(%p)->(%x)\n", This, v);
446 return E_NOTIMPL;
449 static HRESULT WINAPI HTMLFrameBase_get_noResize(IHTMLFrameBase *iface, VARIANT_BOOL *p)
451 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
452 FIXME("(%p)->(%p)\n", This, p);
453 return E_NOTIMPL;
456 static HRESULT WINAPI HTMLFrameBase_put_scrolling(IHTMLFrameBase *iface, BSTR v)
458 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
459 nsAString nsstr;
460 nsresult nsres;
462 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
464 if(!(!strcmpiW(v, yesW) || !strcmpiW(v, noW) || !strcmpiW(v, autoW)))
465 return E_INVALIDARG;
467 if(This->nsframe) {
468 nsAString_InitDepend(&nsstr, v);
469 nsres = nsIDOMHTMLFrameElement_SetScrolling(This->nsframe, &nsstr);
470 }else if(This->nsiframe) {
471 nsAString_InitDepend(&nsstr, v);
472 nsres = nsIDOMHTMLIFrameElement_SetScrolling(This->nsiframe, &nsstr);
473 }else {
474 ERR("No attached ns frame object\n");
475 return E_UNEXPECTED;
477 nsAString_Finish(&nsstr);
479 if(NS_FAILED(nsres)) {
480 ERR("SetScrolling failed: 0x%08x\n", nsres);
481 return E_FAIL;
484 return S_OK;
487 static HRESULT WINAPI HTMLFrameBase_get_scrolling(IHTMLFrameBase *iface, BSTR *p)
489 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
490 nsAString nsstr;
491 const PRUnichar *strdata;
492 nsresult nsres;
494 TRACE("(%p)->(%p)\n", This, p);
496 if(This->nsframe) {
497 nsAString_Init(&nsstr, NULL);
498 nsres = nsIDOMHTMLFrameElement_GetScrolling(This->nsframe, &nsstr);
499 }else if(This->nsiframe) {
500 nsAString_Init(&nsstr, NULL);
501 nsres = nsIDOMHTMLIFrameElement_GetScrolling(This->nsiframe, &nsstr);
502 }else {
503 ERR("No attached ns frame object\n");
504 return E_UNEXPECTED;
507 if(NS_FAILED(nsres)) {
508 ERR("GetScrolling failed: 0x%08x\n", nsres);
509 nsAString_Finish(&nsstr);
510 return E_FAIL;
513 nsAString_GetData(&nsstr, &strdata);
515 if(*strdata)
516 *p = SysAllocString(strdata);
517 else
518 *p = SysAllocString(autoW);
520 nsAString_Finish(&nsstr);
522 return *p ? S_OK : E_OUTOFMEMORY;
525 static const IHTMLFrameBaseVtbl HTMLFrameBaseVtbl = {
526 HTMLFrameBase_QueryInterface,
527 HTMLFrameBase_AddRef,
528 HTMLFrameBase_Release,
529 HTMLFrameBase_GetTypeInfoCount,
530 HTMLFrameBase_GetTypeInfo,
531 HTMLFrameBase_GetIDsOfNames,
532 HTMLFrameBase_Invoke,
533 HTMLFrameBase_put_src,
534 HTMLFrameBase_get_src,
535 HTMLFrameBase_put_name,
536 HTMLFrameBase_get_name,
537 HTMLFrameBase_put_border,
538 HTMLFrameBase_get_border,
539 HTMLFrameBase_put_frameBorder,
540 HTMLFrameBase_get_frameBorder,
541 HTMLFrameBase_put_frameSpacing,
542 HTMLFrameBase_get_frameSpacing,
543 HTMLFrameBase_put_marginWidth,
544 HTMLFrameBase_get_marginWidth,
545 HTMLFrameBase_put_marginHeight,
546 HTMLFrameBase_get_marginHeight,
547 HTMLFrameBase_put_noResize,
548 HTMLFrameBase_get_noResize,
549 HTMLFrameBase_put_scrolling,
550 HTMLFrameBase_get_scrolling
553 static inline HTMLFrameBase *impl_from_IHTMLFrameBase2(IHTMLFrameBase2 *iface)
555 return CONTAINING_RECORD(iface, HTMLFrameBase, IHTMLFrameBase2_iface);
558 static HRESULT WINAPI HTMLFrameBase2_QueryInterface(IHTMLFrameBase2 *iface, REFIID riid, void **ppv)
560 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
562 return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
565 static ULONG WINAPI HTMLFrameBase2_AddRef(IHTMLFrameBase2 *iface)
567 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
569 return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
572 static ULONG WINAPI HTMLFrameBase2_Release(IHTMLFrameBase2 *iface)
574 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
576 return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
579 static HRESULT WINAPI HTMLFrameBase2_GetTypeInfoCount(IHTMLFrameBase2 *iface, UINT *pctinfo)
581 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
582 FIXME("(%p)\n", This);
583 return E_NOTIMPL;
586 static HRESULT WINAPI HTMLFrameBase2_GetTypeInfo(IHTMLFrameBase2 *iface, UINT iTInfo,
587 LCID lcid, ITypeInfo **ppTInfo)
589 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
590 FIXME("(%p)\n", This);
591 return E_NOTIMPL;
594 static HRESULT WINAPI HTMLFrameBase2_GetIDsOfNames(IHTMLFrameBase2 *iface, REFIID riid,
595 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
597 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
598 FIXME("(%p)\n", This);
599 return E_NOTIMPL;
602 static HRESULT WINAPI HTMLFrameBase2_Invoke(IHTMLFrameBase2 *iface, DISPID dispIdMember,
603 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
604 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
606 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
607 FIXME("(%p)\n", This);
608 return E_NOTIMPL;
611 static HRESULT WINAPI HTMLFrameBase2_get_contentWindow(IHTMLFrameBase2 *iface, IHTMLWindow2 **p)
613 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
615 TRACE("(%p)->(%p)\n", This, p);
617 if(This->content_window) {
618 IHTMLWindow2_AddRef(&This->content_window->base.IHTMLWindow2_iface);
619 *p = &This->content_window->base.IHTMLWindow2_iface;
620 }else {
621 WARN("NULL content window\n");
622 *p = NULL;
624 return S_OK;
627 static HRESULT WINAPI HTMLFrameBase2_put_onload(IHTMLFrameBase2 *iface, VARIANT v)
629 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
631 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
633 return set_node_event(&This->element.node, EVENTID_LOAD, &v);
636 static HRESULT WINAPI HTMLFrameBase2_get_onload(IHTMLFrameBase2 *iface, VARIANT *p)
638 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
640 TRACE("(%p)->(%p)\n", This, p);
642 return get_node_event(&This->element.node, EVENTID_LOAD, p);
645 static HRESULT WINAPI HTMLFrameBase2_put_onreadystatechange(IHTMLFrameBase2 *iface, VARIANT v)
647 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
648 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
649 return E_NOTIMPL;
652 static HRESULT WINAPI HTMLFrameBase2_get_onreadystatechange(IHTMLFrameBase2 *iface, VARIANT *p)
654 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
655 FIXME("(%p)->(%p)\n", This, p);
656 return E_NOTIMPL;
659 static HRESULT WINAPI HTMLFrameBase2_get_readyState(IHTMLFrameBase2 *iface, BSTR *p)
661 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
663 TRACE("(%p)->(%p)\n", This, p);
665 if(!This->content_window || !This->content_window->base.inner_window->doc) {
666 FIXME("no document associated\n");
667 return E_FAIL;
670 return IHTMLDocument2_get_readyState(&This->content_window->base.inner_window->doc->basedoc.IHTMLDocument2_iface, p);
673 static HRESULT WINAPI HTMLFrameBase2_put_allowTransparency(IHTMLFrameBase2 *iface, VARIANT_BOOL v)
675 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
677 FIXME("(%p)->(%x) semi-stub\n", This, v);
679 return S_OK;
682 static HRESULT WINAPI HTMLFrameBase2_get_allowTransparency(IHTMLFrameBase2 *iface, VARIANT_BOOL *p)
684 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
686 FIXME("(%p)->(%p) semi-stub\n", This, p);
688 *p = VARIANT_TRUE;
689 return S_OK;
692 static const IHTMLFrameBase2Vtbl HTMLFrameBase2Vtbl = {
693 HTMLFrameBase2_QueryInterface,
694 HTMLFrameBase2_AddRef,
695 HTMLFrameBase2_Release,
696 HTMLFrameBase2_GetTypeInfoCount,
697 HTMLFrameBase2_GetTypeInfo,
698 HTMLFrameBase2_GetIDsOfNames,
699 HTMLFrameBase2_Invoke,
700 HTMLFrameBase2_get_contentWindow,
701 HTMLFrameBase2_put_onload,
702 HTMLFrameBase2_get_onload,
703 HTMLFrameBase2_put_onreadystatechange,
704 HTMLFrameBase2_get_onreadystatechange,
705 HTMLFrameBase2_get_readyState,
706 HTMLFrameBase2_put_allowTransparency,
707 HTMLFrameBase2_get_allowTransparency
710 static HRESULT HTMLFrameBase_QI(HTMLFrameBase *This, REFIID riid, void **ppv)
712 if(IsEqualGUID(&IID_IHTMLFrameBase, riid)) {
713 TRACE("(%p)->(IID_IHTMLFrameBase %p)\n", This, ppv);
714 *ppv = &This->IHTMLFrameBase_iface;
715 }else if(IsEqualGUID(&IID_IHTMLFrameBase2, riid)) {
716 TRACE("(%p)->(IID_IHTMLFrameBase2 %p)\n", This, ppv);
717 *ppv = &This->IHTMLFrameBase2_iface;
718 }else {
719 return HTMLElement_QI(&This->element.node, riid, ppv);
722 IUnknown_AddRef((IUnknown*)*ppv);
723 return S_OK;
726 static void HTMLFrameBase_destructor(HTMLFrameBase *This)
728 if(This->content_window)
729 This->content_window->frame_element = NULL;
731 HTMLElement_destructor(&This->element.node);
734 static void HTMLFrameBase_Init(HTMLFrameBase *This, HTMLDocumentNode *doc, nsIDOMElement *nselem,
735 dispex_static_data_t *dispex_data)
737 nsresult nsres;
739 This->IHTMLFrameBase_iface.lpVtbl = &HTMLFrameBaseVtbl;
740 This->IHTMLFrameBase2_iface.lpVtbl = &HTMLFrameBase2Vtbl;
742 HTMLElement_Init(&This->element, doc, nselem, dispex_data);
744 nsres = nsIDOMElement_QueryInterface(nselem, &IID_nsIDOMHTMLFrameElement, (void**)&This->nsframe);
745 if(NS_FAILED(nsres)) {
746 This->nsframe = NULL;
747 nsres = nsIDOMElement_QueryInterface(nselem, &IID_nsIDOMHTMLIFrameElement, (void**)&This->nsiframe);
748 assert(nsres == NS_OK);
749 }else {
750 This->nsiframe = NULL;
754 struct HTMLFrameElement {
755 HTMLFrameBase framebase;
756 IHTMLFrameElement3 IHTMLFrameElement3_iface;
759 static inline HTMLFrameElement *impl_from_IHTMLFrameElement3(IHTMLFrameElement3 *iface)
761 return CONTAINING_RECORD(iface, HTMLFrameElement, IHTMLFrameElement3_iface);
764 static HRESULT WINAPI HTMLFrameElement3_QueryInterface(IHTMLFrameElement3 *iface,
765 REFIID riid, void **ppv)
767 HTMLFrameElement *This = impl_from_IHTMLFrameElement3(iface);
769 return IHTMLDOMNode_QueryInterface(&This->framebase.element.node.IHTMLDOMNode_iface, riid, ppv);
772 static ULONG WINAPI HTMLFrameElement3_AddRef(IHTMLFrameElement3 *iface)
774 HTMLFrameElement *This = impl_from_IHTMLFrameElement3(iface);
776 return IHTMLDOMNode_AddRef(&This->framebase.element.node.IHTMLDOMNode_iface);
779 static ULONG WINAPI HTMLFrameElement3_Release(IHTMLFrameElement3 *iface)
781 HTMLFrameElement *This = impl_from_IHTMLFrameElement3(iface);
783 return IHTMLDOMNode_Release(&This->framebase.element.node.IHTMLDOMNode_iface);
786 static HRESULT WINAPI HTMLFrameElement3_GetTypeInfoCount(IHTMLFrameElement3 *iface, UINT *pctinfo)
788 HTMLFrameElement *This = impl_from_IHTMLFrameElement3(iface);
789 return IDispatchEx_GetTypeInfoCount(&This->framebase.element.node.event_target.dispex.IDispatchEx_iface,
790 pctinfo);
793 static HRESULT WINAPI HTMLFrameElement3_GetTypeInfo(IHTMLFrameElement3 *iface, UINT iTInfo,
794 LCID lcid, ITypeInfo **ppTInfo)
796 HTMLFrameElement *This = impl_from_IHTMLFrameElement3(iface);
797 return IDispatchEx_GetTypeInfo(&This->framebase.element.node.event_target.dispex.IDispatchEx_iface, iTInfo,
798 lcid, ppTInfo);
801 static HRESULT WINAPI HTMLFrameElement3_GetIDsOfNames(IHTMLFrameElement3 *iface, REFIID riid,
802 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
804 HTMLFrameElement *This = impl_from_IHTMLFrameElement3(iface);
805 return IDispatchEx_GetIDsOfNames(&This->framebase.element.node.event_target.dispex.IDispatchEx_iface, riid,
806 rgszNames, cNames, lcid, rgDispId);
809 static HRESULT WINAPI HTMLFrameElement3_Invoke(IHTMLFrameElement3 *iface, DISPID dispIdMember,
810 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
811 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
813 HTMLFrameElement *This = impl_from_IHTMLFrameElement3(iface);
814 return IDispatchEx_Invoke(&This->framebase.element.node.event_target.dispex.IDispatchEx_iface, dispIdMember,
815 riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
818 static HRESULT WINAPI HTMLFrameElement3_get_contentDocument(IHTMLFrameElement3 *iface, IDispatch **p)
820 HTMLFrameElement *This = impl_from_IHTMLFrameElement3(iface);
821 IHTMLDocument2 *doc;
822 HRESULT hres;
824 TRACE("(%p)->(%p)\n", This, p);
826 if(!This->framebase.content_window) {
827 FIXME("NULL window\n");
828 return E_FAIL;
831 hres = IHTMLWindow2_get_document(&This->framebase.content_window->base.IHTMLWindow2_iface, &doc);
832 if(FAILED(hres))
833 return hres;
835 *p = doc ? (IDispatch*)doc : NULL;
836 return S_OK;
839 static HRESULT WINAPI HTMLFrameElement3_put_src(IHTMLFrameElement3 *iface, BSTR v)
841 HTMLFrameElement *This = impl_from_IHTMLFrameElement3(iface);
842 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
843 return E_NOTIMPL;
846 static HRESULT WINAPI HTMLFrameElement3_get_src(IHTMLFrameElement3 *iface, BSTR *p)
848 HTMLFrameElement *This = impl_from_IHTMLFrameElement3(iface);
849 FIXME("(%p)->(%p)\n", This, p);
850 return E_NOTIMPL;
853 static HRESULT WINAPI HTMLFrameElement3_put_longDesc(IHTMLFrameElement3 *iface, BSTR v)
855 HTMLFrameElement *This = impl_from_IHTMLFrameElement3(iface);
856 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
857 return E_NOTIMPL;
860 static HRESULT WINAPI HTMLFrameElement3_get_longDesc(IHTMLFrameElement3 *iface, BSTR *p)
862 HTMLFrameElement *This = impl_from_IHTMLFrameElement3(iface);
863 FIXME("(%p)->(%p)\n", This, p);
864 return E_NOTIMPL;
867 static HRESULT WINAPI HTMLFrameElement3_put_frameBorder(IHTMLFrameElement3 *iface, BSTR v)
869 HTMLFrameElement *This = impl_from_IHTMLFrameElement3(iface);
870 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
871 return E_NOTIMPL;
874 static HRESULT WINAPI HTMLFrameElement3_get_frameBorder(IHTMLFrameElement3 *iface, BSTR *p)
876 HTMLFrameElement *This = impl_from_IHTMLFrameElement3(iface);
877 FIXME("(%p)->(%p)\n", This, p);
878 return E_NOTIMPL;
881 static const IHTMLFrameElement3Vtbl HTMLFrameElement3Vtbl = {
882 HTMLFrameElement3_QueryInterface,
883 HTMLFrameElement3_AddRef,
884 HTMLFrameElement3_Release,
885 HTMLFrameElement3_GetTypeInfoCount,
886 HTMLFrameElement3_GetTypeInfo,
887 HTMLFrameElement3_GetIDsOfNames,
888 HTMLFrameElement3_Invoke,
889 HTMLFrameElement3_get_contentDocument,
890 HTMLFrameElement3_put_src,
891 HTMLFrameElement3_get_src,
892 HTMLFrameElement3_put_longDesc,
893 HTMLFrameElement3_get_longDesc,
894 HTMLFrameElement3_put_frameBorder,
895 HTMLFrameElement3_get_frameBorder
898 static inline HTMLFrameElement *frame_from_HTMLDOMNode(HTMLDOMNode *iface)
900 return CONTAINING_RECORD(iface, HTMLFrameElement, framebase.element.node);
903 static HRESULT HTMLFrameElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
905 HTMLFrameElement *This = frame_from_HTMLDOMNode(iface);
907 if(IsEqualGUID(&IID_IHTMLFrameElement3, riid)) {
908 TRACE("(%p)->(IID_IHTMLFrameElement3 %p)\n", This, ppv);
909 *ppv = &This->IHTMLFrameElement3_iface;
910 }else {
911 return HTMLFrameBase_QI(&This->framebase, riid, ppv);
914 IUnknown_AddRef((IUnknown*)*ppv);
915 return S_OK;
918 static void HTMLFrameElement_destructor(HTMLDOMNode *iface)
920 HTMLFrameElement *This = frame_from_HTMLDOMNode(iface);
922 HTMLFrameBase_destructor(&This->framebase);
925 static HRESULT HTMLFrameElement_get_document(HTMLDOMNode *iface, IDispatch **p)
927 HTMLFrameElement *This = frame_from_HTMLDOMNode(iface);
929 if(!This->framebase.content_window || !This->framebase.content_window->base.inner_window->doc) {
930 *p = NULL;
931 return S_OK;
934 *p = (IDispatch*)&This->framebase.content_window->base.inner_window->doc->basedoc.IHTMLDocument2_iface;
935 IDispatch_AddRef(*p);
936 return S_OK;
939 static HRESULT HTMLFrameElement_get_readystate(HTMLDOMNode *iface, BSTR *p)
941 HTMLFrameElement *This = frame_from_HTMLDOMNode(iface);
943 return IHTMLFrameBase2_get_readyState(&This->framebase.IHTMLFrameBase2_iface, p);
946 static HRESULT HTMLFrameElement_get_dispid(HTMLDOMNode *iface, BSTR name,
947 DWORD grfdex, DISPID *pid)
949 HTMLFrameElement *This = frame_from_HTMLDOMNode(iface);
951 if(!This->framebase.content_window)
952 return DISP_E_UNKNOWNNAME;
954 return search_window_props(This->framebase.content_window->base.inner_window, name, grfdex, pid);
957 static HRESULT HTMLFrameElement_invoke(HTMLDOMNode *iface, DISPID id, LCID lcid,
958 WORD flags, DISPPARAMS *params, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
960 HTMLFrameElement *This = frame_from_HTMLDOMNode(iface);
962 if(!This->framebase.content_window) {
963 ERR("no content window to invoke on\n");
964 return E_FAIL;
967 return IDispatchEx_InvokeEx(&This->framebase.content_window->base.IDispatchEx_iface, id, lcid,
968 flags, params, res, ei, caller);
971 static HRESULT HTMLFrameElement_bind_to_tree(HTMLDOMNode *iface)
973 HTMLFrameElement *This = frame_from_HTMLDOMNode(iface);
974 nsIDOMDocument *nsdoc;
975 nsresult nsres;
976 HRESULT hres;
978 nsres = nsIDOMHTMLFrameElement_GetContentDocument(This->framebase.nsframe, &nsdoc);
979 if(NS_FAILED(nsres) || !nsdoc) {
980 ERR("GetContentDocument failed: %08x\n", nsres);
981 return E_FAIL;
984 hres = set_frame_doc(&This->framebase, nsdoc);
985 nsIDOMDocument_Release(nsdoc);
986 return hres;
989 static void HTMLFrameElement_traverse(HTMLDOMNode *iface, nsCycleCollectionTraversalCallback *cb)
991 HTMLFrameElement *This = frame_from_HTMLDOMNode(iface);
993 if(This->framebase.nsframe)
994 note_cc_edge((nsISupports*)This->framebase.nsframe, "This->nsframe", cb);
997 static void HTMLFrameElement_unlink(HTMLDOMNode *iface)
999 HTMLFrameElement *This = frame_from_HTMLDOMNode(iface);
1001 if(This->framebase.nsframe) {
1002 nsIDOMHTMLFrameElement *nsframe = This->framebase.nsframe;
1004 This->framebase.nsframe = NULL;
1005 nsIDOMHTMLFrameElement_Release(nsframe);
1009 static const NodeImplVtbl HTMLFrameElementImplVtbl = {
1010 &CLSID_HTMLFrameElement,
1011 HTMLFrameElement_QI,
1012 HTMLFrameElement_destructor,
1013 HTMLElement_cpc,
1014 HTMLElement_clone,
1015 HTMLElement_handle_event,
1016 HTMLElement_get_attr_col,
1017 NULL,
1018 NULL,
1019 NULL,
1020 HTMLFrameElement_get_document,
1021 HTMLFrameElement_get_readystate,
1022 HTMLFrameElement_get_dispid,
1023 HTMLFrameElement_invoke,
1024 HTMLFrameElement_bind_to_tree,
1025 HTMLFrameElement_traverse,
1026 HTMLFrameElement_unlink
1029 static const tid_t HTMLFrameElement_iface_tids[] = {
1030 HTMLELEMENT_TIDS,
1031 IHTMLFrameBase_tid,
1032 IHTMLFrameBase2_tid,
1033 IHTMLFrameElement3_tid,
1037 static dispex_static_data_t HTMLFrameElement_dispex = {
1038 NULL,
1039 DispHTMLFrameElement_tid,
1040 HTMLFrameElement_iface_tids,
1041 HTMLElement_init_dispex_info
1044 HRESULT HTMLFrameElement_Create(HTMLDocumentNode *doc, nsIDOMElement *nselem, HTMLElement **elem)
1046 HTMLFrameElement *ret;
1048 ret = heap_alloc_zero(sizeof(HTMLFrameElement));
1049 if(!ret)
1050 return E_OUTOFMEMORY;
1052 ret->framebase.element.node.vtbl = &HTMLFrameElementImplVtbl;
1053 ret->IHTMLFrameElement3_iface.lpVtbl = &HTMLFrameElement3Vtbl;
1055 HTMLFrameBase_Init(&ret->framebase, doc, nselem, &HTMLFrameElement_dispex);
1057 *elem = &ret->framebase.element;
1058 return S_OK;
1061 struct HTMLIFrame {
1062 HTMLFrameBase framebase;
1063 IHTMLIFrameElement IHTMLIFrameElement_iface;
1064 IHTMLIFrameElement2 IHTMLIFrameElement2_iface;
1065 IHTMLIFrameElement3 IHTMLIFrameElement3_iface;
1068 static inline HTMLIFrame *impl_from_IHTMLIFrameElement(IHTMLIFrameElement *iface)
1070 return CONTAINING_RECORD(iface, HTMLIFrame, IHTMLIFrameElement_iface);
1073 static HRESULT WINAPI HTMLIFrameElement_QueryInterface(IHTMLIFrameElement *iface,
1074 REFIID riid, void **ppv)
1076 HTMLIFrame *This = impl_from_IHTMLIFrameElement(iface);
1078 return IHTMLDOMNode_QueryInterface(&This->framebase.element.node.IHTMLDOMNode_iface, riid, ppv);
1081 static ULONG WINAPI HTMLIFrameElement_AddRef(IHTMLIFrameElement *iface)
1083 HTMLIFrame *This = impl_from_IHTMLIFrameElement(iface);
1085 return IHTMLDOMNode_AddRef(&This->framebase.element.node.IHTMLDOMNode_iface);
1088 static ULONG WINAPI HTMLIFrameElement_Release(IHTMLIFrameElement *iface)
1090 HTMLIFrame *This = impl_from_IHTMLIFrameElement(iface);
1092 return IHTMLDOMNode_Release(&This->framebase.element.node.IHTMLDOMNode_iface);
1095 static HRESULT WINAPI HTMLIFrameElement_GetTypeInfoCount(IHTMLIFrameElement *iface, UINT *pctinfo)
1097 HTMLIFrame *This = impl_from_IHTMLIFrameElement(iface);
1098 return IDispatchEx_GetTypeInfoCount(&This->framebase.element.node.event_target.dispex.IDispatchEx_iface,
1099 pctinfo);
1102 static HRESULT WINAPI HTMLIFrameElement_GetTypeInfo(IHTMLIFrameElement *iface, UINT iTInfo,
1103 LCID lcid, ITypeInfo **ppTInfo)
1105 HTMLIFrame *This = impl_from_IHTMLIFrameElement(iface);
1106 return IDispatchEx_GetTypeInfo(&This->framebase.element.node.event_target.dispex.IDispatchEx_iface, iTInfo,
1107 lcid, ppTInfo);
1110 static HRESULT WINAPI HTMLIFrameElement_GetIDsOfNames(IHTMLIFrameElement *iface, REFIID riid,
1111 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
1113 HTMLIFrame *This = impl_from_IHTMLIFrameElement(iface);
1114 return IDispatchEx_GetIDsOfNames(&This->framebase.element.node.event_target.dispex.IDispatchEx_iface, riid,
1115 rgszNames, cNames, lcid, rgDispId);
1118 static HRESULT WINAPI HTMLIFrameElement_Invoke(IHTMLIFrameElement *iface, DISPID dispIdMember,
1119 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1120 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1122 HTMLIFrame *This = impl_from_IHTMLIFrameElement(iface);
1123 return IDispatchEx_Invoke(&This->framebase.element.node.event_target.dispex.IDispatchEx_iface, dispIdMember,
1124 riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
1127 static HRESULT WINAPI HTMLIFrameElement_put_vspace(IHTMLIFrameElement *iface, LONG v)
1129 HTMLIFrame *This = impl_from_IHTMLIFrameElement(iface);
1130 FIXME("(%p)->(%d)\n", This, v);
1131 return E_NOTIMPL;
1134 static HRESULT WINAPI HTMLIFrameElement_get_vspace(IHTMLIFrameElement *iface, LONG *p)
1136 HTMLIFrame *This = impl_from_IHTMLIFrameElement(iface);
1137 FIXME("(%p)->(%p)\n", This, p);
1138 return E_NOTIMPL;
1141 static HRESULT WINAPI HTMLIFrameElement_put_hspace(IHTMLIFrameElement *iface, LONG v)
1143 HTMLIFrame *This = impl_from_IHTMLIFrameElement(iface);
1144 FIXME("(%p)->(%d)\n", This, v);
1145 return E_NOTIMPL;
1148 static HRESULT WINAPI HTMLIFrameElement_get_hspace(IHTMLIFrameElement *iface, LONG *p)
1150 HTMLIFrame *This = impl_from_IHTMLIFrameElement(iface);
1151 FIXME("(%p)->(%p)\n", This, p);
1152 return E_NOTIMPL;
1155 static HRESULT WINAPI HTMLIFrameElement_put_align(IHTMLIFrameElement *iface, BSTR v)
1157 HTMLIFrame *This = impl_from_IHTMLIFrameElement(iface);
1158 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1159 return E_NOTIMPL;
1162 static HRESULT WINAPI HTMLIFrameElement_get_align(IHTMLIFrameElement *iface, BSTR *p)
1164 HTMLIFrame *This = impl_from_IHTMLIFrameElement(iface);
1165 FIXME("(%p)->(%p)\n", This, p);
1166 return E_NOTIMPL;
1169 static const IHTMLIFrameElementVtbl HTMLIFrameElementVtbl = {
1170 HTMLIFrameElement_QueryInterface,
1171 HTMLIFrameElement_AddRef,
1172 HTMLIFrameElement_Release,
1173 HTMLIFrameElement_GetTypeInfoCount,
1174 HTMLIFrameElement_GetTypeInfo,
1175 HTMLIFrameElement_GetIDsOfNames,
1176 HTMLIFrameElement_Invoke,
1177 HTMLIFrameElement_put_vspace,
1178 HTMLIFrameElement_get_vspace,
1179 HTMLIFrameElement_put_hspace,
1180 HTMLIFrameElement_get_hspace,
1181 HTMLIFrameElement_put_align,
1182 HTMLIFrameElement_get_align
1185 static inline HTMLIFrame *impl_from_IHTMLIFrameElement2(IHTMLIFrameElement2 *iface)
1187 return CONTAINING_RECORD(iface, HTMLIFrame, IHTMLIFrameElement2_iface);
1190 static HRESULT WINAPI HTMLIFrameElement2_QueryInterface(IHTMLIFrameElement2 *iface,
1191 REFIID riid, void **ppv)
1193 HTMLIFrame *This = impl_from_IHTMLIFrameElement2(iface);
1195 return IHTMLDOMNode_QueryInterface(&This->framebase.element.node.IHTMLDOMNode_iface, riid, ppv);
1198 static ULONG WINAPI HTMLIFrameElement2_AddRef(IHTMLIFrameElement2 *iface)
1200 HTMLIFrame *This = impl_from_IHTMLIFrameElement2(iface);
1202 return IHTMLDOMNode_AddRef(&This->framebase.element.node.IHTMLDOMNode_iface);
1205 static ULONG WINAPI HTMLIFrameElement2_Release(IHTMLIFrameElement2 *iface)
1207 HTMLIFrame *This = impl_from_IHTMLIFrameElement2(iface);
1209 return IHTMLDOMNode_Release(&This->framebase.element.node.IHTMLDOMNode_iface);
1212 static HRESULT WINAPI HTMLIFrameElement2_GetTypeInfoCount(IHTMLIFrameElement2 *iface, UINT *pctinfo)
1214 HTMLIFrame *This = impl_from_IHTMLIFrameElement2(iface);
1215 return IDispatchEx_GetTypeInfoCount(&This->framebase.element.node.event_target.dispex.IDispatchEx_iface,
1216 pctinfo);
1219 static HRESULT WINAPI HTMLIFrameElement2_GetTypeInfo(IHTMLIFrameElement2 *iface, UINT iTInfo,
1220 LCID lcid, ITypeInfo **ppTInfo)
1222 HTMLIFrame *This = impl_from_IHTMLIFrameElement2(iface);
1223 return IDispatchEx_GetTypeInfo(&This->framebase.element.node.event_target.dispex.IDispatchEx_iface, iTInfo,
1224 lcid, ppTInfo);
1227 static HRESULT WINAPI HTMLIFrameElement2_GetIDsOfNames(IHTMLIFrameElement2 *iface, REFIID riid,
1228 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
1230 HTMLIFrame *This = impl_from_IHTMLIFrameElement2(iface);
1231 return IDispatchEx_GetIDsOfNames(&This->framebase.element.node.event_target.dispex.IDispatchEx_iface, riid,
1232 rgszNames, cNames, lcid, rgDispId);
1235 static HRESULT WINAPI HTMLIFrameElement2_Invoke(IHTMLIFrameElement2 *iface, DISPID dispIdMember,
1236 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1237 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1239 HTMLIFrame *This = impl_from_IHTMLIFrameElement2(iface);
1240 return IDispatchEx_Invoke(&This->framebase.element.node.event_target.dispex.IDispatchEx_iface, dispIdMember,
1241 riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
1244 static HRESULT WINAPI HTMLIFrameElement2_put_height(IHTMLIFrameElement2 *iface, VARIANT v)
1246 HTMLIFrame *This = impl_from_IHTMLIFrameElement2(iface);
1247 nsAString nsstr;
1248 nsresult nsres;
1250 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1252 if(V_VT(&v) != VT_BSTR) {
1253 FIXME("Unsupported %s\n", debugstr_variant(&v));
1254 return E_NOTIMPL;
1257 nsAString_InitDepend(&nsstr, V_BSTR(&v));
1258 nsres = nsIDOMHTMLIFrameElement_SetHeight(This->framebase.nsiframe, &nsstr);
1259 nsAString_Finish(&nsstr);
1260 if(NS_FAILED(nsres)) {
1261 ERR("SetHeight failed: %08x\n", nsres);
1262 return E_FAIL;
1265 return S_OK;
1268 static HRESULT WINAPI HTMLIFrameElement2_get_height(IHTMLIFrameElement2 *iface, VARIANT *p)
1270 HTMLIFrame *This = impl_from_IHTMLIFrameElement2(iface);
1271 nsAString nsstr;
1272 nsresult nsres;
1274 TRACE("(%p)->(%p)\n", This, p);
1276 nsAString_Init(&nsstr, NULL);
1277 nsres = nsIDOMHTMLIFrameElement_GetHeight(This->framebase.nsiframe, &nsstr);
1279 V_VT(p) = VT_BSTR;
1280 return return_nsstr(nsres, &nsstr, &V_BSTR(p));
1283 static HRESULT WINAPI HTMLIFrameElement2_put_width(IHTMLIFrameElement2 *iface, VARIANT v)
1285 HTMLIFrame *This = impl_from_IHTMLIFrameElement2(iface);
1286 nsAString nsstr;
1287 nsresult nsres;
1289 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1291 if(V_VT(&v) != VT_BSTR) {
1292 FIXME("Unsupported %s\n", debugstr_variant(&v));
1293 return E_NOTIMPL;
1296 nsAString_InitDepend(&nsstr, V_BSTR(&v));
1297 nsres = nsIDOMHTMLIFrameElement_SetWidth(This->framebase.nsiframe, &nsstr);
1298 nsAString_Finish(&nsstr);
1299 if(NS_FAILED(nsres)) {
1300 ERR("SetWidth failed: %08x\n", nsres);
1301 return E_FAIL;
1304 return S_OK;
1307 static HRESULT WINAPI HTMLIFrameElement2_get_width(IHTMLIFrameElement2 *iface, VARIANT *p)
1309 HTMLIFrame *This = impl_from_IHTMLIFrameElement2(iface);
1310 nsAString nsstr;
1311 nsresult nsres;
1313 TRACE("(%p)->(%p)\n", This, p);
1315 nsAString_Init(&nsstr, NULL);
1316 nsres = nsIDOMHTMLIFrameElement_GetWidth(This->framebase.nsiframe, &nsstr);
1318 V_VT(p) = VT_BSTR;
1319 return return_nsstr(nsres, &nsstr, &V_BSTR(p));
1322 static const IHTMLIFrameElement2Vtbl HTMLIFrameElement2Vtbl = {
1323 HTMLIFrameElement2_QueryInterface,
1324 HTMLIFrameElement2_AddRef,
1325 HTMLIFrameElement2_Release,
1326 HTMLIFrameElement2_GetTypeInfoCount,
1327 HTMLIFrameElement2_GetTypeInfo,
1328 HTMLIFrameElement2_GetIDsOfNames,
1329 HTMLIFrameElement2_Invoke,
1330 HTMLIFrameElement2_put_height,
1331 HTMLIFrameElement2_get_height,
1332 HTMLIFrameElement2_put_width,
1333 HTMLIFrameElement2_get_width
1336 static inline HTMLIFrame *impl_from_IHTMLIFrameElement3(IHTMLIFrameElement3 *iface)
1338 return CONTAINING_RECORD(iface, HTMLIFrame, IHTMLIFrameElement3_iface);
1341 static HRESULT WINAPI HTMLIFrameElement3_QueryInterface(IHTMLIFrameElement3 *iface,
1342 REFIID riid, void **ppv)
1344 HTMLIFrame *This = impl_from_IHTMLIFrameElement3(iface);
1346 return IHTMLDOMNode_QueryInterface(&This->framebase.element.node.IHTMLDOMNode_iface, riid, ppv);
1349 static ULONG WINAPI HTMLIFrameElement3_AddRef(IHTMLIFrameElement3 *iface)
1351 HTMLIFrame *This = impl_from_IHTMLIFrameElement3(iface);
1353 return IHTMLDOMNode_AddRef(&This->framebase.element.node.IHTMLDOMNode_iface);
1356 static ULONG WINAPI HTMLIFrameElement3_Release(IHTMLIFrameElement3 *iface)
1358 HTMLIFrame *This = impl_from_IHTMLIFrameElement3(iface);
1360 return IHTMLDOMNode_Release(&This->framebase.element.node.IHTMLDOMNode_iface);
1363 static HRESULT WINAPI HTMLIFrameElement3_GetTypeInfoCount(IHTMLIFrameElement3 *iface, UINT *pctinfo)
1365 HTMLIFrame *This = impl_from_IHTMLIFrameElement3(iface);
1366 return IDispatchEx_GetTypeInfoCount(&This->framebase.element.node.event_target.dispex.IDispatchEx_iface,
1367 pctinfo);
1370 static HRESULT WINAPI HTMLIFrameElement3_GetTypeInfo(IHTMLIFrameElement3 *iface, UINT iTInfo,
1371 LCID lcid, ITypeInfo **ppTInfo)
1373 HTMLIFrame *This = impl_from_IHTMLIFrameElement3(iface);
1374 return IDispatchEx_GetTypeInfo(&This->framebase.element.node.event_target.dispex.IDispatchEx_iface, iTInfo,
1375 lcid, ppTInfo);
1378 static HRESULT WINAPI HTMLIFrameElement3_GetIDsOfNames(IHTMLIFrameElement3 *iface, REFIID riid,
1379 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
1381 HTMLIFrame *This = impl_from_IHTMLIFrameElement3(iface);
1382 return IDispatchEx_GetIDsOfNames(&This->framebase.element.node.event_target.dispex.IDispatchEx_iface, riid,
1383 rgszNames, cNames, lcid, rgDispId);
1386 static HRESULT WINAPI HTMLIFrameElement3_Invoke(IHTMLIFrameElement3 *iface, DISPID dispIdMember,
1387 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1388 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1390 HTMLIFrame *This = impl_from_IHTMLIFrameElement3(iface);
1391 return IDispatchEx_Invoke(&This->framebase.element.node.event_target.dispex.IDispatchEx_iface, dispIdMember,
1392 riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
1395 static HRESULT WINAPI HTMLIFrameElement3_get_contentDocument(IHTMLIFrameElement3 *iface, IDispatch **p)
1397 HTMLIFrame *This = impl_from_IHTMLIFrameElement3(iface);
1398 IHTMLDocument2 *doc;
1399 HRESULT hres;
1401 TRACE("(%p)->(%p)\n", This, p);
1403 if(!This->framebase.content_window) {
1404 *p = NULL;
1405 return S_OK;
1408 hres = IHTMLWindow2_get_document(&This->framebase.content_window->base.IHTMLWindow2_iface, &doc);
1409 *p = (IDispatch*)doc;
1410 return hres;
1413 static HRESULT WINAPI HTMLIFrameElement3_put_src(IHTMLIFrameElement3 *iface, BSTR v)
1415 HTMLIFrame *This = impl_from_IHTMLIFrameElement3(iface);
1416 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1417 return E_NOTIMPL;
1420 static HRESULT WINAPI HTMLIFrameElement3_get_src(IHTMLIFrameElement3 *iface, BSTR *p)
1422 HTMLIFrame *This = impl_from_IHTMLIFrameElement3(iface);
1423 FIXME("(%p)->(%p)\n", This, p);
1424 return E_NOTIMPL;
1427 static HRESULT WINAPI HTMLIFrameElement3_put_longDesc(IHTMLIFrameElement3 *iface, BSTR v)
1429 HTMLIFrame *This = impl_from_IHTMLIFrameElement3(iface);
1430 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1431 return E_NOTIMPL;
1434 static HRESULT WINAPI HTMLIFrameElement3_get_longDesc(IHTMLIFrameElement3 *iface, BSTR *p)
1436 HTMLIFrame *This = impl_from_IHTMLIFrameElement3(iface);
1437 FIXME("(%p)->(%p)\n", This, p);
1438 return E_NOTIMPL;
1441 static HRESULT WINAPI HTMLIFrameElement3_put_frameBorder(IHTMLIFrameElement3 *iface, BSTR v)
1443 HTMLIFrame *This = impl_from_IHTMLIFrameElement3(iface);
1444 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1445 return E_NOTIMPL;
1448 static HRESULT WINAPI HTMLIFrameElement3_get_frameBorder(IHTMLIFrameElement3 *iface, BSTR *p)
1450 HTMLIFrame *This = impl_from_IHTMLIFrameElement3(iface);
1451 FIXME("(%p)->(%p)\n", This, p);
1452 return E_NOTIMPL;
1455 static const IHTMLIFrameElement3Vtbl HTMLIFrameElement3Vtbl = {
1456 HTMLIFrameElement3_QueryInterface,
1457 HTMLIFrameElement3_AddRef,
1458 HTMLIFrameElement3_Release,
1459 HTMLIFrameElement3_GetTypeInfoCount,
1460 HTMLIFrameElement3_GetTypeInfo,
1461 HTMLIFrameElement3_GetIDsOfNames,
1462 HTMLIFrameElement3_Invoke,
1463 HTMLIFrameElement3_get_contentDocument,
1464 HTMLIFrameElement3_put_src,
1465 HTMLIFrameElement3_get_src,
1466 HTMLIFrameElement3_put_longDesc,
1467 HTMLIFrameElement3_get_longDesc,
1468 HTMLIFrameElement3_put_frameBorder,
1469 HTMLIFrameElement3_get_frameBorder
1472 static inline HTMLIFrame *iframe_from_HTMLDOMNode(HTMLDOMNode *iface)
1474 return CONTAINING_RECORD(iface, HTMLIFrame, framebase.element.node);
1477 static HRESULT HTMLIFrame_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
1479 HTMLIFrame *This = iframe_from_HTMLDOMNode(iface);
1481 if(IsEqualGUID(&IID_IHTMLIFrameElement, riid)) {
1482 TRACE("(%p)->(IID_IHTMLIFrameElement %p)\n", This, ppv);
1483 *ppv = &This->IHTMLIFrameElement_iface;
1484 }else if(IsEqualGUID(&IID_IHTMLIFrameElement2, riid)) {
1485 TRACE("(%p)->(IID_IHTMLIFrameElement2 %p)\n", This, ppv);
1486 *ppv = &This->IHTMLIFrameElement2_iface;
1487 }else if(IsEqualGUID(&IID_IHTMLIFrameElement3, riid)) {
1488 TRACE("(%p)->(IID_IHTMLIFrameElement3 %p)\n", This, ppv);
1489 *ppv = &This->IHTMLIFrameElement3_iface;
1490 }else {
1491 return HTMLFrameBase_QI(&This->framebase, riid, ppv);
1494 IUnknown_AddRef((IUnknown*)*ppv);
1495 return S_OK;
1498 static void HTMLIFrame_destructor(HTMLDOMNode *iface)
1500 HTMLIFrame *This = iframe_from_HTMLDOMNode(iface);
1502 HTMLFrameBase_destructor(&This->framebase);
1505 static HRESULT HTMLIFrame_get_document(HTMLDOMNode *iface, IDispatch **p)
1507 HTMLIFrame *This = iframe_from_HTMLDOMNode(iface);
1509 if(!This->framebase.content_window || !This->framebase.content_window->base.inner_window->doc) {
1510 *p = NULL;
1511 return S_OK;
1514 *p = (IDispatch*)&This->framebase.content_window->base.inner_window->doc->basedoc.IHTMLDocument2_iface;
1515 IDispatch_AddRef(*p);
1516 return S_OK;
1519 static HRESULT HTMLIFrame_get_dispid(HTMLDOMNode *iface, BSTR name,
1520 DWORD grfdex, DISPID *pid)
1522 HTMLIFrame *This = iframe_from_HTMLDOMNode(iface);
1524 if(!This->framebase.content_window)
1525 return DISP_E_UNKNOWNNAME;
1527 return search_window_props(This->framebase.content_window->base.inner_window, name, grfdex, pid);
1530 static HRESULT HTMLIFrame_invoke(HTMLDOMNode *iface, DISPID id, LCID lcid,
1531 WORD flags, DISPPARAMS *params, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
1533 HTMLIFrame *This = iframe_from_HTMLDOMNode(iface);
1535 if(!This->framebase.content_window) {
1536 ERR("no content window to invoke on\n");
1537 return E_FAIL;
1540 return IDispatchEx_InvokeEx(&This->framebase.content_window->base.IDispatchEx_iface, id, lcid,
1541 flags, params, res, ei, caller);
1544 static HRESULT HTMLIFrame_get_readystate(HTMLDOMNode *iface, BSTR *p)
1546 HTMLIFrame *This = iframe_from_HTMLDOMNode(iface);
1548 return IHTMLFrameBase2_get_readyState(&This->framebase.IHTMLFrameBase2_iface, p);
1551 static HRESULT HTMLIFrame_bind_to_tree(HTMLDOMNode *iface)
1553 HTMLIFrame *This = iframe_from_HTMLDOMNode(iface);
1554 nsIDOMDocument *nsdoc;
1555 nsresult nsres;
1556 HRESULT hres;
1558 nsres = nsIDOMHTMLIFrameElement_GetContentDocument(This->framebase.nsiframe, &nsdoc);
1559 if(NS_FAILED(nsres) || !nsdoc) {
1560 ERR("GetContentDocument failed: %08x\n", nsres);
1561 return E_FAIL;
1564 hres = set_frame_doc(&This->framebase, nsdoc);
1565 nsIDOMDocument_Release(nsdoc);
1566 return hres;
1569 static void HTMLIFrame_traverse(HTMLDOMNode *iface, nsCycleCollectionTraversalCallback *cb)
1571 HTMLIFrame *This = iframe_from_HTMLDOMNode(iface);
1573 if(This->framebase.nsiframe)
1574 note_cc_edge((nsISupports*)This->framebase.nsiframe, "This->nsiframe", cb);
1577 static void HTMLIFrame_unlink(HTMLDOMNode *iface)
1579 HTMLIFrame *This = iframe_from_HTMLDOMNode(iface);
1581 if(This->framebase.nsiframe) {
1582 nsIDOMHTMLIFrameElement *nsiframe = This->framebase.nsiframe;
1584 This->framebase.nsiframe = NULL;
1585 nsIDOMHTMLIFrameElement_Release(nsiframe);
1589 static const NodeImplVtbl HTMLIFrameImplVtbl = {
1590 &CLSID_HTMLIFrame,
1591 HTMLIFrame_QI,
1592 HTMLIFrame_destructor,
1593 HTMLElement_cpc,
1594 HTMLElement_clone,
1595 HTMLElement_handle_event,
1596 HTMLElement_get_attr_col,
1597 NULL,
1598 NULL,
1599 NULL,
1600 HTMLIFrame_get_document,
1601 HTMLIFrame_get_readystate,
1602 HTMLIFrame_get_dispid,
1603 HTMLIFrame_invoke,
1604 HTMLIFrame_bind_to_tree,
1605 HTMLIFrame_traverse,
1606 HTMLIFrame_unlink
1609 static const tid_t HTMLIFrame_iface_tids[] = {
1610 HTMLELEMENT_TIDS,
1611 IHTMLFrameBase_tid,
1612 IHTMLFrameBase2_tid,
1613 IHTMLIFrameElement_tid,
1614 IHTMLIFrameElement2_tid,
1615 IHTMLIFrameElement3_tid,
1619 static dispex_static_data_t HTMLIFrame_dispex = {
1620 NULL,
1621 DispHTMLIFrame_tid,
1622 HTMLIFrame_iface_tids,
1623 HTMLElement_init_dispex_info
1626 HRESULT HTMLIFrame_Create(HTMLDocumentNode *doc, nsIDOMElement *nselem, HTMLElement **elem)
1628 HTMLIFrame *ret;
1630 ret = heap_alloc_zero(sizeof(HTMLIFrame));
1631 if(!ret)
1632 return E_OUTOFMEMORY;
1634 ret->IHTMLIFrameElement_iface.lpVtbl = &HTMLIFrameElementVtbl;
1635 ret->IHTMLIFrameElement2_iface.lpVtbl = &HTMLIFrameElement2Vtbl;
1636 ret->IHTMLIFrameElement3_iface.lpVtbl = &HTMLIFrameElement3Vtbl;
1637 ret->framebase.element.node.vtbl = &HTMLIFrameImplVtbl;
1639 HTMLFrameBase_Init(&ret->framebase, doc, nselem, &HTMLIFrame_dispex);
1641 *elem = &ret->framebase.element;
1642 return S_OK;