query: Add a stub implementation for LocateCatalogs.
[wine] / dlls / mshtml / tests / htmldoc.c
1 /*
2  * Copyright 2005 Jacek Caban
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 #define COBJMACROS
20
21 #include <wine/test.h>
22 #include <stdarg.h>
23
24 #include "windef.h"
25 #include "winbase.h"
26 #include "ole2.h"
27 #include "mshtml.h"
28 #include "docobj.h"
29 #include "mshtmhst.h"
30 #include "mshtmdid.h"
31 #include "hlink.h"
32 #include "idispids.h"
33 #include "shlguid.h"
34
35 #include "initguid.h"
36 DEFINE_SHLGUID(CGID_Undocumented, 0x000214D4L, 0, 0);
37
38 #define DEFINE_EXPECT(func) \
39     static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
40
41 #define SET_EXPECT(func) \
42     expect_ ## func = TRUE
43
44 #define CHECK_EXPECT(func) \
45     do { \
46         ok(expect_ ##func, "unexpected call " #func "\n"); \
47         expect_ ## func = FALSE; \
48         called_ ## func = TRUE; \
49     }while(0)
50
51 #define CHECK_EXPECT2(func) \
52     do { \
53         ok(expect_ ##func, "unexpected call " #func "\n"); \
54         called_ ## func = TRUE; \
55     }while(0)
56
57 #define CHECK_CALLED(func) \
58     do { \
59         ok(called_ ## func, "expected " #func "\n"); \
60         expect_ ## func = called_ ## func = FALSE; \
61     }while(0)
62
63 static IOleDocumentView *view = NULL;
64 static HWND container_hwnd = NULL, hwnd = NULL, last_hwnd = NULL;
65
66 DEFINE_EXPECT(LockContainer);
67 DEFINE_EXPECT(SetActiveObject);
68 DEFINE_EXPECT(GetWindow);
69 DEFINE_EXPECT(CanInPlaceActivate);
70 DEFINE_EXPECT(OnInPlaceActivate);
71 DEFINE_EXPECT(OnUIActivate);
72 DEFINE_EXPECT(GetWindowContext);
73 DEFINE_EXPECT(OnUIDeactivate);
74 DEFINE_EXPECT(OnInPlaceDeactivate);
75 DEFINE_EXPECT(GetContainer);
76 DEFINE_EXPECT(ShowUI);
77 DEFINE_EXPECT(ActivateMe);
78 DEFINE_EXPECT(GetHostInfo);
79 DEFINE_EXPECT(HideUI);
80 DEFINE_EXPECT(GetOptionKeyPath);
81 DEFINE_EXPECT(GetOverrideKeyPath);
82 DEFINE_EXPECT(SetStatusText);
83 DEFINE_EXPECT(QueryStatus_SETPROGRESSTEXT);
84 DEFINE_EXPECT(QueryStatus_OPEN);
85 DEFINE_EXPECT(QueryStatus_NEW);
86 DEFINE_EXPECT(Exec_SETPROGRESSMAX);
87 DEFINE_EXPECT(Exec_SETPROGRESSPOS);
88 DEFINE_EXPECT(Exec_HTTPEQUIV_DONE); 
89 DEFINE_EXPECT(Exec_SETDOWNLOADSTATE);
90 DEFINE_EXPECT(Exec_ShellDocView_37);
91 DEFINE_EXPECT(Exec_UPDATECOMMANDS);
92 DEFINE_EXPECT(Exec_SETTITLE);
93 DEFINE_EXPECT(Exec_HTTPEQUIV);
94 DEFINE_EXPECT(Exec_MSHTML_2315);
95 DEFINE_EXPECT(Invoke_AMBIENT_USERMODE);
96 DEFINE_EXPECT(Invoke_AMBIENT_DLCONTROL);
97 DEFINE_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
98 DEFINE_EXPECT(Invoke_AMBIENT_SILENT);
99 DEFINE_EXPECT(Invoke_AMBIENT_USERAGENT);
100 DEFINE_EXPECT(Invoke_AMBIENT_PALETTE);
101 DEFINE_EXPECT(GetDropTarget);
102 DEFINE_EXPECT(UpdateUI);
103 DEFINE_EXPECT(Navigate);
104 DEFINE_EXPECT(OnFrameWindowActivate);
105
106 static BOOL expect_LockContainer_fLock;
107 static BOOL expect_SetActiveObject_active;
108 static BOOL set_clientsite = FALSE, container_locked = FALSE;
109 static enum {
110     LD_NO = 0,
111     LD_DOLOAD,
112     LD_LOADING,
113     LD_LOADED
114 } load_state;
115
116 static LPCOLESTR expect_status_text = NULL;
117
118 static HRESULT QueryInterface(REFIID riid, void **ppv);
119
120 static HRESULT WINAPI HlinkFrame_QueryInterface(IHlinkFrame *iface, REFIID riid, void **ppv)
121 {
122     ok(0, "unexpected call\n");
123     return E_NOTIMPL;
124 }
125
126 static ULONG WINAPI HlinkFrame_AddRef(IHlinkFrame *iface)
127 {
128     return 2;
129 }
130
131 static ULONG WINAPI HlinkFrame_Release(IHlinkFrame *iface)
132 {
133     return 1;
134 }
135
136 static HRESULT WINAPI HlinkFrame_SetBrowseContext(IHlinkFrame *iface,
137                                                   IHlinkBrowseContext *pihlbc)
138 {
139     ok(0, "unexpected call\n");
140     return E_NOTIMPL;
141 }
142
143 static HRESULT WINAPI HlinkFrame_GetBrowseContext(IHlinkFrame *iface,
144                                                   IHlinkBrowseContext **ppihlbc)
145 {
146     ok(0, "unexpected call\n");
147     return E_NOTIMPL;
148 }
149
150 static HRESULT WINAPI HlinkFrame_Navigate(IHlinkFrame *iface, DWORD grfHLNF, LPBC pbc,
151                                           IBindStatusCallback *pibsc, IHlink *pihlNavigate)
152 {
153     HRESULT hres;
154
155     CHECK_EXPECT(Navigate);
156
157     ok(grfHLNF == 0, "grfHLNF=%ld, expected 0\n", grfHLNF);
158     ok(pbc != NULL, "pbc == NULL\n");
159     ok(pibsc != NULL, "pubsc == NULL\n");
160     ok(pihlNavigate != NULL, "puhlNavigate == NULL\n");
161
162     if(pihlNavigate) {
163         LPWSTR frame_name = (LPWSTR)0xdeadbeef;
164         LPWSTR location = (LPWSTR)0xdeadbeef;
165         IHlinkSite *site;
166         IMoniker *mon = NULL;
167         DWORD site_data = 0xdeadbeef;
168
169         hres = IHlink_GetTargetFrameName(pihlNavigate, &frame_name);
170         ok(hres == S_FALSE, "GetTargetFrameName failed: %08lx\n", hres);
171         ok(frame_name == NULL, "frame_name = %p\n", frame_name);
172
173         hres = IHlink_GetMonikerReference(pihlNavigate, 1, &mon, &location);
174         ok(hres == S_OK, "GetMonikerReference failed: %08lx\n", hres);
175         ok(location == NULL, "location = %p\n", location);
176         ok(mon != NULL, "mon == NULL\n");
177
178         hres = IHlink_GetHlinkSite(pihlNavigate, &site, &site_data);
179         ok(hres == S_OK, "GetHlinkSite failed: %08lx\n", hres);
180         ok(site == NULL, "site = %p\n, expected NULL\n", site);
181         ok(site_data == 0xdeadbeef, "site_data = %lx\n", site_data);
182     }
183
184     return S_OK;
185 }
186
187 static HRESULT WINAPI HlinkFrame_OnNavigate(IHlinkFrame *iface, DWORD grfHLNF,
188         IMoniker *pimkTarget, LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName, DWORD dwreserved)
189 {
190     ok(0, "unexpected call\n");
191     return E_NOTIMPL;
192 }
193
194 static HRESULT WINAPI HlinkFrame_UpdateHlink(IHlinkFrame *iface, ULONG uHLID,
195         IMoniker *pimkTarget, LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName)
196 {
197     ok(0, "unexpected call\n");
198     return E_NOTIMPL;
199 }
200
201 static const IHlinkFrameVtbl HlinkFrameVtbl = {
202     HlinkFrame_QueryInterface,
203     HlinkFrame_AddRef,
204     HlinkFrame_Release,
205     HlinkFrame_SetBrowseContext,
206     HlinkFrame_GetBrowseContext,
207     HlinkFrame_Navigate,
208     HlinkFrame_OnNavigate,
209     HlinkFrame_UpdateHlink
210 };
211
212 static IHlinkFrame HlinkFrame = { &HlinkFrameVtbl };
213
214 static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv)
215 {
216     return QueryInterface(riid, ppv);
217 }
218
219 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
220 {
221     return 2;
222 }
223
224 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
225 {
226     return 1;
227 }
228
229 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc,
230         LPOLESTR pszDiaplayName, ULONG *pchEaten, IMoniker **ppmkOut)
231 {
232     ok(0, "unexpected call\n");
233     return E_NOTIMPL;
234 }
235
236 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags,
237         IEnumUnknown **ppenum)
238 {
239     ok(0, "unexpected call\n");
240     return E_NOTIMPL;
241 }
242
243 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
244 {
245     CHECK_EXPECT(LockContainer);
246     ok(expect_LockContainer_fLock == fLock, "fLock=%x, expected %x\n", fLock, expect_LockContainer_fLock);
247     return S_OK;
248 }
249
250 static const IOleContainerVtbl OleContainerVtbl = {
251     OleContainer_QueryInterface,
252     OleContainer_AddRef,
253     OleContainer_Release,
254     OleContainer_ParseDisplayName,
255     OleContainer_EnumObjects,
256     OleContainer_LockContainer
257 };
258
259 static IOleContainer OleContainer = { &OleContainerVtbl };
260
261 static HRESULT WINAPI InPlaceFrame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, void **ppv)
262 {
263     return QueryInterface(riid, ppv);
264 }
265
266 static ULONG WINAPI InPlaceFrame_AddRef(IOleInPlaceFrame *iface)
267 {
268     return 2;
269 }
270
271 static ULONG WINAPI InPlaceFrame_Release(IOleInPlaceFrame *iface)
272 {
273     return 1;
274 }
275
276 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
277 {
278     ok(0, "unexpected call\n");
279     return E_NOTIMPL;
280 }
281
282 static HRESULT WINAPI InPlaceFrame_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
283 {
284     ok(0, "unexpected call\n");
285     return E_NOTIMPL;
286 }
287
288 static HRESULT WINAPI InPlaceFrame_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
289 {
290     ok(0, "unexpected call\n");
291     return E_NOTIMPL;
292 }
293
294 static HRESULT WINAPI InPlaceFrame_RequestBorderSpace(IOleInPlaceFrame *iface,
295         LPCBORDERWIDTHS pborderwidths)
296 {
297     ok(0, "unexpected call\n");
298     return E_NOTIMPL;
299 }
300
301 static HRESULT WINAPI InPlaceFrame_SetBorderSpace(IOleInPlaceFrame *iface,
302         LPCBORDERWIDTHS pborderwidths)
303 {
304     ok(0, "unexpected call\n");
305     return E_NOTIMPL;
306 }
307
308 static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
309         IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
310 {
311     static const WCHAR wszHTML_Document[] =
312         {'H','T','M','L',' ','D','o','c','u','m','e','n','t',0};
313
314     CHECK_EXPECT2(SetActiveObject);
315
316     if(expect_SetActiveObject_active) {
317         ok(pActiveObject != NULL, "pActiveObject = NULL\n");
318         if(pActiveObject && PRIMARYLANGID(GetSystemDefaultLangID()) == LANG_ENGLISH)
319             ok(!lstrcmpW(wszHTML_Document, pszObjName), "pszObjName != \"HTML Document\"\n");
320     }else {
321         ok(pActiveObject == NULL, "pActiveObject=%p, expected NULL\n", pActiveObject);
322         ok(pszObjName == NULL, "pszObjName=%p, expected NULL\n", pszObjName);
323     }
324
325     return S_OK;
326 }
327
328 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
329         LPOLEMENUGROUPWIDTHS lpMenuWidths)
330 {
331     ok(0, "unexpected call\n");
332     return E_NOTIMPL;
333 }
334
335 static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared,
336         HOLEMENU holemenu, HWND hwndActiveObject)
337 {
338     ok(0, "unexpected call\n");
339     return E_NOTIMPL;
340 }
341
342 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
343 {
344     ok(0, "unexpected call\n");
345     return E_NOTIMPL;
346 }
347
348 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
349 {
350     CHECK_EXPECT2(SetStatusText);
351     if(!expect_status_text)
352         ok(pszStatusText == NULL, "pszStatusText=%p, expected NULL\n", pszStatusText);
353     return S_OK;
354 }
355
356 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
357 {
358     ok(0, "unexpected call\n");
359     return E_NOTIMPL;
360 }
361
362 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
363 {
364     ok(0, "unexpected call\n");
365     return E_NOTIMPL;
366 }
367
368 static const IOleInPlaceFrameVtbl InPlaceFrameVtbl = {
369     InPlaceFrame_QueryInterface,
370     InPlaceFrame_AddRef,
371     InPlaceFrame_Release,
372     InPlaceFrame_GetWindow,
373     InPlaceFrame_ContextSensitiveHelp,
374     InPlaceFrame_GetBorder,
375     InPlaceFrame_RequestBorderSpace,
376     InPlaceFrame_SetBorderSpace,
377     InPlaceFrame_SetActiveObject,
378     InPlaceFrame_InsertMenus,
379     InPlaceFrame_SetMenu,
380     InPlaceFrame_RemoveMenus,
381     InPlaceFrame_SetStatusText,
382     InPlaceFrame_EnableModeless,
383     InPlaceFrame_TranslateAccelerator
384 };
385
386 static IOleInPlaceFrame InPlaceFrame = { &InPlaceFrameVtbl };
387
388 static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSite *iface, REFIID riid, void **ppv)
389 {
390     return QueryInterface(riid, ppv);
391 }
392
393 static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSite *iface)
394 {
395     return 2;
396 }
397
398 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSite *iface)
399 {
400     return 1;
401 }
402
403 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSite *iface, HWND *phwnd)
404 {
405     CHECK_EXPECT(GetWindow);
406     ok(phwnd != NULL, "phwnd = NULL\n");
407     *phwnd = container_hwnd;
408     return S_OK;
409 }
410
411 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSite *iface, BOOL fEnterMode)
412 {
413     ok(0, "unexpected call\n");
414     return E_NOTIMPL;
415 }
416
417 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSite *iface)
418 {
419     CHECK_EXPECT(CanInPlaceActivate);
420     return S_OK;
421 }
422
423 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSite *iface)
424 {
425     CHECK_EXPECT(OnInPlaceActivate);
426     return S_OK;
427 }
428
429 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSite *iface)
430 {
431     CHECK_EXPECT(OnUIActivate);
432     return S_OK;
433 }
434
435 static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSite *iface,
436         IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
437         LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
438 {
439     static const RECT rect = {0,0,500,500};
440
441     CHECK_EXPECT(GetWindowContext);
442
443     ok(ppFrame != NULL, "ppFrame = NULL\n");
444     if(ppFrame)
445         *ppFrame = &InPlaceFrame;
446     ok(ppDoc != NULL, "ppDoc = NULL\n");
447     if(ppDoc)
448         *ppDoc = NULL;
449     ok(lprcPosRect != NULL, "lprcPosRect = NULL\n");
450     if(lprcPosRect)
451         memcpy(lprcPosRect, &rect, sizeof(RECT));
452     ok(lprcClipRect != NULL, "lprcClipRect = NULL\n");
453     if(lprcClipRect)
454         memcpy(lprcClipRect, &rect, sizeof(RECT));
455     ok(lpFrameInfo != NULL, "lpFrameInfo = NULL\n");
456     if(lpFrameInfo) {
457         lpFrameInfo->cb = sizeof(*lpFrameInfo);
458         lpFrameInfo->fMDIApp = FALSE;
459         lpFrameInfo->hwndFrame = container_hwnd;
460         lpFrameInfo->haccel = NULL;
461         lpFrameInfo->cAccelEntries = 0;
462     }
463
464     return S_OK;
465 }
466
467 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSite *iface, SIZE scrollExtant)
468 {
469     ok(0, "unexpected call\n");
470     return E_NOTIMPL;
471 }
472
473 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSite *iface, BOOL fUndoable)
474 {
475     CHECK_EXPECT(OnUIDeactivate);
476     ok(!fUndoable, "fUndoable = TRUE\n");
477     return S_OK;
478 }
479
480 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSite *iface)
481 {
482     CHECK_EXPECT(OnInPlaceDeactivate);
483     return S_OK;
484 }
485
486 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSite *iface)
487 {
488     ok(0, "unexpected call\n");
489     return E_NOTIMPL;
490 }
491
492 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSite *iface)
493 {
494     ok(0, "unexpected call\n");
495     return E_NOTIMPL;
496 }
497
498 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSite *iface, LPCRECT lprcPosRect)
499 {
500     ok(0, "unexpected call\n");
501     return E_NOTIMPL;
502 }
503
504 static const IOleInPlaceSiteVtbl InPlaceSiteVtbl = {
505     InPlaceSite_QueryInterface,
506     InPlaceSite_AddRef,
507     InPlaceSite_Release,
508     InPlaceSite_GetWindow,
509     InPlaceSite_ContextSensitiveHelp,
510     InPlaceSite_CanInPlaceActivate,
511     InPlaceSite_OnInPlaceActivate,
512     InPlaceSite_OnUIActivate,
513     InPlaceSite_GetWindowContext,
514     InPlaceSite_Scroll,
515     InPlaceSite_OnUIDeactivate,
516     InPlaceSite_OnInPlaceDeactivate,
517     InPlaceSite_DiscardUndoState,
518     InPlaceSite_DeactivateAndUndo,
519     InPlaceSite_OnPosRectChange
520 };
521
522 static IOleInPlaceSite InPlaceSite = { &InPlaceSiteVtbl };
523
524 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
525 {
526     return QueryInterface(riid, ppv);
527 }
528
529 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
530 {
531     return 2;
532 }
533
534 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
535 {
536     return 1;
537 }
538
539 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
540 {
541     ok(0, "unexpected call\n");
542     return E_NOTIMPL;
543 }
544
545 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAsign, DWORD dwWhichMoniker,
546         IMoniker **ppmon)
547 {
548     ok(0, "unexpected call\n");
549     return E_NOTIMPL;
550 }
551
552 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
553 {
554     CHECK_EXPECT(GetContainer);
555     ok(ppContainer != NULL, "ppContainer = NULL\n");
556     *ppContainer = &OleContainer;
557     return S_OK;
558 }
559
560 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
561 {
562     ok(0, "unexpected call\n");
563     return E_NOTIMPL;
564 }
565
566 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
567 {
568     ok(0, "unexpected call\n");
569     return E_NOTIMPL;
570 }
571
572 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
573 {
574     ok(0, "unexpected call\n");
575     return E_NOTIMPL;
576 }
577
578 static const IOleClientSiteVtbl ClientSiteVtbl = {
579     ClientSite_QueryInterface,
580     ClientSite_AddRef,
581     ClientSite_Release,
582     ClientSite_SaveObject,
583     ClientSite_GetMoniker,
584     ClientSite_GetContainer,
585     ClientSite_ShowObject,
586     ClientSite_OnShowWindow,
587     ClientSite_RequestNewObjectLayout
588 };
589
590 static IOleClientSite ClientSite = { &ClientSiteVtbl };
591
592 static HRESULT WINAPI DocumentSite_QueryInterface(IOleDocumentSite *iface, REFIID riid, void **ppv)
593 {
594     return QueryInterface(riid, ppv);
595 }
596
597 static ULONG WINAPI DocumentSite_AddRef(IOleDocumentSite *iface)
598 {
599     return 2;
600 }
601
602 static ULONG WINAPI DocumentSite_Release(IOleDocumentSite *iface)
603 {
604     return 1;
605 }
606
607 static BOOL call_UIActivate = TRUE;
608 static HRESULT WINAPI DocumentSite_ActivateMe(IOleDocumentSite *iface, IOleDocumentView *pViewToActivate)
609 {
610     IOleDocument *document;
611     HRESULT hres;
612
613     CHECK_EXPECT(ActivateMe);
614     ok(pViewToActivate != NULL, "pViewToActivate = NULL\n");
615
616     hres = IOleDocumentView_QueryInterface(pViewToActivate, &IID_IOleDocument, (void**)&document);
617     ok(hres == S_OK, "could not get IOleDocument: %08lx\n", hres);
618
619     if(SUCCEEDED(hres)) {
620         hres = IOleDocument_CreateView(document, &InPlaceSite, NULL, 0, &view);
621         ok(hres == S_OK, "CreateView failed: %08lx\n", hres);
622
623         if(SUCCEEDED(hres)) {
624             IOleInPlaceActiveObject *activeobj = NULL;
625             IOleInPlaceSite *inplacesite = NULL;
626             HWND tmp_hwnd = NULL;
627             static RECT rect = {0,0,400,500};
628
629             hres = IOleDocumentView_GetInPlaceSite(view, &inplacesite);
630             ok(hres == S_OK, "GetInPlaceSite failed: %08lx\n", hres);
631             ok(inplacesite == &InPlaceSite, "inplacesite=%p, expected %p\n",
632                     inplacesite, &InPlaceSite);
633
634             hres = IOleDocumentView_SetInPlaceSite(view, &InPlaceSite);
635             ok(hres == S_OK, "SetInPlaceSite failed: %08lx\n", hres);
636
637             hres = IOleDocumentView_GetInPlaceSite(view, &inplacesite);
638             ok(hres == S_OK, "GetInPlaceSite failed: %08lx\n", hres);
639             ok(inplacesite == &InPlaceSite, "inplacesite=%p, expected %p\n",
640                     inplacesite, &InPlaceSite);
641
642             hres = IOleDocumentView_QueryInterface(view, &IID_IOleInPlaceActiveObject, (void**)&activeobj);
643             ok(hres == S_OK, "Could not get IOleInPlaceActiveObject: %08lx\n", hres);
644
645             if(activeobj) {
646                 IOleInPlaceActiveObject_GetWindow(activeobj, &hwnd);
647                 ok(hres == S_OK, "GetWindow failed: %08lx\n", hres);
648                 ok(hwnd == NULL, "hwnd=%p, expeted NULL\n", hwnd);
649             }
650             
651             if(call_UIActivate) {
652                 SET_EXPECT(CanInPlaceActivate);
653                 SET_EXPECT(GetWindowContext);
654                 SET_EXPECT(GetWindow);
655                 SET_EXPECT(OnInPlaceActivate);
656                 SET_EXPECT(SetStatusText);
657                 SET_EXPECT(Exec_SETPROGRESSMAX);
658                 SET_EXPECT(Exec_SETPROGRESSPOS);
659                 SET_EXPECT(OnUIActivate);
660                 SET_EXPECT(SetActiveObject);
661                 SET_EXPECT(ShowUI);
662                 expect_SetActiveObject_active = TRUE;
663                 expect_status_text = NULL;
664
665                 hres = IOleDocumentView_UIActivate(view, TRUE);
666
667                 if(FAILED(hres)) {
668                     trace("UIActivate failed: %08lx\n", hres);
669                     return hres;
670                 }
671                 ok(hres == S_OK, "UIActivate failed: %08lx\n", hres);
672
673                 CHECK_CALLED(CanInPlaceActivate);
674                 CHECK_CALLED(GetWindowContext);
675                 CHECK_CALLED(GetWindow);
676                 CHECK_CALLED(OnInPlaceActivate);
677                 CHECK_CALLED(SetStatusText);
678                 CHECK_CALLED(Exec_SETPROGRESSMAX);
679                 CHECK_CALLED(Exec_SETPROGRESSPOS);
680                 CHECK_CALLED(OnUIActivate);
681                 CHECK_CALLED(SetActiveObject);
682                 CHECK_CALLED(ShowUI);
683
684                 if(activeobj) {
685                     hres = IOleInPlaceActiveObject_GetWindow(activeobj, &hwnd);
686                     ok(hres == S_OK, "GetWindow failed: %08lx\n", hres);
687                     ok(hwnd != NULL, "hwnd == NULL\n");
688                     if(last_hwnd)
689                         ok(hwnd == last_hwnd, "hwnd != last_hwnd\n");
690                 }
691
692                 hres = IOleDocumentView_UIActivate(view, TRUE);
693                 ok(hres == S_OK, "UIActivate failed: %08lx\n", hres);
694
695                 if(activeobj) {
696                     hres = IOleInPlaceActiveObject_GetWindow(activeobj, &tmp_hwnd);
697                     ok(hres == S_OK, "GetWindow failed: %08lx\n", hres);
698                     ok(tmp_hwnd == hwnd, "tmp_hwnd=%p, expected %p\n", tmp_hwnd, hwnd);
699                 }
700             }
701
702             hres = IOleDocumentView_SetRect(view, &rect);
703             ok(hres == S_OK, "SetRect failed: %08lx\n", hres);
704
705             if(call_UIActivate) {
706                 hres = IOleDocumentView_Show(view, TRUE);
707                 ok(hres == S_OK, "Show failed: %08lx\n", hres);
708             }else {
709                 SET_EXPECT(CanInPlaceActivate);
710                 SET_EXPECT(GetWindowContext);
711                 SET_EXPECT(GetWindow);
712                 SET_EXPECT(OnInPlaceActivate);
713                 SET_EXPECT(SetStatusText);
714                 SET_EXPECT(Exec_SETPROGRESSMAX);
715                 SET_EXPECT(Exec_SETPROGRESSPOS);
716                 SET_EXPECT(OnUIActivate);
717                 expect_status_text = (load_state == LD_LOADED ? (LPCOLESTR)0xdeadbeef : NULL);
718
719                 hres = IOleDocumentView_Show(view, TRUE);
720                 ok(hres == S_OK, "Show failed: %08lx\n", hres);
721
722                 CHECK_CALLED(CanInPlaceActivate);
723                 CHECK_CALLED(GetWindowContext);
724                 CHECK_CALLED(GetWindow);
725                 CHECK_CALLED(OnInPlaceActivate);
726                 CHECK_CALLED(SetStatusText);
727                 CHECK_CALLED(Exec_SETPROGRESSMAX);
728                 CHECK_CALLED(Exec_SETPROGRESSPOS);
729
730                 if(activeobj) {
731                     hres = IOleInPlaceActiveObject_GetWindow(activeobj, &hwnd);
732                     ok(hres == S_OK, "GetWindow failed: %08lx\n", hres);
733                     ok(hwnd != NULL, "hwnd == NULL\n");
734                     if(last_hwnd)
735                         ok(hwnd == last_hwnd, "hwnd != last_hwnd\n");
736                 }
737             }
738
739             if(activeobj)
740                 IOleInPlaceActiveObject_Release(activeobj);
741         }
742
743         IOleDocument_Release(document);
744     }
745
746     return S_OK;
747 }
748
749 static const IOleDocumentSiteVtbl DocumentSiteVtbl = {
750     DocumentSite_QueryInterface,
751     DocumentSite_AddRef,
752     DocumentSite_Release,
753     DocumentSite_ActivateMe
754 };
755
756 static IOleDocumentSite DocumentSite = { &DocumentSiteVtbl };
757
758 static HRESULT WINAPI DocHostUIHandler_QueryInterface(IDocHostUIHandler2 *iface, REFIID riid, void **ppv)
759 {
760     return QueryInterface(riid, ppv);
761 }
762
763 static ULONG WINAPI DocHostUIHandler_AddRef(IDocHostUIHandler2 *iface)
764 {
765     return 2;
766 }
767
768 static ULONG WINAPI DocHostUIHandler_Release(IDocHostUIHandler2 *iface)
769 {
770     return 1;
771 }
772
773 static HRESULT WINAPI DocHostUIHandler_ShowContextMenu(IDocHostUIHandler2 *iface, DWORD dwID, POINT *ppt,
774         IUnknown *pcmdtReserved, IDispatch *pdicpReserved)
775 {
776     ok(0, "unexpected call\n");
777     return E_NOTIMPL;
778 }
779
780 static HRESULT WINAPI DocHostUIHandler_GetHostInfo(IDocHostUIHandler2 *iface, DOCHOSTUIINFO *pInfo)
781 {
782     CHECK_EXPECT(GetHostInfo);
783     ok(pInfo != NULL, "pInfo=NULL\n");
784     if(pInfo) {
785         ok(pInfo->cbSize == sizeof(DOCHOSTUIINFO), "pInfo->cbSize=%lu\n", pInfo->cbSize);
786         ok(!pInfo->dwFlags, "pInfo->dwFlags=%08lx, expected 0\n", pInfo->dwFlags);
787         pInfo->dwFlags = DOCHOSTUIFLAG_DISABLE_HELP_MENU | DOCHOSTUIFLAG_DISABLE_SCRIPT_INACTIVE
788             | DOCHOSTUIFLAG_ACTIVATE_CLIENTHIT_ONLY | DOCHOSTUIFLAG_ENABLE_INPLACE_NAVIGATION
789             | DOCHOSTUIFLAG_IME_ENABLE_RECONVERSION;
790         ok(!pInfo->dwDoubleClick, "pInfo->dwDoubleClick=%08lx, expected 0\n", pInfo->dwDoubleClick);
791         ok(!pInfo->pchHostCss, "pInfo->pchHostCss=%p, expected NULL\n", pInfo->pchHostCss);
792         ok(!pInfo->pchHostNS, "pInfo->pchhostNS=%p, expected NULL\n", pInfo->pchHostNS);
793     }
794     return S_OK;
795 }
796
797 static HRESULT WINAPI DocHostUIHandler_ShowUI(IDocHostUIHandler2 *iface, DWORD dwID,
798         IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget,
799         IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
800 {
801     CHECK_EXPECT(ShowUI);
802
803     ok(dwID == 0, "dwID=%ld, expected 0\n", dwID);
804     ok(pActiveObject != NULL, "pActiveObject = NULL\n");
805     ok(pCommandTarget != NULL, "pCommandTarget = NULL\n");
806     ok(pFrame == &InPlaceFrame, "pFrame=%p, expected %p\n", pFrame, &InPlaceFrame);
807     ok(pDoc == NULL, "pDoc=%p, expected NULL\n", pDoc);
808
809     return S_OK;
810 }
811
812 static HRESULT WINAPI DocHostUIHandler_HideUI(IDocHostUIHandler2 *iface)
813 {
814     CHECK_EXPECT(HideUI);
815     return S_OK;
816 }
817
818 static HRESULT WINAPI DocHostUIHandler_UpdateUI(IDocHostUIHandler2 *iface)
819 {
820     CHECK_EXPECT(UpdateUI);
821     return S_OK;
822 }
823
824 static HRESULT WINAPI DocHostUIHandler_EnableModeless(IDocHostUIHandler2 *iface, BOOL fEnable)
825 {
826     ok(0, "unexpected call\n");
827     return E_NOTIMPL;
828 }
829
830 static HRESULT WINAPI DocHostUIHandler_OnDocWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
831 {
832     ok(0, "unexpected call\n");
833     return E_NOTIMPL;
834 }
835
836 static BOOL expect_OnFrameWindowActivate_fActivate;
837 static HRESULT WINAPI DocHostUIHandler_OnFrameWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
838 {
839     CHECK_EXPECT2(OnFrameWindowActivate);
840     ok(fActivate == expect_OnFrameWindowActivate_fActivate, "fActivate=%x\n", fActivate);
841     return S_OK;
842 }
843
844 static HRESULT WINAPI DocHostUIHandler_ResizeBorder(IDocHostUIHandler2 *iface, LPCRECT prcBorder,
845         IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
846 {
847     ok(0, "unexpected call\n");
848     return E_NOTIMPL;
849 }
850
851 static HRESULT WINAPI DocHostUIHandler_TranslateAccelerator(IDocHostUIHandler2 *iface, LPMSG lpMsg,
852         const GUID *pguidCmdGroup, DWORD nCmdID)
853 {
854     ok(0, "unexpected call\n");
855     return E_NOTIMPL;
856 }
857
858 static HRESULT WINAPI DocHostUIHandler_GetOptionKeyPath(IDocHostUIHandler2 *iface,
859         LPOLESTR *pchKey, DWORD dw)
860 {
861     CHECK_EXPECT(GetOptionKeyPath);
862     ok(pchKey != NULL, "pchKey = NULL\n");
863     ok(!dw, "dw=%ld, expected 0\n", dw);
864     if(pchKey)
865         ok(!*pchKey, "*pchKey=%p, expected NULL\n", *pchKey);
866     return S_OK;
867 }
868
869 static HRESULT WINAPI DocHostUIHandler_GetDropTarget(IDocHostUIHandler2 *iface,
870         IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
871 {
872     CHECK_EXPECT(GetDropTarget);
873     /* TODO */
874     return E_NOTIMPL;
875 }
876
877 static HRESULT WINAPI DocHostUIHandler_GetExternal(IDocHostUIHandler2 *iface, IDispatch **ppDispatch)
878 {
879     ok(0, "unexpected call\n");
880     return E_NOTIMPL;
881 }
882
883 static HRESULT WINAPI DocHostUIHandler_TranslateUrl(IDocHostUIHandler2 *iface, DWORD dwTranslate,
884         OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
885 {
886     ok(0, "unexpected call\n");
887     return E_NOTIMPL;
888 }
889
890 static HRESULT WINAPI DocHostUIHandler_FilterDataObject(IDocHostUIHandler2 *iface, IDataObject *pDO,
891         IDataObject **ppPORet)
892 {
893     ok(0, "unexpected call\n");
894     return E_NOTIMPL;
895 }
896
897 static HRESULT WINAPI DocHostUIHandler_GetOverrideKeyPath(IDocHostUIHandler2 *iface,
898         LPOLESTR *pchKey, DWORD dw)
899 {
900     CHECK_EXPECT(GetOverrideKeyPath);
901     ok(pchKey != NULL, "pchKey = NULL\n");
902     if(pchKey)
903         ok(!*pchKey, "*pchKey=%p, expected NULL\n", *pchKey);
904     ok(!dw, "dw=%ld, xepected 0\n", dw);
905     return S_OK;
906 }
907
908 static const IDocHostUIHandler2Vtbl DocHostUIHandlerVtbl = {
909     DocHostUIHandler_QueryInterface,
910     DocHostUIHandler_AddRef,
911     DocHostUIHandler_Release,
912     DocHostUIHandler_ShowContextMenu,
913     DocHostUIHandler_GetHostInfo,
914     DocHostUIHandler_ShowUI,
915     DocHostUIHandler_HideUI,
916     DocHostUIHandler_UpdateUI,
917     DocHostUIHandler_EnableModeless,
918     DocHostUIHandler_OnDocWindowActivate,
919     DocHostUIHandler_OnFrameWindowActivate,
920     DocHostUIHandler_ResizeBorder,
921     DocHostUIHandler_TranslateAccelerator,
922     DocHostUIHandler_GetOptionKeyPath,
923     DocHostUIHandler_GetDropTarget,
924     DocHostUIHandler_GetExternal,
925     DocHostUIHandler_TranslateUrl,
926     DocHostUIHandler_FilterDataObject,
927     DocHostUIHandler_GetOverrideKeyPath
928 };
929
930 static IDocHostUIHandler2 DocHostUIHandler = { &DocHostUIHandlerVtbl };
931
932 static HRESULT WINAPI OleCommandTarget_QueryInterface(IOleCommandTarget *iface,
933         REFIID riid, void **ppv)
934 {
935     return QueryInterface(riid, ppv);
936 }
937
938 static ULONG WINAPI OleCommandTarget_AddRef(IOleCommandTarget *iface)
939 {
940     return 2;
941 }
942
943 static ULONG WINAPI OleCommandTarget_Release(IOleCommandTarget *iface)
944 {
945     return 1;
946 }
947
948 static HRESULT WINAPI OleCommandTarget_QueryStatus(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
949         ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
950 {
951     ok(!pguidCmdGroup, "pguidCmdGroup != MULL\n");
952     ok(cCmds == 1, "cCmds=%ld, expected 1\n", cCmds);
953     ok(!pCmdText, "pCmdText != NULL\n");
954
955     switch(prgCmds[0].cmdID) {
956     case OLECMDID_SETPROGRESSTEXT:
957         CHECK_EXPECT(QueryStatus_SETPROGRESSTEXT);
958         prgCmds[0].cmdf = OLECMDF_ENABLED;
959         return S_OK;
960     case OLECMDID_OPEN:
961         CHECK_EXPECT(QueryStatus_OPEN);
962         prgCmds[0].cmdf = 0;
963         return S_OK;
964     case OLECMDID_NEW:
965         CHECK_EXPECT(QueryStatus_NEW);
966         prgCmds[0].cmdf = 0;
967         return S_OK;
968     default:
969         ok(0, "unexpected command %ld\n", prgCmds[0].cmdID);
970     };
971
972     return E_FAIL;
973 }
974
975 static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
976         DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
977 {
978     if(!pguidCmdGroup) {
979         switch(nCmdID) {
980         case OLECMDID_SETPROGRESSMAX:
981             CHECK_EXPECT2(Exec_SETPROGRESSMAX);
982             ok(pvaIn != NULL, "pvaIn == NULL\n");
983             if(pvaIn) {
984                 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
985                 if(load_state == LD_NO)
986                     ok(V_I4(pvaIn) == 0, "V_I4(pvaIn)=%ld, expected 0\n", V_I4(pvaIn));
987             }
988             ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
989             return S_OK;
990         case OLECMDID_SETPROGRESSPOS:
991             CHECK_EXPECT2(Exec_SETPROGRESSPOS);
992             ok(pvaIn != NULL, "pvaIn == NULL\n");
993             if(pvaIn) {
994                 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
995                 if(load_state == LD_NO)
996                     ok(V_I4(pvaIn) == 0, "V_I4(pvaIn)=%ld, expected 0\n", V_I4(pvaIn));
997             }
998             ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
999             return S_OK;
1000         case OLECMDID_HTTPEQUIV_DONE:
1001             CHECK_EXPECT(Exec_HTTPEQUIV_DONE);
1002             /* TODO */
1003             return S_OK;
1004         case OLECMDID_SETDOWNLOADSTATE:
1005             CHECK_EXPECT2(Exec_SETDOWNLOADSTATE);
1006             /* TODO */
1007             return S_OK;
1008         case OLECMDID_UPDATECOMMANDS:
1009             CHECK_EXPECT(Exec_UPDATECOMMANDS);
1010             /* TODO */
1011             return S_OK;
1012         case OLECMDID_SETTITLE:
1013             CHECK_EXPECT2(Exec_SETTITLE);
1014             /* TODO */
1015             return S_OK;
1016         case OLECMDID_HTTPEQUIV:
1017             CHECK_EXPECT2(Exec_HTTPEQUIV);
1018             /* TODO */
1019             return S_OK;
1020         default:
1021             ok(0, "unexpected command %ld\n", nCmdID);
1022             return E_FAIL;
1023         };
1024     }
1025
1026     if(IsEqualGUID(&CGID_ShellDocView, pguidCmdGroup)) {
1027         switch(nCmdID) {
1028         case 37:
1029             CHECK_EXPECT(Exec_ShellDocView_37);
1030             ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
1031             ok(pvaIn != NULL, "pvaIn == NULL\n");
1032             if(pvaIn) {
1033                 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
1034                 ok(V_I4(pvaIn) == 0, "V_I4(pvaIn)=%ld, expected 0\n", V_I4(pvaIn));
1035             }
1036             return S_OK;
1037         default:
1038             ok(0, "unexpected command %ld\n", nCmdID);
1039             return E_FAIL;
1040         };
1041     }
1042
1043     if(IsEqualGUID(&CGID_MSHTML, pguidCmdGroup)) {
1044         switch(nCmdID) {
1045         case 2315:
1046             CHECK_EXPECT(Exec_MSHTML_2315);
1047             /* TODO */
1048             return S_OK;
1049         default:
1050             ok(0, "unexpected command %ld\n", nCmdID);
1051         };
1052     }
1053
1054     if(IsEqualGUID(&CGID_Undocumented, pguidCmdGroup))
1055         return E_FAIL; /* TODO */
1056
1057     ok(0, "unexpected call\n");
1058     return E_NOTIMPL;
1059 }
1060
1061 static IOleCommandTargetVtbl OleCommandTargetVtbl = {
1062     OleCommandTarget_QueryInterface,
1063     OleCommandTarget_AddRef,
1064     OleCommandTarget_Release,
1065     OleCommandTarget_QueryStatus,
1066     OleCommandTarget_Exec
1067 };
1068
1069 static IOleCommandTarget OleCommandTarget = { &OleCommandTargetVtbl };
1070
1071 static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
1072 {
1073     return QueryInterface(riid, ppv);
1074 }
1075
1076 static ULONG WINAPI Dispatch_AddRef(IDispatch *iface)
1077 {
1078     return 2;
1079 }
1080
1081 static ULONG WINAPI Dispatch_Release(IDispatch *iface)
1082 {
1083     return 1;
1084 }
1085
1086 static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
1087 {
1088     ok(0, "unexpected call\n");
1089     return E_NOTIMPL;
1090 }
1091
1092 static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid,
1093         ITypeInfo **ppTInfo)
1094 {
1095     ok(0, "unexpected call\n");
1096     return E_NOTIMPL;
1097 }
1098
1099 static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
1100         UINT cNames, LCID lcid, DISPID *rgDispId)
1101 {
1102     ok(0, "unexpected call\n");
1103     return E_NOTIMPL;
1104 }
1105
1106 static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
1107         LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
1108         EXCEPINFO *pExcepInfo, UINT *puArgErr)
1109 {
1110     ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n");
1111     ok(pDispParams != NULL, "pDispParams == NULL\n");
1112     ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo);
1113     ok(puArgErr != NULL, "puArgErr == NULL\n");
1114     ok(V_VT(pVarResult) == 0, "V_VT(pVarResult)=%d, expected 0\n", V_VT(pVarResult));
1115     ok(wFlags == DISPATCH_PROPERTYGET, "wFlags=%08x, expected DISPATCH_PROPERTYGET\n", wFlags);
1116
1117     switch(dispIdMember) {
1118     case DISPID_AMBIENT_USERMODE:
1119         CHECK_EXPECT2(Invoke_AMBIENT_USERMODE);
1120         V_VT(pVarResult) = VT_BOOL;
1121         V_BOOL(pVarResult) = VARIANT_TRUE;
1122         return S_OK;
1123     case DISPID_AMBIENT_DLCONTROL:
1124         CHECK_EXPECT2(Invoke_AMBIENT_DLCONTROL);
1125         return E_FAIL;
1126     case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
1127         CHECK_EXPECT2(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1128         return E_FAIL;
1129     case DISPID_AMBIENT_SILENT:
1130         CHECK_EXPECT2(Invoke_AMBIENT_SILENT);
1131         V_VT(pVarResult) = VT_BOOL;
1132         V_BOOL(pVarResult) = VARIANT_FALSE;
1133         return S_OK;
1134     case DISPID_AMBIENT_USERAGENT:
1135         CHECK_EXPECT(Invoke_AMBIENT_USERAGENT);
1136         return E_FAIL;
1137     case DISPID_AMBIENT_PALETTE:
1138         CHECK_EXPECT(Invoke_AMBIENT_PALETTE);
1139         return E_FAIL;
1140     };
1141
1142     ok(0, "unexpected dispid %ld\n", dispIdMember);
1143     return E_FAIL;
1144 }
1145
1146 static IDispatchVtbl DispatchVtbl = {
1147     Dispatch_QueryInterface,
1148     Dispatch_AddRef,
1149     Dispatch_Release,
1150     Dispatch_GetTypeInfoCount,
1151     Dispatch_GetTypeInfo,
1152     Dispatch_GetIDsOfNames,
1153     Dispatch_Invoke
1154 };
1155
1156 static IDispatch Dispatch = { &DispatchVtbl };
1157
1158 static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface,
1159                                                      REFIID riid, void **ppv)
1160 {
1161     return QueryInterface(riid, ppv);
1162 }
1163
1164 static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
1165 {
1166     return 2;
1167 }
1168
1169 static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
1170 {
1171     return 1;
1172 }
1173
1174 static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService,
1175                                     REFIID riid, void **ppv)
1176 {
1177     /*
1178      * Services used by HTMLDocument:
1179      *
1180      * IOleUndoManager
1181      * IInternetSecurityManager
1182      * ITargetFrame
1183      * {D5F78C80-5252-11CF-90FA-00AA0042106E}
1184      * HTMLFrameBase
1185      * IShellObject
1186      * {3050F312-98B5-11CF-BB82-00AA00BDCE0B}
1187      * {53A2D5B1-D2FC-11D0-84E0-006097C9987D}
1188      * {AD7F6C62-F6BD-11D2-959B-006097C553C8}
1189      * DefView (?)
1190      * {6D12FE80-7911-11CF-9534-0000C05BAE0B}
1191      * IElementBehaviorFactory
1192      * {3050F429-98B5-11CF-BB82-00AA00BDCE0B}
1193      * STopLevelBrowser
1194      * IHTMLWindow2
1195      * IInternetProtocol
1196      * IWebBrowserApp
1197      * UrlHostory
1198      * IHTMLEditHost
1199      * IHlinkFrame
1200      */
1201
1202     if(IsEqualGUID(&IID_IHlinkFrame, guidService)) {
1203         ok(IsEqualGUID(&IID_IHlinkFrame, riid), "unexpected riid\n");
1204         *ppv = &HlinkFrame;
1205         return S_OK;
1206     }
1207
1208     return E_NOINTERFACE;
1209 }
1210
1211 static const IServiceProviderVtbl ServiceProviderVtbl = {
1212     ServiceProvider_QueryInterface,
1213     ServiceProvider_AddRef,
1214     ServiceProvider_Release,
1215     ServiceProvider_QueryService
1216 };
1217
1218 static IServiceProvider ServiceProvider = { &ServiceProviderVtbl };
1219
1220 static HRESULT QueryInterface(REFIID riid, void **ppv)
1221 {
1222     *ppv = NULL;
1223
1224     if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IOleClientSite, riid))
1225         *ppv = &ClientSite;
1226     else if(IsEqualGUID(&IID_IOleDocumentSite, riid))
1227         *ppv = &DocumentSite;
1228     else if(IsEqualGUID(&IID_IDocHostUIHandler, riid) || IsEqualGUID(&IID_IDocHostUIHandler2, riid))
1229         *ppv = &DocHostUIHandler;
1230     else if(IsEqualGUID(&IID_IOleContainer, riid))
1231         *ppv = &OleContainer;
1232     else if(IsEqualGUID(&IID_IOleWindow, riid) || IsEqualGUID(&IID_IOleInPlaceSite, riid))
1233         *ppv = &InPlaceSite;
1234     else if(IsEqualGUID(&IID_IOleInPlaceUIWindow, riid) || IsEqualGUID(&IID_IOleInPlaceFrame, riid))
1235         *ppv = &InPlaceFrame;
1236     else if(IsEqualGUID(&IID_IOleCommandTarget , riid))
1237         *ppv = &OleCommandTarget;
1238     else if(IsEqualGUID(&IID_IDispatch, riid))
1239         *ppv = &Dispatch;
1240     else if(IsEqualGUID(&IID_IServiceProvider, riid))
1241         *ppv = &ServiceProvider;
1242
1243     /* TODO:
1244      * IOleInPlaceSiteEx
1245      * {D48A6EC6-6A4A-11CF-94A7-444553540000}
1246      * {7BB0B520-B1A7-11D2-BB23-00C04F79ABCD}
1247      * {000670BA-0000-0000-C000-000000000046}
1248      */
1249
1250     if(*ppv)
1251         return S_OK;
1252     return E_NOINTERFACE;
1253 }
1254
1255 static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
1256 {
1257     return DefWindowProc(hwnd, msg, wParam, lParam);
1258 }
1259
1260 static void test_ConnectionPoint(IConnectionPointContainer *container, REFIID riid)
1261 {
1262     IConnectionPointContainer *tmp_container = NULL;
1263     IConnectionPoint *cp;
1264     IID iid;
1265     HRESULT hres;
1266
1267     hres = IConnectionPointContainer_FindConnectionPoint(container, riid, &cp);
1268     ok(hres == S_OK, "FindConnectionPoint failed: %08lx\n", hres);
1269     if(FAILED(hres))
1270         return;
1271
1272     hres = IConnectionPoint_GetConnectionInterface(cp, &iid);
1273     ok(hres == S_OK, "GetConnectionInterface failed: %08lx\n", hres);
1274     ok(IsEqualGUID(riid, &iid), "wrong iid\n");
1275
1276     hres = IConnectionPoint_GetConnectionInterface(cp, NULL);
1277     ok(hres == E_POINTER, "GetConnectionInterface failed: %08lx, expected E_POINTER\n", hres);
1278
1279     hres = IConnectionPoint_GetConnectionPointContainer(cp, &tmp_container);
1280     ok(hres == S_OK, "GetConnectionPointContainer failed: %08lx\n", hres);
1281     ok(tmp_container == container, "container != tmp_container\n");
1282     if(SUCCEEDED(hres))
1283         IConnectionPointContainer_Release(tmp_container);
1284
1285     hres = IConnectionPoint_GetConnectionPointContainer(cp, NULL);
1286     ok(hres == E_POINTER, "GetConnectionPointContainer failed: %08lx, expected E_POINTER\n", hres);
1287
1288     IConnectionPoint_Release(cp);
1289 }
1290
1291 static void test_ConnectionPointContainer(IUnknown *unk)
1292 {
1293     IConnectionPointContainer *container;
1294     HRESULT hres;
1295
1296     hres = IUnknown_QueryInterface(unk, &IID_IConnectionPointContainer, (void**)&container);
1297     ok(hres == S_OK, "QueryInterface(IID_IConnectionPointContainer) failed: %08lx\n", hres);
1298     if(FAILED(hres))
1299         return;
1300
1301     test_ConnectionPoint(container, &IID_IPropertyNotifySink);
1302     test_ConnectionPoint(container, &DIID_HTMLDocumentEvents);
1303     test_ConnectionPoint(container, &DIID_HTMLDocumentEvents2);
1304
1305     IConnectionPointContainer_Release(container);
1306 }
1307
1308 static void test_Load(IPersistMoniker *persist)
1309 {
1310     IMoniker *mon;
1311     IBindCtx *bind;
1312     HRESULT hres;
1313
1314     static const WCHAR wszWineHQ[] =
1315         {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g','/',0};
1316
1317     hres = CreateURLMoniker(NULL, wszWineHQ, &mon);
1318     ok(hres == S_OK, "CreateURLMoniker failed: %08lx\n", hres);
1319     if(FAILED(hres))
1320         return;
1321
1322     CreateBindCtx(0, &bind);
1323     IBindCtx_RegisterObjectParam(bind, (LPOLESTR)SZ_HTML_CLIENTSITE_OBJECTPARAM,
1324                                  (IUnknown*)&ClientSite);
1325
1326     SET_EXPECT(GetHostInfo);
1327     SET_EXPECT(GetOptionKeyPath);
1328     SET_EXPECT(GetOverrideKeyPath);
1329     SET_EXPECT(GetWindow);
1330     SET_EXPECT(QueryStatus_SETPROGRESSTEXT);
1331     SET_EXPECT(Exec_SETPROGRESSMAX);
1332     SET_EXPECT(Exec_SETPROGRESSPOS);
1333     SET_EXPECT(Invoke_AMBIENT_USERMODE);
1334     SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
1335     SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1336     SET_EXPECT(Invoke_AMBIENT_SILENT);
1337     SET_EXPECT(Invoke_AMBIENT_USERAGENT);
1338     SET_EXPECT(Invoke_AMBIENT_PALETTE);
1339     SET_EXPECT(GetContainer);
1340     SET_EXPECT(LockContainer);
1341     SET_EXPECT(Exec_ShellDocView_37);
1342     expect_LockContainer_fLock = TRUE;
1343
1344     hres = IPersistMoniker_Load(persist, FALSE, mon, bind, 0x12);
1345 #if 0
1346     ok(hres == S_OK, "Load failed: %08lx\n", hres);
1347 #endif
1348
1349     CHECK_CALLED(GetHostInfo);
1350     CHECK_CALLED(GetOptionKeyPath);
1351     CHECK_CALLED(GetOverrideKeyPath);
1352     CHECK_CALLED(GetWindow);
1353     CHECK_CALLED(QueryStatus_SETPROGRESSTEXT);
1354     CHECK_CALLED(Exec_SETPROGRESSMAX);
1355     CHECK_CALLED(Exec_SETPROGRESSPOS);
1356     CHECK_CALLED(Invoke_AMBIENT_USERMODE);
1357     CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
1358     CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1359     CHECK_CALLED(Invoke_AMBIENT_SILENT);
1360     CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
1361     CHECK_CALLED(Invoke_AMBIENT_PALETTE);
1362     CHECK_CALLED(GetContainer);
1363     CHECK_CALLED(LockContainer);
1364     CHECK_CALLED(Exec_ShellDocView_37);
1365
1366     set_clientsite = container_locked = TRUE;
1367
1368     IBindCtx_Release(bind);
1369     IMoniker_Release(mon);
1370 }
1371
1372 #ifdef DOWNLOAD_TEST
1373
1374 static void test_download(void)
1375 {
1376     MSG msg;
1377
1378     load_state = LD_LOADING;
1379
1380     SET_EXPECT(Exec_SETDOWNLOADSTATE);
1381     SET_EXPECT(GetDropTarget);
1382     SET_EXPECT(SetStatusText);
1383     SET_EXPECT(UpdateUI);
1384     SET_EXPECT(Exec_UPDATECOMMANDS);
1385     SET_EXPECT(Exec_SETTITLE);
1386     SET_EXPECT(Exec_HTTPEQUIV);
1387     SET_EXPECT(Exec_SETPROGRESSMAX);
1388     SET_EXPECT(Exec_SETPROGRESSPOS);
1389     SET_EXPECT(Exec_MSHTML_2315);
1390     SET_EXPECT(Exec_HTTPEQUIV_DONE);
1391     expect_status_text = (LPCOLESTR)0xdeadbeef; /* TODO */
1392
1393     while(!called_Exec_HTTPEQUIV_DONE && GetMessage(&msg, NULL, 0, 0)) {
1394         TranslateMessage(&msg);
1395         DispatchMessage(&msg);
1396     }
1397
1398     CHECK_CALLED(Exec_SETDOWNLOADSTATE);
1399     CHECK_CALLED(GetDropTarget);
1400     CHECK_CALLED(SetStatusText);
1401     CHECK_CALLED(UpdateUI);
1402     CHECK_CALLED(Exec_UPDATECOMMANDS);
1403     CHECK_CALLED(Exec_SETTITLE);
1404     CHECK_CALLED(Exec_HTTPEQUIV);
1405     CHECK_CALLED(Exec_SETPROGRESSMAX);
1406     CHECK_CALLED(Exec_SETPROGRESSPOS);
1407     CHECK_CALLED(Exec_MSHTML_2315);
1408     CHECK_CALLED(Exec_HTTPEQUIV_DONE);
1409
1410     load_state = LD_LOADED;
1411 }
1412
1413 #endif
1414
1415 static void test_Persist(IUnknown *unk)
1416 {
1417     IPersistMoniker *persist_mon;
1418     IPersistFile *persist_file;
1419     GUID guid;
1420     HRESULT hres;
1421
1422     hres = IUnknown_QueryInterface(unk, &IID_IPersistFile, (void**)&persist_file);
1423     ok(hres == S_OK, "QueryInterface(IID_IPersist) failed: %08lx\n", hres);
1424     if(SUCCEEDED(hres)) {
1425         hres = IPersist_GetClassID(persist_file, NULL);
1426         ok(hres == E_INVALIDARG, "GetClassID returned: %08lx, expected E_INVALIDARG\n", hres);
1427
1428         hres = IPersist_GetClassID(persist_file, &guid);
1429         ok(hres == S_OK, "GetClassID failed: %08lx\n", hres);
1430         ok(IsEqualGUID(&CLSID_HTMLDocument, &guid), "guid != CLSID_HTMLDocument\n");
1431
1432         IPersist_Release(persist_file);
1433     }
1434
1435     hres = IUnknown_QueryInterface(unk, &IID_IPersistMoniker, (void**)&persist_mon);
1436     ok(hres == S_OK, "QueryInterface(IID_IPersistMoniker) failed: %08lx\n", hres);
1437     if(SUCCEEDED(hres)) {
1438         hres = IPersistMoniker_GetClassID(persist_mon, NULL);
1439         ok(hres == E_INVALIDARG, "GetClassID returned: %08lx, expected E_INVALIDARG\n", hres);
1440
1441         hres = IPersistMoniker_GetClassID(persist_mon, &guid);
1442         ok(hres == S_OK, "GetClassID failed: %08lx\n", hres);
1443         ok(IsEqualGUID(&CLSID_HTMLDocument, &guid), "guid != CLSID_HTMLDocument\n");
1444
1445         if(load_state == LD_DOLOAD)
1446             test_Load(persist_mon);
1447
1448         IPersistMoniker_Release(persist_mon);
1449     }
1450 }
1451
1452 static const OLECMDF expect_cmds[OLECMDID_GETPRINTTEMPLATE+1] = {
1453     0,
1454     OLECMDF_SUPPORTED,                  /* OLECMDID_OPEN */
1455     OLECMDF_SUPPORTED,                  /* OLECMDID_NEW */
1456     OLECMDF_SUPPORTED,                  /* OLECMDID_SAVE */
1457     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_SAVEAS */
1458     OLECMDF_SUPPORTED,                  /* OLECMDID_SAVECOPYAS */
1459     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_PRINT */
1460     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_PRINTPREVIEW */
1461     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_PAGESETUP */
1462     OLECMDF_SUPPORTED,                  /* OLECMDID_SPELL */
1463     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_PROPERTIES */
1464     OLECMDF_SUPPORTED,                  /* OLECMDID_CUT */
1465     OLECMDF_SUPPORTED,                  /* OLECMDID_COPY */
1466     OLECMDF_SUPPORTED,                  /* OLECMDID_PASTE */
1467     OLECMDF_SUPPORTED,                  /* OLECMDID_PASTESPECIAL */
1468     OLECMDF_SUPPORTED,                  /* OLECMDID_UNDO */
1469     OLECMDF_SUPPORTED,                  /* OLECMDID_REDO */
1470     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_SELECTALL */
1471     OLECMDF_SUPPORTED,                  /* OLECMDID_CLEARSELECTION */
1472     OLECMDF_SUPPORTED,                  /* OLECMDID_ZOOM */
1473     OLECMDF_SUPPORTED,                  /* OLECMDID_GETZOOMRANGE */
1474     0,
1475     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_REFRESH */
1476     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_STOP */
1477     0,0,0,0,0,0,
1478     OLECMDF_SUPPORTED,                  /* OLECMDID_STOPDOWNLOAD */
1479     0,0,
1480     OLECMDF_SUPPORTED,                  /* OLECMDID_DELETE */
1481     0,0,
1482     OLECMDF_SUPPORTED,                  /* OLECMDID_ENABLE_INTERACTION */
1483     OLECMDF_SUPPORTED,                  /* OLECMDID_ONUNLOAD */
1484     0,0,0,0,0,
1485     OLECMDF_SUPPORTED,                  /* OLECMDID_SHOWPAGESETUP */
1486     OLECMDF_SUPPORTED,                  /* OLECMDID_SHOWPRINT */
1487     0,0,
1488     OLECMDF_SUPPORTED,                  /* OLECMDID_CLOSE */
1489     0,0,0,
1490     OLECMDF_SUPPORTED,                  /* OLECMDID_SETPRINTTEMPLATE */
1491     OLECMDF_SUPPORTED                   /* OLECMDID_GETPRINTTEMPLATE */
1492 };
1493
1494 static void test_OleCommandTarget(IUnknown *unk)
1495 {
1496     IOleCommandTarget *cmdtrg;
1497     OLECMD cmds[OLECMDID_GETPRINTTEMPLATE];
1498     int i;
1499     HRESULT hres;
1500
1501     hres = IUnknown_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
1502     ok(hres == S_OK, "QueryInterface(IIDIOleM=CommandTarget failed: %08lx\n", hres);
1503     if(FAILED(hres))
1504         return;
1505
1506     for(i=0; i<OLECMDID_GETPRINTTEMPLATE; i++) {
1507         cmds[i].cmdID = i+1;
1508         cmds[i].cmdf = 0xf0f0;
1509     }
1510
1511     SET_EXPECT(QueryStatus_OPEN);
1512     SET_EXPECT(QueryStatus_NEW);
1513     hres = IOleCommandTarget_QueryStatus(cmdtrg, NULL, sizeof(cmds)/sizeof(cmds[0]), cmds, NULL);
1514     ok(hres == S_OK, "QueryStatus failed: %08lx\n", hres);
1515     CHECK_CALLED(QueryStatus_OPEN);
1516     CHECK_CALLED(QueryStatus_NEW);
1517
1518     for(i=0; i<OLECMDID_GETPRINTTEMPLATE; i++) {
1519         ok(cmds[i].cmdID == i+1, "cmds[%d].cmdID canged to %lx\n", i, cmds[i].cmdID);
1520         ok(cmds[i].cmdf == expect_cmds[i+1], "cmds[%d].cmdf=%lx, expected %x\n",
1521                 i+1, cmds[i].cmdf, expect_cmds[i+1]);
1522     }
1523
1524     IOleCommandTarget_Release(cmdtrg);
1525 }
1526
1527 static void test_OleCommandTarget_fail(IUnknown *unk)
1528 {
1529     IOleCommandTarget *cmdtrg;
1530     int i;
1531     HRESULT hres;
1532
1533     OLECMD cmd[2] = {
1534         {OLECMDID_OPEN, 0xf0f0},
1535         {OLECMDID_GETPRINTTEMPLATE+1, 0xf0f0}
1536     };
1537
1538     hres = IUnknown_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
1539     ok(hres == S_OK, "QueryInterface(IIDIOleM=CommandTarget failed: %08lx\n", hres);
1540     if(FAILED(hres))
1541         return;
1542
1543     hres = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 0, NULL, NULL);
1544     ok(hres == S_OK, "QueryStatus failed: %08lx\n", hres);
1545
1546     SET_EXPECT(QueryStatus_OPEN);
1547     hres = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 2, cmd, NULL);
1548     CHECK_CALLED(QueryStatus_OPEN);
1549
1550     ok(hres == OLECMDERR_E_NOTSUPPORTED,
1551             "QueryStatus failed: %08lx, expected OLECMDERR_E_NOTSUPPORTED\n", hres);
1552     ok(cmd[1].cmdID == OLECMDID_GETPRINTTEMPLATE+1,
1553             "cmd[0].cmdID=%ld, expected OLECMDID_GETPRINTTEMPLATE+1\n", cmd[0].cmdID);
1554     ok(cmd[1].cmdf == 0, "cmd[0].cmdf=%lx, expected 0\n", cmd[0].cmdf);
1555     ok(cmd[0].cmdf == OLECMDF_SUPPORTED,
1556             "cmd[1].cmdf=%lx, expected OLECMDF_SUPPORTED\n", cmd[1].cmdf);
1557
1558     hres = IOleCommandTarget_QueryStatus(cmdtrg, &IID_IHTMLDocument2, 2, cmd, NULL);
1559     ok(hres == OLECMDERR_E_UNKNOWNGROUP,
1560             "QueryStatus failed: %08lx, expected OLECMDERR_E_UNKNOWNGROUP\n", hres);
1561
1562     for(i=0; i<OLECMDID_GETPRINTTEMPLATE; i++) {
1563         if(!expect_cmds[i]) {
1564             hres = IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_UPDATECOMMANDS,
1565                     OLECMDEXECOPT_DODEFAULT, NULL, NULL);
1566             ok(hres == OLECMDERR_E_NOTSUPPORTED,
1567                     "Exec failed: %08lx, expected OLECMDERR_E_NOTSUPPORTED\n", hres);
1568         }
1569     }
1570
1571     hres = IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_GETPRINTTEMPLATE+1,
1572             OLECMDEXECOPT_DODEFAULT, NULL, NULL);
1573     ok(hres == OLECMDERR_E_NOTSUPPORTED,
1574             "Exec failed: %08lx, expected OLECMDERR_E_NOTSUPPORTED\n", hres);
1575
1576     IOleCommandTarget_Release(cmdtrg);
1577 }
1578
1579 static void test_exec_onunload(IUnknown *unk)
1580 {
1581     IOleCommandTarget *cmdtrg;
1582     VARIANT var;
1583     HRESULT hres;
1584
1585     hres = IUnknown_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
1586     ok(hres == S_OK, "QueryInterface(IID_IOleCommandTarget) failed: %08lx\n", hres);
1587     if(FAILED(hres))
1588         return;
1589
1590     memset(&var, 0x0a, sizeof(var));
1591     hres = IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_ONUNLOAD,
1592             OLECMDEXECOPT_DODEFAULT, NULL, &var);
1593     ok(hres == S_OK, "Exec(..., OLECMDID_ONUNLOAD, ...) failed: %08lx\n", hres);
1594     ok(V_VT(&var) == VT_BOOL, "V_VT(var)=%d, expected VT_BOOL\n", V_VT(&var));
1595     ok(V_BOOL(&var) == VARIANT_TRUE, "V_BOOL(var)=%x, expected VARIANT_TRUE\n", V_BOOL(&var));
1596
1597     hres = IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_ONUNLOAD,
1598             OLECMDEXECOPT_DODEFAULT, NULL, NULL);
1599     ok(hres == S_OK, "Exec(..., OLECMDID_ONUNLOAD, ...) failed: %08lx\n", hres);
1600
1601     IOleCommandTarget_Release(cmdtrg);
1602 }
1603
1604 static HWND create_container_window(void)
1605 {
1606     static const WCHAR wszHTMLDocumentTest[] =
1607         {'H','T','M','L','D','o','c','u','m','e','n','t','T','e','s','t',0};
1608     static WNDCLASSEXW wndclass = {
1609         sizeof(WNDCLASSEXW),
1610         0,
1611         wnd_proc,
1612         0, 0, NULL, NULL, NULL, NULL, NULL,
1613         wszHTMLDocumentTest,
1614         NULL
1615     };
1616
1617     RegisterClassExW(&wndclass);
1618     return CreateWindowW(wszHTMLDocumentTest, wszHTMLDocumentTest,
1619             WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
1620             CW_USEDEFAULT, NULL, NULL, NULL, NULL);
1621 }
1622
1623 static HRESULT test_DoVerb(IOleObject *oleobj)
1624 {
1625     RECT rect = {0,0,500,500};
1626     HRESULT hres;
1627
1628     if(!container_locked) {
1629         SET_EXPECT(GetContainer);
1630         SET_EXPECT(LockContainer);
1631     }
1632     SET_EXPECT(ActivateMe);
1633     expect_LockContainer_fLock = TRUE;
1634
1635     hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite, -1, container_hwnd, &rect);
1636     if(FAILED(hres))
1637         return hres;
1638     ok(hres == S_OK, "DoVerb failed: %08lx\n", hres);
1639
1640     if(!container_locked) {
1641         CHECK_CALLED(GetContainer);
1642         CHECK_CALLED(LockContainer);
1643         container_locked = TRUE;
1644     }
1645     CHECK_CALLED(ActivateMe);
1646
1647     return hres;
1648 }
1649
1650 #define CLIENTSITE_EXPECTPATH 0x00000001
1651 #define CLIENTSITE_SETNULL    0x00000002
1652 #define CLIENTSITE_DONTSET    0x00000004
1653
1654 static void test_ClientSite(IOleObject *oleobj, DWORD flags)
1655 {
1656     IOleClientSite *clientsite;
1657     HRESULT hres;
1658
1659     if(flags & CLIENTSITE_SETNULL) {
1660         hres = IOleObject_GetClientSite(oleobj, &clientsite);
1661         ok(clientsite == &ClientSite, "clientsite=%p, expected %p\n", clientsite, &ClientSite);
1662
1663         hres = IOleObject_SetClientSite(oleobj, NULL);
1664         ok(hres == S_OK, "SetClientSite failed: %08lx\n", hres);
1665
1666         set_clientsite = FALSE;
1667     }
1668
1669     if(flags & CLIENTSITE_DONTSET)
1670         return;
1671
1672     hres = IOleObject_GetClientSite(oleobj, &clientsite);
1673     ok(hres == S_OK, "GetClientSite failed: %08lx\n", hres);
1674     ok(clientsite == (set_clientsite ? &ClientSite : NULL), "GetClientSite() = %p, expected %p\n",
1675             clientsite, set_clientsite ? &ClientSite : NULL);
1676
1677     if(!set_clientsite) {
1678         SET_EXPECT(GetHostInfo);
1679         if(flags & CLIENTSITE_EXPECTPATH) {
1680             SET_EXPECT(GetOptionKeyPath);
1681             SET_EXPECT(GetOverrideKeyPath);
1682         }
1683         SET_EXPECT(GetWindow);
1684         SET_EXPECT(QueryStatus_SETPROGRESSTEXT);
1685         SET_EXPECT(Exec_SETPROGRESSMAX);
1686         SET_EXPECT(Exec_SETPROGRESSPOS);
1687         SET_EXPECT(Invoke_AMBIENT_USERMODE);
1688         SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
1689         SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1690         SET_EXPECT(Invoke_AMBIENT_SILENT);
1691         SET_EXPECT(Invoke_AMBIENT_USERAGENT);
1692         SET_EXPECT(Invoke_AMBIENT_PALETTE);
1693
1694         hres = IOleObject_SetClientSite(oleobj, &ClientSite);
1695         ok(hres == S_OK, "SetClientSite failed: %08lx\n", hres);
1696
1697         CHECK_CALLED(GetHostInfo);
1698         if(flags & CLIENTSITE_EXPECTPATH) {
1699             CHECK_CALLED(GetOptionKeyPath);
1700             CHECK_CALLED(GetOverrideKeyPath);
1701         }
1702         CHECK_CALLED(GetWindow);
1703         CHECK_CALLED(QueryStatus_SETPROGRESSTEXT);
1704         CHECK_CALLED(Exec_SETPROGRESSMAX);
1705         CHECK_CALLED(Exec_SETPROGRESSPOS);
1706         CHECK_CALLED(Invoke_AMBIENT_USERMODE);
1707         CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
1708         CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); 
1709         CHECK_CALLED(Invoke_AMBIENT_SILENT);
1710         CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
1711         CHECK_CALLED(Invoke_AMBIENT_PALETTE);
1712
1713         set_clientsite = TRUE;
1714     }
1715
1716     hres = IOleObject_SetClientSite(oleobj, &ClientSite);
1717     ok(hres == S_OK, "SetClientSite failed: %08lx\n", hres);
1718
1719     hres = IOleObject_GetClientSite(oleobj, &clientsite);
1720     ok(hres == S_OK, "GetClientSite failed: %08lx\n", hres);
1721     ok(clientsite == &ClientSite, "GetClientSite() = %p, expected %p\n", clientsite, &ClientSite);
1722 }
1723
1724 static void test_OnAmbientPropertyChange(IUnknown *unk)
1725 {
1726     IOleControl *control = NULL;
1727     HRESULT hres;
1728
1729     hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
1730     ok(hres == S_OK, "QueryInterface(IID_IOleControl failed: %08lx\n", hres);
1731     if(FAILED(hres))
1732         return;
1733
1734     SET_EXPECT(Invoke_AMBIENT_USERMODE);
1735     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_USERMODE);
1736     ok(hres == S_OK, "OnAmbientChange failed: %08lx\n", hres);
1737     CHECK_CALLED(Invoke_AMBIENT_USERMODE);
1738
1739     SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
1740     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_DLCONTROL);
1741     ok(hres == S_OK, "OnAmbientChange failed: %08lx\n", hres);
1742     CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
1743
1744     SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
1745     SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1746     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED);
1747     ok(hres == S_OK, "OnAmbientChange failed: %08lx\n", hres);
1748     CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
1749     CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1750
1751     SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
1752     SET_EXPECT(Invoke_AMBIENT_SILENT);
1753     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_SILENT);
1754     ok(hres == S_OK, "OnAmbientChange failed: %08lx\n", hres);
1755     CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
1756     CHECK_CALLED(Invoke_AMBIENT_SILENT);
1757
1758     SET_EXPECT(Invoke_AMBIENT_USERAGENT);
1759     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_USERAGENT);
1760     ok(hres == S_OK, "OnAmbientChange failed: %08lx\n", hres);
1761     CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
1762
1763     SET_EXPECT(Invoke_AMBIENT_PALETTE);
1764     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_PALETTE);
1765     ok(hres == S_OK, "OnAmbientChange failed: %08lx\n", hres);
1766     CHECK_CALLED(Invoke_AMBIENT_PALETTE);
1767
1768     IOleControl_Release(control);
1769 }
1770
1771
1772
1773 static void test_OnAmbientPropertyChange2(IUnknown *unk)
1774 {
1775     IOleControl *control = NULL;
1776     HRESULT hres;
1777
1778     hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
1779     ok(hres == S_OK, "QueryInterface(IID_IOleControl failed: %08lx\n", hres);
1780     if(FAILED(hres))
1781         return;
1782
1783     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_PALETTE);
1784     ok(hres == S_OK, "OnAmbientPropertyChange failed: %08lx\n", hres);
1785
1786     IOleControl_Release(control);
1787 }
1788
1789 static void test_Close(IUnknown *unk, BOOL set_client)
1790 {
1791     IOleObject *oleobj = NULL;
1792     HRESULT hres;
1793
1794     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
1795     ok(hres == S_OK, "QueryInterface(IID_IOleObject) failed: %08lx\n", hres);
1796     if(FAILED(hres))
1797         return;
1798
1799     SET_EXPECT(GetContainer);
1800     SET_EXPECT(LockContainer);
1801     expect_LockContainer_fLock = FALSE;
1802     hres = IOleObject_Close(oleobj, OLECLOSE_NOSAVE);
1803     ok(hres == S_OK, "Close failed: %08lx\n", hres);
1804     CHECK_CALLED(GetContainer);
1805     CHECK_CALLED(LockContainer);
1806     container_locked = FALSE;
1807
1808     if(set_client)
1809         test_ClientSite(oleobj, CLIENTSITE_SETNULL|CLIENTSITE_DONTSET);
1810
1811     IOleObject_Release(oleobj);
1812 }
1813
1814 static void test_OnFrameWindowActivate(IUnknown *unk)
1815 {
1816     IOleInPlaceActiveObject *inplaceact;
1817     HRESULT hres;
1818
1819     hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceActiveObject, (void**)&inplaceact);
1820     ok(hres == S_OK, "QueryInterface(IID_IOleInPlaceActiveObject) failed: %08lx\n", hres);
1821     if(FAILED(hres))
1822         return;
1823
1824     if(set_clientsite) {
1825         expect_OnFrameWindowActivate_fActivate = TRUE;
1826         SET_EXPECT(OnFrameWindowActivate);
1827         hres = IOleInPlaceActiveObject_OnFrameWindowActivate(inplaceact, TRUE);
1828         ok(hres == S_OK, "OnFrameWindowActivate failed: %08lx\n", hres);
1829         CHECK_CALLED(OnFrameWindowActivate);
1830
1831         SET_EXPECT(OnFrameWindowActivate);
1832         hres = IOleInPlaceActiveObject_OnFrameWindowActivate(inplaceact, TRUE);
1833         ok(hres == S_OK, "OnFrameWindowActivate failed: %08lx\n", hres);
1834         CHECK_CALLED(OnFrameWindowActivate);
1835
1836         expect_OnFrameWindowActivate_fActivate = FALSE;
1837         SET_EXPECT(OnFrameWindowActivate);
1838         hres = IOleInPlaceActiveObject_OnFrameWindowActivate(inplaceact, FALSE);
1839         ok(hres == S_OK, "OnFrameWindowActivate failed: %08lx\n", hres);
1840         CHECK_CALLED(OnFrameWindowActivate);
1841
1842         expect_OnFrameWindowActivate_fActivate = TRUE;
1843         SET_EXPECT(OnFrameWindowActivate);
1844         hres = IOleInPlaceActiveObject_OnFrameWindowActivate(inplaceact, TRUE);
1845         ok(hres == S_OK, "OnFrameWindowActivate failed: %08lx\n", hres);
1846         CHECK_CALLED(OnFrameWindowActivate);
1847     }else {
1848         hres = IOleInPlaceActiveObject_OnFrameWindowActivate(inplaceact, FALSE);
1849         ok(hres == S_OK, "OnFrameWindowActivate failed: %08lx\n", hres);
1850
1851         hres = IOleInPlaceActiveObject_OnFrameWindowActivate(inplaceact, TRUE);
1852         ok(hres == S_OK, "OnFrameWindowActivate failed: %08lx\n", hres);
1853     }
1854
1855     IOleInPlaceActiveObject_Release(inplaceact);
1856 }
1857
1858 static void test_InPlaceDeactivate(IUnknown *unk, BOOL expect_call)
1859 {
1860     IOleInPlaceObjectWindowless *windowlessobj = NULL;
1861     HRESULT hres;
1862
1863     hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceObjectWindowless,
1864             (void**)&windowlessobj);
1865     ok(hres == S_OK, "QueryInterface(IID_IOleInPlaceObjectWindowless) failed: %08lx\n", hres);
1866     if(FAILED(hres))
1867         return;
1868
1869     if(expect_call) SET_EXPECT(OnInPlaceDeactivate);
1870     hres = IOleInPlaceObjectWindowless_InPlaceDeactivate(windowlessobj);
1871     ok(hres == S_OK, "InPlaceDeactivate failed: %08lx\n", hres);
1872     if(expect_call) CHECK_CALLED(OnInPlaceDeactivate);
1873
1874     IOleInPlaceObjectWindowless_Release(windowlessobj);
1875 }
1876
1877 static HRESULT test_Activate(IUnknown *unk, DWORD flags)
1878 {
1879     IOleObject *oleobj = NULL;
1880     GUID guid;
1881     HRESULT hres;
1882
1883     last_hwnd = hwnd;
1884
1885     if(view)
1886         IOleDocumentView_Release(view);
1887     view = NULL;
1888
1889     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
1890     ok(hres == S_OK, "QueryInterface(IID_IOleObject) failed: %08lx\n", hres);
1891     if(FAILED(hres))
1892         return hres;
1893
1894     hres = IOleObject_GetUserClassID(oleobj, NULL);
1895     ok(hres == E_INVALIDARG, "GetUserClassID returned: %08lx, expected E_INVALIDARG\n", hres);
1896
1897     hres = IOleObject_GetUserClassID(oleobj, &guid);
1898     ok(hres == S_OK, "GetUserClassID failed: %08lx\n", hres);
1899     ok(IsEqualGUID(&guid, &CLSID_HTMLDocument), "guid != CLSID_HTMLDocument\n");
1900
1901     test_OnFrameWindowActivate(unk);
1902
1903     test_ClientSite(oleobj, flags);
1904     test_InPlaceDeactivate(unk, FALSE);
1905
1906     hres = test_DoVerb(oleobj);
1907
1908     IOleObject_Release(oleobj);
1909
1910     test_OnFrameWindowActivate(unk);
1911
1912     return hres;
1913 }
1914
1915 static void test_Window(IUnknown *unk, BOOL expect_success)
1916 {
1917     IOleInPlaceActiveObject *activeobject = NULL;
1918     HWND tmp_hwnd;
1919     HRESULT hres;
1920
1921     hres = IOleDocumentView_QueryInterface(view, &IID_IOleInPlaceActiveObject, (void**)&activeobject);
1922     ok(hres == S_OK, "Could not get IOleInPlaceActiveObject interface: %08lx\n", hres);
1923     if(FAILED(hres))
1924         return;
1925
1926     hres = IOleInPlaceActiveObject_GetWindow(activeobject, &tmp_hwnd);
1927
1928     if(expect_success) {
1929         ok(hres == S_OK, "GetWindow failed: %08lx\n", hres);
1930         ok(tmp_hwnd == hwnd, "tmp_hwnd=%p, expected %p\n", tmp_hwnd, hwnd);
1931     }else {
1932         ok(hres == E_FAIL, "GetWindow returned %08lx, expected E_FAIL\n", hres);
1933         ok(IsWindow(hwnd), "hwnd is destroyed\n");
1934     }
1935
1936     IOleInPlaceActiveObject_Release(activeobject);
1937 }
1938
1939 static void test_CloseView(void)
1940 {
1941     IOleInPlaceSite *inplacesite = (IOleInPlaceSite*)0xff00ff00;
1942     HRESULT hres;
1943
1944     if(!view)
1945         return;
1946
1947     hres = IOleDocumentView_Show(view, FALSE);
1948     ok(hres == S_OK, "Show failed: %08lx\n", hres);
1949
1950     hres = IOleDocumentView_CloseView(view, 0);
1951     ok(hres == S_OK, "CloseView failed: %08lx\n", hres);
1952
1953     hres = IOleDocumentView_SetInPlaceSite(view, NULL);
1954     ok(hres == S_OK, "SetInPlaceSite failed: %08lx\n", hres);
1955
1956     hres = IOleDocumentView_GetInPlaceSite(view, &inplacesite);
1957     ok(hres == S_OK, "SetInPlaceSite failed: %08lx\n", hres);
1958     ok(inplacesite == NULL, "inplacesite=%p, expected NULL\n", inplacesite);
1959 }
1960
1961 static void test_UIDeactivate(void)
1962 {
1963     HRESULT hres;
1964
1965     if(call_UIActivate) {
1966         SET_EXPECT(SetActiveObject);
1967         SET_EXPECT(HideUI);
1968         SET_EXPECT(OnUIDeactivate);
1969     }
1970
1971     expect_SetActiveObject_active = FALSE;
1972     hres = IOleDocumentView_UIActivate(view, FALSE);
1973     ok(hres == S_OK, "UIActivate failed: %08lx\n", hres);
1974
1975     if(call_UIActivate) {
1976         CHECK_CALLED(SetActiveObject);
1977         CHECK_CALLED(HideUI);
1978         CHECK_CALLED(OnUIDeactivate);
1979     }
1980 }
1981
1982 static void test_Hide(void)
1983 {
1984     HRESULT hres;
1985
1986     if(!view)
1987         return;
1988
1989     hres = IOleDocumentView_Show(view, FALSE);
1990     ok(hres == S_OK, "Show failed: %08lx\n", hres);
1991 }
1992
1993 static HRESULT create_document(IUnknown **unk)
1994 {
1995     HRESULT hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1996             &IID_IUnknown, (void**)unk);
1997     ok(hres == S_OK, "CoCreateInstance failed: %08lx\n", hres);
1998     return hres;
1999 }
2000
2001 static void test_Navigate(IUnknown *unk)
2002 {
2003     IHlinkTarget *hlink;
2004     HRESULT hres;
2005
2006     hres = IUnknown_QueryInterface(unk, &IID_IHlinkTarget, (void**)&hlink);
2007     ok(hres == S_OK, "QueryInterface(IID_IHlinkTarget) failed: %08lx\n", hres);
2008
2009     SET_EXPECT(ActivateMe);
2010     hres = IHlinkTarget_Navigate(hlink, 0, NULL);
2011     ok(hres == S_OK, "Navigate failed: %08lx\n", hres);
2012     CHECK_CALLED(ActivateMe);
2013
2014     IHlinkTarget_Release(hlink);
2015 }
2016
2017 static void test_HTMLDocument(void)
2018 {
2019     IUnknown *unk;
2020     HRESULT hres;
2021     ULONG ref;
2022
2023     hwnd = last_hwnd = NULL;
2024
2025     hres = create_document(&unk);
2026     if(FAILED(hres))
2027         return;
2028
2029     test_ConnectionPointContainer(unk);
2030     test_Persist(unk);
2031     if(load_state == LD_NO)
2032         test_OnAmbientPropertyChange2(unk);
2033
2034     hres = test_Activate(unk, CLIENTSITE_EXPECTPATH);
2035     if(FAILED(hres)) {
2036         IUnknown_Release(unk);
2037         return;
2038     }
2039
2040 #ifdef DOWNLOAD_TEST
2041     if(load_state == LD_DOLOAD)
2042         test_download();
2043 #endif
2044
2045     test_OleCommandTarget_fail(unk);
2046     test_OleCommandTarget(unk);
2047     test_OnAmbientPropertyChange(unk);
2048     test_Window(unk, TRUE);
2049     test_UIDeactivate();
2050     test_OleCommandTarget(unk);
2051     test_Window(unk, TRUE);
2052     test_InPlaceDeactivate(unk, TRUE);
2053
2054     /* Calling test_OleCommandTarget here couses Segmentation Fault with native
2055      * MSHTML. It doesn't with Wine. */
2056
2057     test_Window(unk, FALSE);
2058     test_Hide();
2059     test_InPlaceDeactivate(unk, FALSE);
2060     test_CloseView();
2061     test_Close(unk, FALSE);
2062
2063     /* Activate HTMLDocument again */
2064     test_Activate(unk, CLIENTSITE_SETNULL);
2065     test_Window(unk, TRUE);
2066     test_OleCommandTarget(unk);
2067     test_UIDeactivate();
2068     test_InPlaceDeactivate(unk, TRUE);
2069     test_Close(unk, FALSE);
2070
2071     /* Activate HTMLDocument again, this time without UIActivate */
2072     call_UIActivate = FALSE;
2073     test_Activate(unk, CLIENTSITE_SETNULL);
2074     test_Window(unk, TRUE);
2075     test_UIDeactivate();
2076     test_InPlaceDeactivate(unk, TRUE);
2077     test_CloseView();
2078     test_CloseView();
2079     test_Close(unk, TRUE);
2080     test_OnAmbientPropertyChange2(unk);
2081
2082     if(view)
2083         IOleDocumentView_Release(view);
2084     view = NULL;
2085
2086     ok(IsWindow(hwnd), "hwnd is destroyed\n");
2087
2088     ref = IUnknown_Release(unk);
2089     ok(ref == 0, "ref=%ld, expected 0\n", ref);
2090
2091     ok(!IsWindow(hwnd), "hwnd is not destroyed\n");
2092
2093 }
2094
2095 static void test_HTMLDocument_hlink(void)
2096 {
2097     IUnknown *unk;
2098     HRESULT hres;
2099     ULONG ref;
2100
2101     hwnd = last_hwnd = NULL;
2102
2103     hres = create_document(&unk);
2104     if(FAILED(hres))
2105         return;
2106
2107     test_Persist(unk);
2108     test_Navigate(unk);
2109
2110 #ifdef DOWNLOAD_TEST
2111     test_download();
2112 #endif
2113
2114     test_exec_onunload(unk);
2115     test_Window(unk, TRUE);
2116     test_InPlaceDeactivate(unk, TRUE);
2117     test_Close(unk, FALSE);
2118
2119     if(view)
2120         IOleDocumentView_Release(view);
2121     view = NULL;
2122
2123     ref = IUnknown_Release(unk);
2124     ok(ref == 0, "ref=%ld, expected 0\n", ref);
2125 }
2126
2127 static void gecko_installer_workaround(BOOL disable)
2128 {
2129     HKEY hkey;
2130     DWORD res;
2131
2132     static BOOL has_url = FALSE;
2133     static char url[2048];
2134
2135     if(!disable && !has_url)
2136         return;
2137
2138     res = RegOpenKey(HKEY_CURRENT_USER, "Software\\Wine\\MSHTML", &hkey);
2139     if(res != ERROR_SUCCESS)
2140         return;
2141
2142     if(disable) {
2143         DWORD type, size = sizeof(url);
2144
2145         res = RegQueryValueEx(hkey, "GeckoUrl", NULL, &type, (PVOID)url, &size);
2146         if(res == ERROR_SUCCESS && type == REG_SZ)
2147             has_url = TRUE;
2148
2149         RegDeleteValue(hkey, "GeckoUrl");
2150     }else {
2151         RegSetValueEx(hkey, "GeckoUrl", 0, REG_SZ, (PVOID)url, lstrlenA(url)+1);
2152     }
2153
2154     RegCloseKey(hkey);
2155 }
2156
2157 START_TEST(htmldoc)
2158 {
2159     gecko_installer_workaround(TRUE);
2160
2161     CoInitialize(NULL);
2162     container_hwnd = create_container_window();
2163
2164     load_state = LD_NO;
2165     test_HTMLDocument();
2166     load_state = LD_DOLOAD;
2167     test_HTMLDocument();
2168     load_state = LD_DOLOAD;
2169     test_HTMLDocument_hlink();
2170
2171     DestroyWindow(container_hwnd);
2172     CoUninitialize();
2173
2174     gecko_installer_workaround(FALSE);
2175 }