user: Remove internal messages from the message queue before handling them.
[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     }else if(IsEqualGUID(&IID_IOleInPlaceActiveObject, riid)) {
98         TRACE("(%p)->(IID_IOleInPlaceActiveObject %p)\n", This, ppv);
99         *ppv = ACTIVEOBJ(This);
100     }else if(IsEqualGUID(&IID_IOleCommandTarget, riid)) {
101         TRACE("(%p)->(IID_IOleCommandTarget %p)\n", This, ppv);
102         *ppv = WBOLECMD(This);
103     }
104
105     if(*ppv) {
106         IUnknown_AddRef((IUnknown*)*ppv);
107         return S_OK;
108     }
109
110     FIXME("(%p)->(%s %p) interface not supported\n", This, debugstr_guid(riid), ppv);
111     return E_NOINTERFACE;
112 }
113
114 static ULONG WINAPI WebBrowser_AddRef(IWebBrowser2 *iface)
115 {
116     WebBrowser *This = WEBBROWSER_THIS(iface);
117     LONG ref = InterlockedIncrement(&This->ref);
118     TRACE("(%p) ref=%ld\n", This, ref);
119     return ref;
120 }
121
122 static ULONG WINAPI WebBrowser_Release(IWebBrowser2 *iface)
123 {
124     WebBrowser *This = WEBBROWSER_THIS(iface);
125     LONG ref = InterlockedDecrement(&This->ref);
126
127     TRACE("(%p) ref=%ld\n", This, ref);
128
129     if(!ref) {
130         if(This->document)
131             IUnknown_Release(This->document);
132
133         WebBrowser_OleObject_Destroy(This);
134         WebBrowser_Events_Destroy(This);
135         WebBrowser_ClientSite_Destroy(This);
136
137         SysFreeString(This->url);
138         HeapFree(GetProcessHeap(), 0, This);
139         SHDOCVW_UnlockModule();
140     }
141
142     return ref;
143 }
144
145 /* IDispatch methods */
146 static HRESULT WINAPI WebBrowser_GetTypeInfoCount(IWebBrowser2 *iface, UINT *pctinfo)
147 {
148     WebBrowser *This = WEBBROWSER_THIS(iface);
149     FIXME("(%p)->(%p)\n", This, pctinfo);
150     return E_NOTIMPL;
151 }
152
153 static HRESULT WINAPI WebBrowser_GetTypeInfo(IWebBrowser2 *iface, UINT iTInfo, LCID lcid,
154                                      LPTYPEINFO *ppTInfo)
155 {
156     WebBrowser *This = WEBBROWSER_THIS(iface);
157     FIXME("(%p)->(%d %ld %p)\n", This, iTInfo, lcid, ppTInfo);
158     return E_NOTIMPL;
159 }
160
161 static HRESULT WINAPI WebBrowser_GetIDsOfNames(IWebBrowser2 *iface, REFIID riid,
162                                        LPOLESTR *rgszNames, UINT cNames,
163                                        LCID lcid, DISPID *rgDispId)
164 {
165     WebBrowser *This = WEBBROWSER_THIS(iface);
166     FIXME("(%p)->(%s %p %d %ld %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
167             lcid, rgDispId);
168     return E_NOTIMPL;
169 }
170
171 static HRESULT WINAPI WebBrowser_Invoke(IWebBrowser2 *iface, DISPID dispIdMember,
172                                 REFIID riid, LCID lcid, WORD wFlags,
173                                 DISPPARAMS *pDispParams, VARIANT *pVarResult,
174                                 EXCEPINFO *pExepInfo, UINT *puArgErr)
175 {
176     WebBrowser *This = WEBBROWSER_THIS(iface);
177     FIXME("(%p)->(%ld %s %ld %08x %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
178             lcid, wFlags, pDispParams, pVarResult, pExepInfo, puArgErr);
179     return E_NOTIMPL;
180 }
181
182 /* IWebBrowser methods */
183 static HRESULT WINAPI WebBrowser_GoBack(IWebBrowser2 *iface)
184 {
185     WebBrowser *This = WEBBROWSER_THIS(iface);
186     FIXME("(%p)\n", This);
187     return E_NOTIMPL;
188 }
189
190 static HRESULT WINAPI WebBrowser_GoForward(IWebBrowser2 *iface)
191 {
192     WebBrowser *This = WEBBROWSER_THIS(iface);
193     FIXME("(%p)\n", This);
194     return E_NOTIMPL;
195 }
196
197 static HRESULT WINAPI WebBrowser_GoHome(IWebBrowser2 *iface)
198 {
199     WebBrowser *This = WEBBROWSER_THIS(iface);
200     FIXME("(%p)\n", This);
201     return E_NOTIMPL;
202 }
203
204 static HRESULT WINAPI WebBrowser_GoSearch(IWebBrowser2 *iface)
205 {
206     WebBrowser *This = WEBBROWSER_THIS(iface);
207     FIXME("(%p)\n", This);
208     return E_NOTIMPL;
209 }
210
211 static HRESULT WINAPI WebBrowser_Navigate(IWebBrowser2 *iface, BSTR URL,
212                                   VARIANT *Flags, VARIANT *TargetFrameName,
213                                   VARIANT *PostData, VARIANT *Headers)
214 {
215     WebBrowser *This = WEBBROWSER_THIS(iface);
216     FIXME("(%p)->(%s %p %p %p %p)\n", This, debugstr_w(URL), Flags, TargetFrameName,
217           PostData, Headers);
218     return E_NOTIMPL;
219 }
220
221 static HRESULT WINAPI WebBrowser_Refresh(IWebBrowser2 *iface)
222 {
223     WebBrowser *This = WEBBROWSER_THIS(iface);
224     FIXME("(%p)\n", This);
225     return E_NOTIMPL;
226 }
227
228 static HRESULT WINAPI WebBrowser_Refresh2(IWebBrowser2 *iface, VARIANT *Level)
229 {
230     WebBrowser *This = WEBBROWSER_THIS(iface);
231     FIXME("(%p)->(%p)\n", This, Level);
232     return E_NOTIMPL;
233 }
234
235 static HRESULT WINAPI WebBrowser_Stop(IWebBrowser2 *iface)
236 {
237     WebBrowser *This = WEBBROWSER_THIS(iface);
238     FIXME("(%p)\n", This);
239     return E_NOTIMPL;
240 }
241
242 static HRESULT WINAPI WebBrowser_get_Application(IWebBrowser2 *iface, IDispatch **ppDisp)
243 {
244     WebBrowser *This = WEBBROWSER_THIS(iface);
245     FIXME("(%p)->(%p)\n", This, ppDisp);
246     return E_NOTIMPL;
247 }
248
249 static HRESULT WINAPI WebBrowser_get_Parent(IWebBrowser2 *iface, IDispatch **ppDisp)
250 {
251     WebBrowser *This = WEBBROWSER_THIS(iface);
252     FIXME("(%p)->(%p)\n", This, ppDisp);
253     return E_NOTIMPL;
254 }
255
256 static HRESULT WINAPI WebBrowser_get_Container(IWebBrowser2 *iface, IDispatch **ppDisp)
257 {
258     WebBrowser *This = WEBBROWSER_THIS(iface);
259     FIXME("(%p)->(%p)\n", This, ppDisp);
260     return E_NOTIMPL;
261 }
262
263 static HRESULT WINAPI WebBrowser_get_Document(IWebBrowser2 *iface, IDispatch **ppDisp)
264 {
265     WebBrowser *This = WEBBROWSER_THIS(iface);
266
267     TRACE("(%p)->(%p)\n", This, ppDisp);
268
269     *ppDisp = NULL;
270     if(This->document)
271         IUnknown_QueryInterface(This->document, &IID_IDispatch, (void**)ppDisp);
272
273     return S_OK;
274 }
275
276 static HRESULT WINAPI WebBrowser_get_TopLevelContainer(IWebBrowser2 *iface, VARIANT_BOOL *pBool)
277 {
278     WebBrowser *This = WEBBROWSER_THIS(iface);
279     FIXME("(%p)->(%p)\n", This, pBool);
280     return E_NOTIMPL;
281 }
282
283 static HRESULT WINAPI WebBrowser_get_Type(IWebBrowser2 *iface, BSTR *Type)
284 {
285     WebBrowser *This = WEBBROWSER_THIS(iface);
286     FIXME("(%p)->(%p)\n", This, Type);
287     return E_NOTIMPL;
288 }
289
290 static HRESULT WINAPI WebBrowser_get_Left(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_Left(IWebBrowser2 *iface, long Left)
298 {
299     WebBrowser *This = WEBBROWSER_THIS(iface);
300     FIXME("(%p)->(%ld)\n", This, Left);
301     return E_NOTIMPL;
302 }
303
304 static HRESULT WINAPI WebBrowser_get_Top(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_Top(IWebBrowser2 *iface, long Top)
312 {
313     WebBrowser *This = WEBBROWSER_THIS(iface);
314     FIXME("(%p)->(%ld)\n", This, Top);
315     return E_NOTIMPL;
316 }
317
318 static HRESULT WINAPI WebBrowser_get_Width(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_Width(IWebBrowser2 *iface, long Width)
326 {
327     WebBrowser *This = WEBBROWSER_THIS(iface);
328     FIXME("(%p)->(%ld)\n", This, Width);
329     return E_NOTIMPL;
330 }
331
332 static HRESULT WINAPI WebBrowser_get_Height(IWebBrowser2 *iface, long *pl)
333 {
334     WebBrowser *This = WEBBROWSER_THIS(iface);
335     FIXME("(%p)->(%p)\n", This, pl);
336     return E_NOTIMPL;
337 }
338
339 static HRESULT WINAPI WebBrowser_put_Height(IWebBrowser2 *iface, long Height)
340 {
341     WebBrowser *This = WEBBROWSER_THIS(iface);
342     FIXME("(%p)->(%ld)\n", This, Height);
343     return E_NOTIMPL;
344 }
345
346 static HRESULT WINAPI WebBrowser_get_LocationName(IWebBrowser2 *iface, BSTR *LocationName)
347 {
348     WebBrowser *This = WEBBROWSER_THIS(iface);
349     FIXME("(%p)->(%p)\n", This, LocationName);
350     return E_NOTIMPL;
351 }
352
353 static HRESULT WINAPI WebBrowser_get_LocationURL(IWebBrowser2 *iface, BSTR *LocationURL)
354 {
355     WebBrowser *This = WEBBROWSER_THIS(iface);
356     FIXME("(%p)->(%p)\n", This, LocationURL);
357     return E_NOTIMPL;
358 }
359
360 static HRESULT WINAPI WebBrowser_get_Busy(IWebBrowser2 *iface, VARIANT_BOOL *pBool)
361 {
362     WebBrowser *This = WEBBROWSER_THIS(iface);
363     FIXME("(%p)->(%p)\n", This, pBool);
364     return E_NOTIMPL;
365 }
366
367 static HRESULT WINAPI WebBrowser_Quit(IWebBrowser2 *iface)
368 {
369     WebBrowser *This = WEBBROWSER_THIS(iface);
370     FIXME("(%p)\n", This);
371     return E_NOTIMPL;
372 }
373
374 static HRESULT WINAPI WebBrowser_ClientToWindow(IWebBrowser2 *iface, int *pcx, int *pcy)
375 {
376     WebBrowser *This = WEBBROWSER_THIS(iface);
377     FIXME("(%p)->(%p %p)\n", This, pcx, pcy);
378     return E_NOTIMPL;
379 }
380
381 static HRESULT WINAPI WebBrowser_PutProperty(IWebBrowser2 *iface, BSTR szProperty, VARIANT vtValue)
382 {
383     WebBrowser *This = WEBBROWSER_THIS(iface);
384     FIXME("(%p)->(%s)\n", This, debugstr_w(szProperty));
385     return E_NOTIMPL;
386 }
387
388 static HRESULT WINAPI WebBrowser_GetProperty(IWebBrowser2 *iface, BSTR szProperty, VARIANT *pvtValue)
389 {
390     WebBrowser *This = WEBBROWSER_THIS(iface);
391     FIXME("(%p)->(%s %p)\n", This, debugstr_w(szProperty), pvtValue);
392     return E_NOTIMPL;
393 }
394
395 static HRESULT WINAPI WebBrowser_get_Name(IWebBrowser2 *iface, BSTR *Name)
396 {
397     WebBrowser *This = WEBBROWSER_THIS(iface);
398     FIXME("(%p)->(%p)\n", This, Name);
399     return E_NOTIMPL;
400 }
401
402 static HRESULT WINAPI WebBrowser_get_HWND(IWebBrowser2 *iface, long *pHWND)
403 {
404     WebBrowser *This = WEBBROWSER_THIS(iface);
405     FIXME("(%p)->(%p)\n", This, pHWND);
406     return E_NOTIMPL;
407 }
408
409 static HRESULT WINAPI WebBrowser_get_FullName(IWebBrowser2 *iface, BSTR *FullName)
410 {
411     WebBrowser *This = WEBBROWSER_THIS(iface);
412     FIXME("(%p)->(%p)\n", This, FullName);
413     return E_NOTIMPL;
414 }
415
416 static HRESULT WINAPI WebBrowser_get_Path(IWebBrowser2 *iface, BSTR *Path)
417 {
418     WebBrowser *This = WEBBROWSER_THIS(iface);
419     FIXME("(%p)->(%p)\n", This, Path);
420     return E_NOTIMPL;
421 }
422
423 static HRESULT WINAPI WebBrowser_get_Visible(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_Visible(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_StatusBar(IWebBrowser2 *iface, VARIANT_BOOL *pBool)
438 {
439     WebBrowser *This = WEBBROWSER_THIS(iface);
440     FIXME("(%p)->(%p)\n", This, pBool);
441     return E_NOTIMPL;
442 }
443
444 static HRESULT WINAPI WebBrowser_put_StatusBar(IWebBrowser2 *iface, VARIANT_BOOL Value)
445 {
446     WebBrowser *This = WEBBROWSER_THIS(iface);
447     FIXME("(%p)->(%x)\n", This, Value);
448     return E_NOTIMPL;
449 }
450
451 static HRESULT WINAPI WebBrowser_get_StatusText(IWebBrowser2 *iface, BSTR *StatusText)
452 {
453     WebBrowser *This = WEBBROWSER_THIS(iface);
454     FIXME("(%p)->(%p)\n", This, StatusText);
455     return E_NOTIMPL;
456 }
457
458 static HRESULT WINAPI WebBrowser_put_StatusText(IWebBrowser2 *iface, BSTR StatusText)
459 {
460     WebBrowser *This = WEBBROWSER_THIS(iface);
461     FIXME("(%p)->(%s)\n", This, debugstr_w(StatusText));
462     return E_NOTIMPL;
463 }
464
465 static HRESULT WINAPI WebBrowser_get_ToolBar(IWebBrowser2 *iface, int *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_ToolBar(IWebBrowser2 *iface, int Value)
473 {
474     WebBrowser *This = WEBBROWSER_THIS(iface);
475     FIXME("(%p)->(%d)\n", This, Value);
476     return E_NOTIMPL;
477 }
478
479 static HRESULT WINAPI WebBrowser_get_MenuBar(IWebBrowser2 *iface, VARIANT_BOOL *Value)
480 {
481     WebBrowser *This = WEBBROWSER_THIS(iface);
482     FIXME("(%p)->(%p)\n", This, Value);
483     return E_NOTIMPL;
484 }
485
486 static HRESULT WINAPI WebBrowser_put_MenuBar(IWebBrowser2 *iface, VARIANT_BOOL Value)
487 {
488     WebBrowser *This = WEBBROWSER_THIS(iface);
489     FIXME("(%p)->(%x)\n", This, Value);
490     return E_NOTIMPL;
491 }
492
493 static HRESULT WINAPI WebBrowser_get_FullScreen(IWebBrowser2 *iface, VARIANT_BOOL *pbFullScreen)
494 {
495     WebBrowser *This = WEBBROWSER_THIS(iface);
496     FIXME("(%p)->(%p)\n", This, pbFullScreen);
497     return E_NOTIMPL;
498 }
499
500 static HRESULT WINAPI WebBrowser_put_FullScreen(IWebBrowser2 *iface, VARIANT_BOOL bFullScreen)
501 {
502     WebBrowser *This = WEBBROWSER_THIS(iface);
503     FIXME("(%p)->(%x)\n", This, bFullScreen);
504     return E_NOTIMPL;
505 }
506
507 static HRESULT WINAPI WebBrowser_Navigate2(IWebBrowser2 *iface, VARIANT *URL, VARIANT *Flags,
508         VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers)
509 {
510     WebBrowser *This = WEBBROWSER_THIS(iface);
511     IPersistMoniker *persist;
512     IOleObject *oleobj;
513     IMoniker *mon;
514     HRESULT hres;
515
516     TRACE("(%p)->(%p %p %p %p %p)\n", This, URL, Flags, TargetFrameName, PostData, Headers);
517
518     if(!This->client)
519         return E_FAIL;
520
521     if((Flags && V_VT(Flags) != VT_EMPTY) 
522        || (TargetFrameName && V_VT(TargetFrameName) != VT_EMPTY)
523        || (PostData && V_VT(PostData) != VT_EMPTY) 
524        || (Headers && V_VT(Headers) != VT_EMPTY))
525         FIXME("Unsupported arguments\n");
526
527     if(!URL)
528         return S_OK;
529     if(V_VT(URL) != VT_BSTR)
530         return E_INVALIDARG;
531
532     if(!This->doc_view_hwnd)
533         create_doc_view_hwnd(This);
534
535     /*
536      * FIXME:
537      * We should use URLMoniker's BindToObject instead creating HTMLDocument here.
538      * This should be fixed when mshtml.dll and urlmon.dll will be good enough.
539      */
540
541     if(!This->document) {
542         hres = CoCreateInstance(&CLSID_HTMLDocument, NULL,
543                                 CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
544                                 &IID_IUnknown, (void**)&This->document);
545         if(FAILED(hres))
546             return hres;
547     }
548
549     hres = IUnknown_QueryInterface(This->document, &IID_IPersistMoniker, (void**)&persist);
550     if(FAILED(hres))
551         return hres;
552
553     hres = CreateURLMoniker(NULL, V_BSTR(URL), &mon);
554     if(FAILED(hres)) {
555         IPersistMoniker_Release(persist);
556         return hres;
557     }
558
559     hres = IPersistMoniker_Load(persist, FALSE, mon, NULL /* FIXME */, 0);
560     IMoniker_Release(mon);
561     IPersistMoniker_Release(persist);
562     if(FAILED(hres)) {
563         WARN("Load failed: %08lx\n", hres);
564         return hres;
565     }
566
567     This->url = SysAllocString(V_BSTR(URL));
568
569     hres = IUnknown_QueryInterface(This->document, &IID_IOleObject, (void**)&oleobj);
570     if(FAILED(hres))
571         return hres;
572
573     hres = IOleObject_SetClientSite(oleobj, CLIENTSITE(This));
574     IOleObject_Release(oleobj);
575
576     PostMessageW(This->doc_view_hwnd, WB_WM_NAVIGATE2, 0, 0);
577
578     return hres;
579 }
580
581 static HRESULT WINAPI WebBrowser_QueryStatusWB(IWebBrowser2 *iface, OLECMDID cmdID, OLECMDF *pcmdf)
582 {
583     WebBrowser *This = WEBBROWSER_THIS(iface);
584     FIXME("(%p)->(%d %p)\n", This, cmdID, pcmdf);
585     return E_NOTIMPL;
586 }
587
588 static HRESULT WINAPI WebBrowser_ExecWB(IWebBrowser2 *iface, OLECMDID cmdID,
589         OLECMDEXECOPT cmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
590 {
591     WebBrowser *This = WEBBROWSER_THIS(iface);
592     FIXME("(%p)->(%d %d %p %p)\n", This, cmdID, cmdexecopt, pvaIn, pvaOut);
593     return E_NOTIMPL;
594 }
595
596 static HRESULT WINAPI WebBrowser_ShowBrowserBar(IWebBrowser2 *iface, VARIANT *pvaClsid,
597         VARIANT *pvarShow, VARIANT *pvarSize)
598 {
599     WebBrowser *This = WEBBROWSER_THIS(iface);
600     FIXME("(%p)->(%p %p %p)\n", This, pvaClsid, pvarShow, pvarSize);
601     return E_NOTIMPL;
602 }
603
604 static HRESULT WINAPI WebBrowser_get_ReadyState(IWebBrowser2 *iface, READYSTATE *lpReadyState)
605 {
606     WebBrowser *This = WEBBROWSER_THIS(iface);
607     FIXME("(%p)->(%p)\n", This, lpReadyState);
608     return E_NOTIMPL;
609 }
610
611 static HRESULT WINAPI WebBrowser_get_Offline(IWebBrowser2 *iface, VARIANT_BOOL *pbOffline)
612 {
613     WebBrowser *This = WEBBROWSER_THIS(iface);
614     FIXME("(%p)->(%p)\n", This, pbOffline);
615     return E_NOTIMPL;
616 }
617
618 static HRESULT WINAPI WebBrowser_put_Offline(IWebBrowser2 *iface, VARIANT_BOOL bOffline)
619 {
620     WebBrowser *This = WEBBROWSER_THIS(iface);
621     FIXME("(%p)->(%x)\n", This, bOffline);
622     return E_NOTIMPL;
623 }
624
625 static HRESULT WINAPI WebBrowser_get_Silent(IWebBrowser2 *iface, VARIANT_BOOL *pbSilent)
626 {
627     WebBrowser *This = WEBBROWSER_THIS(iface);
628     FIXME("(%p)->(%p)\n", This, pbSilent);
629     return E_NOTIMPL;
630 }
631
632 static HRESULT WINAPI WebBrowser_put_Silent(IWebBrowser2 *iface, VARIANT_BOOL bSilent)
633 {
634     WebBrowser *This = WEBBROWSER_THIS(iface);
635     FIXME("(%p)->(%x)\n", This, bSilent);
636     return E_NOTIMPL;
637 }
638
639 static HRESULT WINAPI WebBrowser_get_RegisterAsBrowser(IWebBrowser2 *iface,
640         VARIANT_BOOL *pbRegister)
641 {
642     WebBrowser *This = WEBBROWSER_THIS(iface);
643     FIXME("(%p)->(%p)\n", This, pbRegister);
644     return E_NOTIMPL;
645 }
646
647 static HRESULT WINAPI WebBrowser_put_RegisterAsBrowser(IWebBrowser2 *iface,
648         VARIANT_BOOL bRegister)
649 {
650     WebBrowser *This = WEBBROWSER_THIS(iface);
651     FIXME("(%p)->(%x)\n", This, bRegister);
652     return E_NOTIMPL;
653 }
654
655 static HRESULT WINAPI WebBrowser_get_RegisterAsDropTarget(IWebBrowser2 *iface,
656         VARIANT_BOOL *pbRegister)
657 {
658     WebBrowser *This = WEBBROWSER_THIS(iface);
659     FIXME("(%p)->(%p)\n", This, pbRegister);
660     return E_NOTIMPL;
661 }
662
663 static HRESULT WINAPI WebBrowser_put_RegisterAsDropTarget(IWebBrowser2 *iface,
664         VARIANT_BOOL bRegister)
665 {
666     WebBrowser *This = WEBBROWSER_THIS(iface);
667     FIXME("(%p)->(%x)\n", This, bRegister);
668     return E_NOTIMPL;
669 }
670
671 static HRESULT WINAPI WebBrowser_get_TheaterMode(IWebBrowser2 *iface, VARIANT_BOOL *pbRegister)
672 {
673     WebBrowser *This = WEBBROWSER_THIS(iface);
674     FIXME("(%p)->(%p)\n", This, pbRegister);
675     return E_NOTIMPL;
676 }
677
678 static HRESULT WINAPI WebBrowser_put_TheaterMode(IWebBrowser2 *iface, VARIANT_BOOL bRegister)
679 {
680     WebBrowser *This = WEBBROWSER_THIS(iface);
681     FIXME("(%p)->(%x)\n", This, bRegister);
682     return E_NOTIMPL;
683 }
684
685 static HRESULT WINAPI WebBrowser_get_AddressBar(IWebBrowser2 *iface, VARIANT_BOOL *Value)
686 {
687     WebBrowser *This = WEBBROWSER_THIS(iface);
688     FIXME("(%p)->(%p)\n", This, Value);
689     return E_NOTIMPL;
690 }
691
692 static HRESULT WINAPI WebBrowser_put_AddressBar(IWebBrowser2 *iface, VARIANT_BOOL Value)
693 {
694     WebBrowser *This = WEBBROWSER_THIS(iface);
695     FIXME("(%p)->(%x)\n", This, Value);
696     return E_NOTIMPL;
697 }
698
699 static HRESULT WINAPI WebBrowser_get_Resizable(IWebBrowser2 *iface, VARIANT_BOOL *Value)
700 {
701     WebBrowser *This = WEBBROWSER_THIS(iface);
702     FIXME("(%p)->(%p)\n", This, Value);
703     return E_NOTIMPL;
704 }
705
706 static HRESULT WINAPI WebBrowser_put_Resizable(IWebBrowser2 *iface, VARIANT_BOOL Value)
707 {
708     WebBrowser *This = WEBBROWSER_THIS(iface);
709     FIXME("(%p)->(%x)\n", This, Value);
710     return E_NOTIMPL;
711 }
712
713 #undef WEBBROWSER_THIS
714
715 static const IWebBrowser2Vtbl WebBrowser2Vtbl =
716 {
717     WebBrowser_QueryInterface,
718     WebBrowser_AddRef,
719     WebBrowser_Release,
720     WebBrowser_GetTypeInfoCount,
721     WebBrowser_GetTypeInfo,
722     WebBrowser_GetIDsOfNames,
723     WebBrowser_Invoke,
724     WebBrowser_GoBack,
725     WebBrowser_GoForward,
726     WebBrowser_GoHome,
727     WebBrowser_GoSearch,
728     WebBrowser_Navigate,
729     WebBrowser_Refresh,
730     WebBrowser_Refresh2,
731     WebBrowser_Stop,
732     WebBrowser_get_Application,
733     WebBrowser_get_Parent,
734     WebBrowser_get_Container,
735     WebBrowser_get_Document,
736     WebBrowser_get_TopLevelContainer,
737     WebBrowser_get_Type,
738     WebBrowser_get_Left,
739     WebBrowser_put_Left,
740     WebBrowser_get_Top,
741     WebBrowser_put_Top,
742     WebBrowser_get_Width,
743     WebBrowser_put_Width,
744     WebBrowser_get_Height,
745     WebBrowser_put_Height,
746     WebBrowser_get_LocationName,
747     WebBrowser_get_LocationURL,
748     WebBrowser_get_Busy,
749     WebBrowser_Quit,
750     WebBrowser_ClientToWindow,
751     WebBrowser_PutProperty,
752     WebBrowser_GetProperty,
753     WebBrowser_get_Name,
754     WebBrowser_get_HWND,
755     WebBrowser_get_FullName,
756     WebBrowser_get_Path,
757     WebBrowser_get_Visible,
758     WebBrowser_put_Visible,
759     WebBrowser_get_StatusBar,
760     WebBrowser_put_StatusBar,
761     WebBrowser_get_StatusText,
762     WebBrowser_put_StatusText,
763     WebBrowser_get_ToolBar,
764     WebBrowser_put_ToolBar,
765     WebBrowser_get_MenuBar,
766     WebBrowser_put_MenuBar,
767     WebBrowser_get_FullScreen,
768     WebBrowser_put_FullScreen,
769     WebBrowser_Navigate2,
770     WebBrowser_QueryStatusWB,
771     WebBrowser_ExecWB,
772     WebBrowser_ShowBrowserBar,
773     WebBrowser_get_ReadyState,
774     WebBrowser_get_Offline,
775     WebBrowser_put_Offline,
776     WebBrowser_get_Silent,
777     WebBrowser_put_Silent,
778     WebBrowser_get_RegisterAsBrowser,
779     WebBrowser_put_RegisterAsBrowser,
780     WebBrowser_get_RegisterAsDropTarget,
781     WebBrowser_put_RegisterAsDropTarget,
782     WebBrowser_get_TheaterMode,
783     WebBrowser_put_TheaterMode,
784     WebBrowser_get_AddressBar,
785     WebBrowser_put_AddressBar,
786     WebBrowser_get_Resizable,
787     WebBrowser_put_Resizable
788 };
789
790 HRESULT WebBrowser_Create(IUnknown *pOuter, REFIID riid, void **ppv)
791 {
792     WebBrowser *ret;
793     HRESULT hres;
794
795     TRACE("(%p %s %p)\n", pOuter, debugstr_guid(riid), ppv);
796
797     ret = HeapAlloc(GetProcessHeap(), 0, sizeof(WebBrowser));
798
799     ret->lpWebBrowser2Vtbl = &WebBrowser2Vtbl;
800     ret->ref = 0;
801
802     ret->document = NULL;
803     ret->url = NULL;
804
805     WebBrowser_OleObject_Init(ret);
806     WebBrowser_ViewObject_Init(ret);
807     WebBrowser_Persist_Init(ret);
808     WebBrowser_ClassInfo_Init(ret);
809     WebBrowser_Misc_Init(ret);
810     WebBrowser_Events_Init(ret);
811     WebBrowser_ClientSite_Init(ret);
812     WebBrowser_DocHost_Init(ret);
813     WebBrowser_Frame_Init(ret);
814
815     hres = IWebBrowser_QueryInterface(WEBBROWSER(ret), riid, ppv);
816     if(SUCCEEDED(hres)) {
817         SHDOCVW_LockModule();
818     }else {
819         HeapFree(GetProcessHeap(), 0, ret);
820         return hres;
821     }
822
823     return hres;
824 }