Implement CryptMem and undocumented I_Crypt*Tls functions, with tests.
[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
25 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
26
27 /**********************************************************************
28  * Implement the IWebBrowser interface
29  */
30
31 #define WEBBROWSER_THIS(iface) DEFINE_THIS(WebBrowser, WebBrowser2, iface)
32
33 static HRESULT WINAPI WebBrowser_QueryInterface(IWebBrowser2 *iface, REFIID riid, LPVOID *ppv)
34 {
35     WebBrowser *This = WEBBROWSER_THIS(iface);
36
37     if (ppv == NULL)
38         return E_POINTER;
39     *ppv = NULL;
40
41     if(IsEqualGUID(&IID_IUnknown, riid)) {
42         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
43         *ppv = WEBBROWSER(This);
44     }else if(IsEqualGUID (&IID_IDispatch, riid)) {
45         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
46         *ppv = WEBBROWSER(This);
47     }else if(IsEqualGUID(&IID_IWebBrowser, riid)) {
48         TRACE("(%p)->(IID_IWebBrowser %p)\n", This, ppv);
49         *ppv = WEBBROWSER(This);
50     }else if(IsEqualGUID(&IID_IWebBrowserApp, riid)) {
51         TRACE("(%p)->(IID_IWebBrowserApp %p)\n", This, ppv);
52         *ppv = WEBBROWSER(This);
53     }else if(IsEqualGUID(&IID_IWebBrowser2, riid)) {
54         TRACE("(%p)->(IID_IWebBrowser2 %p)\n", This, ppv);
55         *ppv = WEBBROWSER(This);
56     }else if(IsEqualGUID(&IID_IOleObject, riid)) {
57         TRACE("(%p)->(IID_IOleObject %p)\n", This, ppv);
58         *ppv = OLEOBJ(This);
59     }else if(IsEqualGUID(&IID_IOleWindow, riid)) {
60         TRACE("(%p)->(IID_IOleWindow %p)\n", This, ppv);
61         *ppv = INPLACEOBJ(This);
62     }else if(IsEqualGUID (&IID_IOleInPlaceObject, riid)) {
63         TRACE("(%p)->(IID_IOleInPlaceObject %p)\n", This, ppv);
64         *ppv = INPLACEOBJ(This);
65     }else if(IsEqualGUID(&IID_IOleControl, riid)) {
66         TRACE("(%p)->(IID_IOleControl %p)\n", This, ppv);
67         *ppv = CONTROL(This);
68     }else if(IsEqualGUID(&IID_IPersist, riid)) {
69         TRACE("(%p)->(IID_IPersist %p)\n", This, ppv);
70         *ppv = PERSTORAGE(This);
71     }else if(IsEqualGUID(&IID_IPersistStorage, riid)) {
72         TRACE("(%p)->(IID_IPersistStorage %p)\n", This, ppv);
73         *ppv = PERSTORAGE(This);
74     }else if(IsEqualGUID (&IID_IPersistStreamInit, riid)) {
75         TRACE("(%p)->(IID_IPersistStreamInit %p)\n", This, ppv);
76         *ppv = PERSTRINIT(This);
77     }else if(IsEqualGUID (&IID_IProvideClassInfo, riid)) {
78         TRACE("(%p)->(IID_IProvideClassInfo %p)\n", This, ppv);
79         *ppv = CLASSINFO(This);
80     }else if(IsEqualGUID (&IID_IProvideClassInfo2, riid)) {
81         TRACE("(%p)->(IID_IProvideClassInfo2 %p)\n", This, ppv);
82         *ppv = CLASSINFO(This);
83     }else if(IsEqualGUID (&IID_IQuickActivate, riid)) {
84         TRACE("(%p)->(IID_IQuickActivate %p)\n", This, ppv);
85         *ppv = QUICKACT(This);
86     }else if(IsEqualGUID (&IID_IConnectionPointContainer, riid)) {
87         TRACE("(%p)->(IID_IConnectionPointContainer %p)\n", This, ppv);
88         *ppv = CONPTCONT(This);
89     }
90
91     if(*ppv) {
92         IUnknown_AddRef((IUnknown*)*ppv);
93         return S_OK;
94     }
95
96     FIXME("(%p)->(%s %p) interface not supported\n", This, debugstr_guid(riid), ppv);
97     return E_NOINTERFACE;
98 }
99
100 static ULONG WINAPI WebBrowser_AddRef(IWebBrowser2 *iface)
101 {
102     WebBrowser *This = WEBBROWSER_THIS(iface);
103     LONG ref = InterlockedIncrement(&This->ref);
104     TRACE("(%p) ref=%ld\n", This, ref);
105     return ref;
106 }
107
108 static ULONG WINAPI WebBrowser_Release(IWebBrowser2 *iface)
109 {
110     WebBrowser *This = WEBBROWSER_THIS(iface);
111     LONG ref = InterlockedDecrement(&This->ref);
112
113     TRACE("(%p) ref=%ld\n", This, ref);
114
115     if(!ref) {
116         HeapFree(GetProcessHeap(), 0, This);
117         SHDOCVW_UnlockModule();
118     }
119
120     return ref;
121 }
122
123 /* IDispatch methods */
124 static HRESULT WINAPI WebBrowser_GetTypeInfoCount(IWebBrowser2 *iface, UINT *pctinfo)
125 {
126     WebBrowser *This = WEBBROWSER_THIS(iface);
127     FIXME("(%p)->(%p)\n", This, pctinfo);
128     return E_NOTIMPL;
129 }
130
131 static HRESULT WINAPI WebBrowser_GetTypeInfo(IWebBrowser2 *iface, UINT iTInfo, LCID lcid,
132                                      LPTYPEINFO *ppTInfo)
133 {
134     WebBrowser *This = WEBBROWSER_THIS(iface);
135     FIXME("(%p)->(%d %ld %p)\n", This, iTInfo, lcid, ppTInfo);
136     return E_NOTIMPL;
137 }
138
139 static HRESULT WINAPI WebBrowser_GetIDsOfNames(IWebBrowser2 *iface, REFIID riid,
140                                        LPOLESTR *rgszNames, UINT cNames,
141                                        LCID lcid, DISPID *rgDispId)
142 {
143     WebBrowser *This = WEBBROWSER_THIS(iface);
144     FIXME("(%p)->(%s %p %d %ld %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
145             lcid, rgDispId);
146     return E_NOTIMPL;
147 }
148
149 static HRESULT WINAPI WebBrowser_Invoke(IWebBrowser2 *iface, DISPID dispIdMember,
150                                 REFIID riid, LCID lcid, WORD wFlags,
151                                 DISPPARAMS *pDispParams, VARIANT *pVarResult,
152                                 EXCEPINFO *pExepInfo, UINT *puArgErr)
153 {
154     WebBrowser *This = WEBBROWSER_THIS(iface);
155     FIXME("(%p)->(%ld %s %ld %08x %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
156             lcid, wFlags, pDispParams, pVarResult, pExepInfo, puArgErr);
157     return E_NOTIMPL;
158 }
159
160 /* IWebBrowser methods */
161 static HRESULT WINAPI WebBrowser_GoBack(IWebBrowser2 *iface)
162 {
163     WebBrowser *This = WEBBROWSER_THIS(iface);
164     FIXME("(%p)\n", This);
165     return E_NOTIMPL;
166 }
167
168 static HRESULT WINAPI WebBrowser_GoForward(IWebBrowser2 *iface)
169 {
170     WebBrowser *This = WEBBROWSER_THIS(iface);
171     FIXME("(%p)\n", This);
172     return E_NOTIMPL;
173 }
174
175 static HRESULT WINAPI WebBrowser_GoHome(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_GoSearch(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_Navigate(IWebBrowser2 *iface, BSTR URL,
190                                   VARIANT *Flags, VARIANT *TargetFrameName,
191                                   VARIANT *PostData, VARIANT *Headers)
192 {
193     WebBrowser *This = WEBBROWSER_THIS(iface);
194     FIXME("(%p)->(%s %p %p %p %p)\n", This, debugstr_w(URL), Flags, TargetFrameName,
195           PostData, Headers);
196     return E_NOTIMPL;
197 }
198
199 static HRESULT WINAPI WebBrowser_Refresh(IWebBrowser2 *iface)
200 {
201     WebBrowser *This = WEBBROWSER_THIS(iface);
202     FIXME("(%p)\n", This);
203     return E_NOTIMPL;
204 }
205
206 static HRESULT WINAPI WebBrowser_Refresh2(IWebBrowser2 *iface, VARIANT *Level)
207 {
208     WebBrowser *This = WEBBROWSER_THIS(iface);
209     FIXME("(%p)->(%p)\n", This, Level);
210     return E_NOTIMPL;
211 }
212
213 static HRESULT WINAPI WebBrowser_Stop(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_get_Application(IWebBrowser2 *iface, IDispatch **ppDisp)
221 {
222     WebBrowser *This = WEBBROWSER_THIS(iface);
223     FIXME("(%p)->(%p)\n", This, ppDisp);
224     return E_NOTIMPL;
225 }
226
227 static HRESULT WINAPI WebBrowser_get_Parent(IWebBrowser2 *iface, IDispatch **ppDisp)
228 {
229     WebBrowser *This = WEBBROWSER_THIS(iface);
230     FIXME("(%p)->(%p)\n", This, ppDisp);
231     return E_NOTIMPL;
232 }
233
234 static HRESULT WINAPI WebBrowser_get_Container(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_Document(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_TopLevelContainer(IWebBrowser2 *iface, VARIANT_BOOL *pBool)
249 {
250     WebBrowser *This = WEBBROWSER_THIS(iface);
251     FIXME("(%p)->(%p)\n", This, pBool);
252     return E_NOTIMPL;
253 }
254
255 static HRESULT WINAPI WebBrowser_get_Type(IWebBrowser2 *iface, BSTR *Type)
256 {
257     WebBrowser *This = WEBBROWSER_THIS(iface);
258     FIXME("(%p)->(%p)\n", This, Type);
259     return E_NOTIMPL;
260 }
261
262 static HRESULT WINAPI WebBrowser_get_Left(IWebBrowser2 *iface, long *pl)
263 {
264     WebBrowser *This = WEBBROWSER_THIS(iface);
265     FIXME("(%p)->(%p)\n", This, pl);
266     return E_NOTIMPL;
267 }
268
269 static HRESULT WINAPI WebBrowser_put_Left(IWebBrowser2 *iface, long Left)
270 {
271     WebBrowser *This = WEBBROWSER_THIS(iface);
272     FIXME("(%p)->(%ld)\n", This, Left);
273     return E_NOTIMPL;
274 }
275
276 static HRESULT WINAPI WebBrowser_get_Top(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_Top(IWebBrowser2 *iface, long Top)
284 {
285     WebBrowser *This = WEBBROWSER_THIS(iface);
286     FIXME("(%p)->(%ld)\n", This, Top);
287     return E_NOTIMPL;
288 }
289
290 static HRESULT WINAPI WebBrowser_get_Width(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_Width(IWebBrowser2 *iface, long Width)
298 {
299     WebBrowser *This = WEBBROWSER_THIS(iface);
300     FIXME("(%p)->(%ld)\n", This, Width);
301     return E_NOTIMPL;
302 }
303
304 static HRESULT WINAPI WebBrowser_get_Height(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_Height(IWebBrowser2 *iface, long Height)
312 {
313     WebBrowser *This = WEBBROWSER_THIS(iface);
314     FIXME("(%p)->(%ld)\n", This, Height);
315     return E_NOTIMPL;
316 }
317
318 static HRESULT WINAPI WebBrowser_get_LocationName(IWebBrowser2 *iface, BSTR *LocationName)
319 {
320     WebBrowser *This = WEBBROWSER_THIS(iface);
321     FIXME("(%p)->(%p)\n", This, LocationName);
322     return E_NOTIMPL;
323 }
324
325 static HRESULT WINAPI WebBrowser_get_LocationURL(IWebBrowser2 *iface, BSTR *LocationURL)
326 {
327     WebBrowser *This = WEBBROWSER_THIS(iface);
328     FIXME("(%p)->(%p)\n", This, LocationURL);
329     return E_NOTIMPL;
330 }
331
332 static HRESULT WINAPI WebBrowser_get_Busy(IWebBrowser2 *iface, VARIANT_BOOL *pBool)
333 {
334     WebBrowser *This = WEBBROWSER_THIS(iface);
335     FIXME("(%p)->(%p)\n", This, pBool);
336     return E_NOTIMPL;
337 }
338
339 static HRESULT WINAPI WebBrowser_Quit(IWebBrowser2 *iface)
340 {
341     WebBrowser *This = WEBBROWSER_THIS(iface);
342     FIXME("(%p)\n", This);
343     return E_NOTIMPL;
344 }
345
346 static HRESULT WINAPI WebBrowser_ClientToWindow(IWebBrowser2 *iface, int *pcx, int *pcy)
347 {
348     WebBrowser *This = WEBBROWSER_THIS(iface);
349     FIXME("(%p)->(%p %p)\n", This, pcx, pcy);
350     return E_NOTIMPL;
351 }
352
353 static HRESULT WINAPI WebBrowser_PutProperty(IWebBrowser2 *iface, BSTR szProperty, VARIANT vtValue)
354 {
355     WebBrowser *This = WEBBROWSER_THIS(iface);
356     FIXME("(%p)->(%s)\n", This, debugstr_w(szProperty));
357     return E_NOTIMPL;
358 }
359
360 static HRESULT WINAPI WebBrowser_GetProperty(IWebBrowser2 *iface, BSTR szProperty, VARIANT *pvtValue)
361 {
362     WebBrowser *This = WEBBROWSER_THIS(iface);
363     FIXME("(%p)->(%s %p)\n", This, debugstr_w(szProperty), pvtValue);
364     return E_NOTIMPL;
365 }
366
367 static HRESULT WINAPI WebBrowser_get_Name(IWebBrowser2 *iface, BSTR *Name)
368 {
369     WebBrowser *This = WEBBROWSER_THIS(iface);
370     FIXME("(%p)->(%p)\n", This, Name);
371     return E_NOTIMPL;
372 }
373
374 static HRESULT WINAPI WebBrowser_get_HWND(IWebBrowser2 *iface, long *pHWND)
375 {
376     WebBrowser *This = WEBBROWSER_THIS(iface);
377     FIXME("(%p)->(%p)\n", This, pHWND);
378     return E_NOTIMPL;
379 }
380
381 static HRESULT WINAPI WebBrowser_get_FullName(IWebBrowser2 *iface, BSTR *FullName)
382 {
383     WebBrowser *This = WEBBROWSER_THIS(iface);
384     FIXME("(%p)->(%p)\n", This, FullName);
385     return E_NOTIMPL;
386 }
387
388 static HRESULT WINAPI WebBrowser_get_Path(IWebBrowser2 *iface, BSTR *Path)
389 {
390     WebBrowser *This = WEBBROWSER_THIS(iface);
391     FIXME("(%p)->(%p)\n", This, Path);
392     return E_NOTIMPL;
393 }
394
395 static HRESULT WINAPI WebBrowser_get_Visible(IWebBrowser2 *iface, VARIANT_BOOL *pBool)
396 {
397     WebBrowser *This = WEBBROWSER_THIS(iface);
398     FIXME("(%p)->(%p)\n", This, pBool);
399     return E_NOTIMPL;
400 }
401
402 static HRESULT WINAPI WebBrowser_put_Visible(IWebBrowser2 *iface, VARIANT_BOOL Value)
403 {
404     WebBrowser *This = WEBBROWSER_THIS(iface);
405     FIXME("(%p)->(%x)\n", This, Value);
406     return E_NOTIMPL;
407 }
408
409 static HRESULT WINAPI WebBrowser_get_StatusBar(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_StatusBar(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_StatusText(IWebBrowser2 *iface, BSTR *StatusText)
424 {
425     WebBrowser *This = WEBBROWSER_THIS(iface);
426     FIXME("(%p)->(%p)\n", This, StatusText);
427     return E_NOTIMPL;
428 }
429
430 static HRESULT WINAPI WebBrowser_put_StatusText(IWebBrowser2 *iface, BSTR StatusText)
431 {
432     WebBrowser *This = WEBBROWSER_THIS(iface);
433     FIXME("(%p)->(%s)\n", This, debugstr_w(StatusText));
434     return E_NOTIMPL;
435 }
436
437 static HRESULT WINAPI WebBrowser_get_ToolBar(IWebBrowser2 *iface, int *Value)
438 {
439     WebBrowser *This = WEBBROWSER_THIS(iface);
440     FIXME("(%p)->(%p)\n", This, Value);
441     return E_NOTIMPL;
442 }
443
444 static HRESULT WINAPI WebBrowser_put_ToolBar(IWebBrowser2 *iface, int Value)
445 {
446     WebBrowser *This = WEBBROWSER_THIS(iface);
447     FIXME("(%p)->(%d)\n", This, Value);
448     return E_NOTIMPL;
449 }
450
451 static HRESULT WINAPI WebBrowser_get_MenuBar(IWebBrowser2 *iface, VARIANT_BOOL *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_MenuBar(IWebBrowser2 *iface, VARIANT_BOOL Value)
459 {
460     WebBrowser *This = WEBBROWSER_THIS(iface);
461     FIXME("(%p)->(%x)\n", This, Value);
462     return E_NOTIMPL;
463 }
464
465 static HRESULT WINAPI WebBrowser_get_FullScreen(IWebBrowser2 *iface, VARIANT_BOOL *pbFullScreen)
466 {
467     WebBrowser *This = WEBBROWSER_THIS(iface);
468     FIXME("(%p)->(%p)\n", This, pbFullScreen);
469     return E_NOTIMPL;
470 }
471
472 static HRESULT WINAPI WebBrowser_put_FullScreen(IWebBrowser2 *iface, VARIANT_BOOL bFullScreen)
473 {
474     WebBrowser *This = WEBBROWSER_THIS(iface);
475     FIXME("(%p)->(%x)\n", This, bFullScreen);
476     return E_NOTIMPL;
477 }
478
479 static HRESULT WINAPI WebBrowser_Navigate2(IWebBrowser2 *iface, VARIANT *URL, VARIANT *Flags,
480         VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers)
481 {
482     WebBrowser *This = WEBBROWSER_THIS(iface);
483     FIXME("(%p)->(%p %p %p %p %p)\n", This, URL, Flags, TargetFrameName, PostData, Headers);
484     return E_NOTIMPL;
485 }
486
487 static HRESULT WINAPI WebBrowser_QueryStatusWB(IWebBrowser2 *iface, OLECMDID cmdID, OLECMDF *pcmdf)
488 {
489     WebBrowser *This = WEBBROWSER_THIS(iface);
490     FIXME("(%p)->(%d %p)\n", This, cmdID, pcmdf);
491     return E_NOTIMPL;
492 }
493
494 static HRESULT WINAPI WebBrowser_ExecWB(IWebBrowser2 *iface, OLECMDID cmdID,
495         OLECMDEXECOPT cmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
496 {
497     WebBrowser *This = WEBBROWSER_THIS(iface);
498     FIXME("(%p)->(%d %d %p %p)\n", This, cmdID, cmdexecopt, pvaIn, pvaOut);
499     return E_NOTIMPL;
500 }
501
502 static HRESULT WINAPI WebBrowser_ShowBrowserBar(IWebBrowser2 *iface, VARIANT *pvaClsid,
503         VARIANT *pvarShow, VARIANT *pvarSize)
504 {
505     WebBrowser *This = WEBBROWSER_THIS(iface);
506     FIXME("(%p)->(%p %p %p)\n", This, pvaClsid, pvarShow, pvarSize);
507     return E_NOTIMPL;
508 }
509
510 static HRESULT WINAPI WebBrowser_get_ReadyState(IWebBrowser2 *iface, READYSTATE *lpReadyState)
511 {
512     WebBrowser *This = WEBBROWSER_THIS(iface);
513     FIXME("(%p)->(%p)\n", This, lpReadyState);
514     return E_NOTIMPL;
515 }
516
517 static HRESULT WINAPI WebBrowser_get_Offline(IWebBrowser2 *iface, VARIANT_BOOL *pbOffline)
518 {
519     WebBrowser *This = WEBBROWSER_THIS(iface);
520     FIXME("(%p)->(%p)\n", This, pbOffline);
521     return E_NOTIMPL;
522 }
523
524 static HRESULT WINAPI WebBrowser_put_Offline(IWebBrowser2 *iface, VARIANT_BOOL bOffline)
525 {
526     WebBrowser *This = WEBBROWSER_THIS(iface);
527     FIXME("(%p)->(%x)\n", This, bOffline);
528     return E_NOTIMPL;
529 }
530
531 static HRESULT WINAPI WebBrowser_get_Silent(IWebBrowser2 *iface, VARIANT_BOOL *pbSilent)
532 {
533     WebBrowser *This = WEBBROWSER_THIS(iface);
534     FIXME("(%p)->(%p)\n", This, pbSilent);
535     return E_NOTIMPL;
536 }
537
538 static HRESULT WINAPI WebBrowser_put_Silent(IWebBrowser2 *iface, VARIANT_BOOL bSilent)
539 {
540     WebBrowser *This = WEBBROWSER_THIS(iface);
541     FIXME("(%p)->(%x)\n", This, bSilent);
542     return E_NOTIMPL;
543 }
544
545 static HRESULT WINAPI WebBrowser_get_RegisterAsBrowser(IWebBrowser2 *iface,
546         VARIANT_BOOL *pbRegister)
547 {
548     WebBrowser *This = WEBBROWSER_THIS(iface);
549     FIXME("(%p)->(%p)\n", This, pbRegister);
550     return E_NOTIMPL;
551 }
552
553 static HRESULT WINAPI WebBrowser_put_RegisterAsBrowser(IWebBrowser2 *iface,
554         VARIANT_BOOL bRegister)
555 {
556     WebBrowser *This = WEBBROWSER_THIS(iface);
557     FIXME("(%p)->(%x)\n", This, bRegister);
558     return E_NOTIMPL;
559 }
560
561 static HRESULT WINAPI WebBrowser_get_RegisterAsDropTarget(IWebBrowser2 *iface,
562         VARIANT_BOOL *pbRegister)
563 {
564     WebBrowser *This = WEBBROWSER_THIS(iface);
565     FIXME("(%p)->(%p)\n", This, pbRegister);
566     return E_NOTIMPL;
567 }
568
569 static HRESULT WINAPI WebBrowser_put_RegisterAsDropTarget(IWebBrowser2 *iface,
570         VARIANT_BOOL bRegister)
571 {
572     WebBrowser *This = WEBBROWSER_THIS(iface);
573     FIXME("(%p)->(%x)\n", This, bRegister);
574     return E_NOTIMPL;
575 }
576
577 static HRESULT WINAPI WebBrowser_get_TheaterMode(IWebBrowser2 *iface, VARIANT_BOOL *pbRegister)
578 {
579     WebBrowser *This = WEBBROWSER_THIS(iface);
580     FIXME("(%p)->(%p)\n", This, pbRegister);
581     return E_NOTIMPL;
582 }
583
584 static HRESULT WINAPI WebBrowser_put_TheaterMode(IWebBrowser2 *iface, VARIANT_BOOL bRegister)
585 {
586     WebBrowser *This = WEBBROWSER_THIS(iface);
587     FIXME("(%p)->(%x)\n", This, bRegister);
588     return E_NOTIMPL;
589 }
590
591 static HRESULT WINAPI WebBrowser_get_AddressBar(IWebBrowser2 *iface, VARIANT_BOOL *Value)
592 {
593     WebBrowser *This = WEBBROWSER_THIS(iface);
594     FIXME("(%p)->(%p)\n", This, Value);
595     return E_NOTIMPL;
596 }
597
598 static HRESULT WINAPI WebBrowser_put_AddressBar(IWebBrowser2 *iface, VARIANT_BOOL Value)
599 {
600     WebBrowser *This = WEBBROWSER_THIS(iface);
601     FIXME("(%p)->(%x)\n", This, Value);
602     return E_NOTIMPL;
603 }
604
605 static HRESULT WINAPI WebBrowser_get_Resizable(IWebBrowser2 *iface, VARIANT_BOOL *Value)
606 {
607     WebBrowser *This = WEBBROWSER_THIS(iface);
608     FIXME("(%p)->(%p)\n", This, Value);
609     return E_NOTIMPL;
610 }
611
612 static HRESULT WINAPI WebBrowser_put_Resizable(IWebBrowser2 *iface, VARIANT_BOOL Value)
613 {
614     WebBrowser *This = WEBBROWSER_THIS(iface);
615     FIXME("(%p)->(%x)\n", This, Value);
616     return E_NOTIMPL;
617 }
618
619 #undef WEBBROWSER_THIS
620
621 static const IWebBrowser2Vtbl WebBrowser2Vtbl =
622 {
623     WebBrowser_QueryInterface,
624     WebBrowser_AddRef,
625     WebBrowser_Release,
626     WebBrowser_GetTypeInfoCount,
627     WebBrowser_GetTypeInfo,
628     WebBrowser_GetIDsOfNames,
629     WebBrowser_Invoke,
630     WebBrowser_GoBack,
631     WebBrowser_GoForward,
632     WebBrowser_GoHome,
633     WebBrowser_GoSearch,
634     WebBrowser_Navigate,
635     WebBrowser_Refresh,
636     WebBrowser_Refresh2,
637     WebBrowser_Stop,
638     WebBrowser_get_Application,
639     WebBrowser_get_Parent,
640     WebBrowser_get_Container,
641     WebBrowser_get_Document,
642     WebBrowser_get_TopLevelContainer,
643     WebBrowser_get_Type,
644     WebBrowser_get_Left,
645     WebBrowser_put_Left,
646     WebBrowser_get_Top,
647     WebBrowser_put_Top,
648     WebBrowser_get_Width,
649     WebBrowser_put_Width,
650     WebBrowser_get_Height,
651     WebBrowser_put_Height,
652     WebBrowser_get_LocationName,
653     WebBrowser_get_LocationURL,
654     WebBrowser_get_Busy,
655     WebBrowser_Quit,
656     WebBrowser_ClientToWindow,
657     WebBrowser_PutProperty,
658     WebBrowser_GetProperty,
659     WebBrowser_get_Name,
660     WebBrowser_get_HWND,
661     WebBrowser_get_FullName,
662     WebBrowser_get_Path,
663     WebBrowser_get_Visible,
664     WebBrowser_put_Visible,
665     WebBrowser_get_StatusBar,
666     WebBrowser_put_StatusBar,
667     WebBrowser_get_StatusText,
668     WebBrowser_put_StatusText,
669     WebBrowser_get_ToolBar,
670     WebBrowser_put_ToolBar,
671     WebBrowser_get_MenuBar,
672     WebBrowser_put_MenuBar,
673     WebBrowser_get_FullScreen,
674     WebBrowser_put_FullScreen,
675     WebBrowser_Navigate2,
676     WebBrowser_QueryStatusWB,
677     WebBrowser_ExecWB,
678     WebBrowser_ShowBrowserBar,
679     WebBrowser_get_ReadyState,
680     WebBrowser_get_Offline,
681     WebBrowser_put_Offline,
682     WebBrowser_get_Silent,
683     WebBrowser_put_Silent,
684     WebBrowser_get_RegisterAsBrowser,
685     WebBrowser_put_RegisterAsBrowser,
686     WebBrowser_get_RegisterAsDropTarget,
687     WebBrowser_put_RegisterAsDropTarget,
688     WebBrowser_get_TheaterMode,
689     WebBrowser_put_TheaterMode,
690     WebBrowser_get_AddressBar,
691     WebBrowser_put_AddressBar,
692     WebBrowser_get_Resizable,
693     WebBrowser_put_Resizable
694 };
695
696 HRESULT WebBrowser_Create(IUnknown *pOuter, REFIID riid, void **ppv)
697 {
698     WebBrowser *ret;
699     HRESULT hres;
700
701     TRACE("(%p %s %p)\n", pOuter, debugstr_guid(riid), ppv);
702
703     ret = HeapAlloc(GetProcessHeap(), 0, sizeof(WebBrowser));
704
705     ret->lpWebBrowser2Vtbl = &WebBrowser2Vtbl;
706     ret->ref = 0;
707
708     WebBrowser_OleObject_Init(ret);
709     WebBrowser_Persist_Init(ret);
710     WebBrowser_ClassInfo_Init(ret);
711     WebBrowser_Misc_Init(ret);
712     WebBrowser_Events_Init(ret);
713
714     hres = IWebBrowser_QueryInterface(WEBBROWSER(ret), riid, ppv);
715     if(SUCCEEDED(hres)) {
716         SHDOCVW_LockModule();
717     }else {
718         HeapFree(GetProcessHeap(), 0, ret);
719         return hres;
720     }
721
722     return hres;
723 }