Added a few more Unicode digits from Unicode version 4.1.
[wine] / dlls / shdocvw / webbrowser.c
1 /*
2  * Implementation of IWebBrowser interface for WebBrowser control
3  *
4  * Copyright 2001 John R. Sheets (for CodeWeavers)
5  * Copyright 2005 Jacek Caban
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  */
21
22 #include "wine/debug.h"
23 #include "shdocvw.h"
24 #include "mshtml.h"
25
26
27 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
28
29 /**********************************************************************
30  * Implement the IWebBrowser interface
31  */
32
33 #define WEBBROWSER_THIS(iface) DEFINE_THIS(WebBrowser, WebBrowser2, iface)
34
35 static HRESULT WINAPI WebBrowser_QueryInterface(IWebBrowser2 *iface, REFIID riid, LPVOID *ppv)
36 {
37     WebBrowser *This = WEBBROWSER_THIS(iface);
38
39     if (ppv == NULL)
40         return E_POINTER;
41     *ppv = NULL;
42
43     if(IsEqualGUID(&IID_IUnknown, riid)) {
44         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
45         *ppv = WEBBROWSER(This);
46     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
47         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
48         *ppv = WEBBROWSER(This);
49     }else if(IsEqualGUID(&IID_IWebBrowser, riid)) {
50         TRACE("(%p)->(IID_IWebBrowser %p)\n", This, ppv);
51         *ppv = WEBBROWSER(This);
52     }else if(IsEqualGUID(&IID_IWebBrowserApp, riid)) {
53         TRACE("(%p)->(IID_IWebBrowserApp %p)\n", This, ppv);
54         *ppv = WEBBROWSER(This);
55     }else if(IsEqualGUID(&IID_IWebBrowser2, riid)) {
56         TRACE("(%p)->(IID_IWebBrowser2 %p)\n", This, ppv);
57         *ppv = WEBBROWSER(This);
58     }else if(IsEqualGUID(&IID_IOleObject, riid)) {
59         TRACE("(%p)->(IID_IOleObject %p)\n", This, ppv);
60         *ppv = OLEOBJ(This);
61     }else if(IsEqualGUID(&IID_IOleWindow, riid)) {
62         TRACE("(%p)->(IID_IOleWindow %p)\n", This, ppv);
63         *ppv = INPLACEOBJ(This);
64     }else if(IsEqualGUID (&IID_IOleInPlaceObject, riid)) {
65         TRACE("(%p)->(IID_IOleInPlaceObject %p)\n", This, ppv);
66         *ppv = INPLACEOBJ(This);
67     }else if(IsEqualGUID(&IID_IOleControl, riid)) {
68         TRACE("(%p)->(IID_IOleControl %p)\n", This, ppv);
69         *ppv = CONTROL(This);
70     }else if(IsEqualGUID(&IID_IPersist, riid)) {
71         TRACE("(%p)->(IID_IPersist %p)\n", This, ppv);
72         *ppv = PERSTORAGE(This);
73     }else if(IsEqualGUID(&IID_IPersistStorage, riid)) {
74         TRACE("(%p)->(IID_IPersistStorage %p)\n", This, ppv);
75         *ppv = PERSTORAGE(This);
76     }else if(IsEqualGUID (&IID_IPersistStreamInit, riid)) {
77         TRACE("(%p)->(IID_IPersistStreamInit %p)\n", This, ppv);
78         *ppv = PERSTRINIT(This);
79     }else if(IsEqualGUID(&IID_IProvideClassInfo, riid)) {
80         TRACE("(%p)->(IID_IProvideClassInfo %p)\n", This, ppv);
81         *ppv = CLASSINFO(This);
82     }else if(IsEqualGUID(&IID_IProvideClassInfo2, riid)) {
83         TRACE("(%p)->(IID_IProvideClassInfo2 %p)\n", This, ppv);
84         *ppv = CLASSINFO(This);
85     }else if(IsEqualGUID(&IID_IQuickActivate, riid)) {
86         TRACE("(%p)->(IID_IQuickActivate %p)\n", This, ppv);
87         *ppv = QUICKACT(This);
88     }else if(IsEqualGUID(&IID_IConnectionPointContainer, riid)) {
89         TRACE("(%p)->(IID_IConnectionPointContainer %p)\n", This, ppv);
90         *ppv = CONPTCONT(This);
91     }else if(IsEqualGUID(&IID_IViewObject, riid)) {
92         TRACE("(%p)->(IID_IViewObject %p)\n", This, ppv);
93         *ppv = VIEWOBJ(This);
94     }else if(IsEqualGUID(&IID_IViewObject2, riid)) {
95         TRACE("(%p)->(IID_IViewObject2 %p)\n", This, ppv);
96         *ppv = VIEWOBJ2(This);
97     }
98
99     if(*ppv) {
100         IUnknown_AddRef((IUnknown*)*ppv);
101         return S_OK;
102     }
103
104     FIXME("(%p)->(%s %p) interface not supported\n", This, debugstr_guid(riid), ppv);
105     return E_NOINTERFACE;
106 }
107
108 static ULONG WINAPI WebBrowser_AddRef(IWebBrowser2 *iface)
109 {
110     WebBrowser *This = WEBBROWSER_THIS(iface);
111     LONG ref = InterlockedIncrement(&This->ref);
112     TRACE("(%p) ref=%ld\n", This, ref);
113     return ref;
114 }
115
116 static ULONG WINAPI WebBrowser_Release(IWebBrowser2 *iface)
117 {
118     WebBrowser *This = WEBBROWSER_THIS(iface);
119     LONG ref = InterlockedDecrement(&This->ref);
120
121     TRACE("(%p) ref=%ld\n", This, ref);
122
123     if(!ref) {
124         if(This->document)
125             IUnknown_Release(This->document);
126
127         WebBrowser_OleObject_Destroy(This);
128         WebBrowser_Events_Destroy(This);
129
130         HeapFree(GetProcessHeap(), 0, This);
131         SHDOCVW_UnlockModule();
132     }
133
134     return ref;
135 }
136
137 /* IDispatch methods */
138 static HRESULT WINAPI WebBrowser_GetTypeInfoCount(IWebBrowser2 *iface, UINT *pctinfo)
139 {
140     WebBrowser *This = WEBBROWSER_THIS(iface);
141     FIXME("(%p)->(%p)\n", This, pctinfo);
142     return E_NOTIMPL;
143 }
144
145 static HRESULT WINAPI WebBrowser_GetTypeInfo(IWebBrowser2 *iface, UINT iTInfo, LCID lcid,
146                                      LPTYPEINFO *ppTInfo)
147 {
148     WebBrowser *This = WEBBROWSER_THIS(iface);
149     FIXME("(%p)->(%d %ld %p)\n", This, iTInfo, lcid, ppTInfo);
150     return E_NOTIMPL;
151 }
152
153 static HRESULT WINAPI WebBrowser_GetIDsOfNames(IWebBrowser2 *iface, REFIID riid,
154                                        LPOLESTR *rgszNames, UINT cNames,
155                                        LCID lcid, DISPID *rgDispId)
156 {
157     WebBrowser *This = WEBBROWSER_THIS(iface);
158     FIXME("(%p)->(%s %p %d %ld %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
159             lcid, rgDispId);
160     return E_NOTIMPL;
161 }
162
163 static HRESULT WINAPI WebBrowser_Invoke(IWebBrowser2 *iface, DISPID dispIdMember,
164                                 REFIID riid, LCID lcid, WORD wFlags,
165                                 DISPPARAMS *pDispParams, VARIANT *pVarResult,
166                                 EXCEPINFO *pExepInfo, UINT *puArgErr)
167 {
168     WebBrowser *This = WEBBROWSER_THIS(iface);
169     FIXME("(%p)->(%ld %s %ld %08x %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
170             lcid, wFlags, pDispParams, pVarResult, pExepInfo, puArgErr);
171     return E_NOTIMPL;
172 }
173
174 /* IWebBrowser methods */
175 static HRESULT WINAPI WebBrowser_GoBack(IWebBrowser2 *iface)
176 {
177     WebBrowser *This = WEBBROWSER_THIS(iface);
178     FIXME("(%p)\n", This);
179     return E_NOTIMPL;
180 }
181
182 static HRESULT WINAPI WebBrowser_GoForward(IWebBrowser2 *iface)
183 {
184     WebBrowser *This = WEBBROWSER_THIS(iface);
185     FIXME("(%p)\n", This);
186     return E_NOTIMPL;
187 }
188
189 static HRESULT WINAPI WebBrowser_GoHome(IWebBrowser2 *iface)
190 {
191     WebBrowser *This = WEBBROWSER_THIS(iface);
192     FIXME("(%p)\n", This);
193     return E_NOTIMPL;
194 }
195
196 static HRESULT WINAPI WebBrowser_GoSearch(IWebBrowser2 *iface)
197 {
198     WebBrowser *This = WEBBROWSER_THIS(iface);
199     FIXME("(%p)\n", This);
200     return E_NOTIMPL;
201 }
202
203 static HRESULT WINAPI WebBrowser_Navigate(IWebBrowser2 *iface, BSTR URL,
204                                   VARIANT *Flags, VARIANT *TargetFrameName,
205                                   VARIANT *PostData, VARIANT *Headers)
206 {
207     WebBrowser *This = WEBBROWSER_THIS(iface);
208     FIXME("(%p)->(%s %p %p %p %p)\n", This, debugstr_w(URL), Flags, TargetFrameName,
209           PostData, Headers);
210     return E_NOTIMPL;
211 }
212
213 static HRESULT WINAPI WebBrowser_Refresh(IWebBrowser2 *iface)
214 {
215     WebBrowser *This = WEBBROWSER_THIS(iface);
216     FIXME("(%p)\n", This);
217     return E_NOTIMPL;
218 }
219
220 static HRESULT WINAPI WebBrowser_Refresh2(IWebBrowser2 *iface, VARIANT *Level)
221 {
222     WebBrowser *This = WEBBROWSER_THIS(iface);
223     FIXME("(%p)->(%p)\n", This, Level);
224     return E_NOTIMPL;
225 }
226
227 static HRESULT WINAPI WebBrowser_Stop(IWebBrowser2 *iface)
228 {
229     WebBrowser *This = WEBBROWSER_THIS(iface);
230     FIXME("(%p)\n", This);
231     return E_NOTIMPL;
232 }
233
234 static HRESULT WINAPI WebBrowser_get_Application(IWebBrowser2 *iface, IDispatch **ppDisp)
235 {
236     WebBrowser *This = WEBBROWSER_THIS(iface);
237     FIXME("(%p)->(%p)\n", This, ppDisp);
238     return E_NOTIMPL;
239 }
240
241 static HRESULT WINAPI WebBrowser_get_Parent(IWebBrowser2 *iface, IDispatch **ppDisp)
242 {
243     WebBrowser *This = WEBBROWSER_THIS(iface);
244     FIXME("(%p)->(%p)\n", This, ppDisp);
245     return E_NOTIMPL;
246 }
247
248 static HRESULT WINAPI WebBrowser_get_Container(IWebBrowser2 *iface, IDispatch **ppDisp)
249 {
250     WebBrowser *This = WEBBROWSER_THIS(iface);
251     FIXME("(%p)->(%p)\n", This, ppDisp);
252     return E_NOTIMPL;
253 }
254
255 static HRESULT WINAPI WebBrowser_get_Document(IWebBrowser2 *iface, IDispatch **ppDisp)
256 {
257     WebBrowser *This = WEBBROWSER_THIS(iface);
258     FIXME("(%p)->(%p)\n", This, ppDisp);
259     return E_NOTIMPL;
260 }
261
262 static HRESULT WINAPI WebBrowser_get_TopLevelContainer(IWebBrowser2 *iface, VARIANT_BOOL *pBool)
263 {
264     WebBrowser *This = WEBBROWSER_THIS(iface);
265     FIXME("(%p)->(%p)\n", This, pBool);
266     return E_NOTIMPL;
267 }
268
269 static HRESULT WINAPI WebBrowser_get_Type(IWebBrowser2 *iface, BSTR *Type)
270 {
271     WebBrowser *This = WEBBROWSER_THIS(iface);
272     FIXME("(%p)->(%p)\n", This, Type);
273     return E_NOTIMPL;
274 }
275
276 static HRESULT WINAPI WebBrowser_get_Left(IWebBrowser2 *iface, long *pl)
277 {
278     WebBrowser *This = WEBBROWSER_THIS(iface);
279     FIXME("(%p)->(%p)\n", This, pl);
280     return E_NOTIMPL;
281 }
282
283 static HRESULT WINAPI WebBrowser_put_Left(IWebBrowser2 *iface, long Left)
284 {
285     WebBrowser *This = WEBBROWSER_THIS(iface);
286     FIXME("(%p)->(%ld)\n", This, Left);
287     return E_NOTIMPL;
288 }
289
290 static HRESULT WINAPI WebBrowser_get_Top(IWebBrowser2 *iface, long *pl)
291 {
292     WebBrowser *This = WEBBROWSER_THIS(iface);
293     FIXME("(%p)->(%p)\n", This, pl);
294     return E_NOTIMPL;
295 }
296
297 static HRESULT WINAPI WebBrowser_put_Top(IWebBrowser2 *iface, long Top)
298 {
299     WebBrowser *This = WEBBROWSER_THIS(iface);
300     FIXME("(%p)->(%ld)\n", This, Top);
301     return E_NOTIMPL;
302 }
303
304 static HRESULT WINAPI WebBrowser_get_Width(IWebBrowser2 *iface, long *pl)
305 {
306     WebBrowser *This = WEBBROWSER_THIS(iface);
307     FIXME("(%p)->(%p)\n", This, pl);
308     return E_NOTIMPL;
309 }
310
311 static HRESULT WINAPI WebBrowser_put_Width(IWebBrowser2 *iface, long Width)
312 {
313     WebBrowser *This = WEBBROWSER_THIS(iface);
314     FIXME("(%p)->(%ld)\n", This, Width);
315     return E_NOTIMPL;
316 }
317
318 static HRESULT WINAPI WebBrowser_get_Height(IWebBrowser2 *iface, long *pl)
319 {
320     WebBrowser *This = WEBBROWSER_THIS(iface);
321     FIXME("(%p)->(%p)\n", This, pl);
322     return E_NOTIMPL;
323 }
324
325 static HRESULT WINAPI WebBrowser_put_Height(IWebBrowser2 *iface, long Height)
326 {
327     WebBrowser *This = WEBBROWSER_THIS(iface);
328     FIXME("(%p)->(%ld)\n", This, Height);
329     return E_NOTIMPL;
330 }
331
332 static HRESULT WINAPI WebBrowser_get_LocationName(IWebBrowser2 *iface, BSTR *LocationName)
333 {
334     WebBrowser *This = WEBBROWSER_THIS(iface);
335     FIXME("(%p)->(%p)\n", This, LocationName);
336     return E_NOTIMPL;
337 }
338
339 static HRESULT WINAPI WebBrowser_get_LocationURL(IWebBrowser2 *iface, BSTR *LocationURL)
340 {
341     WebBrowser *This = WEBBROWSER_THIS(iface);
342     FIXME("(%p)->(%p)\n", This, LocationURL);
343     return E_NOTIMPL;
344 }
345
346 static HRESULT WINAPI WebBrowser_get_Busy(IWebBrowser2 *iface, VARIANT_BOOL *pBool)
347 {
348     WebBrowser *This = WEBBROWSER_THIS(iface);
349     FIXME("(%p)->(%p)\n", This, pBool);
350     return E_NOTIMPL;
351 }
352
353 static HRESULT WINAPI WebBrowser_Quit(IWebBrowser2 *iface)
354 {
355     WebBrowser *This = WEBBROWSER_THIS(iface);
356     FIXME("(%p)\n", This);
357     return E_NOTIMPL;
358 }
359
360 static HRESULT WINAPI WebBrowser_ClientToWindow(IWebBrowser2 *iface, int *pcx, int *pcy)
361 {
362     WebBrowser *This = WEBBROWSER_THIS(iface);
363     FIXME("(%p)->(%p %p)\n", This, pcx, pcy);
364     return E_NOTIMPL;
365 }
366
367 static HRESULT WINAPI WebBrowser_PutProperty(IWebBrowser2 *iface, BSTR szProperty, VARIANT vtValue)
368 {
369     WebBrowser *This = WEBBROWSER_THIS(iface);
370     FIXME("(%p)->(%s)\n", This, debugstr_w(szProperty));
371     return E_NOTIMPL;
372 }
373
374 static HRESULT WINAPI WebBrowser_GetProperty(IWebBrowser2 *iface, BSTR szProperty, VARIANT *pvtValue)
375 {
376     WebBrowser *This = WEBBROWSER_THIS(iface);
377     FIXME("(%p)->(%s %p)\n", This, debugstr_w(szProperty), pvtValue);
378     return E_NOTIMPL;
379 }
380
381 static HRESULT WINAPI WebBrowser_get_Name(IWebBrowser2 *iface, BSTR *Name)
382 {
383     WebBrowser *This = WEBBROWSER_THIS(iface);
384     FIXME("(%p)->(%p)\n", This, Name);
385     return E_NOTIMPL;
386 }
387
388 static HRESULT WINAPI WebBrowser_get_HWND(IWebBrowser2 *iface, long *pHWND)
389 {
390     WebBrowser *This = WEBBROWSER_THIS(iface);
391     FIXME("(%p)->(%p)\n", This, pHWND);
392     return E_NOTIMPL;
393 }
394
395 static HRESULT WINAPI WebBrowser_get_FullName(IWebBrowser2 *iface, BSTR *FullName)
396 {
397     WebBrowser *This = WEBBROWSER_THIS(iface);
398     FIXME("(%p)->(%p)\n", This, FullName);
399     return E_NOTIMPL;
400 }
401
402 static HRESULT WINAPI WebBrowser_get_Path(IWebBrowser2 *iface, BSTR *Path)
403 {
404     WebBrowser *This = WEBBROWSER_THIS(iface);
405     FIXME("(%p)->(%p)\n", This, Path);
406     return E_NOTIMPL;
407 }
408
409 static HRESULT WINAPI WebBrowser_get_Visible(IWebBrowser2 *iface, VARIANT_BOOL *pBool)
410 {
411     WebBrowser *This = WEBBROWSER_THIS(iface);
412     FIXME("(%p)->(%p)\n", This, pBool);
413     return E_NOTIMPL;
414 }
415
416 static HRESULT WINAPI WebBrowser_put_Visible(IWebBrowser2 *iface, VARIANT_BOOL Value)
417 {
418     WebBrowser *This = WEBBROWSER_THIS(iface);
419     FIXME("(%p)->(%x)\n", This, Value);
420     return E_NOTIMPL;
421 }
422
423 static HRESULT WINAPI WebBrowser_get_StatusBar(IWebBrowser2 *iface, VARIANT_BOOL *pBool)
424 {
425     WebBrowser *This = WEBBROWSER_THIS(iface);
426     FIXME("(%p)->(%p)\n", This, pBool);
427     return E_NOTIMPL;
428 }
429
430 static HRESULT WINAPI WebBrowser_put_StatusBar(IWebBrowser2 *iface, VARIANT_BOOL Value)
431 {
432     WebBrowser *This = WEBBROWSER_THIS(iface);
433     FIXME("(%p)->(%x)\n", This, Value);
434     return E_NOTIMPL;
435 }
436
437 static HRESULT WINAPI WebBrowser_get_StatusText(IWebBrowser2 *iface, BSTR *StatusText)
438 {
439     WebBrowser *This = WEBBROWSER_THIS(iface);
440     FIXME("(%p)->(%p)\n", This, StatusText);
441     return E_NOTIMPL;
442 }
443
444 static HRESULT WINAPI WebBrowser_put_StatusText(IWebBrowser2 *iface, BSTR StatusText)
445 {
446     WebBrowser *This = WEBBROWSER_THIS(iface);
447     FIXME("(%p)->(%s)\n", This, debugstr_w(StatusText));
448     return E_NOTIMPL;
449 }
450
451 static HRESULT WINAPI WebBrowser_get_ToolBar(IWebBrowser2 *iface, int *Value)
452 {
453     WebBrowser *This = WEBBROWSER_THIS(iface);
454     FIXME("(%p)->(%p)\n", This, Value);
455     return E_NOTIMPL;
456 }
457
458 static HRESULT WINAPI WebBrowser_put_ToolBar(IWebBrowser2 *iface, int Value)
459 {
460     WebBrowser *This = WEBBROWSER_THIS(iface);
461     FIXME("(%p)->(%d)\n", This, Value);
462     return E_NOTIMPL;
463 }
464
465 static HRESULT WINAPI WebBrowser_get_MenuBar(IWebBrowser2 *iface, VARIANT_BOOL *Value)
466 {
467     WebBrowser *This = WEBBROWSER_THIS(iface);
468     FIXME("(%p)->(%p)\n", This, Value);
469     return E_NOTIMPL;
470 }
471
472 static HRESULT WINAPI WebBrowser_put_MenuBar(IWebBrowser2 *iface, VARIANT_BOOL Value)
473 {
474     WebBrowser *This = WEBBROWSER_THIS(iface);
475     FIXME("(%p)->(%x)\n", This, Value);
476     return E_NOTIMPL;
477 }
478
479 static HRESULT WINAPI WebBrowser_get_FullScreen(IWebBrowser2 *iface, VARIANT_BOOL *pbFullScreen)
480 {
481     WebBrowser *This = WEBBROWSER_THIS(iface);
482     FIXME("(%p)->(%p)\n", This, pbFullScreen);
483     return E_NOTIMPL;
484 }
485
486 static HRESULT WINAPI WebBrowser_put_FullScreen(IWebBrowser2 *iface, VARIANT_BOOL bFullScreen)
487 {
488     WebBrowser *This = WEBBROWSER_THIS(iface);
489     FIXME("(%p)->(%x)\n", This, bFullScreen);
490     return E_NOTIMPL;
491 }
492
493 static HRESULT WINAPI WebBrowser_Navigate2(IWebBrowser2 *iface, VARIANT *URL, VARIANT *Flags,
494         VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers)
495 {
496     WebBrowser *This = WEBBROWSER_THIS(iface);
497     IPersistMoniker *persist;
498     IOleObject *oleobj;
499     IMoniker *mon;
500     HRESULT hres;
501
502     TRACE("(%p)->(%p %p %p %p %p)\n", This, URL, Flags, TargetFrameName, PostData, Headers);
503
504     if(!This->client)
505         return E_FAIL;
506
507     if(V_VT(Flags) != VT_EMPTY || V_VT(TargetFrameName) != VT_EMPTY
508        || V_VT(PostData) != VT_EMPTY || V_VT(Headers) != VT_EMPTY)
509         FIXME("Unsupported arguments\n");
510
511     if(V_VT(URL) != VT_BSTR)
512         FIXME("V_VT(URL) != VT_BSTR\n");
513
514     /*
515      * FIXME:
516      * We should use URLMoniker's BindToObject instead creating HTMLDocument here.
517      * This should be fixed when mshtml.dll and urlmon.dll will be good enough.
518      */
519
520     if(!This->document) {
521         hres = CoCreateInstance(&CLSID_HTMLDocument, NULL,
522                                 CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
523                                 &IID_IUnknown, (void**)&This->document);
524         if(FAILED(hres))
525             return hres;
526     }
527
528     hres = IUnknown_QueryInterface(This->document, &IID_IPersistMoniker, (void**)&persist);
529     if(FAILED(hres))
530         return hres;
531
532     hres = CreateURLMoniker(NULL, V_BSTR(URL), &mon);
533     if(FAILED(hres)) {
534         IPersistMoniker_Release(persist);
535         return hres;
536     }
537
538     hres = IPersistMoniker_Load(persist, FALSE, mon, NULL /* FIXME */, 0);
539     IMoniker_Release(mon);
540     IPersistMoniker_Release(persist);
541     if(FAILED(hres)) {
542         WARN("Load failed: %08lx\n", hres);
543         return hres;
544     }
545
546     hres = IUnknown_QueryInterface(This->document, &IID_IOleObject, (void**)&oleobj);
547     if(FAILED(hres))
548         return hres;
549
550     hres = IOleObject_SetClientSite(oleobj, CLIENTSITE(This));
551     IOleObject_Release(oleobj);
552
553     return hres;
554 }
555
556 static HRESULT WINAPI WebBrowser_QueryStatusWB(IWebBrowser2 *iface, OLECMDID cmdID, OLECMDF *pcmdf)
557 {
558     WebBrowser *This = WEBBROWSER_THIS(iface);
559     FIXME("(%p)->(%d %p)\n", This, cmdID, pcmdf);
560     return E_NOTIMPL;
561 }
562
563 static HRESULT WINAPI WebBrowser_ExecWB(IWebBrowser2 *iface, OLECMDID cmdID,
564         OLECMDEXECOPT cmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
565 {
566     WebBrowser *This = WEBBROWSER_THIS(iface);
567     FIXME("(%p)->(%d %d %p %p)\n", This, cmdID, cmdexecopt, pvaIn, pvaOut);
568     return E_NOTIMPL;
569 }
570
571 static HRESULT WINAPI WebBrowser_ShowBrowserBar(IWebBrowser2 *iface, VARIANT *pvaClsid,
572         VARIANT *pvarShow, VARIANT *pvarSize)
573 {
574     WebBrowser *This = WEBBROWSER_THIS(iface);
575     FIXME("(%p)->(%p %p %p)\n", This, pvaClsid, pvarShow, pvarSize);
576     return E_NOTIMPL;
577 }
578
579 static HRESULT WINAPI WebBrowser_get_ReadyState(IWebBrowser2 *iface, READYSTATE *lpReadyState)
580 {
581     WebBrowser *This = WEBBROWSER_THIS(iface);
582     FIXME("(%p)->(%p)\n", This, lpReadyState);
583     return E_NOTIMPL;
584 }
585
586 static HRESULT WINAPI WebBrowser_get_Offline(IWebBrowser2 *iface, VARIANT_BOOL *pbOffline)
587 {
588     WebBrowser *This = WEBBROWSER_THIS(iface);
589     FIXME("(%p)->(%p)\n", This, pbOffline);
590     return E_NOTIMPL;
591 }
592
593 static HRESULT WINAPI WebBrowser_put_Offline(IWebBrowser2 *iface, VARIANT_BOOL bOffline)
594 {
595     WebBrowser *This = WEBBROWSER_THIS(iface);
596     FIXME("(%p)->(%x)\n", This, bOffline);
597     return E_NOTIMPL;
598 }
599
600 static HRESULT WINAPI WebBrowser_get_Silent(IWebBrowser2 *iface, VARIANT_BOOL *pbSilent)
601 {
602     WebBrowser *This = WEBBROWSER_THIS(iface);
603     FIXME("(%p)->(%p)\n", This, pbSilent);
604     return E_NOTIMPL;
605 }
606
607 static HRESULT WINAPI WebBrowser_put_Silent(IWebBrowser2 *iface, VARIANT_BOOL bSilent)
608 {
609     WebBrowser *This = WEBBROWSER_THIS(iface);
610     FIXME("(%p)->(%x)\n", This, bSilent);
611     return E_NOTIMPL;
612 }
613
614 static HRESULT WINAPI WebBrowser_get_RegisterAsBrowser(IWebBrowser2 *iface,
615         VARIANT_BOOL *pbRegister)
616 {
617     WebBrowser *This = WEBBROWSER_THIS(iface);
618     FIXME("(%p)->(%p)\n", This, pbRegister);
619     return E_NOTIMPL;
620 }
621
622 static HRESULT WINAPI WebBrowser_put_RegisterAsBrowser(IWebBrowser2 *iface,
623         VARIANT_BOOL bRegister)
624 {
625     WebBrowser *This = WEBBROWSER_THIS(iface);
626     FIXME("(%p)->(%x)\n", This, bRegister);
627     return E_NOTIMPL;
628 }
629
630 static HRESULT WINAPI WebBrowser_get_RegisterAsDropTarget(IWebBrowser2 *iface,
631         VARIANT_BOOL *pbRegister)
632 {
633     WebBrowser *This = WEBBROWSER_THIS(iface);
634     FIXME("(%p)->(%p)\n", This, pbRegister);
635     return E_NOTIMPL;
636 }
637
638 static HRESULT WINAPI WebBrowser_put_RegisterAsDropTarget(IWebBrowser2 *iface,
639         VARIANT_BOOL bRegister)
640 {
641     WebBrowser *This = WEBBROWSER_THIS(iface);
642     FIXME("(%p)->(%x)\n", This, bRegister);
643     return E_NOTIMPL;
644 }
645
646 static HRESULT WINAPI WebBrowser_get_TheaterMode(IWebBrowser2 *iface, VARIANT_BOOL *pbRegister)
647 {
648     WebBrowser *This = WEBBROWSER_THIS(iface);
649     FIXME("(%p)->(%p)\n", This, pbRegister);
650     return E_NOTIMPL;
651 }
652
653 static HRESULT WINAPI WebBrowser_put_TheaterMode(IWebBrowser2 *iface, VARIANT_BOOL bRegister)
654 {
655     WebBrowser *This = WEBBROWSER_THIS(iface);
656     FIXME("(%p)->(%x)\n", This, bRegister);
657     return E_NOTIMPL;
658 }
659
660 static HRESULT WINAPI WebBrowser_get_AddressBar(IWebBrowser2 *iface, VARIANT_BOOL *Value)
661 {
662     WebBrowser *This = WEBBROWSER_THIS(iface);
663     FIXME("(%p)->(%p)\n", This, Value);
664     return E_NOTIMPL;
665 }
666
667 static HRESULT WINAPI WebBrowser_put_AddressBar(IWebBrowser2 *iface, VARIANT_BOOL Value)
668 {
669     WebBrowser *This = WEBBROWSER_THIS(iface);
670     FIXME("(%p)->(%x)\n", This, Value);
671     return E_NOTIMPL;
672 }
673
674 static HRESULT WINAPI WebBrowser_get_Resizable(IWebBrowser2 *iface, VARIANT_BOOL *Value)
675 {
676     WebBrowser *This = WEBBROWSER_THIS(iface);
677     FIXME("(%p)->(%p)\n", This, Value);
678     return E_NOTIMPL;
679 }
680
681 static HRESULT WINAPI WebBrowser_put_Resizable(IWebBrowser2 *iface, VARIANT_BOOL Value)
682 {
683     WebBrowser *This = WEBBROWSER_THIS(iface);
684     FIXME("(%p)->(%x)\n", This, Value);
685     return E_NOTIMPL;
686 }
687
688 #undef WEBBROWSER_THIS
689
690 static const IWebBrowser2Vtbl WebBrowser2Vtbl =
691 {
692     WebBrowser_QueryInterface,
693     WebBrowser_AddRef,
694     WebBrowser_Release,
695     WebBrowser_GetTypeInfoCount,
696     WebBrowser_GetTypeInfo,
697     WebBrowser_GetIDsOfNames,
698     WebBrowser_Invoke,
699     WebBrowser_GoBack,
700     WebBrowser_GoForward,
701     WebBrowser_GoHome,
702     WebBrowser_GoSearch,
703     WebBrowser_Navigate,
704     WebBrowser_Refresh,
705     WebBrowser_Refresh2,
706     WebBrowser_Stop,
707     WebBrowser_get_Application,
708     WebBrowser_get_Parent,
709     WebBrowser_get_Container,
710     WebBrowser_get_Document,
711     WebBrowser_get_TopLevelContainer,
712     WebBrowser_get_Type,
713     WebBrowser_get_Left,
714     WebBrowser_put_Left,
715     WebBrowser_get_Top,
716     WebBrowser_put_Top,
717     WebBrowser_get_Width,
718     WebBrowser_put_Width,
719     WebBrowser_get_Height,
720     WebBrowser_put_Height,
721     WebBrowser_get_LocationName,
722     WebBrowser_get_LocationURL,
723     WebBrowser_get_Busy,
724     WebBrowser_Quit,
725     WebBrowser_ClientToWindow,
726     WebBrowser_PutProperty,
727     WebBrowser_GetProperty,
728     WebBrowser_get_Name,
729     WebBrowser_get_HWND,
730     WebBrowser_get_FullName,
731     WebBrowser_get_Path,
732     WebBrowser_get_Visible,
733     WebBrowser_put_Visible,
734     WebBrowser_get_StatusBar,
735     WebBrowser_put_StatusBar,
736     WebBrowser_get_StatusText,
737     WebBrowser_put_StatusText,
738     WebBrowser_get_ToolBar,
739     WebBrowser_put_ToolBar,
740     WebBrowser_get_MenuBar,
741     WebBrowser_put_MenuBar,
742     WebBrowser_get_FullScreen,
743     WebBrowser_put_FullScreen,
744     WebBrowser_Navigate2,
745     WebBrowser_QueryStatusWB,
746     WebBrowser_ExecWB,
747     WebBrowser_ShowBrowserBar,
748     WebBrowser_get_ReadyState,
749     WebBrowser_get_Offline,
750     WebBrowser_put_Offline,
751     WebBrowser_get_Silent,
752     WebBrowser_put_Silent,
753     WebBrowser_get_RegisterAsBrowser,
754     WebBrowser_put_RegisterAsBrowser,
755     WebBrowser_get_RegisterAsDropTarget,
756     WebBrowser_put_RegisterAsDropTarget,
757     WebBrowser_get_TheaterMode,
758     WebBrowser_put_TheaterMode,
759     WebBrowser_get_AddressBar,
760     WebBrowser_put_AddressBar,
761     WebBrowser_get_Resizable,
762     WebBrowser_put_Resizable
763 };
764
765 HRESULT WebBrowser_Create(IUnknown *pOuter, REFIID riid, void **ppv)
766 {
767     WebBrowser *ret;
768     HRESULT hres;
769
770     TRACE("(%p %s %p)\n", pOuter, debugstr_guid(riid), ppv);
771
772     ret = HeapAlloc(GetProcessHeap(), 0, sizeof(WebBrowser));
773
774     ret->lpWebBrowser2Vtbl = &WebBrowser2Vtbl;
775     ret->ref = 0;
776
777     ret->document = NULL;
778
779     WebBrowser_OleObject_Init(ret);
780     WebBrowser_ViewObject_Init(ret);
781     WebBrowser_Persist_Init(ret);
782     WebBrowser_ClassInfo_Init(ret);
783     WebBrowser_Misc_Init(ret);
784     WebBrowser_Events_Init(ret);
785     WebBrowser_ClientSite_Init(ret);
786     WebBrowser_DocHost_Init(ret);
787
788     hres = IWebBrowser_QueryInterface(WEBBROWSER(ret), riid, ppv);
789     if(SUCCEEDED(hres)) {
790         SHDOCVW_LockModule();
791     }else {
792         HeapFree(GetProcessHeap(), 0, ret);
793         return hres;
794     }
795
796     return hres;
797 }