Start source tree (final, I hope!) restructuration. Part 1/X
[reactos.git] / reactos / base / shell / ie / mshtml / htmlframebase.c
1 /*
2 * Copyright 2008 Jacek Caban for CodeWeavers
3 *
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.
8 *
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.
13 *
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
17 */
18
19 #include "mshtml_private.h"
20
21 static const WCHAR autoW[] = {'a','u','t','o',0};
22 static const WCHAR yesW[] = {'y','e','s',0};
23 static const WCHAR noW[] = {'n','o',0};
24 static const WCHAR pxW[] = {'p','x',0};
25
26 HRESULT set_frame_doc(HTMLFrameBase *frame, nsIDOMDocument *nsdoc)
27 {
28 nsIDOMWindow *nswindow;
29 HTMLOuterWindow *window;
30 nsresult nsres;
31 HRESULT hres = S_OK;
32
33 if(frame->content_window)
34 return S_OK;
35
36 nsres = nsIDOMDocument_GetDefaultView(nsdoc, &nswindow);
37 if(NS_FAILED(nsres) || !nswindow)
38 return E_FAIL;
39
40 window = nswindow_to_window(nswindow);
41 if(!window)
42 hres = HTMLOuterWindow_Create(frame->element.node.doc->basedoc.doc_obj, nswindow,
43 frame->element.node.doc->basedoc.window, &window);
44 nsIDOMWindow_Release(nswindow);
45 if(FAILED(hres))
46 return hres;
47
48 frame->content_window = window;
49 window->frame_element = frame;
50 return S_OK;
51 }
52
53 static inline HTMLFrameBase *impl_from_IHTMLFrameBase(IHTMLFrameBase *iface)
54 {
55 return CONTAINING_RECORD(iface, HTMLFrameBase, IHTMLFrameBase_iface);
56 }
57
58 static HRESULT WINAPI HTMLFrameBase_QueryInterface(IHTMLFrameBase *iface, REFIID riid, void **ppv)
59 {
60 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
61
62 return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
63 }
64
65 static ULONG WINAPI HTMLFrameBase_AddRef(IHTMLFrameBase *iface)
66 {
67 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
68
69 return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
70 }
71
72 static ULONG WINAPI HTMLFrameBase_Release(IHTMLFrameBase *iface)
73 {
74 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
75
76 return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
77 }
78
79 static HRESULT WINAPI HTMLFrameBase_GetTypeInfoCount(IHTMLFrameBase *iface, UINT *pctinfo)
80 {
81 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
82
83 return IDispatchEx_GetTypeInfoCount(&This->element.node.dispex.IDispatchEx_iface, pctinfo);
84 }
85
86 static HRESULT WINAPI HTMLFrameBase_GetTypeInfo(IHTMLFrameBase *iface, UINT iTInfo,
87 LCID lcid, ITypeInfo **ppTInfo)
88 {
89 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
90
91 return IDispatchEx_GetTypeInfo(&This->element.node.dispex.IDispatchEx_iface, iTInfo, lcid,
92 ppTInfo);
93 }
94
95 static HRESULT WINAPI HTMLFrameBase_GetIDsOfNames(IHTMLFrameBase *iface, REFIID riid,
96 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
97 {
98 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
99
100 return IDispatchEx_GetIDsOfNames(&This->element.node.dispex.IDispatchEx_iface, riid, rgszNames,
101 cNames, lcid, rgDispId);
102 }
103
104 static HRESULT WINAPI HTMLFrameBase_Invoke(IHTMLFrameBase *iface, DISPID dispIdMember,
105 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
106 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
107 {
108 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
109
110 return IDispatchEx_Invoke(&This->element.node.dispex.IDispatchEx_iface, dispIdMember, riid,
111 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
112 }
113
114 static HRESULT WINAPI HTMLFrameBase_put_src(IHTMLFrameBase *iface, BSTR v)
115 {
116 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
117
118 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
119
120 if(!This->content_window || !This->element.node.doc || !This->element.node.doc->basedoc.window) {
121 FIXME("detached element\n");
122 return E_FAIL;
123 }
124
125 return navigate_url(This->content_window, v, This->element.node.doc->basedoc.window->uri, BINDING_NAVIGATED);
126 }
127
128 static HRESULT WINAPI HTMLFrameBase_get_src(IHTMLFrameBase *iface, BSTR *p)
129 {
130 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
131 FIXME("(%p)->(%p)\n", This, p);
132 return E_NOTIMPL;
133 }
134
135 static HRESULT WINAPI HTMLFrameBase_put_name(IHTMLFrameBase *iface, BSTR v)
136 {
137 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
138 nsAString name_str;
139 nsresult nsres;
140
141 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
142
143 if(!This->nsframe && !This->nsiframe) {
144 ERR("No attached ns frame object\n");
145 return E_UNEXPECTED;
146 }
147
148 nsAString_InitDepend(&name_str, v);
149 if(This->nsframe)
150 nsres = nsIDOMHTMLFrameElement_SetName(This->nsframe, &name_str);
151 else
152 nsres = nsIDOMHTMLIFrameElement_SetName(This->nsiframe, &name_str);
153 nsAString_Finish(&name_str);
154 if(NS_FAILED(nsres)) {
155 ERR("SetName failed: %08x\n", nsres);
156 return E_FAIL;
157 }
158
159 return S_OK;
160 }
161
162 static HRESULT WINAPI HTMLFrameBase_get_name(IHTMLFrameBase *iface, BSTR *p)
163 {
164 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
165 nsAString nsstr;
166 nsresult nsres;
167
168 TRACE("(%p)->(%p)\n", This, p);
169
170 if(!This->nsframe && !This->nsiframe) {
171 ERR("No attached ns frame object\n");
172 return E_UNEXPECTED;
173 }
174
175 nsAString_Init(&nsstr, NULL);
176 if(This->nsframe)
177 nsres = nsIDOMHTMLFrameElement_GetName(This->nsframe, &nsstr);
178 else
179 nsres = nsIDOMHTMLIFrameElement_GetName(This->nsiframe, &nsstr);
180 return return_nsstr(nsres, &nsstr, p);
181 }
182
183 static HRESULT WINAPI HTMLFrameBase_put_border(IHTMLFrameBase *iface, VARIANT v)
184 {
185 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
186 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
187 return E_NOTIMPL;
188 }
189
190 static HRESULT WINAPI HTMLFrameBase_get_border(IHTMLFrameBase *iface, VARIANT *p)
191 {
192 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
193 FIXME("(%p)->(%p)\n", This, p);
194 return E_NOTIMPL;
195 }
196
197 static HRESULT WINAPI HTMLFrameBase_put_frameBorder(IHTMLFrameBase *iface, BSTR v)
198 {
199 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
200 nsAString nsstr;
201 nsresult nsres;
202
203 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
204
205 if(!This->nsframe && !This->nsiframe) {
206 ERR("No attached ns frame object\n");
207 return E_UNEXPECTED;
208 }
209
210 nsAString_InitDepend(&nsstr, v);
211 if(This->nsframe)
212 nsres = nsIDOMHTMLFrameElement_SetFrameBorder(This->nsframe, &nsstr);
213 else
214 nsres = nsIDOMHTMLIFrameElement_SetFrameBorder(This->nsiframe, &nsstr);
215 nsAString_Finish(&nsstr);
216 if(NS_FAILED(nsres)) {
217 ERR("SetFrameBorder failed: %08x\n", nsres);
218 return E_FAIL;
219 }
220
221 return S_OK;
222 }
223
224 static HRESULT WINAPI HTMLFrameBase_get_frameBorder(IHTMLFrameBase *iface, BSTR *p)
225 {
226 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
227 nsAString nsstr;
228 nsresult nsres;
229
230 TRACE("(%p)->(%p)\n", This, p);
231
232 if(!This->nsframe && !This->nsiframe) {
233 ERR("No attached ns frame object\n");
234 return E_UNEXPECTED;
235 }
236
237 nsAString_Init(&nsstr, NULL);
238 if(This->nsframe)
239 nsres = nsIDOMHTMLFrameElement_GetFrameBorder(This->nsframe, &nsstr);
240 else
241 nsres = nsIDOMHTMLIFrameElement_GetFrameBorder(This->nsiframe, &nsstr);
242 return return_nsstr(nsres, &nsstr, p);
243 }
244
245 static HRESULT WINAPI HTMLFrameBase_put_frameSpacing(IHTMLFrameBase *iface, VARIANT v)
246 {
247 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
248 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
249 return E_NOTIMPL;
250 }
251
252 static HRESULT WINAPI HTMLFrameBase_get_frameSpacing(IHTMLFrameBase *iface, VARIANT *p)
253 {
254 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
255 FIXME("(%p)->(%p)\n", This, p);
256 return E_NOTIMPL;
257 }
258
259 static HRESULT WINAPI HTMLFrameBase_put_marginWidth(IHTMLFrameBase *iface, VARIANT v)
260 {
261 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
262 nsAString nsstr;
263 nsresult nsres;
264
265 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
266
267 if(V_VT(&v) != VT_BSTR) {
268 FIXME("unsupported %s\n", debugstr_variant(&v));
269 return E_NOTIMPL;
270 }
271
272 nsAString_InitDepend(&nsstr, V_BSTR(&v));
273 if(This->nsframe)
274 nsres = nsIDOMHTMLFrameElement_SetMarginWidth(This->nsframe, &nsstr);
275 else
276 nsres = nsIDOMHTMLIFrameElement_SetMarginWidth(This->nsiframe, &nsstr);
277 nsAString_Finish(&nsstr);
278 return NS_SUCCEEDED(nsres) ? S_OK : E_FAIL;
279 }
280
281 static HRESULT WINAPI HTMLFrameBase_get_marginWidth(IHTMLFrameBase *iface, VARIANT *p)
282 {
283 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
284 nsAString nsstr;
285 nsresult nsres;
286 HRESULT hres = S_OK;
287
288 TRACE("(%p)->(%p)\n", This, p);
289
290 nsAString_Init(&nsstr, NULL);
291 if(This->nsframe)
292 nsres = nsIDOMHTMLFrameElement_GetMarginWidth(This->nsframe, &nsstr);
293 else
294 nsres = nsIDOMHTMLIFrameElement_GetMarginWidth(This->nsiframe, &nsstr);
295 if(NS_SUCCEEDED(nsres)) {
296 const PRUnichar *str, *end;
297
298 nsAString_GetData(&nsstr, &str);
299
300 if(*str) {
301 BSTR ret;
302
303 end = strstrW(str, pxW);
304 if(!end)
305 end = str+strlenW(str);
306 ret = SysAllocStringLen(str, end-str);
307 if(ret) {
308 V_VT(p) = VT_BSTR;
309 V_BSTR(p) = ret;
310 }else {
311 hres = E_OUTOFMEMORY;
312 }
313 }else {
314 V_VT(p) = VT_BSTR;
315 V_BSTR(p) = NULL;
316 }
317 }else {
318 ERR("GetMarginWidth failed: %08x\n", nsres);
319 hres = E_FAIL;
320 }
321
322 nsAString_Finish(&nsstr);
323 return hres;
324 }
325
326 static HRESULT WINAPI HTMLFrameBase_put_marginHeight(IHTMLFrameBase *iface, VARIANT v)
327 {
328 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
329 nsAString nsstr;
330 nsresult nsres;
331
332 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
333
334 if(V_VT(&v) != VT_BSTR) {
335 FIXME("unsupported %s\n", debugstr_variant(&v));
336 return E_NOTIMPL;
337 }
338
339 nsAString_InitDepend(&nsstr, V_BSTR(&v));
340 if(This->nsframe)
341 nsres = nsIDOMHTMLFrameElement_SetMarginHeight(This->nsframe, &nsstr);
342 else
343 nsres = nsIDOMHTMLIFrameElement_SetMarginHeight(This->nsiframe, &nsstr);
344 nsAString_Finish(&nsstr);
345 return NS_SUCCEEDED(nsres) ? S_OK : E_FAIL;
346 }
347
348 static HRESULT WINAPI HTMLFrameBase_get_marginHeight(IHTMLFrameBase *iface, VARIANT *p)
349 {
350 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
351 nsAString nsstr;
352 nsresult nsres;
353 HRESULT hres = S_OK;
354
355 TRACE("(%p)->(%p)\n", This, p);
356
357 nsAString_Init(&nsstr, NULL);
358 if(This->nsframe)
359 nsres = nsIDOMHTMLFrameElement_GetMarginHeight(This->nsframe, &nsstr);
360 else
361 nsres = nsIDOMHTMLIFrameElement_GetMarginHeight(This->nsiframe, &nsstr);
362 if(NS_SUCCEEDED(nsres)) {
363 const PRUnichar *str, *end;
364
365 nsAString_GetData(&nsstr, &str);
366
367 if(*str) {
368 BSTR ret;
369
370 end = strstrW(str, pxW);
371 if(!end)
372 end = str+strlenW(str);
373 ret = SysAllocStringLen(str, end-str);
374 if(ret) {
375 V_VT(p) = VT_BSTR;
376 V_BSTR(p) = ret;
377 }else {
378 hres = E_OUTOFMEMORY;
379 }
380 }else {
381 V_VT(p) = VT_BSTR;
382 V_BSTR(p) = NULL;
383 }
384 }else {
385 ERR("SetMarginHeight failed: %08x\n", nsres);
386 hres = E_FAIL;
387 }
388
389 nsAString_Finish(&nsstr);
390 return hres;
391 }
392
393 static HRESULT WINAPI HTMLFrameBase_put_noResize(IHTMLFrameBase *iface, VARIANT_BOOL v)
394 {
395 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
396 FIXME("(%p)->(%x)\n", This, v);
397 return E_NOTIMPL;
398 }
399
400 static HRESULT WINAPI HTMLFrameBase_get_noResize(IHTMLFrameBase *iface, VARIANT_BOOL *p)
401 {
402 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
403 FIXME("(%p)->(%p)\n", This, p);
404 return E_NOTIMPL;
405 }
406
407 static HRESULT WINAPI HTMLFrameBase_put_scrolling(IHTMLFrameBase *iface, BSTR v)
408 {
409 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
410 nsAString nsstr;
411 nsresult nsres;
412
413 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
414
415 if(!(!strcmpiW(v, yesW) || !strcmpiW(v, noW) || !strcmpiW(v, autoW)))
416 return E_INVALIDARG;
417
418 if(This->nsframe) {
419 nsAString_InitDepend(&nsstr, v);
420 nsres = nsIDOMHTMLFrameElement_SetScrolling(This->nsframe, &nsstr);
421 }else if(This->nsiframe) {
422 nsAString_InitDepend(&nsstr, v);
423 nsres = nsIDOMHTMLIFrameElement_SetScrolling(This->nsiframe, &nsstr);
424 }else {
425 ERR("No attached ns frame object\n");
426 return E_UNEXPECTED;
427 }
428 nsAString_Finish(&nsstr);
429
430 if(NS_FAILED(nsres)) {
431 ERR("SetScrolling failed: 0x%08x\n", nsres);
432 return E_FAIL;
433 }
434
435 return S_OK;
436 }
437
438 static HRESULT WINAPI HTMLFrameBase_get_scrolling(IHTMLFrameBase *iface, BSTR *p)
439 {
440 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface);
441 nsAString nsstr;
442 const PRUnichar *strdata;
443 nsresult nsres;
444
445 TRACE("(%p)->(%p)\n", This, p);
446
447 if(This->nsframe) {
448 nsAString_Init(&nsstr, NULL);
449 nsres = nsIDOMHTMLFrameElement_GetScrolling(This->nsframe, &nsstr);
450 }else if(This->nsiframe) {
451 nsAString_Init(&nsstr, NULL);
452 nsres = nsIDOMHTMLIFrameElement_GetScrolling(This->nsiframe, &nsstr);
453 }else {
454 ERR("No attached ns frame object\n");
455 return E_UNEXPECTED;
456 }
457
458 if(NS_FAILED(nsres)) {
459 ERR("GetScrolling failed: 0x%08x\n", nsres);
460 nsAString_Finish(&nsstr);
461 return E_FAIL;
462 }
463
464 nsAString_GetData(&nsstr, &strdata);
465
466 if(*strdata)
467 *p = SysAllocString(strdata);
468 else
469 *p = SysAllocString(autoW);
470
471 nsAString_Finish(&nsstr);
472
473 return *p ? S_OK : E_OUTOFMEMORY;
474 }
475
476 static const IHTMLFrameBaseVtbl HTMLFrameBaseVtbl = {
477 HTMLFrameBase_QueryInterface,
478 HTMLFrameBase_AddRef,
479 HTMLFrameBase_Release,
480 HTMLFrameBase_GetTypeInfoCount,
481 HTMLFrameBase_GetTypeInfo,
482 HTMLFrameBase_GetIDsOfNames,
483 HTMLFrameBase_Invoke,
484 HTMLFrameBase_put_src,
485 HTMLFrameBase_get_src,
486 HTMLFrameBase_put_name,
487 HTMLFrameBase_get_name,
488 HTMLFrameBase_put_border,
489 HTMLFrameBase_get_border,
490 HTMLFrameBase_put_frameBorder,
491 HTMLFrameBase_get_frameBorder,
492 HTMLFrameBase_put_frameSpacing,
493 HTMLFrameBase_get_frameSpacing,
494 HTMLFrameBase_put_marginWidth,
495 HTMLFrameBase_get_marginWidth,
496 HTMLFrameBase_put_marginHeight,
497 HTMLFrameBase_get_marginHeight,
498 HTMLFrameBase_put_noResize,
499 HTMLFrameBase_get_noResize,
500 HTMLFrameBase_put_scrolling,
501 HTMLFrameBase_get_scrolling
502 };
503
504 static inline HTMLFrameBase *impl_from_IHTMLFrameBase2(IHTMLFrameBase2 *iface)
505 {
506 return CONTAINING_RECORD(iface, HTMLFrameBase, IHTMLFrameBase2_iface);
507 }
508
509 static HRESULT WINAPI HTMLFrameBase2_QueryInterface(IHTMLFrameBase2 *iface, REFIID riid, void **ppv)
510 {
511 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
512
513 return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
514 }
515
516 static ULONG WINAPI HTMLFrameBase2_AddRef(IHTMLFrameBase2 *iface)
517 {
518 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
519
520 return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
521 }
522
523 static ULONG WINAPI HTMLFrameBase2_Release(IHTMLFrameBase2 *iface)
524 {
525 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
526
527 return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
528 }
529
530 static HRESULT WINAPI HTMLFrameBase2_GetTypeInfoCount(IHTMLFrameBase2 *iface, UINT *pctinfo)
531 {
532 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
533 FIXME("(%p)\n", This);
534 return E_NOTIMPL;
535 }
536
537 static HRESULT WINAPI HTMLFrameBase2_GetTypeInfo(IHTMLFrameBase2 *iface, UINT iTInfo,
538 LCID lcid, ITypeInfo **ppTInfo)
539 {
540 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
541 FIXME("(%p)\n", This);
542 return E_NOTIMPL;
543 }
544
545 static HRESULT WINAPI HTMLFrameBase2_GetIDsOfNames(IHTMLFrameBase2 *iface, REFIID riid,
546 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
547 {
548 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
549 FIXME("(%p)\n", This);
550 return E_NOTIMPL;
551 }
552
553 static HRESULT WINAPI HTMLFrameBase2_Invoke(IHTMLFrameBase2 *iface, DISPID dispIdMember,
554 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
555 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
556 {
557 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
558 FIXME("(%p)\n", This);
559 return E_NOTIMPL;
560 }
561
562 static HRESULT WINAPI HTMLFrameBase2_get_contentWindow(IHTMLFrameBase2 *iface, IHTMLWindow2 **p)
563 {
564 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
565
566 TRACE("(%p)->(%p)\n", This, p);
567
568 if(This->content_window) {
569 IHTMLWindow2_AddRef(&This->content_window->base.IHTMLWindow2_iface);
570 *p = &This->content_window->base.IHTMLWindow2_iface;
571 }else {
572 WARN("NULL content window\n");
573 *p = NULL;
574 }
575 return S_OK;
576 }
577
578 static HRESULT WINAPI HTMLFrameBase2_put_onload(IHTMLFrameBase2 *iface, VARIANT v)
579 {
580 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
581
582 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
583
584 return set_node_event(&This->element.node, EVENTID_LOAD, &v);
585 }
586
587 static HRESULT WINAPI HTMLFrameBase2_get_onload(IHTMLFrameBase2 *iface, VARIANT *p)
588 {
589 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
590
591 TRACE("(%p)->(%p)\n", This, p);
592
593 return get_node_event(&This->element.node, EVENTID_LOAD, p);
594 }
595
596 static HRESULT WINAPI HTMLFrameBase2_put_onreadystatechange(IHTMLFrameBase2 *iface, VARIANT v)
597 {
598 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
599 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
600 return E_NOTIMPL;
601 }
602
603 static HRESULT WINAPI HTMLFrameBase2_get_onreadystatechange(IHTMLFrameBase2 *iface, VARIANT *p)
604 {
605 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
606 FIXME("(%p)->(%p)\n", This, p);
607 return E_NOTIMPL;
608 }
609
610 static HRESULT WINAPI HTMLFrameBase2_get_readyState(IHTMLFrameBase2 *iface, BSTR *p)
611 {
612 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
613
614 TRACE("(%p)->(%p)\n", This, p);
615
616 if(!This->content_window || !This->content_window->base.inner_window->doc) {
617 FIXME("no document associated\n");
618 return E_FAIL;
619 }
620
621 return IHTMLDocument2_get_readyState(&This->content_window->base.inner_window->doc->basedoc.IHTMLDocument2_iface, p);
622 }
623
624 static HRESULT WINAPI HTMLFrameBase2_put_allowTransparency(IHTMLFrameBase2 *iface, VARIANT_BOOL v)
625 {
626 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
627 FIXME("(%p)->(%x)\n", This, v);
628 return E_NOTIMPL;
629 }
630
631 static HRESULT WINAPI HTMLFrameBase2_get_allowTransparency(IHTMLFrameBase2 *iface, VARIANT_BOOL *p)
632 {
633 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface);
634 FIXME("(%p)->(%p)\n", This, p);
635 return E_NOTIMPL;
636 }
637
638 static const IHTMLFrameBase2Vtbl HTMLFrameBase2Vtbl = {
639 HTMLFrameBase2_QueryInterface,
640 HTMLFrameBase2_AddRef,
641 HTMLFrameBase2_Release,
642 HTMLFrameBase2_GetTypeInfoCount,
643 HTMLFrameBase2_GetTypeInfo,
644 HTMLFrameBase2_GetIDsOfNames,
645 HTMLFrameBase2_Invoke,
646 HTMLFrameBase2_get_contentWindow,
647 HTMLFrameBase2_put_onload,
648 HTMLFrameBase2_get_onload,
649 HTMLFrameBase2_put_onreadystatechange,
650 HTMLFrameBase2_get_onreadystatechange,
651 HTMLFrameBase2_get_readyState,
652 HTMLFrameBase2_put_allowTransparency,
653 HTMLFrameBase2_get_allowTransparency
654 };
655
656 HRESULT HTMLFrameBase_QI(HTMLFrameBase *This, REFIID riid, void **ppv)
657 {
658 if(IsEqualGUID(&IID_IHTMLFrameBase, riid)) {
659 TRACE("(%p)->(IID_IHTMLFrameBase %p)\n", This, ppv);
660 *ppv = &This->IHTMLFrameBase_iface;
661 }else if(IsEqualGUID(&IID_IHTMLFrameBase2, riid)) {
662 TRACE("(%p)->(IID_IHTMLFrameBase2 %p)\n", This, ppv);
663 *ppv = &This->IHTMLFrameBase2_iface;
664 }else {
665 return HTMLElement_QI(&This->element.node, riid, ppv);
666 }
667
668 IUnknown_AddRef((IUnknown*)*ppv);
669 return S_OK;
670 }
671
672 void HTMLFrameBase_destructor(HTMLFrameBase *This)
673 {
674 if(This->content_window)
675 This->content_window->frame_element = NULL;
676
677 HTMLElement_destructor(&This->element.node);
678 }
679
680 void HTMLFrameBase_Init(HTMLFrameBase *This, HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem,
681 dispex_static_data_t *dispex_data)
682 {
683 nsresult nsres;
684
685 This->IHTMLFrameBase_iface.lpVtbl = &HTMLFrameBaseVtbl;
686 This->IHTMLFrameBase2_iface.lpVtbl = &HTMLFrameBase2Vtbl;
687
688 HTMLElement_Init(&This->element, doc, nselem, dispex_data);
689
690 nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLFrameElement, (void**)&This->nsframe);
691 if(NS_FAILED(nsres)) {
692 This->nsframe = NULL;
693 nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLIFrameElement, (void**)&This->nsiframe);
694 assert(nsres == NS_OK && (nsIDOMNode*)This->nsiframe == This->element.node.nsnode);
695 }else {
696 assert((nsIDOMNode*)This->nsframe == This->element.node.nsnode);
697 This->nsiframe = NULL;
698 }
699
700 /* Share the reference with nsnode */
701 nsIDOMNode_Release(This->element.node.nsnode);
702 }