ntdll: Add support for the FILE_OPEN_BY_FILE_ID flag in NtCreateFile.
[wine] / dlls / 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 <stdarg.h>
20
21 #define COBJMACROS
22
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winuser.h"
26 #include "ole2.h"
27
28 #include "mshtml_private.h"
29
30 #include "wine/debug.h"
31
32 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
33
34 #define HTMLFRAMEBASE_THIS(iface) DEFINE_THIS(HTMLFrameBase, IHTMLFrameBase, iface)
35
36 static HRESULT WINAPI HTMLFrameBase_QueryInterface(IHTMLFrameBase *iface, REFIID riid, void **ppv)
37 {
38     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
39
40     return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->element.node), riid, ppv);
41 }
42
43 static ULONG WINAPI HTMLFrameBase_AddRef(IHTMLFrameBase *iface)
44 {
45     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
46
47     return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node));
48 }
49
50 static ULONG WINAPI HTMLFrameBase_Release(IHTMLFrameBase *iface)
51 {
52     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
53
54     return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node));
55 }
56
57 static HRESULT WINAPI HTMLFrameBase_GetTypeInfoCount(IHTMLFrameBase *iface, UINT *pctinfo)
58 {
59     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
60
61     return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->element.node.dispex), pctinfo);
62 }
63
64 static HRESULT WINAPI HTMLFrameBase_GetTypeInfo(IHTMLFrameBase *iface, UINT iTInfo,
65         LCID lcid, ITypeInfo **ppTInfo)
66 {
67     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
68
69     return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->element.node.dispex), iTInfo, lcid, ppTInfo);
70 }
71
72 static HRESULT WINAPI HTMLFrameBase_GetIDsOfNames(IHTMLFrameBase *iface, REFIID riid,
73         LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
74 {
75     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
76
77     return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->element.node.dispex), riid, rgszNames,
78             cNames, lcid, rgDispId);
79 }
80
81 static HRESULT WINAPI HTMLFrameBase_Invoke(IHTMLFrameBase *iface, DISPID dispIdMember,
82         REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
83         VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
84 {
85     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
86
87     return IDispatchEx_Invoke(DISPATCHEX(&This->element.node.dispex), dispIdMember, riid, lcid,
88             wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
89 }
90
91 static HRESULT WINAPI HTMLFrameBase_put_src(IHTMLFrameBase *iface, BSTR v)
92 {
93     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
94
95     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
96
97     if(!This->content_window || !This->element.node.doc || !This->element.node.doc->basedoc.window) {
98         FIXME("detached element\n");
99         return E_FAIL;
100     }
101
102     return navigate_url(This->content_window, v, This->element.node.doc->basedoc.window->url);
103 }
104
105 static HRESULT WINAPI HTMLFrameBase_get_src(IHTMLFrameBase *iface, BSTR *p)
106 {
107     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
108     FIXME("(%p)->(%p)\n", This, p);
109     return E_NOTIMPL;
110 }
111
112 static HRESULT WINAPI HTMLFrameBase_put_name(IHTMLFrameBase *iface, BSTR v)
113 {
114     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
115     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
116     return E_NOTIMPL;
117 }
118
119 static HRESULT WINAPI HTMLFrameBase_get_name(IHTMLFrameBase *iface, BSTR *p)
120 {
121     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
122     FIXME("(%p)->(%p)\n", This, p);
123     return E_NOTIMPL;
124 }
125
126 static HRESULT WINAPI HTMLFrameBase_put_border(IHTMLFrameBase *iface, VARIANT v)
127 {
128     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
129     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
130     return E_NOTIMPL;
131 }
132
133 static HRESULT WINAPI HTMLFrameBase_get_border(IHTMLFrameBase *iface, VARIANT *p)
134 {
135     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
136     FIXME("(%p)->(%p)\n", This, p);
137     return E_NOTIMPL;
138 }
139
140 static HRESULT WINAPI HTMLFrameBase_put_frameBorder(IHTMLFrameBase *iface, BSTR v)
141 {
142     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
143     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
144     return E_NOTIMPL;
145 }
146
147 static HRESULT WINAPI HTMLFrameBase_get_frameBorder(IHTMLFrameBase *iface, BSTR *p)
148 {
149     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
150     FIXME("(%p)->(%p)\n", This, p);
151     return E_NOTIMPL;
152 }
153
154 static HRESULT WINAPI HTMLFrameBase_put_frameSpacing(IHTMLFrameBase *iface, VARIANT v)
155 {
156     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
157     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
158     return E_NOTIMPL;
159 }
160
161 static HRESULT WINAPI HTMLFrameBase_get_frameSpacing(IHTMLFrameBase *iface, VARIANT *p)
162 {
163     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
164     FIXME("(%p)->(%p)\n", This, p);
165     return E_NOTIMPL;
166 }
167
168 static HRESULT WINAPI HTMLFrameBase_put_marginWidth(IHTMLFrameBase *iface, VARIANT v)
169 {
170     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
171     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
172     return E_NOTIMPL;
173 }
174
175 static HRESULT WINAPI HTMLFrameBase_get_marginWidth(IHTMLFrameBase *iface, VARIANT *p)
176 {
177     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
178     FIXME("(%p)->(%p)\n", This, p);
179     return E_NOTIMPL;
180 }
181
182 static HRESULT WINAPI HTMLFrameBase_put_marginHeight(IHTMLFrameBase *iface, VARIANT v)
183 {
184     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
185     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
186     return E_NOTIMPL;
187 }
188
189 static HRESULT WINAPI HTMLFrameBase_get_marginHeight(IHTMLFrameBase *iface, VARIANT *p)
190 {
191     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
192     FIXME("(%p)->(%p)\n", This, p);
193     return E_NOTIMPL;
194 }
195
196 static HRESULT WINAPI HTMLFrameBase_put_noResize(IHTMLFrameBase *iface, VARIANT_BOOL v)
197 {
198     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
199     FIXME("(%p)->(%x)\n", This, v);
200     return E_NOTIMPL;
201 }
202
203 static HRESULT WINAPI HTMLFrameBase_get_noResize(IHTMLFrameBase *iface, VARIANT_BOOL *p)
204 {
205     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
206     FIXME("(%p)->(%p)\n", This, p);
207     return E_NOTIMPL;
208 }
209
210 static HRESULT WINAPI HTMLFrameBase_put_scrolling(IHTMLFrameBase *iface, BSTR v)
211 {
212     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
213     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
214     return E_NOTIMPL;
215 }
216
217 static HRESULT WINAPI HTMLFrameBase_get_scrolling(IHTMLFrameBase *iface, BSTR *p)
218 {
219     HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface);
220     FIXME("(%p)->(%p)\n", This, p);
221     return E_NOTIMPL;
222 }
223
224 static const IHTMLFrameBaseVtbl HTMLFrameBaseVtbl = {
225     HTMLFrameBase_QueryInterface,
226     HTMLFrameBase_AddRef,
227     HTMLFrameBase_Release,
228     HTMLFrameBase_GetTypeInfoCount,
229     HTMLFrameBase_GetTypeInfo,
230     HTMLFrameBase_GetIDsOfNames,
231     HTMLFrameBase_Invoke,
232     HTMLFrameBase_put_src,
233     HTMLFrameBase_get_src,
234     HTMLFrameBase_put_name,
235     HTMLFrameBase_get_name,
236     HTMLFrameBase_put_border,
237     HTMLFrameBase_get_border,
238     HTMLFrameBase_put_frameBorder,
239     HTMLFrameBase_get_frameBorder,
240     HTMLFrameBase_put_frameSpacing,
241     HTMLFrameBase_get_frameSpacing,
242     HTMLFrameBase_put_marginWidth,
243     HTMLFrameBase_get_marginWidth,
244     HTMLFrameBase_put_marginHeight,
245     HTMLFrameBase_get_marginHeight,
246     HTMLFrameBase_put_noResize,
247     HTMLFrameBase_get_noResize,
248     HTMLFrameBase_put_scrolling,
249     HTMLFrameBase_get_scrolling
250 };
251
252 #define HTMLFRAMEBASE2_THIS(iface) DEFINE_THIS(HTMLFrameBase, IHTMLFrameBase2, iface)
253
254 static HRESULT WINAPI HTMLFrameBase2_QueryInterface(IHTMLFrameBase2 *iface, REFIID riid, void **ppv)
255 {
256     HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface);
257
258     return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->element.node), riid, ppv);
259 }
260
261 static ULONG WINAPI HTMLFrameBase2_AddRef(IHTMLFrameBase2 *iface)
262 {
263     HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface);
264
265     return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node));
266 }
267
268 static ULONG WINAPI HTMLFrameBase2_Release(IHTMLFrameBase2 *iface)
269 {
270     HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface);
271
272     return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node));
273 }
274
275 static HRESULT WINAPI HTMLFrameBase2_GetTypeInfoCount(IHTMLFrameBase2 *iface, UINT *pctinfo)
276 {
277     HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface);
278     FIXME("(%p)\n", This);
279     return E_NOTIMPL;
280 }
281
282 static HRESULT WINAPI HTMLFrameBase2_GetTypeInfo(IHTMLFrameBase2 *iface, UINT iTInfo,
283         LCID lcid, ITypeInfo **ppTInfo)
284 {
285     HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface);
286     FIXME("(%p)\n", This);
287     return E_NOTIMPL;
288 }
289
290 static HRESULT WINAPI HTMLFrameBase2_GetIDsOfNames(IHTMLFrameBase2 *iface, REFIID riid,
291         LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
292 {
293     HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface);
294     FIXME("(%p)\n", This);
295     return E_NOTIMPL;
296 }
297
298 static HRESULT WINAPI HTMLFrameBase2_Invoke(IHTMLFrameBase2 *iface, DISPID dispIdMember,
299         REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
300         VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
301 {
302     HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface);
303     FIXME("(%p)\n", This);
304     return E_NOTIMPL;
305 }
306
307 static HRESULT WINAPI HTMLFrameBase2_get_contentWindow(IHTMLFrameBase2 *iface, IHTMLWindow2 **p)
308 {
309     HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface);
310
311     TRACE("(%p)->(%p)\n", This, p);
312
313     if(This->content_window) {
314         IHTMLWindow2_AddRef(HTMLWINDOW2(This->content_window));
315         *p = HTMLWINDOW2(This->content_window);
316     }else {
317         WARN("NULL content window\n");
318         *p = NULL;
319     }
320     return S_OK;
321 }
322
323 static HRESULT WINAPI HTMLFrameBase2_put_onload(IHTMLFrameBase2 *iface, VARIANT v)
324 {
325     HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface);
326     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
327     return E_NOTIMPL;
328 }
329
330 static HRESULT WINAPI HTMLFrameBase2_get_onload(IHTMLFrameBase2 *iface, VARIANT *p)
331 {
332     HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface);
333     FIXME("(%p)->(%p)\n", This, p);
334     return E_NOTIMPL;
335 }
336
337 static HRESULT WINAPI HTMLFrameBase2_put_onreadystatechange(IHTMLFrameBase2 *iface, VARIANT v)
338 {
339     HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface);
340     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
341     return E_NOTIMPL;
342 }
343
344 static HRESULT WINAPI HTMLFrameBase2_get_onreadystatechange(IHTMLFrameBase2 *iface, VARIANT *p)
345 {
346     HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface);
347     FIXME("(%p)->(%p)\n", This, p);
348     return E_NOTIMPL;
349 }
350
351 static HRESULT WINAPI HTMLFrameBase2_get_readyState(IHTMLFrameBase2 *iface, BSTR *p)
352 {
353     HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface);
354
355     TRACE("(%p)->(%p)\n", This, p);
356
357     if(!This->content_window || !This->content_window->doc) {
358         FIXME("no document associated\n");
359         return E_FAIL;
360     }
361
362     return IHTMLDocument2_get_readyState(HTMLDOC(&This->content_window->doc->basedoc), p);
363 }
364
365 static HRESULT WINAPI HTMLFrameBase2_put_allowTransparency(IHTMLFrameBase2 *iface, VARIANT_BOOL v)
366 {
367     HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface);
368     FIXME("(%p)->(%x)\n", This, v);
369     return E_NOTIMPL;
370 }
371
372 static HRESULT WINAPI HTMLFrameBase2_get_allowTransparency(IHTMLFrameBase2 *iface, VARIANT_BOOL *p)
373 {
374     HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface);
375     FIXME("(%p)->(%p)\n", This, p);
376     return E_NOTIMPL;
377 }
378
379 #undef HTMLFRAMEBASE2_THIS
380
381 static const IHTMLFrameBase2Vtbl HTMLFrameBase2Vtbl = {
382     HTMLFrameBase2_QueryInterface,
383     HTMLFrameBase2_AddRef,
384     HTMLFrameBase2_Release,
385     HTMLFrameBase2_GetTypeInfoCount,
386     HTMLFrameBase2_GetTypeInfo,
387     HTMLFrameBase2_GetIDsOfNames,
388     HTMLFrameBase2_Invoke,
389     HTMLFrameBase2_get_contentWindow,
390     HTMLFrameBase2_put_onload,
391     HTMLFrameBase2_get_onload,
392     HTMLFrameBase2_put_onreadystatechange,
393     HTMLFrameBase2_get_onreadystatechange,
394     HTMLFrameBase2_get_readyState,
395     HTMLFrameBase2_put_allowTransparency,
396     HTMLFrameBase2_get_allowTransparency
397 };
398
399 HRESULT HTMLFrameBase_QI(HTMLFrameBase *This, REFIID riid, void **ppv)
400 {
401     if(IsEqualGUID(&IID_IHTMLFrameBase, riid)) {
402         TRACE("(%p)->(IID_IHTMLFrameBase %p)\n", This, ppv);
403         *ppv = HTMLFRAMEBASE(This);
404     }else if(IsEqualGUID(&IID_IHTMLFrameBase2, riid)) {
405         TRACE("(%p)->(IID_IHTMLFrameBase2 %p)\n", This, ppv);
406         *ppv = HTMLFRAMEBASE2(This);
407     }else {
408         return HTMLElement_QI(&This->element.node, riid, ppv);
409     }
410
411     IUnknown_AddRef((IUnknown*)*ppv);
412     return S_OK;
413 }
414
415 void HTMLFrameBase_destructor(HTMLFrameBase *This)
416 {
417     if(This->content_window) {
418         This->content_window->frame_element = NULL;
419         IHTMLWindow2_Release(HTMLWINDOW2(This->content_window));
420     }
421
422     HTMLElement_destructor(&This->element.node);
423 }
424
425 void HTMLFrameBase_Init(HTMLFrameBase *This, HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem,
426         HTMLWindow *content_window, dispex_static_data_t *dispex_data)
427 {
428     This->lpIHTMLFrameBaseVtbl = &HTMLFrameBaseVtbl;
429     This->lpIHTMLFrameBase2Vtbl = &HTMLFrameBase2Vtbl;
430
431     HTMLElement_Init(&This->element, doc, nselem, dispex_data);
432
433     if(content_window) {
434         IHTMLWindow2_AddRef(HTMLWINDOW2(content_window));
435         content_window->frame_element = This;
436     }
437     This->content_window = content_window;
438 }
439
440 typedef struct {
441     HTMLFrameBase framebase;
442 } HTMLFrameElement;
443
444 #define HTMLFRAME_NODE_THIS(iface) DEFINE_THIS2(HTMLFrameElement, framebase.element.node, iface)
445
446 static HRESULT HTMLFrameElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
447 {
448     HTMLFrameElement *This = HTMLFRAME_NODE_THIS(iface);
449
450     return HTMLFrameBase_QI(&This->framebase, riid, ppv);
451 }
452
453 static void HTMLFrameElement_destructor(HTMLDOMNode *iface)
454 {
455     HTMLFrameElement *This = HTMLFRAME_NODE_THIS(iface);
456
457     HTMLFrameBase_destructor(&This->framebase);
458 }
459
460 static HRESULT HTMLFrameElement_get_document(HTMLDOMNode *iface, IDispatch **p)
461 {
462     HTMLFrameElement *This = HTMLFRAME_NODE_THIS(iface);
463
464     if(!This->framebase.content_window || !This->framebase.content_window->doc) {
465         *p = NULL;
466         return S_OK;
467     }
468
469     *p = (IDispatch*)HTMLDOC(&This->framebase.content_window->doc->basedoc);
470     IDispatch_AddRef(*p);
471     return S_OK;
472 }
473
474 #undef HTMLFRAME_NODE_THIS
475
476 static const NodeImplVtbl HTMLFrameElementImplVtbl = {
477     HTMLFrameElement_QI,
478     HTMLFrameElement_destructor,
479     NULL,
480     NULL,
481     NULL,
482     NULL,
483     HTMLFrameElement_get_document
484 };
485
486 HTMLElement *HTMLFrameElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLWindow *content_window)
487 {
488     nsIDOMHTMLFrameElement *nsframe;
489     HTMLFrameElement *ret;
490     nsresult nsres;
491
492     ret = heap_alloc_zero(sizeof(HTMLFrameElement));
493
494     ret->framebase.element.node.vtbl = &HTMLFrameElementImplVtbl;
495
496     nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLFrameElement, (void**)&nsframe);
497     if(NS_FAILED(nsres))
498         ERR("Could not get nsIDOMHTMLFrameElement iface: %08x\n", nsres);
499
500     HTMLFrameBase_Init(&ret->framebase, doc, nselem, content_window, NULL);
501
502     return &ret->framebase.element;
503 }