quartz: Fix discontinuities in wave parser.
[wine] / dlls / mshtml / htmlwindow.c
1 /*
2  * Copyright 2006 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 "wine/debug.h"
29 #include "wine/unicode.h"
30
31 #include "mshtml_private.h"
32 #include "resource.h"
33
34 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
35
36 #define HTMLWINDOW2_THIS(iface) DEFINE_THIS(HTMLWindow, HTMLWindow2, iface)
37
38 static struct list window_list = LIST_INIT(window_list);
39
40 static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID riid, void **ppv)
41 {
42     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
43
44     *ppv = NULL;
45
46     if(IsEqualGUID(&IID_IUnknown, riid)) {
47         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
48         *ppv = HTMLWINDOW2(This);
49     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
50         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
51         *ppv = HTMLWINDOW2(This);
52     }else if(IsEqualGUID(&IID_IHTMLFramesCollection2, riid)) {
53         TRACE("(%p)->(IID_IHTMLFramesCollection2 %p)\n", This, ppv);
54         *ppv = HTMLWINDOW2(This);
55     }else if(IsEqualGUID(&IID_IHTMLWindow2, riid)) {
56         TRACE("(%p)->(IID_IHTMLWindow2 %p)\n", This, ppv);
57         *ppv = HTMLWINDOW2(This);
58     }
59
60     if(*ppv) {
61         IUnknown_AddRef((IUnknown*)*ppv);
62         return S_OK;
63     }
64
65     WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
66     return E_NOINTERFACE;
67 }
68
69 static ULONG WINAPI HTMLWindow2_AddRef(IHTMLWindow2 *iface)
70 {
71     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
72     LONG ref = InterlockedIncrement(&This->ref);
73
74     TRACE("(%p) ref=%d\n", This, ref);
75
76     return ref;
77 }
78
79 static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface)
80 {
81     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
82     LONG ref = InterlockedDecrement(&This->ref);
83
84     TRACE("(%p) ref=%d\n", This, ref);
85
86     if(!ref) {
87         list_remove(&This->entry);
88         heap_free(This);
89     }
90
91     return ref;
92 }
93
94 static HRESULT WINAPI HTMLWindow2_GetTypeInfoCount(IHTMLWindow2 *iface, UINT *pctinfo)
95 {
96     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
97
98     TRACE("(%p)->(%p)\n", This, pctinfo);
99
100     *pctinfo = 1;
101     return S_OK;
102 }
103
104 static HRESULT WINAPI HTMLWindow2_GetTypeInfo(IHTMLWindow2 *iface, UINT iTInfo,
105                                               LCID lcid, ITypeInfo **ppTInfo)
106 {
107     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
108     HRESULT hres;
109
110     TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
111
112     hres = get_typeinfo(IHTMLWindow2_tid, ppTInfo);
113     if(SUCCEEDED(hres))
114         ITypeInfo_AddRef(*ppTInfo);
115
116     return hres;
117 }
118
119 static HRESULT WINAPI HTMLWindow2_GetIDsOfNames(IHTMLWindow2 *iface, REFIID riid,
120                                                 LPOLESTR *rgszNames, UINT cNames,
121                                                 LCID lcid, DISPID *rgDispId)
122 {
123     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
124     ITypeInfo *typeinfo;
125     HRESULT hres;
126
127     TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
128           lcid, rgDispId);
129
130     hres = get_typeinfo(IHTMLWindow2_tid, &typeinfo);
131     if(SUCCEEDED(hres))
132         hres = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
133
134     return hres;
135 }
136
137 static HRESULT WINAPI HTMLWindow2_Invoke(IHTMLWindow2 *iface, DISPID dispIdMember,
138                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
139                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
140 {
141     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
142     ITypeInfo *typeinfo;
143     HRESULT hres;
144
145     TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
146           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
147
148     hres = get_typeinfo(IHTMLWindow2_tid, &typeinfo);
149     if(SUCCEEDED(hres))
150         hres = ITypeInfo_Invoke(typeinfo, HTMLWINDOW2(This), dispIdMember, wFlags, pDispParams,
151                 pVarResult, pExcepInfo, puArgErr);
152
153     return hres;
154 }
155
156 static HRESULT WINAPI HTMLWindow2_item(IHTMLWindow2 *iface, VARIANT *pvarIndex, VARIANT *pvarResult)
157 {
158     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
159     FIXME("(%p)->(%p %p)\n", This, pvarIndex, pvarResult);
160     return E_NOTIMPL;
161 }
162
163 static HRESULT WINAPI HTMLWindow2_get_length(IHTMLWindow2 *iface, long *p)
164 {
165     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
166     FIXME("(%p)->(%p)\n", This, p);
167     return E_NOTIMPL;
168 }
169
170 static HRESULT WINAPI HTMLWindow2_get_frames(IHTMLWindow2 *iface, IHTMLFramesCollection2 **p)
171 {
172     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
173     FIXME("(%p)->(%p)\n", This, p);
174     return E_NOTIMPL;
175 }
176
177 static HRESULT WINAPI HTMLWindow2_put_defaultStatus(IHTMLWindow2 *iface, BSTR v)
178 {
179     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
180     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
181     return E_NOTIMPL;
182 }
183
184 static HRESULT WINAPI HTMLWindow2_get_defaultStatus(IHTMLWindow2 *iface, BSTR *p)
185 {
186     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
187     FIXME("(%p)->(%p)\n", This, p);
188     return E_NOTIMPL;
189 }
190
191 static HRESULT WINAPI HTMLWindow2_put_status(IHTMLWindow2 *iface, BSTR v)
192 {
193     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
194     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
195     return E_NOTIMPL;
196 }
197
198 static HRESULT WINAPI HTMLWindow2_get_status(IHTMLWindow2 *iface, BSTR *p)
199 {
200     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
201     FIXME("(%p)->(%p)\n", This, p);
202     return E_NOTIMPL;
203 }
204
205 static HRESULT WINAPI HTMLWindow2_setTimeout(IHTMLWindow2 *iface, BSTR expression,
206         long msec, VARIANT *language, long *timerID)
207 {
208     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
209     FIXME("(%p)->(%s %ld %p %p)\n", This, debugstr_w(expression), msec, language, timerID);
210     return E_NOTIMPL;
211 }
212
213 static HRESULT WINAPI HTMLWindow2_clearTimeout(IHTMLWindow2 *iface, long timerID)
214 {
215     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
216     FIXME("(%p)->(%ld)\n", This, timerID);
217     return E_NOTIMPL;
218 }
219
220 static HRESULT WINAPI HTMLWindow2_alert(IHTMLWindow2 *iface, BSTR message)
221 {
222     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
223     WCHAR wszTitle[100];
224
225     TRACE("(%p)->(%s)\n", This, debugstr_w(message));
226
227     if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, wszTitle,
228                     sizeof(wszTitle)/sizeof(WCHAR))) {
229         WARN("Could not load message box title: %d\n", GetLastError());
230         return S_OK;
231     }
232
233     MessageBoxW(This->doc->hwnd, message, wszTitle, MB_ICONWARNING);
234     return S_OK;
235 }
236
237 static HRESULT WINAPI HTMLWindow2_confirm(IHTMLWindow2 *iface, BSTR message,
238         VARIANT_BOOL *confirmed)
239 {
240     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
241     FIXME("(%p)->(%s %p)\n", This, debugstr_w(message), confirmed);
242     return E_NOTIMPL;
243 }
244
245 static HRESULT WINAPI HTMLWindow2_prompt(IHTMLWindow2 *iface, BSTR message,
246         BSTR dststr, VARIANT *textdata)
247 {
248     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
249     FIXME("(%p)->(%s %s %p)\n", This, debugstr_w(message), debugstr_w(dststr), textdata);
250     return E_NOTIMPL;
251 }
252
253 static HRESULT WINAPI HTMLWindow2_get_Image(IHTMLWindow2 *iface, IHTMLImageElementFactory **p)
254 {
255     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
256     FIXME("(%p)->(%p)\n", This, p);
257     return E_NOTIMPL;
258 }
259
260 static HRESULT WINAPI HTMLWindow2_get_location(IHTMLWindow2 *iface, IHTMLLocation **p)
261 {
262     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
263     FIXME("(%p)->(%p)\n", This, p);
264     return E_NOTIMPL;
265 }
266
267 static HRESULT WINAPI HTMLWindow2_get_history(IHTMLWindow2 *iface, IOmHistory **p)
268 {
269     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
270     FIXME("(%p)->(%p)\n", This, p);
271     return E_NOTIMPL;
272 }
273
274 static HRESULT WINAPI HTMLWindow2_close(IHTMLWindow2 *iface)
275 {
276     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
277     FIXME("(%p)->()\n", This);
278     return E_NOTIMPL;
279 }
280
281 static HRESULT WINAPI HTMLWindow2_put_opener(IHTMLWindow2 *iface, VARIANT v)
282 {
283     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
284     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
285     return E_NOTIMPL;
286 }
287
288 static HRESULT WINAPI HTMLWindow2_get_opener(IHTMLWindow2 *iface, VARIANT *p)
289 {
290     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
291     FIXME("(%p)->(%p)\n", This, p);
292     return E_NOTIMPL;
293 }
294
295 static HRESULT WINAPI HTMLWindow2_get_navigator(IHTMLWindow2 *iface, IOmNavigator **p)
296 {
297     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
298
299     TRACE("(%p)->(%p)\n", This, p);
300
301     *p = OmNavigator_Create();
302     return S_OK;
303 }
304
305 static HRESULT WINAPI HTMLWindow2_put_name(IHTMLWindow2 *iface, BSTR v)
306 {
307     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
308     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
309     return E_NOTIMPL;
310 }
311
312 static HRESULT WINAPI HTMLWindow2_get_name(IHTMLWindow2 *iface, BSTR *p)
313 {
314     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
315     FIXME("(%p)->(%p)\n", This, p);
316     return E_NOTIMPL;
317 }
318
319 static HRESULT WINAPI HTMLWindow2_get_parent(IHTMLWindow2 *iface, IHTMLWindow2 **p)
320 {
321     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
322     FIXME("(%p)->(%p)\n", This, p);
323     return E_NOTIMPL;
324 }
325
326 static HRESULT WINAPI HTMLWindow2_open(IHTMLWindow2 *iface, BSTR url, BSTR name,
327          BSTR features, VARIANT_BOOL replace, IHTMLWindow2 **pomWindowResult)
328 {
329     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
330     FIXME("(%p)->(%s %s %s %x %p)\n", This, debugstr_w(url), debugstr_w(name),
331           debugstr_w(features), replace, pomWindowResult);
332     return E_NOTIMPL;
333 }
334
335 static HRESULT WINAPI HTMLWindow2_get_self(IHTMLWindow2 *iface, IHTMLWindow2 **p)
336 {
337     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
338     FIXME("(%p)->(%p)\n", This, p);
339     return E_NOTIMPL;
340 }
341
342 static HRESULT WINAPI HTMLWindow2_get_top(IHTMLWindow2 *iface, IHTMLWindow2 **p)
343 {
344     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
345     FIXME("(%p)->(%p)\n", This, p);
346     return E_NOTIMPL;
347 }
348
349 static HRESULT WINAPI HTMLWindow2_get_window(IHTMLWindow2 *iface, IHTMLWindow2 **p)
350 {
351     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
352     FIXME("(%p)->(%p)\n", This, p);
353     return E_NOTIMPL;
354 }
355
356 static HRESULT WINAPI HTMLWindow2_navigate(IHTMLWindow2 *iface, BSTR url)
357 {
358     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
359     FIXME("(%p)->(%s)\n", This, debugstr_w(url));
360     return E_NOTIMPL;
361 }
362
363 static HRESULT WINAPI HTMLWindow2_put_onfocus(IHTMLWindow2 *iface, VARIANT v)
364 {
365     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
366     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
367     return E_NOTIMPL;
368 }
369
370 static HRESULT WINAPI HTMLWindow2_get_onfocus(IHTMLWindow2 *iface, VARIANT *p)
371 {
372     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
373     FIXME("(%p)->(%p)\n", This, p);
374     return E_NOTIMPL;
375 }
376
377 static HRESULT WINAPI HTMLWindow2_put_onblur(IHTMLWindow2 *iface, VARIANT v)
378 {
379     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
380     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
381     return E_NOTIMPL;
382 }
383
384 static HRESULT WINAPI HTMLWindow2_get_onblur(IHTMLWindow2 *iface, VARIANT *p)
385 {
386     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
387     FIXME("(%p)->(%p)\n", This, p);
388     return E_NOTIMPL;
389 }
390
391 static HRESULT WINAPI HTMLWindow2_put_onload(IHTMLWindow2 *iface, VARIANT v)
392 {
393     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
394     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
395     return E_NOTIMPL;
396 }
397
398 static HRESULT WINAPI HTMLWindow2_get_onload(IHTMLWindow2 *iface, VARIANT *p)
399 {
400     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
401     FIXME("(%p)->(%p)\n", This, p);
402     return E_NOTIMPL;
403 }
404
405 static HRESULT WINAPI HTMLWindow2_put_onbeforeunload(IHTMLWindow2 *iface, VARIANT v)
406 {
407     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
408     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
409     return E_NOTIMPL;
410 }
411
412 static HRESULT WINAPI HTMLWindow2_get_onbeforeunload(IHTMLWindow2 *iface, VARIANT *p)
413 {
414     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
415     FIXME("(%p)->(%p)\n", This, p);
416     return E_NOTIMPL;
417 }
418
419 static HRESULT WINAPI HTMLWindow2_put_onunload(IHTMLWindow2 *iface, VARIANT v)
420 {
421     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
422     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
423     return E_NOTIMPL;
424 }
425
426 static HRESULT WINAPI HTMLWindow2_get_onunload(IHTMLWindow2 *iface, VARIANT *p)
427 {
428     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
429     FIXME("(%p)->(%p)\n", This, p);
430     return E_NOTIMPL;
431 }
432
433 static HRESULT WINAPI HTMLWindow2_put_onhelp(IHTMLWindow2 *iface, VARIANT v)
434 {
435     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
436     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
437     return E_NOTIMPL;
438 }
439
440 static HRESULT WINAPI HTMLWindow2_get_onhelp(IHTMLWindow2 *iface, VARIANT *p)
441 {
442     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
443     FIXME("(%p)->(%p)\n", This, p);
444     return E_NOTIMPL;
445 }
446
447 static HRESULT WINAPI HTMLWindow2_put_onerror(IHTMLWindow2 *iface, VARIANT v)
448 {
449     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
450     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
451     return E_NOTIMPL;
452 }
453
454 static HRESULT WINAPI HTMLWindow2_get_onerror(IHTMLWindow2 *iface, VARIANT *p)
455 {
456     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
457     FIXME("(%p)->(%p)\n", This, p);
458     return E_NOTIMPL;
459 }
460
461 static HRESULT WINAPI HTMLWindow2_put_onresize(IHTMLWindow2 *iface, VARIANT v)
462 {
463     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
464     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
465     return E_NOTIMPL;
466 }
467
468 static HRESULT WINAPI HTMLWindow2_get_onresize(IHTMLWindow2 *iface, VARIANT *p)
469 {
470     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
471     FIXME("(%p)->(%p)\n", This, p);
472     return E_NOTIMPL;
473 }
474
475 static HRESULT WINAPI HTMLWindow2_put_onscroll(IHTMLWindow2 *iface, VARIANT v)
476 {
477     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
478     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
479     return E_NOTIMPL;
480 }
481
482 static HRESULT WINAPI HTMLWindow2_get_onscroll(IHTMLWindow2 *iface, VARIANT *p)
483 {
484     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
485     FIXME("(%p)->(%p)\n", This, p);
486     return E_NOTIMPL;
487 }
488
489 static HRESULT WINAPI HTMLWindow2_get_document(IHTMLWindow2 *iface, IHTMLDocument2 **p)
490 {
491     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
492     FIXME("(%p)->(%p)\n", This, p);
493     return E_NOTIMPL;
494 }
495
496 static HRESULT WINAPI HTMLWindow2_get_event(IHTMLWindow2 *iface, IHTMLEventObj **p)
497 {
498     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
499     FIXME("(%p)->(%p)\n", This, p);
500     return E_NOTIMPL;
501 }
502
503 static HRESULT WINAPI HTMLWindow2_get__newEnum(IHTMLWindow2 *iface, IUnknown **p)
504 {
505     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
506     FIXME("(%p)->(%p)\n", This, p);
507     return E_NOTIMPL;
508 }
509
510 static HRESULT WINAPI HTMLWindow2_showModalDialog(IHTMLWindow2 *iface, BSTR dialog,
511         VARIANT *varArgIn, VARIANT *varOptions, VARIANT *varArgOut)
512 {
513     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
514     FIXME("(%p)->(%s %p %p %p)\n", This, debugstr_w(dialog), varArgIn, varOptions, varArgOut);
515     return E_NOTIMPL;
516 }
517
518 static HRESULT WINAPI HTMLWindow2_showHelp(IHTMLWindow2 *iface, BSTR helpURL, VARIANT helpArg,
519         BSTR features)
520 {
521     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
522     FIXME("(%p)->(%s v(%d) %s)\n", This, debugstr_w(helpURL), V_VT(&helpArg), debugstr_w(features));
523     return E_NOTIMPL;
524 }
525
526 static HRESULT WINAPI HTMLWindow2_get_screen(IHTMLWindow2 *iface, IHTMLScreen **p)
527 {
528     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
529     FIXME("(%p)->(%p)\n", This, p);
530     return E_NOTIMPL;
531 }
532
533 static HRESULT WINAPI HTMLWindow2_get_Option(IHTMLWindow2 *iface, IHTMLOptionElementFactory **p)
534 {
535     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
536
537     TRACE("(%p)->(%p)\n", This, p);
538
539     if(!This->doc->option_factory)
540         This->doc->option_factory = HTMLOptionElementFactory_Create(This->doc);
541
542     *p = HTMLOPTFACTORY(This->doc->option_factory);
543     IHTMLOptionElementFactory_AddRef(*p);
544
545     return S_OK;
546 }
547
548 static HRESULT WINAPI HTMLWindow2_focus(IHTMLWindow2 *iface)
549 {
550     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
551     FIXME("(%p)->()\n", This);
552     return E_NOTIMPL;
553 }
554
555 static HRESULT WINAPI HTMLWindow2_get_closed(IHTMLWindow2 *iface, VARIANT_BOOL *p)
556 {
557     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
558     FIXME("(%p)->(%p)\n", This, p);
559     return E_NOTIMPL;
560 }
561
562 static HRESULT WINAPI HTMLWindow2_blur(IHTMLWindow2 *iface)
563 {
564     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
565     FIXME("(%p)->()\n", This);
566     return E_NOTIMPL;
567 }
568
569 static HRESULT WINAPI HTMLWindow2_scroll(IHTMLWindow2 *iface, long x, long y)
570 {
571     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
572     FIXME("(%p)->(%ld %ld)\n", This, x, y);
573     return E_NOTIMPL;
574 }
575
576 static HRESULT WINAPI HTMLWindow2_get_clientInformation(IHTMLWindow2 *iface, IOmNavigator **p)
577 {
578     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
579     FIXME("(%p)->(%p)\n", This, p);
580     return E_NOTIMPL;
581 }
582
583 static HRESULT WINAPI HTMLWindow2_setInterval(IHTMLWindow2 *iface, BSTR expression,
584         long msec, VARIANT *language, long *timerID)
585 {
586     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
587     FIXME("(%p)->(%s %ld %p %p)\n", This, debugstr_w(expression), msec, language, timerID);
588     return E_NOTIMPL;
589 }
590
591 static HRESULT WINAPI HTMLWindow2_clearInterval(IHTMLWindow2 *iface, long timerID)
592 {
593     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
594     FIXME("(%p)->(%ld)\n", This, timerID);
595     return E_NOTIMPL;
596 }
597
598 static HRESULT WINAPI HTMLWindow2_put_offscreenBuffering(IHTMLWindow2 *iface, VARIANT v)
599 {
600     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
601     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
602     return E_NOTIMPL;
603 }
604
605 static HRESULT WINAPI HTMLWindow2_get_offscreenBuffering(IHTMLWindow2 *iface, VARIANT *p)
606 {
607     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
608     FIXME("(%p)->(%p)\n", This, p);
609     return E_NOTIMPL;
610 }
611
612 static HRESULT WINAPI HTMLWindow2_execScript(IHTMLWindow2 *iface, BSTR scode, BSTR language,
613         VARIANT *pvarRet)
614 {
615     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
616     FIXME("(%p)->(%s %s %p)\n", This, debugstr_w(scode), debugstr_w(language), pvarRet);
617     return E_NOTIMPL;
618 }
619
620 static HRESULT WINAPI HTMLWindow2_toString(IHTMLWindow2 *iface, BSTR *String)
621 {
622     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
623     FIXME("(%p)->(%p)\n", This, String);
624     return E_NOTIMPL;
625 }
626
627 static HRESULT WINAPI HTMLWindow2_scrollBy(IHTMLWindow2 *iface, long x, long y)
628 {
629     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
630     FIXME("(%p)->(%ld %ld)\n", This, x, y);
631     return E_NOTIMPL;
632 }
633
634 static HRESULT WINAPI HTMLWindow2_scrollTo(IHTMLWindow2 *iface, long x, long y)
635 {
636     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
637     FIXME("(%p)->(%ld %ld)\n", This, x, y);
638     return E_NOTIMPL;
639 }
640
641 static HRESULT WINAPI HTMLWindow2_moveTo(IHTMLWindow2 *iface, long x, long y)
642 {
643     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
644     FIXME("(%p)->(%ld %ld)\n", This, x, y);
645     return E_NOTIMPL;
646 }
647
648 static HRESULT WINAPI HTMLWindow2_moveBy(IHTMLWindow2 *iface, long x, long y)
649 {
650     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
651     FIXME("(%p)->(%ld %ld)\n", This, x, y);
652     return E_NOTIMPL;
653 }
654
655 static HRESULT WINAPI HTMLWindow2_resizeTo(IHTMLWindow2 *iface, long x, long y)
656 {
657     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
658     FIXME("(%p)->(%ld %ld)\n", This, x, y);
659     return E_NOTIMPL;
660 }
661
662 static HRESULT WINAPI HTMLWindow2_resizeBy(IHTMLWindow2 *iface, long x, long y)
663 {
664     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
665     FIXME("(%p)->(%ld %ld)\n", This, x, y);
666     return E_NOTIMPL;
667 }
668
669 static HRESULT WINAPI HTMLWindow2_get_external(IHTMLWindow2 *iface, IDispatch **p)
670 {
671     HTMLWindow *This = HTMLWINDOW2_THIS(iface);
672
673     TRACE("(%p)->(%p)\n", This, p);
674
675     *p = NULL;
676
677     if(!This->doc->hostui)
678         return S_OK;
679
680     return IDocHostUIHandler_GetExternal(This->doc->hostui, p);
681 }
682
683 #undef HTMLWINDOW2_THIS
684
685 static const IHTMLWindow2Vtbl HTMLWindow2Vtbl = {
686     HTMLWindow2_QueryInterface,
687     HTMLWindow2_AddRef,
688     HTMLWindow2_Release,
689     HTMLWindow2_GetTypeInfoCount,
690     HTMLWindow2_GetTypeInfo,
691     HTMLWindow2_GetIDsOfNames,
692     HTMLWindow2_Invoke,
693     HTMLWindow2_item,
694     HTMLWindow2_get_length,
695     HTMLWindow2_get_frames,
696     HTMLWindow2_put_defaultStatus,
697     HTMLWindow2_get_defaultStatus,
698     HTMLWindow2_put_status,
699     HTMLWindow2_get_status,
700     HTMLWindow2_setTimeout,
701     HTMLWindow2_clearTimeout,
702     HTMLWindow2_alert,
703     HTMLWindow2_confirm,
704     HTMLWindow2_prompt,
705     HTMLWindow2_get_Image,
706     HTMLWindow2_get_location,
707     HTMLWindow2_get_history,
708     HTMLWindow2_close,
709     HTMLWindow2_put_opener,
710     HTMLWindow2_get_opener,
711     HTMLWindow2_get_navigator,
712     HTMLWindow2_put_name,
713     HTMLWindow2_get_name,
714     HTMLWindow2_get_parent,
715     HTMLWindow2_open,
716     HTMLWindow2_get_self,
717     HTMLWindow2_get_top,
718     HTMLWindow2_get_window,
719     HTMLWindow2_navigate,
720     HTMLWindow2_put_onfocus,
721     HTMLWindow2_get_onfocus,
722     HTMLWindow2_put_onblur,
723     HTMLWindow2_get_onblur,
724     HTMLWindow2_put_onload,
725     HTMLWindow2_get_onload,
726     HTMLWindow2_put_onbeforeunload,
727     HTMLWindow2_get_onbeforeunload,
728     HTMLWindow2_put_onunload,
729     HTMLWindow2_get_onunload,
730     HTMLWindow2_put_onhelp,
731     HTMLWindow2_get_onhelp,
732     HTMLWindow2_put_onerror,
733     HTMLWindow2_get_onerror,
734     HTMLWindow2_put_onresize,
735     HTMLWindow2_get_onresize,
736     HTMLWindow2_put_onscroll,
737     HTMLWindow2_get_onscroll,
738     HTMLWindow2_get_document,
739     HTMLWindow2_get_event,
740     HTMLWindow2_get__newEnum,
741     HTMLWindow2_showModalDialog,
742     HTMLWindow2_showHelp,
743     HTMLWindow2_get_screen,
744     HTMLWindow2_get_Option,
745     HTMLWindow2_focus,
746     HTMLWindow2_get_closed,
747     HTMLWindow2_blur,
748     HTMLWindow2_scroll,
749     HTMLWindow2_get_clientInformation,
750     HTMLWindow2_setInterval,
751     HTMLWindow2_clearInterval,
752     HTMLWindow2_put_offscreenBuffering,
753     HTMLWindow2_get_offscreenBuffering,
754     HTMLWindow2_execScript,
755     HTMLWindow2_toString,
756     HTMLWindow2_scrollBy,
757     HTMLWindow2_scrollTo,
758     HTMLWindow2_moveTo,
759     HTMLWindow2_moveBy,
760     HTMLWindow2_resizeTo,
761     HTMLWindow2_resizeBy,
762     HTMLWindow2_get_external
763 };
764
765 static const char wineConfig_func[] =
766 "window.__defineGetter__(\"external\",function() {\n"
767 "    return window.__wineWindow__.external;\n"
768 "});\n"
769 "window.__wineWindow__ = wineWindow;\n";
770
771 static void astr_to_nswstr(const char *str, nsAString *nsstr)
772 {
773     LPWSTR wstr;
774     int len;
775
776     len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
777     wstr = heap_alloc(len*sizeof(WCHAR));
778     MultiByteToWideChar(CP_ACP, 0, str, -1, wstr, len);
779
780     nsAString_Init(nsstr, wstr);
781
782     heap_free(wstr);
783 }
784
785 static nsresult call_js_func(nsIScriptContainer *script_container, nsISupports *target,
786                              const char *name, const char *body,
787                              PRUint32 argc, const char **arg_names, nsIArray *argv)
788 {
789     nsACString name_str;
790     nsAString body_str;
791     JSObject func_obj, jsglobal;
792     nsIVariant *jsret;
793     nsresult nsres;
794
795     nsres = nsIScriptContainer_GetGlobalObject(script_container, &jsglobal);
796     if(NS_FAILED(nsres))
797         ERR("GetGlobalObject: %08x\n", nsres);
798
799     nsACString_Init(&name_str, name);
800     astr_to_nswstr(body, &body_str);
801
802     nsres =  nsIScriptContainer_CompileFunction(script_container, jsglobal, &name_str, argc, arg_names,
803                                                 &body_str, NULL, 1, FALSE, &func_obj);
804
805     nsACString_Finish(&name_str);
806     nsAString_Finish(&body_str);
807
808     if(NS_FAILED(nsres)) {
809         ERR("CompileFunction failed: %08x\n", nsres);
810         return nsres;
811     }
812
813     nsres = nsIScriptContainer_CallFunction(script_container, target, jsglobal, func_obj, argv, &jsret);
814
815     nsIScriptContainer_DropScriptObject(script_container, func_obj);
816     nsIScriptContainer_DropScriptObject(script_container, jsglobal);
817     if(NS_FAILED(nsres)) {
818         ERR("CallFunction failed: %08x\n", nsres);
819         return nsres;
820     }
821
822     nsIVariant_Release(jsret);
823     return NS_OK;
824 }
825
826 void setup_nswindow(HTMLWindow *This)
827 {
828     nsIScriptContainer *script_container;
829     nsIDOMWindow *nswindow;
830     nsIDOMDocument *domdoc;
831     nsIWritableVariant *nsvar;
832     nsIMutableArray *argv;
833     nsresult nsres;
834
835     static const char *args[] = {"wineWindow"};
836
837     TRACE("(%p)\n", This);
838
839     nsIWebNavigation_GetDocument(This->doc->nscontainer->navigation, &domdoc);
840     nsres = nsIDOMDocument_QueryInterface(domdoc, &IID_nsIScriptContainer, (void**)&script_container);
841     nsIDOMDocument_Release(domdoc);
842     if(NS_FAILED(nsres)) {
843         TRACE("Could not get nsIDOMScriptContainer: %08x\n", nsres);
844         return;
845     }
846
847     nsIWebBrowser_GetContentDOMWindow(This->doc->nscontainer->webbrowser, &nswindow);
848
849     nsvar = create_nsvariant();
850     nsres = nsIWritableVariant_SetAsInterface(nsvar, &IID_IDispatch, HTMLWINDOW2(This));
851     if(NS_FAILED(nsres))
852         ERR("SetAsInterface failed: %08x\n", nsres);
853
854     argv = create_nsarray();
855     nsres = nsIMutableArray_AppendElement(argv, (nsISupports*)nsvar, FALSE);
856     nsIWritableVariant_Release(nsvar);
857     if(NS_FAILED(nsres))
858         ERR("AppendElement failed: %08x\n", nsres);
859
860     call_js_func(script_container, (nsISupports*)nswindow/*HTMLWINDOW2(This)*/, "wineConfig",
861                  wineConfig_func, 1, args, (nsIArray*)argv);
862
863     nsIMutableArray_Release(argv);
864     nsIScriptContainer_Release(script_container);
865 }
866
867 HTMLWindow *HTMLWindow_Create(HTMLDocument *doc)
868 {
869     HTMLWindow *ret = heap_alloc(sizeof(HTMLWindow));
870
871     ret->lpHTMLWindow2Vtbl = &HTMLWindow2Vtbl;
872     ret->ref = 1;
873     ret->nswindow = NULL;
874     ret->doc = doc;
875
876     if(doc->nscontainer) {
877         nsresult nsres;
878
879         nsres = nsIWebBrowser_GetContentDOMWindow(doc->nscontainer->webbrowser, &ret->nswindow);
880         if(NS_FAILED(nsres))
881             ERR("GetContentDOMWindow failed: %08x\n", nsres);
882     }
883
884     list_add_head(&window_list, &ret->entry);
885
886     return ret;
887 }
888
889 HTMLWindow *nswindow_to_window(const nsIDOMWindow *nswindow)
890 {
891     HTMLWindow *iter;
892
893     LIST_FOR_EACH_ENTRY(iter, &window_list, HTMLWindow, entry) {
894         if(iter->nswindow == nswindow)
895             return iter;
896     }
897
898     return NULL;
899 }