mshtml: Correct test for another unknown dispID.
[wine] / dlls / mshtml / tests / htmldoc.c
1 /*
2  * Copyright 2005-2009 Jacek Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #define COBJMACROS
20 #define CONST_VTABLE
21
22 #include <wine/test.h>
23 #include <stdarg.h>
24 #include <stdio.h>
25
26 #include "windef.h"
27 #include "winbase.h"
28 #include "initguid.h"
29 #include "ole2.h"
30 #include "mshtml.h"
31 #include "docobj.h"
32 #include "wininet.h"
33 #include "mshtmhst.h"
34 #include "mshtmdid.h"
35 #include "mshtmcid.h"
36 #include "hlink.h"
37 #include "dispex.h"
38 #include "idispids.h"
39 #include "shlguid.h"
40 #include "perhist.h"
41 #include "shobjidl.h"
42 #include "mshtml_test.h"
43
44 DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
45 DEFINE_GUID(IID_IProxyManager,0x00000008,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
46 DEFINE_OLEGUID(CGID_DocHostCmdPriv, 0x000214D4L, 0, 0);
47
48 #define DEFINE_EXPECT(func) \
49     static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
50
51 #define SET_EXPECT(func) \
52     expect_ ## func = TRUE
53
54 #define SET_CALLED(func) \
55     called_ ## func = TRUE
56
57 #define CHECK_EXPECT2(func) \
58     do { \
59         ok(expect_ ##func, "unexpected call " #func "\n"); \
60         called_ ## func = TRUE; \
61     }while(0)
62
63 #define CHECK_EXPECT(func) \
64     do { \
65         CHECK_EXPECT2(func); \
66         expect_ ## func = FALSE; \
67     }while(0)
68
69 #define CHECK_CALLED(func) \
70     do { \
71         ok(called_ ## func, "expected " #func "\n"); \
72         expect_ ## func = called_ ## func = FALSE; \
73     }while(0)
74
75 static IOleDocumentView *view = NULL;
76 static HWND container_hwnd = NULL, hwnd = NULL, last_hwnd = NULL;
77
78 DEFINE_EXPECT(LockContainer);
79 DEFINE_EXPECT(SetActiveObject);
80 DEFINE_EXPECT(SetActiveObject_null);
81 DEFINE_EXPECT(GetWindow);
82 DEFINE_EXPECT(CanInPlaceActivate);
83 DEFINE_EXPECT(OnInPlaceActivate);
84 DEFINE_EXPECT(OnInPlaceActivateEx);
85 DEFINE_EXPECT(OnUIActivate);
86 DEFINE_EXPECT(GetWindowContext);
87 DEFINE_EXPECT(OnUIDeactivate);
88 DEFINE_EXPECT(OnInPlaceDeactivate);
89 DEFINE_EXPECT(OnInPlaceDeactivateEx);
90 DEFINE_EXPECT(GetContainer);
91 DEFINE_EXPECT(ShowUI);
92 DEFINE_EXPECT(ActivateMe);
93 DEFINE_EXPECT(GetHostInfo);
94 DEFINE_EXPECT(HideUI);
95 DEFINE_EXPECT(GetOptionKeyPath);
96 DEFINE_EXPECT(GetOverrideKeyPath);
97 DEFINE_EXPECT(SetStatusText);
98 DEFINE_EXPECT(QueryStatus_SETPROGRESSTEXT);
99 DEFINE_EXPECT(QueryStatus_OPEN);
100 DEFINE_EXPECT(QueryStatus_NEW);
101 DEFINE_EXPECT(Exec_SETPROGRESSMAX);
102 DEFINE_EXPECT(Exec_SETPROGRESSPOS);
103 DEFINE_EXPECT(Exec_HTTPEQUIV_DONE); 
104 DEFINE_EXPECT(Exec_SETDOWNLOADSTATE_0);
105 DEFINE_EXPECT(Exec_SETDOWNLOADSTATE_1);
106 DEFINE_EXPECT(Exec_ShellDocView_37);
107 DEFINE_EXPECT(Exec_ShellDocView_63);
108 DEFINE_EXPECT(Exec_ShellDocView_67);
109 DEFINE_EXPECT(Exec_ShellDocView_84);
110 DEFINE_EXPECT(Exec_ShellDocView_103);
111 DEFINE_EXPECT(Exec_ShellDocView_105);
112 DEFINE_EXPECT(Exec_ShellDocView_140);
113 DEFINE_EXPECT(Exec_UPDATECOMMANDS);
114 DEFINE_EXPECT(Exec_SETTITLE);
115 DEFINE_EXPECT(Exec_HTTPEQUIV);
116 DEFINE_EXPECT(Exec_MSHTML_PARSECOMPLETE);
117 DEFINE_EXPECT(Exec_Explorer_69);
118 DEFINE_EXPECT(Exec_DOCCANNAVIGATE);
119 DEFINE_EXPECT(Invoke_AMBIENT_USERMODE);
120 DEFINE_EXPECT(Invoke_AMBIENT_DLCONTROL);
121 DEFINE_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
122 DEFINE_EXPECT(Invoke_AMBIENT_SILENT);
123 DEFINE_EXPECT(Invoke_AMBIENT_USERAGENT);
124 DEFINE_EXPECT(Invoke_AMBIENT_PALETTE);
125 DEFINE_EXPECT(GetDropTarget);
126 DEFINE_EXPECT(UpdateUI);
127 DEFINE_EXPECT(Navigate);
128 DEFINE_EXPECT(OnFrameWindowActivate);
129 DEFINE_EXPECT(OnChanged_READYSTATE);
130 DEFINE_EXPECT(OnChanged_1005);
131 DEFINE_EXPECT(OnChanged_1012);
132 DEFINE_EXPECT(GetDisplayName);
133 DEFINE_EXPECT(BindToStorage);
134 DEFINE_EXPECT(IsSystemMoniker);
135 DEFINE_EXPECT(GetBindResult);
136 DEFINE_EXPECT(GetClassID);
137 DEFINE_EXPECT(Abort);
138 DEFINE_EXPECT(Read);
139 DEFINE_EXPECT(CreateInstance);
140 DEFINE_EXPECT(Start);
141 DEFINE_EXPECT(Terminate);
142 DEFINE_EXPECT(Protocol_Read);
143 DEFINE_EXPECT(LockRequest);
144 DEFINE_EXPECT(UnlockRequest);
145 DEFINE_EXPECT(OnFocus_TRUE);
146 DEFINE_EXPECT(OnFocus_FALSE);
147 DEFINE_EXPECT(RequestUIActivate);
148 DEFINE_EXPECT(InPlaceFrame_SetBorderSpace);
149 DEFINE_EXPECT(InPlaceUIWindow_SetActiveObject);
150 DEFINE_EXPECT(GetExternal);
151 DEFINE_EXPECT(EnableModeless_TRUE);
152 DEFINE_EXPECT(EnableModeless_FALSE);
153 DEFINE_EXPECT(Frame_EnableModeless_TRUE);
154 DEFINE_EXPECT(Frame_EnableModeless_FALSE);
155 DEFINE_EXPECT(Frame_GetWindow);
156 DEFINE_EXPECT(TranslateUrl);
157 DEFINE_EXPECT(Advise_Close);
158 DEFINE_EXPECT(OnViewChange);
159 DEFINE_EXPECT(EvaluateNewWindow);
160
161 static IUnknown *doc_unk;
162 static IMoniker *doc_mon;
163 static BOOL expect_LockContainer_fLock;
164 static BOOL expect_InPlaceUIWindow_SetActiveObject_active = TRUE;
165 static BOOL ipsex, ipsw;
166 static BOOL set_clientsite, container_locked, navigated_load;
167 static BOOL readystate_set_loading = FALSE, readystate_set_interactive = FALSE, load_from_stream;
168 static BOOL editmode = FALSE, show_failed;
169 static BOOL inplace_deactivated, open_call;
170 static int stream_read, protocol_read;
171 static enum load_state_t {
172     LD_DOLOAD,
173     LD_LOADING,
174     LD_LOADED,
175     LD_INTERACTIVE,
176     LD_COMPLETE,
177     LD_NO
178 } load_state;
179
180 static LPCOLESTR expect_status_text = NULL;
181
182 static const char html_page[] =
183 "<html>"
184 "<head><link rel=\"stylesheet\" type=\"text/css\" href=\"test.css\"></head>"
185 "<body>test</body>"
186 "</html>";
187
188 static const char css_data[] = "body {color: red}";
189
190 static const WCHAR http_urlW[] =
191     {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g',0};
192
193 static const WCHAR doc_url[] = {'w','i','n','e','t','e','s','t',':','d','o','c',0};
194 static const WCHAR about_blank_url[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
195
196 #define DOCHOST_DOCCANNAVIGATE 0
197
198 static HRESULT QueryInterface(REFIID riid, void **ppv);
199 static void test_MSHTML_QueryStatus(IHTMLDocument2*,DWORD);
200
201 #define test_readyState(u) _test_readyState(__LINE__,u)
202 static void _test_readyState(unsigned,IUnknown*);
203
204 static const WCHAR wszTimesNewRoman[] =
205     {'T','i','m','e','s',' ','N','e','w',' ','R','o','m','a','n',0};
206 static const WCHAR wszArial[] =
207     {'A','r','i','a','l',0};
208
209 static const char *debugstr_guid(REFIID riid)
210 {
211     static char buf[50];
212
213     if(!riid)
214         return "(null)";
215
216     sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
217             riid->Data1, riid->Data2, riid->Data3, riid->Data4[0],
218             riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4],
219             riid->Data4[5], riid->Data4[6], riid->Data4[7]);
220
221     return buf;
222 }
223
224 static int strcmp_wa(LPCWSTR strw, const char *stra)
225 {
226     CHAR buf[512];
227     WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL);
228     return lstrcmpA(stra, buf);
229 }
230
231 static const WCHAR *strstrW( const WCHAR *str, const WCHAR *sub )
232 {
233     while (*str)
234     {
235         const WCHAR *p1 = str, *p2 = sub;
236         while (*p1 && *p2 && *p1 == *p2) { p1++; p2++; }
237         if (!*p2) return str;
238         str++;
239     }
240     return NULL;
241 }
242
243 static BSTR a2bstr(const char *str)
244 {
245     BSTR ret;
246     int len;
247
248     len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
249     ret = SysAllocStringLen(NULL, len);
250     MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
251
252     return ret;
253 }
254
255 static BOOL is_english(void)
256 {
257     return PRIMARYLANGID(GetSystemDefaultLangID()) == LANG_ENGLISH
258         && PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH;
259 }
260
261 #define EXPECT_UPDATEUI  1
262 #define EXPECT_SETTITLE  2
263
264 static void test_timer(DWORD flags)
265 {
266     BOOL *b = &called_Exec_SETTITLE;
267     MSG msg;
268
269     if(flags & EXPECT_UPDATEUI) {
270         SET_EXPECT(UpdateUI);
271         SET_EXPECT(Exec_UPDATECOMMANDS);
272         b = &called_UpdateUI;
273     }
274     if(flags & EXPECT_SETTITLE)
275         SET_EXPECT(Exec_SETTITLE);
276
277     while(!*b && GetMessage(&msg, hwnd, 0, 0)) {
278         TranslateMessage(&msg);
279         DispatchMessage(&msg);
280     }
281
282     if(flags & EXPECT_UPDATEUI) {
283         CHECK_CALLED(UpdateUI);
284         CHECK_CALLED(Exec_UPDATECOMMANDS);
285     }
286     if(flags & EXPECT_SETTITLE)
287         CHECK_CALLED(Exec_SETTITLE);
288 }
289
290 static IMoniker Moniker;
291
292 #define test_GetCurMoniker(u,m,v) _test_GetCurMoniker(__LINE__,u,m,v)
293 static void _test_GetCurMoniker(unsigned line, IUnknown *unk, IMoniker *exmon, LPCWSTR exurl)
294 {
295     IHTMLDocument2 *doc;
296     IPersistMoniker *permon;
297     IMoniker *mon = (void*)0xdeadbeef;
298     BSTR doc_url = (void*)0xdeadbeef;
299     HRESULT hres;
300
301     if(open_call)
302         return; /* FIXME */
303
304     hres = IUnknown_QueryInterface(unk, &IID_IPersistMoniker, (void**)&permon);
305     ok(hres == S_OK, "QueryInterface(IID_IPersistMoniker) failed: %08x\n", hres);
306     if(FAILED(hres))
307         return;
308
309     hres = IUnknown_QueryInterface(unk, &IID_IHTMLDocument2, (void**)&doc);
310     ok(hres == S_OK, "QueryInterface(IID_IHTMLDocument2) failed: %08x\n", hres);
311
312     hres = IHTMLDocument2_get_URL(doc, &doc_url);
313     ok(hres == S_OK, "get_URL failed: %08x\n", hres);
314
315     hres = IPersistMoniker_GetCurMoniker(permon, &mon);
316     IPersistMoniker_Release(permon);
317
318     if(exmon) {
319         LPOLESTR url;
320         BOOL exb = expect_GetDisplayName;
321         BOOL clb = called_GetDisplayName;
322
323         ok_(__FILE__,line)(hres == S_OK, "GetCurrentMoniker failed: %08x\n", hres);
324         ok_(__FILE__,line)(mon == exmon, "mon(%p) != exmon(%p)\n", mon, exmon);
325
326         if(mon == &Moniker)
327             SET_EXPECT(GetDisplayName);
328         hres = IMoniker_GetDisplayName(mon, NULL, NULL, &url);
329         ok(hres == S_OK, "GetDisplayName failed: %08x\n", hres);
330         if(mon == &Moniker)
331             CHECK_CALLED(GetDisplayName);
332         expect_GetDisplayName = exb;
333         called_GetDisplayName = clb;
334
335         ok(!lstrcmpW(url, doc_url), "url != doc_url\n");
336         CoTaskMemFree(url);
337     }else if(exurl) {
338         LPOLESTR url;
339
340         ok_(__FILE__,line)(hres == S_OK, "GetCurrentMoniker failed: %08x\n", hres);
341
342         hres = IMoniker_GetDisplayName(mon, NULL, NULL, &url);
343         ok(hres == S_OK, "GetDisplayName failed: %08x\n", hres);
344
345         ok(!lstrcmpW(url, exurl), "unexpected url %s\n", wine_dbgstr_w(url));
346         ok(!lstrcmpW(url, doc_url), "url != doc_url\n");
347
348         CoTaskMemFree(url);
349     }else {
350         ok(hres == E_UNEXPECTED,
351            "GetCurrentMoniker failed: %08x, expected E_UNEXPECTED\n", hres);
352         ok(mon == (IMoniker*)0xdeadbeef, "mon=%p\n", mon);
353         ok(!lstrcmpW(doc_url, about_blank_url), "doc_url is not about:blank\n");
354     }
355
356     SysFreeString(doc_url);
357     IHTMLDocument_Release(doc);
358     if(mon && mon != (void*)0xdeadbeef)
359         IMoniker_Release(mon);
360 }
361
362 DEFINE_GUID(IID_External_unk,0x30510406,0x98B5,0x11CF,0xBB,0x82,0x00,0xAA,0x00,0xBD,0xCE,0x0B);
363
364 static HRESULT WINAPI External_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
365 {
366     *ppv = NULL;
367
368     if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IDispatch, riid)) {
369         *ppv = iface;
370         return S_OK;
371     }
372
373     if(IsEqualGUID(&IID_IProxyManager, riid))
374         return E_NOINTERFACE; /* TODO */
375     if(IsEqualGUID(&IID_IDispatchEx, riid))
376         return E_NOINTERFACE; /* TODO */
377     if(IsEqualGUID(&IID_External_unk, riid))
378         return E_NOINTERFACE; /* TODO */
379
380     ok(0, "unexpected riid: %s\n", debugstr_guid(riid));
381     return E_NOINTERFACE;
382 }
383
384 static ULONG WINAPI Dispatch_AddRef(IDispatch *iface)
385 {
386     return 2;
387 }
388
389 static ULONG WINAPI Dispatch_Release(IDispatch *iface)
390 {
391     return 1;
392 }
393
394 static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
395 {
396     ok(0, "unexpected call\n");
397     return E_NOTIMPL;
398 }
399
400 static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid,
401         ITypeInfo **ppTInfo)
402 {
403     ok(0, "unexpected call\n");
404     return E_NOTIMPL;
405 }
406
407 static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
408         UINT cNames, LCID lcid, DISPID *rgDispId)
409 {
410     ok(0, "unexpected call\n");
411     return E_NOTIMPL;
412 }
413
414 static HRESULT WINAPI External_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
415         LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
416         EXCEPINFO *pExcepInfo, UINT *puArgErr)
417 {
418     ok(0, "unexpected call\n");
419     return E_NOTIMPL;
420 }
421
422 static const IDispatchVtbl ExternalVtbl = {
423     External_QueryInterface,
424     Dispatch_AddRef,
425     Dispatch_Release,
426     Dispatch_GetTypeInfoCount,
427     Dispatch_GetTypeInfo,
428     Dispatch_GetIDsOfNames,
429     External_Invoke
430 };
431
432 static IDispatch External = { &ExternalVtbl };
433
434 static HRESULT WINAPI Protocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv)
435 {
436     if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IInternetProtocol, riid)) {
437         *ppv = iface;
438         return S_OK;
439     }
440
441     *ppv = NULL;
442     return E_NOINTERFACE;
443 }
444
445 static ULONG WINAPI Protocol_AddRef(IInternetProtocol *iface)
446 {
447     return 2;
448 }
449
450 static ULONG WINAPI Protocol_Release(IInternetProtocol *iface)
451 {
452     return 1;
453 }
454
455 static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl,
456         IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
457         DWORD grfPI, HANDLE_PTR dwReserved)
458 {
459     BINDINFO bindinfo;
460     DWORD bindf = 0;
461     HRESULT hres;
462
463     static const WCHAR wszTextCss[] = {'t','e','x','t','/','c','s','s',0};
464     static const WCHAR empty_str = {0};
465
466     CHECK_EXPECT(Start);
467
468     ok(pOIProtSink != NULL, "pOIProtSink == NULL\n");
469     ok(pOIBindInfo != NULL, "pOIBindInfo == NULL\n");
470     ok(!grfPI, "grfPI = %x\n", grfPI);
471     ok(!dwReserved, "dwReserved = %lx\n", dwReserved);
472
473     memset(&bindinfo, 0, sizeof(bindinfo));
474     bindinfo.cbSize = sizeof(bindinfo);
475     hres = IInternetBindInfo_GetBindInfo(pOIBindInfo, &bindf, &bindinfo);
476     ok(hres == S_OK, "GetBindInfo failed: %08x\n", hres);
477     ok(bindf == (BINDF_FROMURLMON|BINDF_PULLDATA|BINDF_NEEDFILE|BINDF_ASYNCSTORAGE|BINDF_ASYNCHRONOUS),
478        "bindf = %x\n", bindf);
479
480     ok(bindinfo.cbSize == sizeof(bindinfo), "bindinfo.cbSize=%d\n", bindinfo.cbSize);
481     ok(bindinfo.szExtraInfo == NULL, "bindinfo.szExtraInfo=%p\n", bindinfo.szExtraInfo);
482     /* TODO: test stgmedData */
483     ok(bindinfo.grfBindInfoF == 0, "bindinfo.grfBinfInfoF=%08x\n", bindinfo.grfBindInfoF);
484     ok(bindinfo.dwBindVerb == 0, "bindinfo.dwBindVerb=%d\n", bindinfo.dwBindVerb);
485     ok(bindinfo.szCustomVerb == 0, "bindinfo.szCustomVerb=%p\n", bindinfo.szCustomVerb);
486     ok(bindinfo.cbstgmedData == 0, "bindinfo.cbstgmedData=%d\n", bindinfo.cbstgmedData);
487     ok(bindinfo.dwOptions == 0x80000 ||
488        bindinfo.dwOptions == 0x4080000, /* win2k3 */
489        "bindinfo.dwOptions=%x\n", bindinfo.dwOptions);
490     ok(bindinfo.dwOptionsFlags == 0, "bindinfo.dwOptionsFlags=%d\n", bindinfo.dwOptionsFlags);
491     /* TODO: test dwCodePage */
492     /* TODO: test securityAttributes */
493     ok(IsEqualGUID(&IID_NULL, &bindinfo.iid), "unexpected bindinfo.iid\n");
494     ok(bindinfo.pUnk == NULL, "bindinfo.pUnk=%p\n", bindinfo.pUnk);
495     ok(bindinfo.dwReserved == 0, "bindinfo.dwReserved=%d\n", bindinfo.dwReserved);
496
497     hres = IInternetProtocolSink_ReportProgress(pOIProtSink,
498             BINDSTATUS_CACHEFILENAMEAVAILABLE, &empty_str);
499     ok(hres == S_OK, "ReportProgress(BINDSTATUS_CACHEFILENAMEAVAILABLE) failed: %08x\n", hres);
500
501     hres = IInternetProtocolSink_ReportProgress(pOIProtSink,
502             BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE, wszTextCss);
503     ok(hres == S_OK,
504        "ReportProgress(BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE) failed: %08x\n", hres);
505
506     hres = IInternetProtocolSink_ReportData(pOIProtSink,
507             BSCF_FIRSTDATANOTIFICATION | BSCF_LASTDATANOTIFICATION, 13, 13);
508     ok(hres == S_OK, "ReportData failed: %08x\n", hres);
509
510     hres = IInternetProtocolSink_ReportResult(pOIProtSink, S_OK, 0, NULL);
511     ok(hres == S_OK, "ReportResult failed: %08x\n", hres);
512
513     return S_OK;
514 }
515
516 static HRESULT WINAPI Protocol_Continue(IInternetProtocol *iface,
517         PROTOCOLDATA *pProtocolData)
518 {
519     ok(0, "unexpected call\n");
520     return E_NOTIMPL;
521 }
522
523 static HRESULT WINAPI Protocol_Abort(IInternetProtocol *iface, HRESULT hrReason,
524         DWORD dwOptions)
525 {
526     ok(0, "unexpected call\n");
527     return E_NOTIMPL;
528 }
529
530 static HRESULT WINAPI Protocol_Terminate(IInternetProtocol *iface, DWORD dwOptions)
531 {
532     CHECK_EXPECT(Terminate);
533     return S_OK;
534 }
535
536 static HRESULT WINAPI Protocol_Suspend(IInternetProtocol *iface)
537 {
538     ok(0, "unexpected call\n");
539     return E_NOTIMPL;
540 }
541
542 static HRESULT WINAPI Protocol_Resume(IInternetProtocol *iface)
543 {
544     ok(0, "unexpected call\n");
545     return E_NOTIMPL;
546 }
547
548 static HRESULT WINAPI Protocol_Read(IInternetProtocol *iface, void *pv,
549         ULONG cb, ULONG *pcbRead)
550 {
551     CHECK_EXPECT2(Protocol_Read);
552
553     ok(pv != NULL, "pv == NULL\n");
554     ok(cb > sizeof(css_data), "cb < sizeof(css_data)\n");
555     ok(pcbRead != NULL, "pcbRead == NULL\n");
556     ok(!*pcbRead, "*pcbRead=%d\n", *pcbRead);
557
558     if(protocol_read)
559         return S_FALSE;
560
561     protocol_read += *pcbRead = sizeof(css_data)-1;
562     memcpy(pv, css_data, sizeof(css_data)-1);
563     return S_OK;
564 }
565
566 static HRESULT WINAPI Protocol_Seek(IInternetProtocol *iface,
567         LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
568 {
569     ok(0, "unexpected call\n");
570     return E_NOTIMPL;
571 }
572
573 static HRESULT WINAPI Protocol_LockRequest(IInternetProtocol *iface, DWORD dwOptions)
574 {
575     CHECK_EXPECT(LockRequest);
576     return S_OK;
577 }
578
579 static HRESULT WINAPI Protocol_UnlockRequest(IInternetProtocol *iface)
580 {
581     CHECK_EXPECT(UnlockRequest);
582     return S_OK;
583 }
584
585 static const IInternetProtocolVtbl ProtocolVtbl = {
586     Protocol_QueryInterface,
587     Protocol_AddRef,
588     Protocol_Release,
589     Protocol_Start,
590     Protocol_Continue,
591     Protocol_Abort,
592     Protocol_Terminate,
593     Protocol_Suspend,
594     Protocol_Resume,
595     Protocol_Read,
596     Protocol_Seek,
597     Protocol_LockRequest,
598     Protocol_UnlockRequest
599 };
600
601 static IInternetProtocol Protocol = { &ProtocolVtbl };
602
603 static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
604 {
605     if(!IsEqualGUID(&IID_IInternetProtocolInfo, riid))
606         ok(0, "unexpected call\n");
607     return E_NOINTERFACE;
608 }
609
610 static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface)
611 {
612     return 2;
613 }
614
615 static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
616 {
617     return 1;
618 }
619
620 static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *pOuter,
621                                         REFIID riid, void **ppv)
622 {
623     if(IsEqualGUID(&IID_IInternetProtocolInfo, riid))
624         return E_NOINTERFACE;
625
626     CHECK_EXPECT(CreateInstance);
627     ok(ppv != NULL, "ppv == NULL\n");
628
629     *ppv = &Protocol;
630     return S_OK;
631 }
632
633 static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL dolock)
634 {
635     ok(0, "unexpected call\n");
636     return S_OK;
637 }
638
639 static const IClassFactoryVtbl ClassFactoryVtbl = {
640     ClassFactory_QueryInterface,
641     ClassFactory_AddRef,
642     ClassFactory_Release,
643     ClassFactory_CreateInstance,
644     ClassFactory_LockServer
645 };
646
647 static IClassFactory ClassFactory = { &ClassFactoryVtbl };
648
649 static HRESULT WINAPI HlinkFrame_QueryInterface(IHlinkFrame *iface, REFIID riid, void **ppv)
650 {
651     ok(0, "unexpected call\n");
652     return E_NOTIMPL;
653 }
654
655 static ULONG WINAPI HlinkFrame_AddRef(IHlinkFrame *iface)
656 {
657     return 2;
658 }
659
660 static ULONG WINAPI HlinkFrame_Release(IHlinkFrame *iface)
661 {
662     return 1;
663 }
664
665 static HRESULT WINAPI HlinkFrame_SetBrowseContext(IHlinkFrame *iface,
666                                                   IHlinkBrowseContext *pihlbc)
667 {
668     ok(0, "unexpected call\n");
669     return E_NOTIMPL;
670 }
671
672 static HRESULT WINAPI HlinkFrame_GetBrowseContext(IHlinkFrame *iface,
673                                                   IHlinkBrowseContext **ppihlbc)
674 {
675     ok(0, "unexpected call\n");
676     return E_NOTIMPL;
677 }
678
679 static HRESULT WINAPI HlinkFrame_Navigate(IHlinkFrame *iface, DWORD grfHLNF, LPBC pbc,
680                                           IBindStatusCallback *pibsc, IHlink *pihlNavigate)
681 {
682     HRESULT hres;
683
684     CHECK_EXPECT(Navigate);
685
686     ok(grfHLNF == 0, "grfHLNF=%d, expected 0\n", grfHLNF);
687     ok(pbc != NULL, "pbc == NULL\n");
688     ok(pibsc != NULL, "pubsc == NULL\n");
689     ok(pihlNavigate != NULL, "puhlNavigate == NULL\n");
690
691     if(pihlNavigate) {
692         LPWSTR frame_name = (LPWSTR)0xdeadbeef;
693         LPWSTR location = (LPWSTR)0xdeadbeef;
694         IHlinkSite *site;
695         IMoniker *mon = NULL;
696         DWORD site_data = 0xdeadbeef;
697
698         hres = IHlink_GetTargetFrameName(pihlNavigate, &frame_name);
699         todo_wine
700         ok(hres == S_FALSE, "GetTargetFrameName failed: %08x\n", hres);
701         ok(frame_name == NULL, "frame_name = %p\n", frame_name);
702
703         hres = IHlink_GetMonikerReference(pihlNavigate, 1, &mon, &location);
704         ok(hres == S_OK, "GetMonikerReference failed: %08x\n", hres);
705         ok(location == NULL, "location = %p\n", location);
706         ok(mon != NULL, "mon == NULL\n");
707
708         hres = IHlink_GetHlinkSite(pihlNavigate, &site, &site_data);
709         ok(hres == S_OK, "GetHlinkSite failed: %08x\n", hres);
710         ok(site == NULL, "site = %p\n, expected NULL\n", site);
711         todo_wine
712         ok(site_data == 0xdeadbeef, "site_data = %x\n", site_data);
713     }
714
715     return S_OK;
716 }
717
718 static HRESULT WINAPI HlinkFrame_OnNavigate(IHlinkFrame *iface, DWORD grfHLNF,
719         IMoniker *pimkTarget, LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName, DWORD dwreserved)
720 {
721     ok(0, "unexpected call\n");
722     return E_NOTIMPL;
723 }
724
725 static HRESULT WINAPI HlinkFrame_UpdateHlink(IHlinkFrame *iface, ULONG uHLID,
726         IMoniker *pimkTarget, LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName)
727 {
728     ok(0, "unexpected call\n");
729     return E_NOTIMPL;
730 }
731
732 static const IHlinkFrameVtbl HlinkFrameVtbl = {
733     HlinkFrame_QueryInterface,
734     HlinkFrame_AddRef,
735     HlinkFrame_Release,
736     HlinkFrame_SetBrowseContext,
737     HlinkFrame_GetBrowseContext,
738     HlinkFrame_Navigate,
739     HlinkFrame_OnNavigate,
740     HlinkFrame_UpdateHlink
741 };
742
743 static IHlinkFrame HlinkFrame = { &HlinkFrameVtbl };
744
745 static HRESULT WINAPI NewWindowManager_QueryInterface(INewWindowManager *iface, REFIID riid, void **ppv)
746 {
747     ok(0, "unexpected call\n");
748     return E_NOINTERFACE;
749 }
750
751 static ULONG WINAPI NewWindowManager_AddRef(INewWindowManager *iface)
752 {
753     return 2;
754 }
755
756 static ULONG WINAPI NewWindowManager_Release(INewWindowManager *iface)
757 {
758     return 1;
759 }
760
761 static HRESULT WINAPI NewWindowManager_EvaluateNewWindow(INewWindowManager *iface, LPCWSTR pszUrl,
762         LPCWSTR pszName, LPCWSTR pszUrlContext, LPCWSTR pszFeatures, BOOL fReplace, DWORD dwFlags,
763         DWORD dwUserActionTime)
764 {
765     CHECK_EXPECT(EvaluateNewWindow);
766
767     ok(!strcmp_wa(pszUrl, "about:blank"), "pszUrl = %s\n", wine_dbgstr_w(pszUrl));
768     ok(!strcmp_wa(pszName, "test"), "pszName = %s\n", wine_dbgstr_w(pszName));
769     ok(!strcmp_wa(pszUrlContext, "about:blank"), "pszUrlContext = %s\n", wine_dbgstr_w(pszUrlContext));
770     ok(!pszFeatures, "pszFeatures = %s\n", wine_dbgstr_w(pszFeatures));
771     ok(!fReplace, "fReplace = %x\n", fReplace);
772     ok(dwFlags == NWMF_FIRST, "dwFlags = %x\n", dwFlags);
773     ok(!dwUserActionTime, "dwUserActionime = %d\n", dwUserActionTime);
774
775     return E_FAIL;
776 }
777
778 static const INewWindowManagerVtbl NewWindowManagerVtbl = {
779     NewWindowManager_QueryInterface,
780     NewWindowManager_AddRef,
781     NewWindowManager_Release,
782     NewWindowManager_EvaluateNewWindow
783 };
784
785 static INewWindowManager NewWindowManager = { &NewWindowManagerVtbl };
786
787 static HRESULT WINAPI PropertyNotifySink_QueryInterface(IPropertyNotifySink *iface,
788         REFIID riid, void**ppv)
789 {
790     if(IsEqualGUID(&IID_IPropertyNotifySink, riid)) {
791         *ppv = iface;
792         return S_OK;
793     }
794
795     ok(0, "unexpected call\n");
796     return E_NOINTERFACE;
797 }
798
799 static ULONG WINAPI PropertyNotifySink_AddRef(IPropertyNotifySink *iface)
800 {
801     return 2;
802 }
803
804 static ULONG WINAPI PropertyNotifySink_Release(IPropertyNotifySink *iface)
805 {
806     return 1;
807 }
808
809 static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, DISPID dispID)
810 {
811     switch(dispID) {
812     case DISPID_READYSTATE:
813         CHECK_EXPECT2(OnChanged_READYSTATE);
814
815         if(!readystate_set_interactive)
816             test_MSHTML_QueryStatus(NULL, OLECMDF_SUPPORTED
817                 | (editmode && (load_state == LD_INTERACTIVE || load_state == LD_COMPLETE)
818                    ? OLECMDF_ENABLED : 0));
819
820         if(readystate_set_loading) {
821             readystate_set_loading = FALSE;
822             load_state = LD_LOADING;
823         }
824         if(!editmode || load_state != LD_LOADING || !called_Exec_Explorer_69)
825             test_readyState(NULL);
826         return S_OK;
827     case 1005:
828         CHECK_EXPECT(OnChanged_1005);
829         if(!editmode)
830             test_readyState(NULL);
831         readystate_set_interactive = (load_state != LD_INTERACTIVE);
832         return S_OK;
833     case 1012:
834         CHECK_EXPECT(OnChanged_1012);
835         return S_OK;
836     case 1030:
837     case 3000028:
838     case 3000029:
839     case 3000030:
840     case 3000031:
841         /* TODO */
842         return S_OK;
843     }
844
845     ok(0, "unexpected id %d\n", dispID);
846     return E_NOTIMPL;
847 }
848
849 static HRESULT WINAPI PropertyNotifySink_OnRequestEdit(IPropertyNotifySink *iface, DISPID dispID)
850 {
851     ok(0, "unexpected call\n");
852     return E_NOTIMPL;
853 }
854
855 static IPropertyNotifySinkVtbl PropertyNotifySinkVtbl = {
856     PropertyNotifySink_QueryInterface,
857     PropertyNotifySink_AddRef,
858     PropertyNotifySink_Release,
859     PropertyNotifySink_OnChanged,
860     PropertyNotifySink_OnRequestEdit
861 };
862
863 static IPropertyNotifySink PropertyNotifySink = { &PropertyNotifySinkVtbl };
864
865 static HRESULT WINAPI Stream_QueryInterface(IStream *iface, REFIID riid, void **ppv)
866 {
867     ok(0, "unexpected call\n");
868     return E_NOINTERFACE;
869 }
870
871 static ULONG WINAPI Stream_AddRef(IStream *iface)
872 {
873     return 2;
874 }
875
876 static ULONG WINAPI Stream_Release(IStream *iface)
877 {
878     return 1;
879 }
880
881 static HRESULT WINAPI Stream_Read(IStream *iface, void *pv,
882                                   ULONG cb, ULONG *pcbRead)
883 {
884     CHECK_EXPECT2(Read);
885     ok(pv != NULL, "pv == NULL\n");
886     ok(cb > sizeof(html_page), "cb = %d\n", cb);
887     ok(pcbRead != NULL, "pcbRead == NULL\n");
888     ok(!*pcbRead, "*pcbRead = %d\n", *pcbRead);
889
890     if(stream_read)
891         return S_FALSE;
892
893     memcpy(pv, html_page, sizeof(html_page)-1);
894     stream_read += *pcbRead = sizeof(html_page)-1;
895     return S_OK;
896 }
897
898 static HRESULT WINAPI Stream_Write(IStream *iface, const void *pv,
899                                           ULONG cb, ULONG *pcbWritten)
900 {
901     ok(0, "unexpected call\n");
902     return E_NOTIMPL;
903 }
904
905 static HRESULT WINAPI Stream_Seek(IStream *iface, LARGE_INTEGER dlibMove,
906                                          DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
907 {
908     ok(0, "unexpected call\n");
909     return E_NOTIMPL;
910 }
911
912 static HRESULT WINAPI Stream_SetSize(IStream *iface, ULARGE_INTEGER libNewSize)
913 {
914     ok(0, "unexpected call\n");
915     return E_NOTIMPL;
916 }
917
918 static HRESULT WINAPI Stream_CopyTo(IStream *iface, IStream *pstm,
919         ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten)
920 {
921     ok(0, "unexpected call\n");
922     return E_NOTIMPL;
923 }
924
925 static HRESULT WINAPI Stream_Commit(IStream *iface, DWORD grfCommitFlags)
926 {
927     ok(0, "unexpected call\n");
928     return E_NOTIMPL;
929 }
930
931 static HRESULT WINAPI Stream_Revert(IStream *iface)
932 {
933     ok(0, "unexpected call\n");
934     return E_NOTIMPL;
935 }
936
937 static HRESULT WINAPI Stream_LockRegion(IStream *iface, ULARGE_INTEGER libOffset,
938                                                ULARGE_INTEGER cb, DWORD dwLockType)
939 {
940     ok(0, "unexpected call\n");
941     return E_NOTIMPL;
942 }
943
944 static HRESULT WINAPI Stream_UnlockRegion(IStream *iface,
945         ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
946 {
947     ok(0, "unexpected call\n");
948     return E_NOTIMPL;
949 }
950
951 static HRESULT WINAPI Stream_Stat(IStream *iface, STATSTG *pstatstg,
952                                          DWORD dwStatFlag)
953 {
954     ok(0, "unexpected call\n");
955     return E_NOTIMPL;
956 }
957
958 static HRESULT WINAPI Stream_Clone(IStream *iface, IStream **ppstm)
959 {
960     ok(0, "unexpected call\n");
961     return E_NOTIMPL;
962 }
963
964 static const IStreamVtbl StreamVtbl = {
965     Stream_QueryInterface,
966     Stream_AddRef,
967     Stream_Release,
968     Stream_Read,
969     Stream_Write,
970     Stream_Seek,
971     Stream_SetSize,
972     Stream_CopyTo,
973     Stream_Commit,
974     Stream_Revert,
975     Stream_LockRegion,
976     Stream_UnlockRegion,
977     Stream_Stat,
978     Stream_Clone
979 };
980
981 static IStream Stream = { &StreamVtbl };
982
983 static HRESULT WINAPI Binding_QueryInterface(IBinding *iface, REFIID riid, void **ppv)
984 {
985     if(IsEqualGUID(&IID_IWinInetHttpInfo, riid))
986         return E_NOINTERFACE; /* TODO */
987
988     if(IsEqualGUID(&IID_IWinInetInfo, riid))
989         return E_NOINTERFACE; /* TODO */
990
991     ok(0, "unexpected call\n");
992     return E_NOINTERFACE;
993 }
994
995 static ULONG WINAPI Binding_AddRef(IBinding *iface)
996 {
997     return 2;
998 }
999
1000 static ULONG WINAPI Binding_Release(IBinding *iface)
1001 {
1002     return 1;
1003 }
1004
1005 static HRESULT WINAPI Binding_Abort(IBinding *iface)
1006 {
1007     CHECK_EXPECT(Abort);
1008     return S_OK;
1009 }
1010
1011 static HRESULT WINAPI Binding_Suspend(IBinding *iface)
1012 {
1013     ok(0, "unexpected call\n");
1014     return E_NOTIMPL;
1015 }
1016
1017 static HRESULT WINAPI Binding_Resume(IBinding *iface)
1018 {
1019     ok(0, "unexpected call\n");
1020     return E_NOTIMPL;
1021 }
1022
1023 static HRESULT WINAPI Binding_SetPriority(IBinding *iface, LONG nPriority)
1024 {
1025     ok(0, "unexpected call\n");
1026     return E_NOTIMPL;
1027 }
1028
1029 static HRESULT WINAPI Binding_GetPriority(IBinding *iface, LONG *pnPriority)
1030 {
1031     ok(0, "unexpected call\n");
1032     return E_NOTIMPL;
1033 }
1034
1035 static HRESULT WINAPI Binding_GetBindResult(IBinding *iface, CLSID *pclsidProtocol,
1036         DWORD *pdwResult, LPOLESTR *pszResult, DWORD *pdwReserved)
1037 {
1038     CHECK_EXPECT(GetBindResult);
1039     return E_NOTIMPL;
1040 }
1041
1042 static const IBindingVtbl BindingVtbl = {
1043     Binding_QueryInterface,
1044     Binding_AddRef,
1045     Binding_Release,
1046     Binding_Abort,
1047     Binding_Suspend,
1048     Binding_Resume,
1049     Binding_SetPriority,
1050     Binding_GetPriority,
1051     Binding_GetBindResult
1052 };
1053
1054 static IBinding Binding = { &BindingVtbl };
1055
1056 DEFINE_GUID(IID_IMoniker_unk,0xA158A630,0xED6F,0x45FB,0xB9,0x87,0xF6,0x86,0x76,0xF5,0x77,0x52);
1057 DEFINE_GUID(IID_IMoniker_unk2, 0x79EAC9D3,0xBAF9,0x11CE,0x8C,0x82,0x00,0xAA,0x00,0x4B,0xA9,0x0B);
1058
1059 static HRESULT WINAPI Moniker_QueryInterface(IMoniker *iface, REFIID riid, void **ppv)
1060 {
1061     *ppv = NULL;
1062
1063     if(IsEqualGUID(&IID_IMoniker_unk, riid))
1064         return E_NOINTERFACE; /* TODO */
1065     if(IsEqualGUID(&IID_IMoniker_unk2, riid))
1066         return E_NOINTERFACE; /* TODO */
1067
1068     ok(0, "unexpected riid: %s\n", debugstr_guid(riid));
1069     return E_NOINTERFACE;
1070 }
1071
1072 static ULONG WINAPI Moniker_AddRef(IMoniker *iface)
1073 {
1074     return 2;
1075 }
1076
1077 static ULONG WINAPI Moniker_Release(IMoniker *iface)
1078 {
1079     return 1;
1080 }
1081
1082 static HRESULT WINAPI Moniker_GetClassID(IMoniker *iface, CLSID *pClassID)
1083 {
1084     CHECK_EXPECT(GetClassID);
1085     ok(IsEqualGUID(pClassID, &IID_NULL), "pClassID = %s\n", debugstr_guid(pClassID));
1086     return E_FAIL;
1087 }
1088
1089 static HRESULT WINAPI Moniker_IsDirty(IMoniker *iface)
1090 {
1091     ok(0, "unexpected call\n");
1092     return E_NOTIMPL;
1093 }
1094
1095 static HRESULT WINAPI Moniker_Load(IMoniker *iface, IStream *pStm)
1096 {
1097     ok(0, "unexpected call\n");
1098     return E_NOTIMPL;
1099 }
1100
1101 static HRESULT WINAPI Moniker_Save(IMoniker *iface, IStream *pStm, BOOL fClearDirty)
1102 {
1103     ok(0, "unexpected call\n");
1104     return E_NOTIMPL;
1105 }
1106
1107 static HRESULT WINAPI Moniker_GetSizeMax(IMoniker *iface, ULARGE_INTEGER *pcbSize)
1108 {
1109     ok(0, "unexpected call\n");
1110     return E_NOTIMPL;
1111 }
1112
1113 static HRESULT WINAPI Moniker_BindToObject(IMoniker *iface, IBindCtx *pcb, IMoniker *pmkToLeft,
1114         REFIID riidResult, void **ppvResult)
1115 {
1116     ok(0, "unexpected call\n");
1117     return E_NOTIMPL;
1118 }
1119
1120 static HRESULT WINAPI Moniker_BindToStorage(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft,
1121         REFIID riid, void **ppv)
1122 {
1123     IBindStatusCallback *callback = NULL;
1124     FORMATETC formatetc = {0xc02d, NULL, 1, -1, TYMED_ISTREAM};
1125     STGMEDIUM stgmedium;
1126     BINDINFO bindinfo;
1127     DWORD bindf;
1128     HRESULT hres;
1129
1130     static OLECHAR BSCBHolder[] = { '_','B','S','C','B','_','H','o','l','d','e','r','_',0 };
1131     static const WCHAR wszTextHtml[] = {'t','e','x','t','/','h','t','m','l',0};
1132
1133     CHECK_EXPECT(BindToStorage);
1134
1135     load_state = LD_LOADING;
1136
1137     ok(pbc != NULL, "pbc == NULL\n");
1138     ok(pmkToLeft == NULL, "pmkToLeft=%p\n", pmkToLeft);
1139     ok(IsEqualGUID(&IID_IStream, riid), "unexpected riid\n");
1140     ok(ppv != NULL, "ppv == NULL\n");
1141     ok(*ppv == NULL, "*ppv=%p\n", *ppv);
1142
1143     hres = IBindCtx_GetObjectParam(pbc, BSCBHolder, (IUnknown**)&callback);
1144     ok(hres == S_OK, "GetObjectParam failed: %08x\n", hres);
1145     ok(callback != NULL, "callback == NULL\n");
1146
1147     memset(&bindinfo, 0xf0, sizeof(bindinfo));
1148     bindinfo.cbSize = sizeof(bindinfo);
1149
1150     hres = IBindStatusCallback_GetBindInfo(callback, &bindf, &bindinfo);
1151     ok(hres == S_OK, "GetBindInfo failed: %08x\n", hres);
1152     ok(bindf == (BINDF_PULLDATA|BINDF_ASYNCSTORAGE|BINDF_ASYNCHRONOUS), "bindf = %08x\n", bindf);
1153     ok(bindinfo.cbSize == sizeof(bindinfo), "bindinfo.cbSize=%d\n", bindinfo.cbSize);
1154     ok(bindinfo.szExtraInfo == NULL, "bindinfo.szExtraInfo=%p\n", bindinfo.szExtraInfo);
1155     /* TODO: test stgmedData */
1156     ok(bindinfo.grfBindInfoF == 0, "bindinfo.grfBinfInfoF=%08x\n", bindinfo.grfBindInfoF);
1157     ok(bindinfo.dwBindVerb == 0, "bindinfo.dwBindVerb=%d\n", bindinfo.dwBindVerb);
1158     ok(bindinfo.szCustomVerb == 0, "bindinfo.szCustomVerb=%p\n", bindinfo.szCustomVerb);
1159     ok(bindinfo.cbstgmedData == 0, "bindinfo.cbstgmedData=%d\n", bindinfo.cbstgmedData);
1160     ok(bindinfo.dwOptions == 0x80000 || bindinfo.dwOptions == 0x4080000,
1161        "bindinfo.dwOptions=%x\n", bindinfo.dwOptions);
1162     ok(bindinfo.dwOptionsFlags == 0, "bindinfo.dwOptionsFlags=%d\n", bindinfo.dwOptionsFlags);
1163     /* TODO: test dwCodePage */
1164     /* TODO: test securityAttributes */
1165     ok(IsEqualGUID(&IID_NULL, &bindinfo.iid), "unexpected bindinfo.iid\n");
1166     ok(bindinfo.pUnk == NULL, "bindinfo.pUnk=%p\n", bindinfo.pUnk);
1167     ok(bindinfo.dwReserved == 0, "bindinfo.dwReserved=%d\n", bindinfo.dwReserved);
1168
1169     hres = IBindStatusCallback_OnStartBinding(callback, 0, &Binding);
1170     ok(hres == S_OK, "OnStartBinding failed: %08x\n", hres);
1171
1172     hres = IBindStatusCallback_OnProgress(callback, 0, 0, BINDSTATUS_MIMETYPEAVAILABLE,
1173                                           wszTextHtml);
1174     ok(hres == S_OK, "OnProgress(BINDSTATUS_MIMETYPEAVAILABLE) failed: %08x\n", hres);
1175
1176     hres = IBindStatusCallback_OnProgress(callback, sizeof(html_page)-1, sizeof(html_page)-1,
1177                                           BINDSTATUS_BEGINDOWNLOADDATA, doc_url);
1178     ok(hres == S_OK, "OnProgress(BINDSTATUS_BEGINDOWNLOADDATA) failed: %08x\n", hres);
1179
1180     SET_EXPECT(Read);
1181     stgmedium.tymed = TYMED_ISTREAM;
1182     U(stgmedium).pstm = &Stream;
1183     stgmedium.pUnkForRelease = (IUnknown*)iface;
1184     hres = IBindStatusCallback_OnDataAvailable(callback,
1185             BSCF_FIRSTDATANOTIFICATION|BSCF_LASTDATANOTIFICATION,
1186             sizeof(html_page)-1, &formatetc, &stgmedium);
1187     ok(hres == S_OK, "OnDataAvailable failed: %08x\n", hres);
1188     CHECK_CALLED(Read);
1189
1190     hres = IBindStatusCallback_OnProgress(callback, sizeof(html_page)-1, sizeof(html_page)-1,
1191             BINDSTATUS_ENDDOWNLOADDATA, NULL);
1192     ok(hres == S_OK, "OnProgress(BINDSTATUS_ENDDOWNLOADDATA) failed: %08x\n", hres);
1193
1194     SET_EXPECT(GetBindResult);
1195     hres = IBindStatusCallback_OnStopBinding(callback, S_OK, NULL);
1196     ok(hres == S_OK, "OnStopBinding failed: %08x\n", hres);
1197     SET_CALLED(GetBindResult); /* IE7 */
1198
1199     IBindStatusCallback_Release(callback);
1200
1201     return S_OK;
1202 }
1203
1204 static HRESULT WINAPI Moniker_Reduce(IMoniker *iface, IBindCtx *pbc, DWORD dwReduceHowFar,
1205         IMoniker **ppmkToLeft, IMoniker **ppmkReduced)
1206 {
1207     ok(0, "unexpected call\n");
1208     return E_NOTIMPL;
1209 }
1210
1211 static HRESULT WINAPI Moniker_ComposeWith(IMoniker *iface, IMoniker *pmkRight,
1212         BOOL fOnlyIfNotGeneric, IMoniker **ppnkComposite)
1213 {
1214     ok(0, "unexpected call\n");
1215     return E_NOTIMPL;
1216 }
1217
1218 static HRESULT WINAPI Moniker_Enum(IMoniker *iface, BOOL fForwrd, IEnumMoniker **ppenumMoniker)
1219 {
1220     ok(0, "unexpected call\n");
1221     return E_NOTIMPL;
1222 }
1223
1224 static HRESULT WINAPI Moniker_IsEqual(IMoniker *iface, IMoniker *pmkOtherMoniker)
1225 {
1226     ok(0, "unexpected call\n");
1227     return E_NOTIMPL;
1228 }
1229
1230 static HRESULT WINAPI Moniker_Hash(IMoniker *iface, DWORD *pdwHash)
1231 {
1232     ok(0, "unexpected call\n");
1233     return E_NOTIMPL;
1234 }
1235
1236 static HRESULT WINAPI Moniker_IsRunning(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft,
1237         IMoniker *pmkNewlyRunning)
1238 {
1239     ok(0, "unexpected call\n");
1240     return E_NOTIMPL;
1241 }
1242
1243 static HRESULT WINAPI Moniker_GetTimeOfLastChange(IMoniker *iface, IBindCtx *pbc,
1244         IMoniker *pmkToLeft, FILETIME *pFileTime)
1245 {
1246     ok(0, "unexpected call\n");
1247     return E_NOTIMPL;
1248 }
1249
1250 static HRESULT WINAPI Moniker_Inverse(IMoniker *iface, IMoniker **ppmk)
1251 {
1252     ok(0, "unexpected call\n");
1253     return E_NOTIMPL;
1254 }
1255
1256 static HRESULT WINAPI Moniker_CommonPrefixWith(IMoniker *iface, IMoniker *pmkOther,
1257         IMoniker **ppmkPrefix)
1258 {
1259     ok(0, "unexpected call\n");
1260     return E_NOTIMPL;
1261 }
1262
1263 static HRESULT WINAPI Moniker_RelativePathTo(IMoniker *iface, IMoniker *pmkOther,
1264         IMoniker **pmkRelPath)
1265 {
1266     ok(0, "unexpected call\n");
1267     return E_NOTIMPL;
1268 }
1269
1270 static HRESULT WINAPI Moniker_GetDisplayName(IMoniker *iface, IBindCtx *pbc,
1271         IMoniker *pmkToLeft, LPOLESTR *ppszDisplayName)
1272 {
1273     CHECK_EXPECT2(GetDisplayName);
1274
1275     /* ok(pbc != NULL, "pbc == NULL\n"); */
1276     ok(pmkToLeft == NULL, "pmkToLeft=%p\n", pmkToLeft);
1277     ok(ppszDisplayName != NULL, "ppszDisplayName == NULL\n");
1278
1279     *ppszDisplayName = CoTaskMemAlloc(sizeof(doc_url));
1280     memcpy(*ppszDisplayName, doc_url, sizeof(doc_url));
1281
1282     return S_OK;
1283 }
1284
1285 static HRESULT WINAPI Moniker_ParseDisplayName(IMoniker *iface, IBindCtx *pbc,
1286         IMoniker *pmkToLeft, LPOLESTR pszDisplayName, ULONG *pchEaten, IMoniker **ppmkOut)
1287 {
1288     ok(0, "unexpected call\n");
1289     return E_NOTIMPL;
1290 }
1291
1292 static HRESULT WINAPI Moniker_IsSystemMoniker(IMoniker *iface, DWORD *pdwMksys)
1293 {
1294     CHECK_EXPECT(IsSystemMoniker);
1295     return E_NOTIMPL;
1296 }
1297
1298 static const IMonikerVtbl MonikerVtbl = {
1299     Moniker_QueryInterface,
1300     Moniker_AddRef,
1301     Moniker_Release,
1302     Moniker_GetClassID,
1303     Moniker_IsDirty,
1304     Moniker_Load,
1305     Moniker_Save,
1306     Moniker_GetSizeMax,
1307     Moniker_BindToObject,
1308     Moniker_BindToStorage,
1309     Moniker_Reduce,
1310     Moniker_ComposeWith,
1311     Moniker_Enum,
1312     Moniker_IsEqual,
1313     Moniker_Hash,
1314     Moniker_IsRunning,
1315     Moniker_GetTimeOfLastChange,
1316     Moniker_Inverse,
1317     Moniker_CommonPrefixWith,
1318     Moniker_RelativePathTo,
1319     Moniker_GetDisplayName,
1320     Moniker_ParseDisplayName,
1321     Moniker_IsSystemMoniker
1322 };
1323
1324 static IMoniker Moniker = { &MonikerVtbl };
1325
1326 static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv)
1327 {
1328     return QueryInterface(riid, ppv);
1329 }
1330
1331 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
1332 {
1333     return 2;
1334 }
1335
1336 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
1337 {
1338     return 1;
1339 }
1340
1341 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc,
1342         LPOLESTR pszDiaplayName, ULONG *pchEaten, IMoniker **ppmkOut)
1343 {
1344     ok(0, "unexpected call\n");
1345     return E_NOTIMPL;
1346 }
1347
1348 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags,
1349         IEnumUnknown **ppenum)
1350 {
1351     ok(0, "unexpected call\n");
1352     return E_NOTIMPL;
1353 }
1354
1355 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
1356 {
1357     CHECK_EXPECT(LockContainer);
1358     ok(expect_LockContainer_fLock == fLock, "fLock=%x, expected %x\n", fLock, expect_LockContainer_fLock);
1359     return S_OK;
1360 }
1361
1362 static const IOleContainerVtbl OleContainerVtbl = {
1363     OleContainer_QueryInterface,
1364     OleContainer_AddRef,
1365     OleContainer_Release,
1366     OleContainer_ParseDisplayName,
1367     OleContainer_EnumObjects,
1368     OleContainer_LockContainer
1369 };
1370
1371 static IOleContainer OleContainer = { &OleContainerVtbl };
1372
1373 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
1374 {
1375     return QueryInterface(riid, ppv);
1376 }
1377
1378 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
1379 {
1380     return 2;
1381 }
1382
1383 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
1384 {
1385     return 1;
1386 }
1387
1388 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
1389 {
1390     ok(0, "unexpected call\n");
1391     return E_NOTIMPL;
1392 }
1393
1394 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign, DWORD dwWhichMoniker,
1395         IMoniker **ppmon)
1396 {
1397     ok(0, "unexpected call\n");
1398     return E_NOTIMPL;
1399 }
1400
1401 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
1402 {
1403     CHECK_EXPECT(GetContainer);
1404     ok(ppContainer != NULL, "ppContainer = NULL\n");
1405     *ppContainer = &OleContainer;
1406     return S_OK;
1407 }
1408
1409 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
1410 {
1411     ok(0, "unexpected call\n");
1412     return E_NOTIMPL;
1413 }
1414
1415 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
1416 {
1417     ok(0, "unexpected call\n");
1418     return E_NOTIMPL;
1419 }
1420
1421 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
1422 {
1423     ok(0, "unexpected call\n");
1424     return E_NOTIMPL;
1425 }
1426
1427 static const IOleClientSiteVtbl ClientSiteVtbl = {
1428     ClientSite_QueryInterface,
1429     ClientSite_AddRef,
1430     ClientSite_Release,
1431     ClientSite_SaveObject,
1432     ClientSite_GetMoniker,
1433     ClientSite_GetContainer,
1434     ClientSite_ShowObject,
1435     ClientSite_OnShowWindow,
1436     ClientSite_RequestNewObjectLayout
1437 };
1438
1439 static IOleClientSite ClientSite = { &ClientSiteVtbl };
1440
1441 static HRESULT WINAPI InPlaceFrame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, void **ppv)
1442 {
1443     static const GUID undocumented_frame_iid = {0xfbece6c9,0x48d7,0x4a37,{0x8f,0xe3,0x6a,0xd4,0x27,0x2f,0xdd,0xac}};
1444
1445     if(!IsEqualGUID(&undocumented_frame_iid, riid))
1446         ok(0, "unexpected riid %s\n", debugstr_guid(riid));
1447
1448     *ppv = NULL;
1449     return E_NOINTERFACE;
1450 }
1451
1452 static ULONG WINAPI InPlaceFrame_AddRef(IOleInPlaceFrame *iface)
1453 {
1454     return 2;
1455 }
1456
1457 static ULONG WINAPI InPlaceFrame_Release(IOleInPlaceFrame *iface)
1458 {
1459     return 1;
1460 }
1461
1462 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
1463 {
1464     CHECK_EXPECT(Frame_GetWindow);
1465     return E_NOTIMPL;
1466 }
1467
1468 static HRESULT WINAPI InPlaceFrame_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
1469 {
1470     ok(0, "unexpected call\n");
1471     return E_NOTIMPL;
1472 }
1473
1474 static HRESULT WINAPI InPlaceFrame_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
1475 {
1476     ok(0, "unexpected call\n");
1477     return E_NOTIMPL;
1478 }
1479
1480 static HRESULT WINAPI InPlaceFrame_RequestBorderSpace(IOleInPlaceFrame *iface,
1481         LPCBORDERWIDTHS pborderwidths)
1482 {
1483     ok(0, "unexpected call\n");
1484     return E_NOTIMPL;
1485 }
1486
1487 static HRESULT WINAPI InPlaceFrame_SetBorderSpace(IOleInPlaceFrame *iface,
1488         LPCBORDERWIDTHS pborderwidths)
1489 {
1490     CHECK_EXPECT(InPlaceFrame_SetBorderSpace);
1491     return S_OK;
1492 }
1493
1494 static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame *iface,
1495         IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
1496 {
1497     static const WCHAR wszHTML_Document[] =
1498         {'H','T','M','L',' ','D','o','c','u','m','e','n','t',0};
1499
1500     CHECK_EXPECT2(InPlaceUIWindow_SetActiveObject);
1501
1502     if(expect_InPlaceUIWindow_SetActiveObject_active) {
1503         ok(pActiveObject != NULL, "pActiveObject = NULL\n");
1504         if(pActiveObject && is_english())
1505             ok(!lstrcmpW(wszHTML_Document, pszObjName), "pszObjName != \"HTML Document\"\n");
1506     }
1507     else {
1508         ok(pActiveObject == NULL, "pActiveObject=%p, expected NULL\n", pActiveObject);
1509         ok(pszObjName == NULL, "pszObjName=%p, expected NULL\n", pszObjName);
1510     }
1511     expect_InPlaceUIWindow_SetActiveObject_active = !expect_InPlaceUIWindow_SetActiveObject_active;
1512     return S_OK;
1513 }
1514
1515 static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
1516         IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
1517 {
1518     static const WCHAR wszHTML_Document[] =
1519         {'H','T','M','L',' ','D','o','c','u','m','e','n','t',0};
1520
1521     if(pActiveObject) {
1522         CHECK_EXPECT2(SetActiveObject);
1523
1524         if(pActiveObject && is_english())
1525             ok(!lstrcmpW(wszHTML_Document, pszObjName), "pszObjName != \"HTML Document\"\n");
1526     }else {
1527         CHECK_EXPECT(SetActiveObject_null);
1528
1529         ok(pActiveObject == NULL, "pActiveObject=%p, expected NULL\n", pActiveObject);
1530         ok(pszObjName == NULL, "pszObjName=%p, expected NULL\n", pszObjName);
1531     }
1532
1533     return S_OK;
1534 }
1535
1536 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
1537         LPOLEMENUGROUPWIDTHS lpMenuWidths)
1538 {
1539     ok(0, "unexpected call\n");
1540     return E_NOTIMPL;
1541 }
1542
1543 static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared,
1544         HOLEMENU holemenu, HWND hwndActiveObject)
1545 {
1546     ok(0, "unexpected call\n");
1547     return E_NOTIMPL;
1548 }
1549
1550 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
1551 {
1552     ok(0, "unexpected call\n");
1553     return E_NOTIMPL;
1554 }
1555
1556 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
1557 {
1558     CHECK_EXPECT2(SetStatusText);
1559     if(!expect_status_text)
1560         ok(pszStatusText == NULL, "pszStatusText=%p, expected NULL\n", pszStatusText);
1561     return S_OK;
1562 }
1563
1564 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
1565 {
1566     if(fEnable)
1567         CHECK_EXPECT2(Frame_EnableModeless_TRUE);
1568     else
1569         CHECK_EXPECT2(Frame_EnableModeless_FALSE);
1570     return E_NOTIMPL;
1571 }
1572
1573 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
1574 {
1575     ok(0, "unexpected call\n");
1576     return E_NOTIMPL;
1577 }
1578
1579 static const IOleInPlaceFrameVtbl InPlaceFrameVtbl = {
1580     InPlaceFrame_QueryInterface,
1581     InPlaceFrame_AddRef,
1582     InPlaceFrame_Release,
1583     InPlaceFrame_GetWindow,
1584     InPlaceFrame_ContextSensitiveHelp,
1585     InPlaceFrame_GetBorder,
1586     InPlaceFrame_RequestBorderSpace,
1587     InPlaceFrame_SetBorderSpace,
1588     InPlaceFrame_SetActiveObject,
1589     InPlaceFrame_InsertMenus,
1590     InPlaceFrame_SetMenu,
1591     InPlaceFrame_RemoveMenus,
1592     InPlaceFrame_SetStatusText,
1593     InPlaceFrame_EnableModeless,
1594     InPlaceFrame_TranslateAccelerator
1595 };
1596
1597 static IOleInPlaceFrame InPlaceFrame = { &InPlaceFrameVtbl };
1598
1599 static const IOleInPlaceFrameVtbl InPlaceUIWindowVtbl = {
1600     InPlaceFrame_QueryInterface,
1601     InPlaceFrame_AddRef,
1602     InPlaceFrame_Release,
1603     InPlaceFrame_GetWindow,
1604     InPlaceFrame_ContextSensitiveHelp,
1605     InPlaceFrame_GetBorder,
1606     InPlaceFrame_RequestBorderSpace,
1607     InPlaceFrame_SetBorderSpace,
1608     InPlaceUIWindow_SetActiveObject,
1609 };
1610
1611 static IOleInPlaceFrame InPlaceUIWindow = { &InPlaceUIWindowVtbl };
1612
1613 static HRESULT WINAPI InPlaceSiteWindowless_QueryInterface(IOleInPlaceSiteWindowless *iface, REFIID riid, void **ppv)
1614 {
1615     return QueryInterface(riid, ppv);
1616 }
1617
1618 static ULONG WINAPI InPlaceSiteWindowless_AddRef(IOleInPlaceSiteWindowless *iface)
1619 {
1620     return 2;
1621 }
1622
1623 static ULONG WINAPI InPlaceSiteWindowless_Release(IOleInPlaceSiteWindowless *iface)
1624 {
1625     return 1;
1626 }
1627
1628 static HRESULT WINAPI InPlaceSiteWindowless_GetWindow(
1629         IOleInPlaceSiteWindowless *iface, HWND *phwnd)
1630 {
1631     IOleClientSite *client_site;
1632     IOleObject *ole_obj;
1633     HRESULT hres;
1634
1635     CHECK_EXPECT2(GetWindow);
1636     ok(phwnd != NULL, "phwnd = NULL\n");
1637     *phwnd = container_hwnd;
1638
1639     hres = IUnknown_QueryInterface(doc_unk, &IID_IOleObject, (void**)&ole_obj);
1640     ok(hres == S_OK, "Could not get IOleObject: %08x\n", hres);
1641
1642     hres = IOleObject_GetClientSite(ole_obj, &client_site);
1643     IOleObject_Release(ole_obj);
1644     ok(hres == S_OK, "GetClientSite failed: %08x\n", hres);
1645     ok(client_site == &ClientSite, "client_site != ClientSite\n");
1646     IOleClientSite_Release(client_site);
1647
1648     return S_OK;
1649 }
1650
1651 static HRESULT WINAPI InPlaceSiteWindowless_ContextSensitiveHelp(
1652         IOleInPlaceSiteWindowless *iface, BOOL fEnterMode)
1653 {
1654     ok(0, "unexpected call\n");
1655     return E_NOTIMPL;
1656 }
1657
1658 static HRESULT WINAPI InPlaceSiteWindowless_CanInPlaceActivate(
1659         IOleInPlaceSiteWindowless *iface)
1660 {
1661     CHECK_EXPECT(CanInPlaceActivate);
1662     return S_OK;
1663 }
1664
1665 static HRESULT WINAPI InPlaceSiteWindowless_OnInPlaceActivate(
1666         IOleInPlaceSiteWindowless *iface)
1667 {
1668     CHECK_EXPECT(OnInPlaceActivate);
1669     inplace_deactivated = FALSE;
1670     return S_OK;
1671 }
1672
1673 static HRESULT WINAPI InPlaceSiteWindowless_OnUIActivate(
1674         IOleInPlaceSiteWindowless *iface)
1675 {
1676     CHECK_EXPECT(OnUIActivate);
1677     return S_OK;
1678 }
1679
1680 static HRESULT WINAPI InPlaceSiteWindowless_GetWindowContext(
1681         IOleInPlaceSiteWindowless *iface, IOleInPlaceFrame **ppFrame,
1682         IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
1683         LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
1684 {
1685     static const RECT rect = {0,0,500,500};
1686
1687     CHECK_EXPECT(GetWindowContext);
1688
1689     ok(ppFrame != NULL, "ppFrame = NULL\n");
1690     if(ppFrame)
1691         *ppFrame = &InPlaceFrame;
1692     ok(ppDoc != NULL, "ppDoc = NULL\n");
1693     if(ppDoc)
1694         *ppDoc = (IOleInPlaceUIWindow*)&InPlaceUIWindow;
1695     ok(lprcPosRect != NULL, "lprcPosRect = NULL\n");
1696     if(lprcPosRect)
1697         memcpy(lprcPosRect, &rect, sizeof(RECT));
1698     ok(lprcClipRect != NULL, "lprcClipRect = NULL\n");
1699     if(lprcClipRect)
1700         memcpy(lprcClipRect, &rect, sizeof(RECT));
1701     ok(lpFrameInfo != NULL, "lpFrameInfo = NULL\n");
1702     if(lpFrameInfo) {
1703         lpFrameInfo->cb = sizeof(*lpFrameInfo);
1704         lpFrameInfo->fMDIApp = FALSE;
1705         lpFrameInfo->hwndFrame = container_hwnd;
1706         lpFrameInfo->haccel = NULL;
1707         lpFrameInfo->cAccelEntries = 0;
1708     }
1709
1710     return S_OK;
1711 }
1712
1713 static HRESULT WINAPI InPlaceSiteWindowless_Scroll(
1714         IOleInPlaceSiteWindowless *iface, SIZE scrollExtent)
1715 {
1716     ok(0, "unexpected call\n");
1717     return E_NOTIMPL;
1718 }
1719
1720 static HRESULT WINAPI InPlaceSiteWindowless_OnUIDeactivate(
1721         IOleInPlaceSiteWindowless *iface, BOOL fUndoable)
1722 {
1723     CHECK_EXPECT(OnUIDeactivate);
1724     ok(!fUndoable, "fUndoable = TRUE\n");
1725     return S_OK;
1726 }
1727
1728 static HRESULT WINAPI InPlaceSiteWindowless_OnInPlaceDeactivate(
1729         IOleInPlaceSiteWindowless *iface)
1730 {
1731     CHECK_EXPECT(OnInPlaceDeactivate);
1732     inplace_deactivated = TRUE;
1733     return S_OK;
1734 }
1735
1736 static HRESULT WINAPI InPlaceSiteWindowless_DiscardUndoState(
1737         IOleInPlaceSiteWindowless *iface)
1738 {
1739     ok(0, "unexpected call\n");
1740     return E_NOTIMPL;
1741 }
1742
1743 static HRESULT WINAPI InPlaceSiteWindowless_DeactivateAndUndo(
1744         IOleInPlaceSiteWindowless *iface)
1745 {
1746     ok(0, "unexpected call\n");
1747     return E_NOTIMPL;
1748 }
1749
1750 static HRESULT WINAPI InPlaceSiteWindowless_OnPosRectChange(
1751         IOleInPlaceSiteWindowless *iface, LPCRECT lprcPosRect)
1752 {
1753     ok(0, "unexpected call\n");
1754     return E_NOTIMPL;
1755 }
1756
1757 static HRESULT WINAPI InPlaceSiteWindowless_OnInPlaceActivateEx(
1758         IOleInPlaceSiteWindowless *iface, BOOL *pfNoRedraw, DWORD dwFlags)
1759 {
1760     CHECK_EXPECT(OnInPlaceActivateEx);
1761
1762     ok(pfNoRedraw != NULL, "pfNoRedraw == NULL\n");
1763     ok(!*pfNoRedraw, "*pfNoRedraw == TRUE\n");
1764     ok(dwFlags == 0, "dwFlags = %08x\n", dwFlags);
1765
1766     return S_OK;
1767 }
1768
1769 static HRESULT WINAPI InPlaceSiteWindowless_OnInPlaceDeactivateEx(
1770         IOleInPlaceSiteWindowless *iface, BOOL fNoRedraw)
1771 {
1772     CHECK_EXPECT(OnInPlaceDeactivateEx);
1773
1774     ok(fNoRedraw, "fNoRedraw == FALSE\n");
1775
1776     return S_OK;
1777 }
1778
1779 static HRESULT WINAPI InPlaceSiteWindowless_RequestUIActivate(
1780         IOleInPlaceSiteWindowless *iface)
1781 {
1782     CHECK_EXPECT2(RequestUIActivate);
1783     return S_OK;
1784 }
1785
1786 static HRESULT WINAPI InPlaceSiteWindowless_CanWindowlessActivate(
1787         IOleInPlaceSiteWindowless *iface)
1788 {
1789     ok(0, "unexpected call\n");
1790     return E_NOTIMPL;
1791 }
1792
1793 static HRESULT WINAPI InPlaceSiteWindowless_GetCapture(
1794         IOleInPlaceSiteWindowless *iface)
1795 {
1796     ok(0, "unexpected call\n");
1797     return E_NOTIMPL;
1798 }
1799
1800 static HRESULT WINAPI InPlaceSiteWindowless_SetCapture(
1801         IOleInPlaceSiteWindowless *iface, BOOL fCapture)
1802 {
1803     ok(0, "unexpected call\n");
1804     return E_NOTIMPL;
1805 }
1806
1807 static HRESULT WINAPI InPlaceSiteWindowless_GetFocus(
1808         IOleInPlaceSiteWindowless *iface)
1809 {
1810     ok(0, "unexpected call\n");
1811     return E_NOTIMPL;
1812 }
1813
1814 static HRESULT WINAPI InPlaceSiteWindowless_SetFocus(
1815         IOleInPlaceSiteWindowless *iface, BOOL fFocus)
1816 {
1817     ok(0, "unexpected call\n");
1818     return E_NOTIMPL;
1819 }
1820
1821 static HRESULT WINAPI InPlaceSiteWindowless_GetDC(
1822         IOleInPlaceSiteWindowless *iface, LPCRECT pRect,
1823         DWORD grfFlags, HDC *phDC)
1824 {
1825     ok(0, "unexpected call\n");
1826     return E_NOTIMPL;
1827 }
1828
1829 static HRESULT WINAPI InPlaceSiteWindowless_ReleaseDC(
1830         IOleInPlaceSiteWindowless *iface, HDC hDC)
1831 {
1832     ok(0, "unexpected call\n");
1833     return E_NOTIMPL;
1834 }
1835
1836 static HRESULT WINAPI InPlaceSiteWindowless_InvalidateRect(
1837         IOleInPlaceSiteWindowless *iface, LPCRECT pRect, BOOL fErase)
1838 {
1839     ok(0, "unexpected call\n");
1840     return E_NOTIMPL;
1841 }
1842
1843 static HRESULT WINAPI InPlaceSiteWindowless_InvalidateRgn(
1844         IOleInPlaceSiteWindowless *iface, HRGN hRGN, BOOL fErase)
1845 {
1846     ok(0, "unexpected call\n");
1847     return E_NOTIMPL;
1848 }
1849
1850 static HRESULT WINAPI InPlaceSiteWindowless_ScrollRect(
1851         IOleInPlaceSiteWindowless *iface, INT dx, INT dy,
1852         LPCRECT pRectScroll, LPCRECT pRectClip)
1853 {
1854     ok(0, "unexpected call\n");
1855     return E_NOTIMPL;
1856 }
1857
1858 static HRESULT WINAPI InPlaceSiteWindowless_AdjustRect(
1859         IOleInPlaceSiteWindowless *iface, LPRECT prc)
1860 {
1861     ok(0, "unexpected call\n");
1862     return E_NOTIMPL;
1863 }
1864
1865 static HRESULT WINAPI InPlaceSiteWindowless_OnDefWindowMessage(
1866         IOleInPlaceSiteWindowless *iface, UINT msg,
1867         WPARAM wParam, LPARAM lParam, LRESULT *plResult)
1868 {
1869     ok(0, "unexpected call\n");
1870     return E_NOTIMPL;
1871 }
1872
1873 static const IOleInPlaceSiteWindowlessVtbl InPlaceSiteWindowlessVtbl = {
1874     InPlaceSiteWindowless_QueryInterface,
1875     InPlaceSiteWindowless_AddRef,
1876     InPlaceSiteWindowless_Release,
1877     InPlaceSiteWindowless_GetWindow,
1878     InPlaceSiteWindowless_ContextSensitiveHelp,
1879     InPlaceSiteWindowless_CanInPlaceActivate,
1880     InPlaceSiteWindowless_OnInPlaceActivate,
1881     InPlaceSiteWindowless_OnUIActivate,
1882     InPlaceSiteWindowless_GetWindowContext,
1883     InPlaceSiteWindowless_Scroll,
1884     InPlaceSiteWindowless_OnUIDeactivate,
1885     InPlaceSiteWindowless_OnInPlaceDeactivate,
1886     InPlaceSiteWindowless_DiscardUndoState,
1887     InPlaceSiteWindowless_DeactivateAndUndo,
1888     InPlaceSiteWindowless_OnPosRectChange,
1889     InPlaceSiteWindowless_OnInPlaceActivateEx,
1890     InPlaceSiteWindowless_OnInPlaceDeactivateEx,
1891     InPlaceSiteWindowless_RequestUIActivate,
1892     InPlaceSiteWindowless_CanWindowlessActivate,
1893     InPlaceSiteWindowless_GetCapture,
1894     InPlaceSiteWindowless_SetCapture,
1895     InPlaceSiteWindowless_GetFocus,
1896     InPlaceSiteWindowless_SetFocus,
1897     InPlaceSiteWindowless_GetDC,
1898     InPlaceSiteWindowless_ReleaseDC,
1899     InPlaceSiteWindowless_InvalidateRect,
1900     InPlaceSiteWindowless_InvalidateRgn,
1901     InPlaceSiteWindowless_ScrollRect,
1902     InPlaceSiteWindowless_AdjustRect,
1903     InPlaceSiteWindowless_OnDefWindowMessage
1904 };
1905
1906 static IOleInPlaceSiteWindowless InPlaceSiteWindowless = { &InPlaceSiteWindowlessVtbl };
1907
1908 static HRESULT WINAPI DocumentSite_QueryInterface(IOleDocumentSite *iface, REFIID riid, void **ppv)
1909 {
1910     return QueryInterface(riid, ppv);
1911 }
1912
1913 static ULONG WINAPI DocumentSite_AddRef(IOleDocumentSite *iface)
1914 {
1915     return 2;
1916 }
1917
1918 static ULONG WINAPI DocumentSite_Release(IOleDocumentSite *iface)
1919 {
1920     return 1;
1921 }
1922
1923 typedef enum
1924 {
1925     CallUIActivate_None,
1926     CallUIActivate_ActivateMe,
1927     CallUIActivate_AfterShow,
1928 } CallUIActivate;
1929
1930 static BOOL call_UIActivate = CallUIActivate_ActivateMe;
1931 static HRESULT WINAPI DocumentSite_ActivateMe(IOleDocumentSite *iface, IOleDocumentView *pViewToActivate)
1932 {
1933     IOleDocument *document;
1934     HRESULT hres;
1935
1936     CHECK_EXPECT(ActivateMe);
1937     ok(pViewToActivate != NULL, "pViewToActivate = NULL\n");
1938
1939     hres = IOleDocumentView_QueryInterface(pViewToActivate, &IID_IOleDocument, (void**)&document);
1940     ok(hres == S_OK, "could not get IOleDocument: %08x\n", hres);
1941
1942     if(SUCCEEDED(hres)) {
1943         hres = IOleDocument_CreateView(document, (IOleInPlaceSite*)&InPlaceSiteWindowless, NULL, 0, &view);
1944         ok(hres == S_OK, "CreateView failed: %08x\n", hres);
1945
1946         if(SUCCEEDED(hres)) {
1947             IOleInPlaceActiveObject *activeobj = NULL;
1948             IOleInPlaceSite *inplacesite = NULL;
1949             HWND tmp_hwnd = NULL;
1950             static RECT rect = {0,0,400,500};
1951
1952             hres = IOleDocumentView_GetInPlaceSite(view, &inplacesite);
1953             ok(hres == S_OK, "GetInPlaceSite failed: %08x\n", hres);
1954             ok(inplacesite == (IOleInPlaceSite*)&InPlaceSiteWindowless, "inplacesite=%p, expected %p\n",
1955                     inplacesite, &InPlaceSiteWindowless);
1956
1957             hres = IOleDocumentView_SetInPlaceSite(view, (IOleInPlaceSite*)&InPlaceSiteWindowless);
1958             ok(hres == S_OK, "SetInPlaceSite failed: %08x\n", hres);
1959
1960             hres = IOleDocumentView_GetInPlaceSite(view, &inplacesite);
1961             ok(hres == S_OK, "GetInPlaceSite failed: %08x\n", hres);
1962             ok(inplacesite == (IOleInPlaceSite*)&InPlaceSiteWindowless, "inplacesite=%p, expected %p\n",
1963                     inplacesite, &InPlaceSiteWindowless);
1964
1965             hres = IOleDocumentView_QueryInterface(view, &IID_IOleInPlaceActiveObject, (void**)&activeobj);
1966             ok(hres == S_OK, "Could not get IOleInPlaceActiveObject: %08x\n", hres);
1967
1968             if(activeobj) {
1969                 IOleInPlaceActiveObject_GetWindow(activeobj, &hwnd);
1970                 ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
1971                 ok(hwnd == NULL, "hwnd=%p, expeted NULL\n", hwnd);
1972             }
1973             
1974             if(call_UIActivate == CallUIActivate_ActivateMe) {
1975                 SET_EXPECT(CanInPlaceActivate);
1976                 SET_EXPECT(GetWindowContext);
1977                 SET_EXPECT(GetWindow);
1978                 if(ipsex)
1979                     SET_EXPECT(OnInPlaceActivateEx);
1980                 else
1981                     SET_EXPECT(OnInPlaceActivate);
1982                 SET_EXPECT(SetStatusText);
1983                 SET_EXPECT(Exec_SETPROGRESSMAX);
1984                 SET_EXPECT(Exec_SETPROGRESSPOS);
1985                 SET_EXPECT(OnUIActivate);
1986                 SET_EXPECT(SetActiveObject);
1987                 SET_EXPECT(ShowUI);
1988                 expect_status_text = NULL;
1989
1990                 hres = IOleDocumentView_UIActivate(view, TRUE);
1991                 ok(hres == S_OK, "UIActivate failed: %08x\n", hres);
1992
1993                 CHECK_CALLED(CanInPlaceActivate);
1994                 CHECK_CALLED(GetWindowContext);
1995                 CHECK_CALLED(GetWindow);
1996                 if(ipsex)
1997                     CHECK_CALLED(OnInPlaceActivateEx);
1998                 else
1999                     CHECK_CALLED(OnInPlaceActivate);
2000                 CHECK_CALLED(SetStatusText);
2001                 CHECK_CALLED(Exec_SETPROGRESSMAX);
2002                 CHECK_CALLED(Exec_SETPROGRESSPOS);
2003                 CHECK_CALLED(OnUIActivate);
2004                 CHECK_CALLED(SetActiveObject);
2005                 CHECK_CALLED(ShowUI);
2006
2007                 if(activeobj) {
2008                     hres = IOleInPlaceActiveObject_GetWindow(activeobj, &hwnd);
2009                     ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
2010                     ok(hwnd != NULL, "hwnd == NULL\n");
2011                     if(last_hwnd)
2012                         ok(hwnd == last_hwnd, "hwnd != last_hwnd\n");
2013                 }
2014
2015                 hres = IOleDocumentView_UIActivate(view, TRUE);
2016                 ok(hres == S_OK, "UIActivate failed: %08x\n", hres);
2017
2018                 if(activeobj) {
2019                     hres = IOleInPlaceActiveObject_GetWindow(activeobj, &tmp_hwnd);
2020                     ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
2021                     ok(tmp_hwnd == hwnd, "tmp_hwnd=%p, expected %p\n", tmp_hwnd, hwnd);
2022                 }
2023             }
2024
2025             hres = IOleDocumentView_SetRect(view, &rect);
2026             ok(hres == S_OK, "SetRect failed: %08x\n", hres);
2027
2028             if(call_UIActivate == CallUIActivate_ActivateMe) {
2029                 hres = IOleDocumentView_Show(view, TRUE);
2030                 ok(hres == S_OK, "Show failed: %08x\n", hres);
2031             }else {
2032                 SET_EXPECT(CanInPlaceActivate);
2033                 SET_EXPECT(GetWindowContext);
2034                 SET_EXPECT(GetWindow);
2035                 if(ipsex)
2036                     SET_EXPECT(OnInPlaceActivateEx);
2037                 else
2038                     SET_EXPECT(OnInPlaceActivate);
2039                 SET_EXPECT(SetStatusText);
2040                 SET_EXPECT(Exec_SETPROGRESSMAX);
2041                 SET_EXPECT(Exec_SETPROGRESSPOS);
2042                 SET_EXPECT(OnUIActivate);
2043                 expect_status_text = (load_state == LD_COMPLETE ? (LPCOLESTR)0xdeadbeef : NULL);
2044
2045                 hres = IOleDocumentView_Show(view, TRUE);
2046                 if(FAILED(hres)) {
2047                     win_skip("Show failed\n");
2048                     if(activeobj)
2049                         IOleInPlaceActiveObject_Release(activeobj);
2050                     IOleDocument_Release(document);
2051                     show_failed = TRUE;
2052                     return S_OK;
2053                 }
2054                 ok(hres == S_OK, "Show failed: %08x\n", hres);
2055
2056                 CHECK_CALLED(CanInPlaceActivate);
2057                 CHECK_CALLED(GetWindowContext);
2058                 CHECK_CALLED(GetWindow);
2059                 if(ipsex)
2060                     CHECK_CALLED(OnInPlaceActivateEx);
2061                 else
2062                     CHECK_CALLED(OnInPlaceActivate);
2063                 CHECK_CALLED(SetStatusText);
2064                 CHECK_CALLED(Exec_SETPROGRESSMAX);
2065                 CHECK_CALLED(Exec_SETPROGRESSPOS);
2066
2067                 if(activeobj) {
2068                     hres = IOleInPlaceActiveObject_GetWindow(activeobj, &hwnd);
2069                     ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
2070                     ok(hwnd != NULL, "hwnd == NULL\n");
2071                     if(last_hwnd)
2072                         ok(hwnd == last_hwnd, "hwnd != last_hwnd\n");
2073                 }
2074             }
2075
2076             test_timer(EXPECT_UPDATEUI | ((load_state == LD_LOADING) ? EXPECT_SETTITLE : 0));
2077
2078             if(activeobj)
2079                 IOleInPlaceActiveObject_Release(activeobj);
2080         }
2081
2082         IOleDocument_Release(document);
2083     }
2084
2085     return S_OK;
2086 }
2087
2088 static const IOleDocumentSiteVtbl DocumentSiteVtbl = {
2089     DocumentSite_QueryInterface,
2090     DocumentSite_AddRef,
2091     DocumentSite_Release,
2092     DocumentSite_ActivateMe
2093 };
2094
2095 static IOleDocumentSite DocumentSite = { &DocumentSiteVtbl };
2096
2097 static HRESULT WINAPI OleControlSite_QueryInterface(IOleControlSite *iface, REFIID riid, void **ppv)
2098 {
2099     return QueryInterface(riid, ppv);
2100 }
2101
2102 static ULONG WINAPI OleControlSite_AddRef(IOleControlSite *iface)
2103 {
2104     return 2;
2105 }
2106
2107 static ULONG WINAPI OleControlSite_Release(IOleControlSite *iface)
2108 {
2109     return 1;
2110 }
2111
2112 static HRESULT WINAPI OleControlSite_OnControlInfoChanged(IOleControlSite *iface)
2113 {
2114     ok(0, "unexpected call\n");
2115     return E_NOTIMPL;
2116 }
2117
2118 static HRESULT WINAPI OleControlSite_LockInPlaceActive(IOleControlSite *iface, BOOL fLock)
2119 {
2120     ok(0, "unexpected call\n");
2121     return E_NOTIMPL;
2122 }
2123
2124 static HRESULT WINAPI OleControlSite_GetExtendedControl(IOleControlSite *iface, IDispatch **ppDisp)
2125 {
2126     ok(0, "unexpected call\n");
2127     return E_NOTIMPL;
2128 }
2129
2130 static HRESULT WINAPI OleControlSite_TransformCoords(IOleControlSite *iface, POINTL *pPtHimetric,
2131         POINTF *pPtfContainer, DWORD dwFlags)
2132 {
2133     ok(0, "unexpected call\n");
2134     return E_NOTIMPL;
2135 }
2136
2137 static HRESULT WINAPI OleControlSite_TranslateAccelerator(IOleControlSite *iface,
2138         MSG *pMsg, DWORD grfModifiers)
2139 {
2140     ok(0, "unexpected call\n");
2141     return E_NOTIMPL;
2142 }
2143
2144 static HRESULT WINAPI OleControlSite_OnFocus(IOleControlSite *iface, BOOL fGotFocus)
2145 {
2146     if(fGotFocus)
2147         CHECK_EXPECT(OnFocus_TRUE);
2148     else
2149         CHECK_EXPECT2(OnFocus_FALSE);
2150     return S_OK;
2151 }
2152
2153 static HRESULT WINAPI OleControlSite_ShowPropertyFrame(IOleControlSite *iface)
2154 {
2155     ok(0, "unexpected call\n");
2156     return E_NOTIMPL;
2157 }
2158
2159 static const IOleControlSiteVtbl OleControlSiteVtbl = {
2160     OleControlSite_QueryInterface,
2161     OleControlSite_AddRef,
2162     OleControlSite_Release,
2163     OleControlSite_OnControlInfoChanged,
2164     OleControlSite_LockInPlaceActive,
2165     OleControlSite_GetExtendedControl,
2166     OleControlSite_TransformCoords,
2167     OleControlSite_TranslateAccelerator,
2168     OleControlSite_OnFocus,
2169     OleControlSite_ShowPropertyFrame
2170 };
2171
2172 static IOleControlSite OleControlSite = { &OleControlSiteVtbl };
2173
2174 static HRESULT WINAPI DocHostUIHandler_QueryInterface(IDocHostUIHandler2 *iface, REFIID riid, void **ppv)
2175 {
2176     return QueryInterface(riid, ppv);
2177 }
2178
2179 static ULONG WINAPI DocHostUIHandler_AddRef(IDocHostUIHandler2 *iface)
2180 {
2181     return 2;
2182 }
2183
2184 static ULONG WINAPI DocHostUIHandler_Release(IDocHostUIHandler2 *iface)
2185 {
2186     return 1;
2187 }
2188
2189 static HRESULT WINAPI DocHostUIHandler_ShowContextMenu(IDocHostUIHandler2 *iface, DWORD dwID, POINT *ppt,
2190         IUnknown *pcmdtReserved, IDispatch *pdicpReserved)
2191 {
2192     ok(0, "unexpected call\n");
2193     return E_NOTIMPL;
2194 }
2195
2196 static HRESULT WINAPI DocHostUIHandler_GetHostInfo(IDocHostUIHandler2 *iface, DOCHOSTUIINFO *pInfo)
2197 {
2198     CHECK_EXPECT(GetHostInfo);
2199     ok(pInfo != NULL, "pInfo=NULL\n");
2200     if(pInfo) {
2201         ok(pInfo->cbSize == sizeof(DOCHOSTUIINFO), "pInfo->cbSize=%u\n", pInfo->cbSize);
2202         ok(!pInfo->dwFlags, "pInfo->dwFlags=%08x, expected 0\n", pInfo->dwFlags);
2203         pInfo->dwFlags = DOCHOSTUIFLAG_DISABLE_HELP_MENU | DOCHOSTUIFLAG_DISABLE_SCRIPT_INACTIVE
2204             | DOCHOSTUIFLAG_ACTIVATE_CLIENTHIT_ONLY | DOCHOSTUIFLAG_ENABLE_INPLACE_NAVIGATION
2205             | DOCHOSTUIFLAG_IME_ENABLE_RECONVERSION;
2206         ok(!pInfo->dwDoubleClick, "pInfo->dwDoubleClick=%08x, expected 0\n", pInfo->dwDoubleClick);
2207         ok(!pInfo->pchHostCss, "pInfo->pchHostCss=%p, expected NULL\n", pInfo->pchHostCss);
2208         ok(!pInfo->pchHostNS, "pInfo->pchhostNS=%p, expected NULL\n", pInfo->pchHostNS);
2209     }
2210     return S_OK;
2211 }
2212
2213 static HRESULT WINAPI DocHostUIHandler_ShowUI(IDocHostUIHandler2 *iface, DWORD dwID,
2214         IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget,
2215         IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
2216 {
2217     CHECK_EXPECT(ShowUI);
2218
2219     if (editmode)
2220         ok(dwID == DOCHOSTUITYPE_AUTHOR, "dwID=%d, expected DOCHOSTUITYPE_AUTHOR\n", dwID);
2221     else
2222         ok(dwID == DOCHOSTUITYPE_BROWSE, "dwID=%d, expected DOCHOSTUITYPE_BROWSE\n", dwID);
2223     ok(pActiveObject != NULL, "pActiveObject = NULL\n");
2224     ok(pCommandTarget != NULL, "pCommandTarget = NULL\n");
2225     ok(pFrame == &InPlaceFrame, "pFrame=%p, expected %p\n", pFrame, &InPlaceFrame);
2226     if (expect_InPlaceUIWindow_SetActiveObject_active)
2227         ok(pDoc == (IOleInPlaceUIWindow *)&InPlaceUIWindow, "pDoc=%p, expected %p\n", pDoc, &InPlaceUIWindow);
2228     else
2229         ok(pDoc == NULL, "pDoc=%p, expected NULL\n", pDoc);
2230
2231     return S_OK;
2232 }
2233
2234 static HRESULT WINAPI DocHostUIHandler_HideUI(IDocHostUIHandler2 *iface)
2235 {
2236     CHECK_EXPECT(HideUI);
2237     return S_OK;
2238 }
2239
2240 static HRESULT WINAPI DocHostUIHandler_UpdateUI(IDocHostUIHandler2 *iface)
2241 {
2242     CHECK_EXPECT(UpdateUI);
2243     return S_OK;
2244 }
2245
2246 static HRESULT WINAPI DocHostUIHandler_EnableModeless(IDocHostUIHandler2 *iface, BOOL fEnable)
2247 {
2248     if(fEnable)
2249         CHECK_EXPECT2(EnableModeless_TRUE);
2250     else
2251         CHECK_EXPECT2(EnableModeless_FALSE);
2252     return E_NOTIMPL;
2253 }
2254
2255 static HRESULT WINAPI DocHostUIHandler_OnDocWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
2256 {
2257     ok(0, "unexpected call\n");
2258     return E_NOTIMPL;
2259 }
2260
2261 static BOOL expect_OnFrameWindowActivate_fActivate;
2262 static HRESULT WINAPI DocHostUIHandler_OnFrameWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
2263 {
2264     CHECK_EXPECT2(OnFrameWindowActivate);
2265     ok(fActivate == expect_OnFrameWindowActivate_fActivate, "fActivate=%x\n", fActivate);
2266     return S_OK;
2267 }
2268
2269 static HRESULT WINAPI DocHostUIHandler_ResizeBorder(IDocHostUIHandler2 *iface, LPCRECT prcBorder,
2270         IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
2271 {
2272     ok(0, "unexpected call\n");
2273     return E_NOTIMPL;
2274 }
2275
2276 static HRESULT WINAPI DocHostUIHandler_TranslateAccelerator(IDocHostUIHandler2 *iface, LPMSG lpMsg,
2277         const GUID *pguidCmdGroup, DWORD nCmdID)
2278 {
2279     ok(0, "unexpected call\n");
2280     return E_NOTIMPL;
2281 }
2282
2283 static HRESULT WINAPI DocHostUIHandler_GetOptionKeyPath(IDocHostUIHandler2 *iface,
2284         LPOLESTR *pchKey, DWORD dw)
2285 {
2286     CHECK_EXPECT(GetOptionKeyPath);
2287     ok(pchKey != NULL, "pchKey = NULL\n");
2288     ok(!dw, "dw=%d, expected 0\n", dw);
2289     if(pchKey)
2290         ok(!*pchKey, "*pchKey=%p, expected NULL\n", *pchKey);
2291     return S_OK;
2292 }
2293
2294 static HRESULT WINAPI DocHostUIHandler_GetDropTarget(IDocHostUIHandler2 *iface,
2295         IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
2296 {
2297     CHECK_EXPECT(GetDropTarget);
2298     /* TODO */
2299     return E_NOTIMPL;
2300 }
2301
2302 static HRESULT WINAPI DocHostUIHandler_GetExternal(IDocHostUIHandler2 *iface, IDispatch **ppDispatch)
2303 {
2304     CHECK_EXPECT(GetExternal);
2305     *ppDispatch = &External;
2306     return S_FALSE;
2307 }
2308
2309 static HRESULT WINAPI DocHostUIHandler_TranslateUrl(IDocHostUIHandler2 *iface, DWORD dwTranslate,
2310         OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
2311 {
2312     CHECK_EXPECT(TranslateUrl);
2313     ok(!dwTranslate, "dwTranslate = %x\n", dwTranslate);
2314     ok(!strcmp_wa(pchURLIn, "about:blank"), "pchURLIn = %s\n", wine_dbgstr_w(pchURLIn));
2315     ok(ppchURLOut != NULL, "ppchURLOut == NULL\n");
2316     ok(!*ppchURLOut, "*ppchURLOut = %p\n", *ppchURLOut);
2317
2318     return S_FALSE;
2319 }
2320
2321 static HRESULT WINAPI DocHostUIHandler_FilterDataObject(IDocHostUIHandler2 *iface, IDataObject *pDO,
2322         IDataObject **ppPORet)
2323 {
2324     ok(0, "unexpected call\n");
2325     return E_NOTIMPL;
2326 }
2327
2328 static HRESULT WINAPI DocHostUIHandler_GetOverrideKeyPath(IDocHostUIHandler2 *iface,
2329         LPOLESTR *pchKey, DWORD dw)
2330 {
2331     CHECK_EXPECT(GetOverrideKeyPath);
2332     ok(pchKey != NULL, "pchKey = NULL\n");
2333     if(pchKey)
2334         ok(!*pchKey, "*pchKey=%p, expected NULL\n", *pchKey);
2335     ok(!dw, "dw=%d, xepected 0\n", dw);
2336     return S_OK;
2337 }
2338
2339 static const IDocHostUIHandler2Vtbl DocHostUIHandlerVtbl = {
2340     DocHostUIHandler_QueryInterface,
2341     DocHostUIHandler_AddRef,
2342     DocHostUIHandler_Release,
2343     DocHostUIHandler_ShowContextMenu,
2344     DocHostUIHandler_GetHostInfo,
2345     DocHostUIHandler_ShowUI,
2346     DocHostUIHandler_HideUI,
2347     DocHostUIHandler_UpdateUI,
2348     DocHostUIHandler_EnableModeless,
2349     DocHostUIHandler_OnDocWindowActivate,
2350     DocHostUIHandler_OnFrameWindowActivate,
2351     DocHostUIHandler_ResizeBorder,
2352     DocHostUIHandler_TranslateAccelerator,
2353     DocHostUIHandler_GetOptionKeyPath,
2354     DocHostUIHandler_GetDropTarget,
2355     DocHostUIHandler_GetExternal,
2356     DocHostUIHandler_TranslateUrl,
2357     DocHostUIHandler_FilterDataObject,
2358     DocHostUIHandler_GetOverrideKeyPath
2359 };
2360
2361 static IDocHostUIHandler2 DocHostUIHandler = { &DocHostUIHandlerVtbl };
2362
2363 static HRESULT WINAPI OleCommandTarget_QueryInterface(IOleCommandTarget *iface,
2364         REFIID riid, void **ppv)
2365 {
2366     return QueryInterface(riid, ppv);
2367 }
2368
2369 static ULONG WINAPI OleCommandTarget_AddRef(IOleCommandTarget *iface)
2370 {
2371     return 2;
2372 }
2373
2374 static ULONG WINAPI OleCommandTarget_Release(IOleCommandTarget *iface)
2375 {
2376     return 1;
2377 }
2378
2379 static HRESULT WINAPI OleCommandTarget_QueryStatus(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
2380         ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
2381 {
2382     ok(!pguidCmdGroup, "pguidCmdGroup != MULL\n");
2383     ok(cCmds == 1, "cCmds=%d, expected 1\n", cCmds);
2384     ok(!pCmdText, "pCmdText != NULL\n");
2385
2386     switch(prgCmds[0].cmdID) {
2387     case OLECMDID_SETPROGRESSTEXT:
2388         CHECK_EXPECT(QueryStatus_SETPROGRESSTEXT);
2389         prgCmds[0].cmdf = OLECMDF_ENABLED;
2390         return S_OK;
2391     case OLECMDID_OPEN:
2392         CHECK_EXPECT(QueryStatus_OPEN);
2393         prgCmds[0].cmdf = 0;
2394         return S_OK;
2395     case OLECMDID_NEW:
2396         CHECK_EXPECT(QueryStatus_NEW);
2397         prgCmds[0].cmdf = 0;
2398         return S_OK;
2399     default:
2400         ok(0, "unexpected command %d\n", prgCmds[0].cmdID);
2401     };
2402
2403     return E_FAIL;
2404 }
2405
2406 static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
2407         DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
2408 {
2409     if((!pguidCmdGroup || !IsEqualGUID(pguidCmdGroup, &CGID_Explorer))
2410         && (!pguidCmdGroup || !IsEqualGUID(&CGID_ShellDocView, pguidCmdGroup) || nCmdID != 63))
2411         test_readyState(NULL);
2412
2413     if(!pguidCmdGroup) {
2414         switch(nCmdID) {
2415         case OLECMDID_SETPROGRESSMAX:
2416             CHECK_EXPECT2(Exec_SETPROGRESSMAX);
2417             ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt);
2418             ok(pvaIn != NULL, "pvaIn == NULL\n");
2419             if(pvaIn) {
2420                 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
2421                 if(load_state == LD_NO)
2422                     ok(V_I4(pvaIn) == 0, "V_I4(pvaIn)=%d, expected 0\n", V_I4(pvaIn));
2423             }
2424             ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
2425             return S_OK;
2426         case OLECMDID_SETPROGRESSPOS:
2427             CHECK_EXPECT2(Exec_SETPROGRESSPOS);
2428             ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt);
2429             ok(pvaIn != NULL, "pvaIn == NULL\n");
2430             if(pvaIn) {
2431                 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
2432                 if(load_state == LD_NO)
2433                     ok(V_I4(pvaIn) == 0, "V_I4(pvaIn)=%d, expected 0\n", V_I4(pvaIn));
2434             }
2435             ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
2436             return S_OK;
2437         case OLECMDID_HTTPEQUIV_DONE:
2438             CHECK_EXPECT(Exec_HTTPEQUIV_DONE);
2439             ok(nCmdexecopt == 0, "nCmdexecopts=%08x\n", nCmdexecopt);
2440             ok(pvaOut == NULL, "pvaOut=%p\n", pvaOut);
2441             ok(pvaIn == NULL, "pvaIn=%p\n", pvaIn);
2442             readystate_set_loading = FALSE;
2443             readystate_set_interactive = FALSE;
2444             load_state = LD_COMPLETE;
2445             return S_OK;
2446         case OLECMDID_SETDOWNLOADSTATE:
2447             ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt);
2448             ok(pvaOut == NULL, "pvaOut=%p\n", pvaOut);
2449             ok(pvaIn != NULL, "pvaIn == NULL\n");
2450             ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d\n", V_VT(pvaIn));
2451
2452             switch(V_I4(pvaIn)) {
2453             case 0:
2454                 CHECK_EXPECT(Exec_SETDOWNLOADSTATE_0);
2455                 load_state = LD_INTERACTIVE;
2456                 break;
2457             case 1:
2458                 CHECK_EXPECT(Exec_SETDOWNLOADSTATE_1);
2459                 readystate_set_interactive = (load_state != LD_INTERACTIVE);
2460                 break;
2461             default:
2462                 ok(0, "unexpevted V_I4(pvaIn)=%d\n", V_I4(pvaIn));
2463             }
2464
2465             return S_OK;
2466         case OLECMDID_UPDATECOMMANDS:
2467             CHECK_EXPECT(Exec_UPDATECOMMANDS);
2468             ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt);
2469             ok(pvaIn == NULL, "pvaIn=%p\n", pvaIn);
2470             ok(pvaOut == NULL, "pvaOut=%p\n", pvaOut);
2471             return S_OK;
2472         case OLECMDID_SETTITLE:
2473             CHECK_EXPECT2(Exec_SETTITLE);
2474             ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt);
2475             ok(pvaIn != NULL, "pvaIn == NULL\n");
2476             ok(pvaOut == NULL, "pvaOut=%p\n", pvaOut);
2477             ok(V_VT(pvaIn) == VT_BSTR, "V_VT(pvaIn)=%d\n", V_VT(pvaIn));
2478             ok(V_BSTR(pvaIn) != NULL, "V_BSTR(pvaIn) == NULL\n"); /* TODO */
2479             return S_OK;
2480         case OLECMDID_HTTPEQUIV:
2481             CHECK_EXPECT2(Exec_HTTPEQUIV);
2482             ok(!nCmdexecopt, "nCmdexecopts=%08x\n", nCmdexecopt);
2483             ok(pvaIn != NULL, "pvaIn == NULL\n");
2484             ok(pvaOut == NULL, "pvaOut=%p\n", pvaOut);
2485             ok(V_VT(pvaIn) == VT_BSTR, "V_VT(pvaIn)=%d\n", V_VT(pvaIn));
2486             ok(V_BSTR(pvaIn) != NULL, "V_BSTR(pvaIn) = NULL\n");
2487             test_readyState(NULL);
2488             return S_OK;
2489         case OLECMDID_UPDATETRAVELENTRY_DATARECOVERY:
2490             return E_FAIL; /* FIXME */
2491         default:
2492             ok(0, "unexpected command %d\n", nCmdID);
2493             return E_FAIL;
2494         };
2495     }
2496
2497     if(IsEqualGUID(&CGID_ShellDocView, pguidCmdGroup)) {
2498         ok(nCmdexecopt == 0, "nCmdexecopts=%08x\n", nCmdexecopt);
2499
2500         switch(nCmdID) {
2501         case 37:
2502             CHECK_EXPECT2(Exec_ShellDocView_37);
2503
2504             if(load_from_stream || navigated_load)
2505                 test_GetCurMoniker(doc_unk, NULL, about_blank_url);
2506             else if(!editmode)
2507                 test_GetCurMoniker(doc_unk, doc_mon, NULL);
2508
2509             ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
2510             ok(pvaIn != NULL, "pvaIn == NULL\n");
2511             if(pvaIn) {
2512                 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
2513                 ok(V_I4(pvaIn) == 0, "V_I4(pvaIn)=%d, expected 0\n", V_I4(pvaIn));
2514             }
2515             return S_OK;
2516
2517         case 63: {
2518             IHTMLPrivateWindow *priv_window;
2519             HRESULT hres;
2520
2521             CHECK_EXPECT(Exec_ShellDocView_63);
2522             ok(pvaIn != NULL, "pvaIn == NULL\n");
2523             ok(V_VT(pvaIn) == VT_UNKNOWN, "V_VT(pvaIn) = %d\n", V_VT(pvaIn));
2524             ok(V_UNKNOWN(pvaIn) != NULL, "VPUNKNOWN(pvaIn) = NULL\n");
2525             ok(pvaOut != NULL, "pvaOut == NULL\n");
2526             ok(V_VT(pvaOut) == VT_EMPTY, "V_VT(pvaOut) = %d\n", V_VT(pvaOut));
2527
2528             hres = IUnknown_QueryInterface(V_UNKNOWN(pvaIn), &IID_IHTMLPrivateWindow, (void**)&priv_window);
2529             ok(hres == S_OK, "Could not get IHTMLPrivateWindow: %08x\n", hres);
2530             if(SUCCEEDED(hres))
2531                 IHTMLPrivateWindow_Release(priv_window);
2532
2533             load_state = LD_LOADING;
2534             return S_OK; /* TODO */
2535         }
2536
2537         case 67:
2538             CHECK_EXPECT(Exec_ShellDocView_67);
2539             ok(pvaIn != NULL, "pvaIn == NULL\n");
2540             ok(V_VT(pvaIn) == VT_BSTR, "V_VT(pvaIn) = %d\n", V_VT(pvaIn));
2541             ok(!strcmp_wa(V_BSTR(pvaIn), "about:blank"), "V_BSTR(pvaIn) = %s\n", wine_dbgstr_w(V_BSTR(pvaIn)));
2542             ok(pvaOut != NULL, "pvaOut == NULL\n");
2543             ok(V_VT(pvaOut) == VT_BOOL, "V_VT(pvaOut) = %d\n", V_VT(pvaOut));
2544             ok(V_BOOL(pvaOut) == VARIANT_TRUE, "V_BOOL(pvaOut) = %x\n", V_BOOL(pvaOut));
2545             load_state = LD_DOLOAD;
2546             return S_OK;
2547
2548         case 84:
2549             CHECK_EXPECT2(Exec_ShellDocView_84);
2550
2551             ok(pvaIn == NULL, "pvaIn != NULL\n");
2552             ok(pvaOut != NULL, "pvaOut == NULL\n");
2553             if(pvaIn)
2554                 ok(V_VT(pvaOut) == VT_EMPTY, "V_VT(pvaOut)=%d\n", V_VT(pvaOut));
2555
2556             return E_NOTIMPL;
2557
2558         case 103:
2559             CHECK_EXPECT2(Exec_ShellDocView_103);
2560
2561             ok(pvaIn == NULL, "pvaIn != NULL\n");
2562             ok(pvaOut == NULL, "pvaOut != NULL\n");
2563
2564             return E_NOTIMPL;
2565
2566         case 105:
2567             CHECK_EXPECT2(Exec_ShellDocView_105);
2568
2569             ok(pvaIn != NULL, "pvaIn == NULL\n");
2570             ok(pvaOut == NULL, "pvaOut != NULL\n");
2571
2572             return E_NOTIMPL;
2573
2574         case 140:
2575             CHECK_EXPECT2(Exec_ShellDocView_140);
2576
2577             ok(pvaIn == NULL, "pvaIn != NULL\n");
2578             ok(pvaOut == NULL, "pvaOut != NULL\n");
2579
2580             return E_NOTIMPL;
2581
2582         default:
2583             ok(0, "unexpected command %d\n", nCmdID);
2584             return E_FAIL;
2585         };
2586     }
2587
2588     if(IsEqualGUID(&CGID_MSHTML, pguidCmdGroup)) {
2589         ok(nCmdexecopt == 0, "nCmdexecopts=%08x\n", nCmdexecopt);
2590
2591         switch(nCmdID) {
2592         case IDM_PARSECOMPLETE:
2593             CHECK_EXPECT(Exec_MSHTML_PARSECOMPLETE);
2594             ok(pvaIn == NULL, "pvaIn != NULL\n");
2595             ok(pvaOut == NULL, "pvaOut != NULL\n");
2596             return S_OK;
2597         default:
2598             ok(0, "unexpected command %d\n", nCmdID);
2599         };
2600     }
2601
2602     if(IsEqualGUID(&CGID_DocHostCmdPriv, pguidCmdGroup)) {
2603         switch(nCmdID) {
2604         case DOCHOST_DOCCANNAVIGATE:
2605             CHECK_EXPECT(Exec_DOCCANNAVIGATE);
2606             ok(pvaIn != NULL, "pvaIn == NULL\n");
2607             ok(pvaOut == NULL, "pvaOut != NULL\n");
2608             ok(V_VT(pvaIn) == VT_UNKNOWN, "V_VT(pvaIn) != VT_UNKNOWN\n");
2609             /* FIXME: test V_UNKNOWN(pvaIn) == window */
2610             return S_OK;
2611         default:
2612             return E_FAIL; /* TODO */
2613         }
2614     }
2615
2616     if(IsEqualGUID(&CGID_Explorer, pguidCmdGroup)) {
2617         ok(nCmdexecopt == 0, "nCmdexecopts=%08x\n", nCmdexecopt);
2618
2619         switch(nCmdID) {
2620         case 69:
2621             CHECK_EXPECT2(Exec_Explorer_69);
2622             ok(pvaIn == NULL, "pvaIn != NULL\n");
2623             ok(pvaOut != NULL, "pvaOut == NULL\n");
2624             return E_NOTIMPL;
2625         default:
2626             ok(0, "unexpected cmd %d of CGID_Explorer\n", nCmdID);
2627         }
2628         return E_NOTIMPL;
2629     }
2630
2631     if(IsEqualGUID(&CGID_DocHostCommandHandler, pguidCmdGroup)) {
2632         switch (nCmdID) {
2633         case OLECMDID_PAGEACTIONBLOCKED: /* win2k3 */
2634             SET_EXPECT(SetStatusText);
2635             ok(pvaIn == NULL, "pvaIn != NULL\n");
2636             ok(pvaOut == NULL, "pvaOut != NULL\n");
2637             return S_OK;
2638         case OLECMDID_SHOWSCRIPTERROR:
2639             /* TODO */
2640             return S_OK;
2641         default:
2642             ok(0, "unexpected command %d\n", nCmdID);
2643             return E_FAIL;
2644         }
2645     }
2646
2647     ok(0, "unexpected pguidCmdGroup: %s\n", debugstr_guid(pguidCmdGroup));
2648     return E_NOTIMPL;
2649 }
2650
2651 static IOleCommandTargetVtbl OleCommandTargetVtbl = {
2652     OleCommandTarget_QueryInterface,
2653     OleCommandTarget_AddRef,
2654     OleCommandTarget_Release,
2655     OleCommandTarget_QueryStatus,
2656     OleCommandTarget_Exec
2657 };
2658
2659 static IOleCommandTarget OleCommandTarget = { &OleCommandTargetVtbl };
2660
2661 static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
2662 {
2663     return QueryInterface(riid, ppv);
2664 }
2665
2666 static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
2667         LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
2668         EXCEPINFO *pExcepInfo, UINT *puArgErr)
2669 {
2670     ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n");
2671     ok(pDispParams != NULL, "pDispParams == NULL\n");
2672     ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo);
2673     ok(puArgErr != NULL, "puArgErr == NULL\n");
2674     ok(V_VT(pVarResult) == 0, "V_VT(pVarResult)=%d, expected 0\n", V_VT(pVarResult));
2675     ok(wFlags == DISPATCH_PROPERTYGET, "wFlags=%08x, expected DISPATCH_PROPERTYGET\n", wFlags);
2676     test_readyState(NULL);
2677
2678     switch(dispIdMember) {
2679     case DISPID_AMBIENT_USERMODE:
2680         CHECK_EXPECT2(Invoke_AMBIENT_USERMODE);
2681         V_VT(pVarResult) = VT_BOOL;
2682         V_BOOL(pVarResult) = VARIANT_TRUE;
2683         return S_OK;
2684     case DISPID_AMBIENT_DLCONTROL:
2685         CHECK_EXPECT2(Invoke_AMBIENT_DLCONTROL);
2686         return E_FAIL;
2687     case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
2688         CHECK_EXPECT2(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2689         return E_FAIL;
2690     case DISPID_AMBIENT_SILENT:
2691         CHECK_EXPECT2(Invoke_AMBIENT_SILENT);
2692         V_VT(pVarResult) = VT_BOOL;
2693         V_BOOL(pVarResult) = VARIANT_FALSE;
2694         return S_OK;
2695     case DISPID_AMBIENT_USERAGENT:
2696         CHECK_EXPECT(Invoke_AMBIENT_USERAGENT);
2697         return E_FAIL;
2698     case DISPID_AMBIENT_PALETTE:
2699         CHECK_EXPECT(Invoke_AMBIENT_PALETTE);
2700         return E_FAIL;
2701     };
2702
2703     ok(0, "unexpected dispid %d\n", dispIdMember);
2704     return E_FAIL;
2705 }
2706
2707 static IDispatchVtbl DispatchVtbl = {
2708     Dispatch_QueryInterface,
2709     Dispatch_AddRef,
2710     Dispatch_Release,
2711     Dispatch_GetTypeInfoCount,
2712     Dispatch_GetTypeInfo,
2713     Dispatch_GetIDsOfNames,
2714     Dispatch_Invoke
2715 };
2716
2717 static IDispatch Dispatch = { &DispatchVtbl };
2718
2719 static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface,
2720                                                      REFIID riid, void **ppv)
2721 {
2722     return QueryInterface(riid, ppv);
2723 }
2724
2725 static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
2726 {
2727     return 2;
2728 }
2729
2730 static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
2731 {
2732     return 1;
2733 }
2734
2735 static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService,
2736                                     REFIID riid, void **ppv)
2737 {
2738     /*
2739      * Services used by HTMLDocument:
2740      *
2741      * IOleUndoManager
2742      * IInternetSecurityManager
2743      * ITargetFrame
2744      * {D5F78C80-5252-11CF-90FA-00AA0042106E}
2745      * HTMLFrameBase
2746      * IShellObject
2747      * {3050F312-98B5-11CF-BB82-00AA00BDCE0B}
2748      * {53A2D5B1-D2FC-11D0-84E0-006097C9987D}
2749      * {AD7F6C62-F6BD-11D2-959B-006097C553C8}
2750      * DefView (?)
2751      * {6D12FE80-7911-11CF-9534-0000C05BAE0B}
2752      * IElementBehaviorFactory
2753      * {3050F429-98B5-11CF-BB82-00AA00BDCE0B}
2754      * STopLevelBrowser
2755      * IHTMLWindow2
2756      * IInternetProtocol
2757      * IWebBrowserApp
2758      * UrlHostory
2759      * IHTMLEditHost
2760      * IHlinkFrame
2761      */
2762
2763     if(IsEqualGUID(&IID_IHlinkFrame, guidService)) {
2764         ok(IsEqualGUID(&IID_IHlinkFrame, riid), "unexpected riid\n");
2765         *ppv = &HlinkFrame;
2766         return S_OK;
2767     }
2768
2769     if(IsEqualGUID(&SID_SNewWindowManager, guidService)) {
2770         ok(IsEqualGUID(&IID_INewWindowManager, riid), "unexpected riid\n");
2771         *ppv = &NewWindowManager;
2772         return S_OK;
2773     }
2774
2775     return E_NOINTERFACE;
2776 }
2777
2778 static const IServiceProviderVtbl ServiceProviderVtbl = {
2779     ServiceProvider_QueryInterface,
2780     ServiceProvider_AddRef,
2781     ServiceProvider_Release,
2782     ServiceProvider_QueryService
2783 };
2784
2785 static IServiceProvider ServiceProvider = { &ServiceProviderVtbl };
2786
2787 static HRESULT WINAPI AdviseSink_QueryInterface(IAdviseSinkEx *iface,
2788         REFIID riid, void **ppv)
2789 {
2790     return QueryInterface(riid, ppv);
2791 }
2792
2793 static ULONG WINAPI AdviseSink_AddRef(IAdviseSinkEx *iface)
2794 {
2795     return 2;
2796 }
2797
2798 static ULONG WINAPI AdviseSink_Release(IAdviseSinkEx *iface)
2799 {
2800     return 1;
2801 }
2802
2803 static void WINAPI AdviseSink_OnDataChange(IAdviseSinkEx *iface,
2804         FORMATETC *pFormatetc, STGMEDIUM *pStgmed)
2805 {
2806     ok(0, "unexpected call\n");
2807 }
2808
2809 static void WINAPI AdviseSink_OnViewChange(IAdviseSinkEx *iface,
2810         DWORD dwAspect, LONG lindex)
2811 {
2812     ok(0, "unexpected call\n");
2813 }
2814
2815 static void WINAPI AdviseSink_OnRename(IAdviseSinkEx *iface, IMoniker *pmk)
2816 {
2817     ok(0, "unexpected call\n");
2818 }
2819
2820 static void WINAPI AdviseSink_OnSave(IAdviseSinkEx *iface)
2821 {
2822     ok(0, "unexpected call\n");
2823 }
2824
2825 static void WINAPI AdviseSink_OnClose(IAdviseSinkEx *iface)
2826 {
2827     ok(0, "unexpected call\n");
2828 }
2829
2830 static void WINAPI AdviseSinkEx_OnViewStatusChange(IAdviseSinkEx *iface, DWORD dwViewStatus)
2831 {
2832     ok(0, "unexpected call\n");
2833 }
2834
2835 static void WINAPI ObjectAdviseSink_OnClose(IAdviseSinkEx *iface)
2836 {
2837     CHECK_EXPECT(Advise_Close);
2838 }
2839
2840 static const IAdviseSinkExVtbl AdviseSinkVtbl = {
2841     AdviseSink_QueryInterface,
2842     AdviseSink_AddRef,
2843     AdviseSink_Release,
2844     AdviseSink_OnDataChange,
2845     AdviseSink_OnViewChange,
2846     AdviseSink_OnRename,
2847     AdviseSink_OnSave,
2848     ObjectAdviseSink_OnClose,
2849     AdviseSinkEx_OnViewStatusChange
2850 };
2851
2852 static IAdviseSinkEx AdviseSink = { &AdviseSinkVtbl };
2853
2854 static HRESULT WINAPI ViewAdviseSink_QueryInterface(IAdviseSinkEx *iface,
2855         REFIID riid, void **ppv)
2856 {
2857     if(IsEqualGUID(&IID_IAdviseSinkEx, riid)) {
2858         *ppv = iface;
2859         return S_OK;
2860     }
2861
2862     ok(0, "unexpected riid %s\n", debugstr_guid(riid));
2863     *ppv = NULL;
2864     return E_NOINTERFACE;
2865 }
2866
2867 static void WINAPI ViewAdviseSink_OnViewChange(IAdviseSinkEx *iface,
2868         DWORD dwAspect, LONG lindex)
2869 {
2870     CHECK_EXPECT2(OnViewChange);
2871
2872     ok(dwAspect == DVASPECT_CONTENT, "dwAspect = %d\n", dwAspect);
2873     ok(lindex == -1, "lindex = %d\n", lindex);
2874 }
2875
2876 static const IAdviseSinkExVtbl ViewAdviseSinkVtbl = {
2877     ViewAdviseSink_QueryInterface,
2878     AdviseSink_AddRef,
2879     AdviseSink_Release,
2880     AdviseSink_OnDataChange,
2881     ViewAdviseSink_OnViewChange,
2882     AdviseSink_OnRename,
2883     AdviseSink_OnSave,
2884     AdviseSink_OnClose,
2885     AdviseSinkEx_OnViewStatusChange
2886 };
2887
2888 static IAdviseSinkEx ViewAdviseSink = { &ViewAdviseSinkVtbl };
2889
2890 DEFINE_GUID(IID_unk1, 0xD48A6EC6,0x6A4A,0x11CF,0x94,0xA7,0x44,0x45,0x53,0x54,0x00,0x00); /* HTMLWindow2 ? */
2891 DEFINE_GUID(IID_IThumbnailView, 0x7BB0B520,0xB1A7,0x11D2,0xBB,0x23,0x00,0xC0,0x4F,0x79,0xAB,0xCD);
2892 DEFINE_GUID(IID_IRenMailEditor, 0x000670BA,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
2893 DEFINE_GUID(IID_unk4, 0x305104a6,0x98b5,0x11cf,0xbb,0x82,0x00,0xaa,0x00,0xbd,0xce,0x0b);
2894 DEFINE_GUID(IID_IDocHostUIHandlerPriv, 0xf0d241d1,0x5d0e,0x4e85,0xbc,0xb4,0xfa,0xd7,0xf7,0xc5,0x52,0x8c);
2895
2896 static HRESULT QueryInterface(REFIID riid, void **ppv)
2897 {
2898     *ppv = NULL;
2899
2900     if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IOleClientSite, riid))
2901         *ppv = &ClientSite;
2902     else if(IsEqualGUID(&IID_IOleDocumentSite, riid))
2903         *ppv = &DocumentSite;
2904     else if(IsEqualGUID(&IID_IDocHostUIHandler, riid) || IsEqualGUID(&IID_IDocHostUIHandler2, riid))
2905         *ppv = &DocHostUIHandler;
2906     else if(IsEqualGUID(&IID_IOleContainer, riid))
2907         *ppv = &OleContainer;
2908     else if(IsEqualGUID(&IID_IOleWindow, riid) || IsEqualGUID(&IID_IOleInPlaceSite, riid))
2909         *ppv = &InPlaceSiteWindowless;
2910     else if(IsEqualGUID(&IID_IOleCommandTarget , riid))
2911         *ppv = &OleCommandTarget;
2912     else if(IsEqualGUID(&IID_IDispatch, riid))
2913         *ppv = &Dispatch;
2914     else if(IsEqualGUID(&IID_IServiceProvider, riid))
2915         *ppv = &ServiceProvider;
2916     else if(IsEqualGUID(&IID_IOleInPlaceSiteEx, riid))
2917         *ppv = ipsex ? &InPlaceSiteWindowless : NULL;
2918     else if(IsEqualGUID(&IID_IOleInPlaceSiteWindowless, riid))
2919         *ppv = ipsw ? &InPlaceSiteWindowless : NULL;
2920     else if(IsEqualGUID(&IID_IOleControlSite, riid))
2921         *ppv = &OleControlSite;
2922     else if(IsEqualGUID(&IID_IDocHostShowUI, riid))
2923         return E_NOINTERFACE; /* TODO */
2924     else if(IsEqualGUID(&IID_IProxyManager, riid))
2925         return E_NOINTERFACE; /* ? */
2926     else if(IsEqualGUID(&IID_unk1, riid))
2927         return E_NOINTERFACE; /* HTMLWindow2 ? */
2928     else if(IsEqualGUID(&IID_IThumbnailView, riid))
2929         return E_NOINTERFACE; /* ? */
2930     else if(IsEqualGUID(&IID_IRenMailEditor, riid))
2931         return E_NOINTERFACE; /* ? */
2932     else if(IsEqualGUID(&IID_unk4, riid))
2933         return E_NOINTERFACE; /* ? */
2934     else if(IsEqualGUID(&IID_IDocHostUIHandlerPriv, riid))
2935         return E_NOINTERFACE; /* ? */
2936     else
2937         ok(0, "unexpected riid %s\n", debugstr_guid(riid));
2938
2939     if(*ppv)
2940         return S_OK;
2941     return E_NOINTERFACE;
2942 }
2943
2944 static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
2945 {
2946     return DefWindowProc(hwnd, msg, wParam, lParam);
2947 }
2948
2949 static void test_doscroll(IUnknown *unk)
2950 {
2951     IHTMLDocument3 *doc;
2952     IHTMLElement2 *elem2;
2953     IHTMLElement *elem;
2954     VARIANT v;
2955     HRESULT hres;
2956
2957     hres = IUnknown_QueryInterface(unk, &IID_IHTMLDocument3, (void**)&doc);
2958     ok(hres == S_OK, "Could not get IHTMLDocument3 iface: %08x\n", hres);
2959     if(FAILED(hres))
2960         return;
2961
2962     hres = IHTMLDocument3_get_documentElement(doc, &elem);
2963     IHTMLDocument3_Release(doc);
2964     ok(hres == S_OK, "get_documentElement failed: %08x\n", hres);
2965     switch(load_state) {
2966     case LD_DOLOAD:
2967     case LD_NO:
2968         if(!navigated_load)
2969             ok(!elem, "elem != NULL\n");
2970     default:
2971         break;
2972     case LD_INTERACTIVE:
2973     case LD_COMPLETE:
2974         ok(elem != NULL, "elem == NULL\n");
2975     }
2976     if(!elem)
2977         return;
2978
2979     hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLElement2, (void**)&elem2);
2980     IHTMLElement_Release(elem);
2981     ok(hres == S_OK, "Could not get IHTMLElement2 iface: %08x\n", hres);
2982
2983     V_VT(&v) = VT_BSTR;
2984     V_BSTR(&v) = a2bstr("left");
2985     hres = IHTMLElement2_doScroll(elem2, v);
2986     SysFreeString(V_BSTR(&v));
2987     IHTMLElement2_Release(elem2);
2988
2989     if(inplace_deactivated)
2990         ok(hres == E_PENDING, "doScroll failed: %08x\n", hres);
2991     else if(load_state == LD_COMPLETE)
2992         ok(hres == S_OK, "doScroll failed: %08x\n", hres);
2993     else
2994         ok(hres == E_PENDING || hres == S_OK, "doScroll failed: %08x\n", hres);
2995 }
2996
2997 static void _test_readyState(unsigned line, IUnknown *unk)
2998 {
2999     IHTMLDocument2 *htmldoc;
3000     DISPPARAMS dispparams;
3001     IHTMLElement *elem;
3002     BSTR state;
3003     VARIANT out;
3004     HRESULT hres;
3005
3006     static const LPCSTR expected_state[] = {
3007         "uninitialized",
3008         "loading",
3009         NULL,
3010         "interactive",
3011         "complete",
3012         "uninitialized"
3013     };
3014
3015     if(open_call)
3016         return; /* FIXME */
3017
3018     if(!unk)
3019         unk = doc_unk;
3020
3021     hres = IUnknown_QueryInterface(unk, &IID_IHTMLDocument2, (void**)&htmldoc);
3022     ok(hres == S_OK, "QueryInterface(IID_IHTMLDocument2) failed: %08x\n", hres);
3023     if(FAILED(hres))
3024         return;
3025
3026     hres = IHTMLDocument2_get_readyState(htmldoc, NULL);
3027     ok(hres == E_POINTER, "get_readyState failed: %08x, expected\n", hres);
3028
3029     hres = IHTMLDocument2_get_readyState(htmldoc, &state);
3030     ok(hres == S_OK, "get_ReadyState failed: %08x\n", hres);
3031
3032     if(!strcmp_wa(state, "interactive") && load_state == LD_LOADING)
3033         load_state = LD_INTERACTIVE;
3034
3035     ok_(__FILE__, line)
3036         (!strcmp_wa(state, expected_state[load_state]), "unexpected state %s, expected %d\n",
3037          wine_dbgstr_w(state), load_state);
3038     SysFreeString(state);
3039
3040     hres = IHTMLDocument2_get_body(htmldoc, &elem);
3041     ok_(__FILE__,line)(hres == S_OK, "get_body failed: %08x\n", hres);
3042     if(elem) {
3043         IHTMLElement2 *elem2;
3044         VARIANT var;
3045
3046         hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLElement2, (void**)&elem2);
3047         IHTMLElement_Release(elem);
3048         ok(hres == S_OK, "Could not get IHTMLElement2 iface: %08x\n", hres);
3049
3050         hres = IHTMLElement2_get_readyState(elem2, &var);
3051         IHTMLElement2_Release(elem2);
3052         ok(hres == S_OK, "get_readyState failed: %08x\n", hres);
3053         ok(V_VT(&var) == VT_BSTR, "V_VT(state) = %d\n", V_VT(&var));
3054         ok(!strcmp_wa(V_BSTR(&var), "complete"), "unexpected body state %s\n", wine_dbgstr_w(V_BSTR(&var)));
3055         VariantClear(&var);
3056     }else {
3057         ok_(__FILE__,line)(load_state != LD_COMPLETE, "body is NULL in complete state\n");
3058     }
3059
3060     dispparams.cArgs = 0;
3061     dispparams.cNamedArgs = 0;
3062     dispparams.rgdispidNamedArgs = NULL;
3063     dispparams.rgvarg = NULL;
3064
3065     VariantInit(&out);
3066
3067     hres = IHTMLDocument2_Invoke(htmldoc, DISPID_READYSTATE, &IID_NULL, 0, DISPATCH_PROPERTYGET,
3068                                  &dispparams, &out, NULL, NULL);
3069     ok(hres == S_OK, "Invoke(DISPID_READYSTATE) failed: %08x\n", hres);
3070
3071     ok_(__FILE__,line) (V_VT(&out) == VT_I4, "V_VT(out)=%d\n", V_VT(&out));
3072     ok_(__FILE__,line) (V_I4(&out) == load_state%5, "VT_I4(out)=%d, expected %d\n", V_I4(&out), load_state%5);
3073
3074     test_doscroll((IUnknown*)htmldoc);
3075
3076     IHTMLDocument2_Release(htmldoc);
3077 }
3078
3079 static void test_ViewAdviseSink(IHTMLDocument2 *doc)
3080 {
3081     IViewObject *view;
3082     HRESULT hres;
3083
3084     hres = IHTMLDocument2_QueryInterface(doc, &IID_IViewObject, (void**)&view);
3085     ok(hres == S_OK, "QueryInterface(IID_IViewObject) failed: %08x\n", hres);
3086
3087     hres = IViewObject_SetAdvise(view, DVASPECT_CONTENT, ADVF_PRIMEFIRST, (IAdviseSink*)&ViewAdviseSink);
3088     ok(hres == S_OK, "SetAdvise failed: %08x\n", hres);
3089
3090     IViewObject_Release(view);
3091 }
3092
3093 static void test_ConnectionPoint(IConnectionPointContainer *container, REFIID riid)
3094 {
3095     IConnectionPointContainer *tmp_container = NULL;
3096     IConnectionPoint *cp;
3097     IID iid;
3098     HRESULT hres;
3099
3100     hres = IConnectionPointContainer_FindConnectionPoint(container, riid, &cp);
3101     ok(hres == S_OK, "FindConnectionPoint failed: %08x\n", hres);
3102     if(FAILED(hres))
3103         return;
3104
3105     hres = IConnectionPoint_GetConnectionInterface(cp, &iid);
3106     ok(hres == S_OK, "GetConnectionInterface failed: %08x\n", hres);
3107     ok(IsEqualGUID(riid, &iid), "wrong iid\n");
3108
3109     hres = IConnectionPoint_GetConnectionInterface(cp, NULL);
3110     ok(hres == E_POINTER, "GetConnectionInterface failed: %08x, expected E_POINTER\n", hres);
3111
3112     hres = IConnectionPoint_GetConnectionPointContainer(cp, &tmp_container);
3113     ok(hres == S_OK, "GetConnectionPointContainer failed: %08x\n", hres);
3114     ok(tmp_container == container, "container != tmp_container\n");
3115     if(SUCCEEDED(hres))
3116         IConnectionPointContainer_Release(tmp_container);
3117
3118     hres = IConnectionPoint_GetConnectionPointContainer(cp, NULL);
3119     ok(hres == E_POINTER, "GetConnectionPointContainer failed: %08x, expected E_POINTER\n", hres);
3120
3121     if(IsEqualGUID(&IID_IPropertyNotifySink, riid)) {
3122         DWORD cookie;
3123
3124         hres = IConnectionPoint_Advise(cp, (IUnknown*)&PropertyNotifySink, &cookie);
3125         ok(hres == S_OK, "Advise failed: %08x\n", hres);
3126     }
3127
3128     IConnectionPoint_Release(cp);
3129 }
3130
3131 static void test_ConnectionPointContainer(IHTMLDocument2 *doc)
3132 {
3133     IConnectionPointContainer *container;
3134     HRESULT hres;
3135
3136     hres = IUnknown_QueryInterface(doc, &IID_IConnectionPointContainer, (void**)&container);
3137     ok(hres == S_OK, "QueryInterface(IID_IConnectionPointContainer) failed: %08x\n", hres);
3138     if(FAILED(hres))
3139         return;
3140
3141     test_ConnectionPoint(container, &IID_IDispatch);
3142     test_ConnectionPoint(container, &IID_IPropertyNotifySink);
3143     test_ConnectionPoint(container, &DIID_HTMLDocumentEvents);
3144     test_ConnectionPoint(container, &DIID_HTMLDocumentEvents2);
3145
3146     IConnectionPointContainer_Release(container);
3147 }
3148
3149 static void test_Load(IPersistMoniker *persist, IMoniker *mon)
3150 {
3151     IBindCtx *bind;
3152     HRESULT hres;
3153     WCHAR sz_html_clientsite_objectparam[MAX_PATH];
3154
3155     lstrcpyW(sz_html_clientsite_objectparam, SZ_HTML_CLIENTSITE_OBJECTPARAM);
3156
3157     test_readyState((IUnknown*)persist);
3158
3159     doc_mon = mon;
3160
3161     CreateBindCtx(0, &bind);
3162     IBindCtx_RegisterObjectParam(bind, sz_html_clientsite_objectparam,
3163                                  (IUnknown*)&ClientSite);
3164
3165     if(mon == &Moniker)
3166         SET_EXPECT(GetDisplayName);
3167     if(!set_clientsite) {
3168         SET_EXPECT(Invoke_AMBIENT_USERMODE);
3169         SET_EXPECT(GetHostInfo);
3170         SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
3171         SET_EXPECT(Invoke_AMBIENT_SILENT);
3172         SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
3173         SET_EXPECT(Invoke_AMBIENT_USERAGENT);
3174         SET_EXPECT(Invoke_AMBIENT_PALETTE);
3175         SET_EXPECT(GetOptionKeyPath);
3176         SET_EXPECT(GetOverrideKeyPath);
3177         SET_EXPECT(GetWindow);
3178         SET_EXPECT(Exec_DOCCANNAVIGATE);
3179         SET_EXPECT(QueryStatus_SETPROGRESSTEXT);
3180         SET_EXPECT(Exec_SETPROGRESSMAX);
3181         SET_EXPECT(Exec_SETPROGRESSPOS);
3182         SET_EXPECT(Exec_ShellDocView_37);
3183     }
3184     if(!container_locked) {
3185         SET_EXPECT(GetContainer);
3186         SET_EXPECT(LockContainer);
3187     }
3188     SET_EXPECT(OnChanged_READYSTATE);
3189     SET_EXPECT(Exec_ShellDocView_84);
3190     SET_EXPECT(IsSystemMoniker);
3191     if(mon == &Moniker)
3192         SET_EXPECT(BindToStorage);
3193     SET_EXPECT(SetActiveObject);
3194     if(set_clientsite) {
3195         SET_EXPECT(Invoke_AMBIENT_SILENT);
3196         SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
3197         SET_EXPECT(Exec_ShellDocView_37);
3198     }
3199     load_state = LD_DOLOAD;
3200     expect_LockContainer_fLock = TRUE;
3201     readystate_set_loading = TRUE;
3202
3203     hres = IPersistMoniker_Load(persist, FALSE, mon, bind, 0x12);
3204     ok(hres == S_OK, "Load failed: %08x\n", hres);
3205
3206     if(mon == &Moniker)
3207         CHECK_CALLED(GetDisplayName);
3208     if(!set_clientsite) {
3209         CHECK_CALLED(Invoke_AMBIENT_USERMODE);
3210         CHECK_CALLED(GetHostInfo);
3211         CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
3212         CHECK_CALLED(Invoke_AMBIENT_SILENT);
3213         CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
3214         CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
3215         CHECK_CALLED(Invoke_AMBIENT_PALETTE);
3216         CHECK_CALLED(GetOptionKeyPath);
3217         CHECK_CALLED(GetOverrideKeyPath);
3218         CHECK_CALLED(GetWindow);
3219         CHECK_CALLED(Exec_DOCCANNAVIGATE);
3220         CHECK_CALLED(QueryStatus_SETPROGRESSTEXT);
3221         CHECK_CALLED(Exec_SETPROGRESSMAX);
3222         CHECK_CALLED(Exec_SETPROGRESSPOS);
3223         CHECK_CALLED(Exec_ShellDocView_37);
3224     }
3225     if(!container_locked) {
3226         CHECK_CALLED(GetContainer);
3227         CHECK_CALLED(LockContainer);
3228         container_locked = TRUE;
3229     }
3230     CHECK_CALLED(OnChanged_READYSTATE);
3231     SET_CALLED(IsSystemMoniker); /* IE7 */
3232     SET_CALLED(Exec_ShellDocView_84);
3233     if(mon == &Moniker)
3234         CHECK_CALLED(BindToStorage);
3235     SET_CALLED(SetActiveObject); /* FIXME */
3236     if(set_clientsite) {
3237         CHECK_CALLED(Invoke_AMBIENT_SILENT);
3238         CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
3239         CHECK_CALLED(Exec_ShellDocView_37);
3240     }
3241
3242     set_clientsite = container_locked = TRUE;
3243
3244     test_GetCurMoniker((IUnknown*)persist, mon, NULL);
3245
3246     IBindCtx_Release(bind);
3247
3248     test_readyState((IUnknown*)persist);
3249 }
3250
3251 #define DWL_VERBDONE  0x0001
3252 #define DWL_CSS       0x0002
3253 #define DWL_TRYCSS    0x0004
3254 #define DWL_HTTP      0x0008
3255 #define DWL_EMPTY     0x0010
3256
3257 static void test_download(DWORD flags)
3258 {
3259     HWND hwnd;
3260     MSG msg;
3261
3262     hwnd = FindWindowA("Internet Explorer_Hidden", NULL);
3263     ok(hwnd != NULL, "Could not find hidden window\n");
3264
3265     test_readyState(NULL);
3266
3267     if(flags & (DWL_VERBDONE|DWL_HTTP))
3268         SET_EXPECT(Exec_SETPROGRESSMAX);
3269     if((flags & DWL_VERBDONE) && !load_from_stream)
3270         SET_EXPECT(GetHostInfo);
3271     SET_EXPECT(SetStatusText);
3272     if(!(flags & DWL_EMPTY))
3273         SET_EXPECT(Exec_SETDOWNLOADSTATE_1);
3274     SET_EXPECT(OnViewChange);
3275     SET_EXPECT(GetDropTarget);
3276     if(flags & DWL_TRYCSS)
3277         SET_EXPECT(Exec_ShellDocView_84);
3278     if(flags & DWL_CSS) {
3279         SET_EXPECT(CreateInstance);
3280         SET_EXPECT(Start);
3281         SET_EXPECT(LockRequest);
3282         SET_EXPECT(Terminate);
3283         SET_EXPECT(Protocol_Read);
3284         SET_EXPECT(UnlockRequest);
3285     }
3286     SET_EXPECT(Exec_Explorer_69);
3287     SET_EXPECT(EnableModeless_TRUE); /* IE7 */
3288     SET_EXPECT(Frame_EnableModeless_TRUE); /* IE7 */
3289     SET_EXPECT(EnableModeless_FALSE); /* IE7 */
3290     SET_EXPECT(Frame_EnableModeless_FALSE); /* IE7 */
3291     if(navigated_load)
3292         SET_EXPECT(Exec_ShellDocView_37);
3293     if(flags & DWL_HTTP) {
3294         SET_EXPECT(OnChanged_1012);
3295         SET_EXPECT(Exec_HTTPEQUIV);
3296         SET_EXPECT(Exec_SETTITLE);
3297     }
3298     SET_EXPECT(OnChanged_1005);
3299     SET_EXPECT(OnChanged_READYSTATE);
3300     SET_EXPECT(Exec_SETPROGRESSPOS);
3301     if(!(flags & DWL_EMPTY))
3302         SET_EXPECT(Exec_SETDOWNLOADSTATE_0);
3303     SET_EXPECT(Exec_ShellDocView_103);
3304     SET_EXPECT(Exec_ShellDocView_105);
3305     SET_EXPECT(Exec_ShellDocView_140);
3306     SET_EXPECT(Exec_MSHTML_PARSECOMPLETE);
3307     SET_EXPECT(Exec_HTTPEQUIV_DONE);
3308     SET_EXPECT(SetStatusText);
3309     if(navigated_load) {
3310         SET_EXPECT(UpdateUI);
3311         SET_EXPECT(Exec_UPDATECOMMANDS);
3312         SET_EXPECT(Exec_SETTITLE);
3313     }
3314     expect_status_text = (LPWSTR)0xdeadbeef; /* TODO */
3315
3316     while(!called_Exec_HTTPEQUIV_DONE && GetMessage(&msg, NULL, 0, 0)) {
3317         TranslateMessage(&msg);
3318         DispatchMessage(&msg);
3319     }
3320
3321     if(flags & DWL_VERBDONE)
3322         CHECK_CALLED(Exec_SETPROGRESSMAX);
3323     if(flags & DWL_HTTP)
3324         SET_CALLED(Exec_SETPROGRESSMAX);
3325     if((flags & DWL_VERBDONE) && !load_from_stream) {
3326         if(navigated_load)
3327             todo_wine CHECK_CALLED(GetHostInfo);
3328         else
3329             CHECK_CALLED(GetHostInfo);
3330     }
3331     CHECK_CALLED(SetStatusText);
3332     if(!(flags & DWL_EMPTY))
3333         CHECK_CALLED(Exec_SETDOWNLOADSTATE_1);
3334     CHECK_CALLED(OnViewChange);
3335     if(navigated_load)
3336         CHECK_CALLED(GetDropTarget);
3337     else
3338         SET_CALLED(GetDropTarget);
3339     if(flags & DWL_TRYCSS)
3340         SET_CALLED(Exec_ShellDocView_84);
3341     if(flags & DWL_CSS) {
3342         CHECK_CALLED(CreateInstance);
3343         CHECK_CALLED(Start);
3344         CHECK_CALLED(LockRequest);
3345         CHECK_CALLED(Terminate);
3346         CHECK_CALLED(Protocol_Read);
3347         CHECK_CALLED(UnlockRequest);
3348     }
3349     SET_CALLED(Exec_Explorer_69);
3350     SET_CALLED(EnableModeless_TRUE); /* IE7 */
3351     SET_CALLED(Frame_EnableModeless_TRUE); /* IE7 */
3352     SET_CALLED(EnableModeless_FALSE); /* IE7 */
3353     SET_CALLED(Frame_EnableModeless_FALSE); /* IE7 */
3354     if(navigated_load)
3355         todo_wine CHECK_CALLED(Exec_ShellDocView_37);
3356     if(flags & DWL_HTTP) todo_wine {
3357         CHECK_CALLED(OnChanged_1012);
3358         CHECK_CALLED(Exec_HTTPEQUIV);
3359         CHECK_CALLED(Exec_SETTITLE);
3360     }
3361     CHECK_CALLED(OnChanged_1005);
3362     CHECK_CALLED(OnChanged_READYSTATE);
3363     CHECK_CALLED(Exec_SETPROGRESSPOS);
3364     if(!(flags & DWL_EMPTY))
3365         CHECK_CALLED(Exec_SETDOWNLOADSTATE_0);
3366     SET_CALLED(Exec_ShellDocView_103);
3367     SET_CALLED(Exec_ShellDocView_105);
3368     SET_CALLED(Exec_ShellDocView_140);
3369     CHECK_CALLED(Exec_MSHTML_PARSECOMPLETE);
3370     CHECK_CALLED(Exec_HTTPEQUIV_DONE);
3371     SET_CALLED(SetStatusText);
3372     if(navigated_load) { /* avoiding race, FIXME: fund better way */
3373         SET_CALLED(UpdateUI);
3374         SET_CALLED(Exec_UPDATECOMMANDS);
3375         SET_CALLED(Exec_SETTITLE);
3376     }
3377
3378     load_state = LD_COMPLETE;
3379
3380     test_readyState(NULL);
3381 }
3382
3383 static void test_Persist(IHTMLDocument2 *doc, IMoniker *mon)
3384 {
3385     IPersistMoniker *persist_mon;
3386     IPersistFile *persist_file;
3387     GUID guid;
3388     HRESULT hres;
3389
3390     hres = IUnknown_QueryInterface(doc, &IID_IPersistFile, (void**)&persist_file);
3391     ok(hres == S_OK, "QueryInterface(IID_IPersist) failed: %08x\n", hres);
3392     if(SUCCEEDED(hres)) {
3393         hres = IPersist_GetClassID(persist_file, NULL);
3394         ok(hres == E_INVALIDARG, "GetClassID returned: %08x, expected E_INVALIDARG\n", hres);
3395
3396         hres = IPersist_GetClassID(persist_file, &guid);
3397         ok(hres == S_OK, "GetClassID failed: %08x\n", hres);
3398         ok(IsEqualGUID(&CLSID_HTMLDocument, &guid), "guid != CLSID_HTMLDocument\n");
3399
3400         IPersist_Release(persist_file);
3401     }
3402
3403     hres = IUnknown_QueryInterface(doc, &IID_IPersistMoniker, (void**)&persist_mon);
3404     ok(hres == S_OK, "QueryInterface(IID_IPersistMoniker) failed: %08x\n", hres);
3405     if(SUCCEEDED(hres)) {
3406         hres = IPersistMoniker_GetClassID(persist_mon, NULL);
3407         ok(hres == E_INVALIDARG, "GetClassID returned: %08x, expected E_INVALIDARG\n", hres);
3408
3409         hres = IPersistMoniker_GetClassID(persist_mon, &guid);
3410         ok(hres == S_OK, "GetClassID failed: %08x\n", hres);
3411         ok(IsEqualGUID(&CLSID_HTMLDocument, &guid), "guid != CLSID_HTMLDocument\n");
3412
3413         if(load_state == LD_DOLOAD)
3414             test_Load(persist_mon, mon);
3415
3416         test_readyState((IUnknown*)doc);
3417
3418         IPersistMoniker_Release(persist_mon);
3419     }
3420 }
3421
3422 static void test_put_href(IHTMLDocument2 *doc)
3423 {
3424     IHTMLPrivateWindow *priv_window;
3425     IHTMLWindow2 *window;
3426     IHTMLLocation *location;
3427     BSTR str, str2;
3428     VARIANT vempty;
3429     HRESULT hres;
3430
3431     location = NULL;
3432     hres = IHTMLDocument2_get_location(doc, &location);
3433     ok(hres == S_OK, "get_location failed: %08x\n", hres);
3434     ok(location != NULL, "location == NULL\n");
3435
3436     SET_EXPECT(TranslateUrl);
3437     SET_EXPECT(Navigate);
3438     str = a2bstr("about:blank");
3439     hres = IHTMLLocation_put_href(location, str);
3440     ok(hres == S_OK, "put_href failed: %08x\n", hres);
3441     CHECK_CALLED(TranslateUrl);
3442     CHECK_CALLED(Navigate);
3443
3444     IHTMLLocation_Release(location);
3445
3446     hres = IHTMLDocument2_get_parentWindow(doc, &window);
3447     ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres);
3448
3449     hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLPrivateWindow, (void**)&priv_window);
3450     IHTMLWindow2_Release(window);
3451     ok(hres == S_OK, "QueryInterface(IID_IHTMLPrivateWindow) failed: %08x\n", hres);
3452
3453     readystate_set_loading = TRUE;
3454     navigated_load = TRUE;
3455     SET_EXPECT(TranslateUrl);
3456     SET_EXPECT(Exec_ShellDocView_67);
3457     SET_EXPECT(Invoke_AMBIENT_SILENT);
3458     SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
3459     SET_EXPECT(OnChanged_READYSTATE);
3460     SET_EXPECT(Exec_ShellDocView_63);
3461
3462     str2 = a2bstr("");
3463     V_VT(&vempty) = VT_EMPTY;
3464     hres = IHTMLPrivateWindow_SuperNavigate(priv_window, str, str2, NULL, NULL, &vempty, &vempty, 0);
3465     SysFreeString(str);
3466     SysFreeString(str2);
3467     ok(hres == S_OK, "SuperNavigate failed: %08x\n", hres);
3468
3469     CHECK_CALLED(TranslateUrl);
3470     CHECK_CALLED(Exec_ShellDocView_67);
3471     CHECK_CALLED(Invoke_AMBIENT_SILENT);
3472     CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
3473     SET_CALLED(OnChanged_READYSTATE); /* not always called */
3474     CHECK_CALLED(Exec_ShellDocView_63);
3475
3476     test_GetCurMoniker(doc_unk, doc_mon, NULL);
3477     IHTMLPrivateWindow_Release(priv_window);
3478
3479     test_download(DWL_VERBDONE);
3480 }
3481
3482 static void test_open_window(IHTMLDocument2 *doc)
3483 {
3484     IHTMLWindow2 *window, *new_window;
3485     BSTR name, url;
3486     HRESULT hres;
3487
3488     hres = IHTMLDocument2_get_parentWindow(doc, &window);
3489     ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres);
3490
3491     url = a2bstr("about:blank");
3492     name = a2bstr("test");
3493     new_window = (void*)0xdeadbeef;
3494
3495     open_call = TRUE;
3496
3497     SET_EXPECT(TranslateUrl);
3498     SET_EXPECT(EvaluateNewWindow);
3499
3500     hres = IHTMLWindow2_open(window, url, name, NULL, VARIANT_FALSE, &new_window);
3501     todo_wine
3502     ok(hres == S_OK, "open failed: %08x\n", hres);
3503     todo_wine
3504     ok(new_window == NULL, "new_window != NULL\n");
3505
3506     todo_wine
3507     CHECK_CALLED(TranslateUrl);
3508     todo_wine
3509     CHECK_CALLED(EvaluateNewWindow);
3510
3511     open_call = FALSE;
3512     SysFreeString(url);
3513     SysFreeString(name);
3514
3515     IHTMLWindow2_Release(window);
3516     SysFreeString(name);
3517 }
3518
3519 static void test_clear(IHTMLDocument2 *doc)
3520 {
3521     HRESULT hres;
3522
3523     hres = IHTMLDocument2_clear(doc);
3524     ok(hres == S_OK, "clear failed: %08x\n", hres);
3525 }
3526
3527 static const OLECMDF expect_cmds[OLECMDID_GETPRINTTEMPLATE+1] = {
3528     0,
3529     OLECMDF_SUPPORTED,                  /* OLECMDID_OPEN */
3530     OLECMDF_SUPPORTED,                  /* OLECMDID_NEW */
3531     OLECMDF_SUPPORTED,                  /* OLECMDID_SAVE */
3532     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_SAVEAS */
3533     OLECMDF_SUPPORTED,                  /* OLECMDID_SAVECOPYAS */
3534     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_PRINT */
3535     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_PRINTPREVIEW */
3536     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_PAGESETUP */
3537     OLECMDF_SUPPORTED,                  /* OLECMDID_SPELL */
3538     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_PROPERTIES */
3539     OLECMDF_SUPPORTED,                  /* OLECMDID_CUT */
3540     OLECMDF_SUPPORTED,                  /* OLECMDID_COPY */
3541     OLECMDF_SUPPORTED,                  /* OLECMDID_PASTE */
3542     OLECMDF_SUPPORTED,                  /* OLECMDID_PASTESPECIAL */
3543     OLECMDF_SUPPORTED,                  /* OLECMDID_UNDO */
3544     OLECMDF_SUPPORTED,                  /* OLECMDID_REDO */
3545     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_SELECTALL */
3546     OLECMDF_SUPPORTED,                  /* OLECMDID_CLEARSELECTION */
3547     OLECMDF_SUPPORTED,                  /* OLECMDID_ZOOM */
3548     OLECMDF_SUPPORTED,                  /* OLECMDID_GETZOOMRANGE */
3549     0,
3550     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_REFRESH */
3551     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_STOP */
3552     0,0,0,0,0,0,
3553     OLECMDF_SUPPORTED,                  /* OLECMDID_STOPDOWNLOAD */
3554     0,0,
3555     OLECMDF_SUPPORTED,                  /* OLECMDID_DELETE */
3556     0,0,
3557     OLECMDF_SUPPORTED,                  /* OLECMDID_ENABLE_INTERACTION */
3558     OLECMDF_SUPPORTED,                  /* OLECMDID_ONUNLOAD */
3559     0,0,0,0,0,
3560     OLECMDF_SUPPORTED,                  /* OLECMDID_SHOWPAGESETUP */
3561     OLECMDF_SUPPORTED,                  /* OLECMDID_SHOWPRINT */
3562     0,0,
3563     OLECMDF_SUPPORTED,                  /* OLECMDID_CLOSE */
3564     0,0,0,
3565     OLECMDF_SUPPORTED,                  /* OLECMDID_SETPRINTTEMPLATE */
3566     OLECMDF_SUPPORTED                   /* OLECMDID_GETPRINTTEMPLATE */
3567 };
3568
3569 #define test_QueryStatus(u,cgid,cmdid,cmdf) _test_QueryStatus(__LINE__,u,cgid,cmdid,cmdf)
3570 static void _test_QueryStatus(unsigned line, IUnknown *unk, REFIID cgid, ULONG cmdid, DWORD cmdf)
3571 {
3572     IOleCommandTarget *cmdtrg;
3573     OLECMD olecmd = {cmdid, 0};
3574     HRESULT hres;
3575
3576     hres = IUnknown_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
3577     ok_(__FILE__,line) (hres == S_OK, "QueryInterface(IID_IOleCommandTarget failed: %08x\n", hres);
3578     if(FAILED(hres))
3579         return;
3580
3581     hres = IOleCommandTarget_QueryStatus(cmdtrg, cgid, 1, &olecmd, NULL);
3582     ok(hres == S_OK, "QueryStatus(%u) failed: %08x\n", cmdid, hres);
3583
3584     IOleCommandTarget_Release(cmdtrg);
3585
3586     ok_(__FILE__,line) (olecmd.cmdID == cmdid, "cmdID changed\n");
3587     ok_(__FILE__,line) (olecmd.cmdf == cmdf, "(%u) cmdf=%08x, expected %08x\n", cmdid, olecmd.cmdf, cmdf);
3588 }
3589
3590 static void test_MSHTML_QueryStatus(IHTMLDocument2 *doc, DWORD cmdf)
3591 {
3592     IUnknown *unk = doc ? (IUnknown*)doc : doc_unk;
3593
3594     test_QueryStatus(unk, &CGID_MSHTML, IDM_FONTNAME, cmdf);
3595     test_QueryStatus(unk, &CGID_MSHTML, IDM_FONTSIZE, cmdf);
3596     test_QueryStatus(unk, &CGID_MSHTML, IDM_SELECTALL, cmdf|OLECMDF_ENABLED);
3597     test_QueryStatus(unk, &CGID_MSHTML, IDM_BOLD, cmdf);
3598     test_QueryStatus(unk, &CGID_MSHTML, IDM_FORECOLOR, cmdf);
3599     test_QueryStatus(unk, &CGID_MSHTML, IDM_JUSTIFYCENTER, cmdf);
3600     test_QueryStatus(unk, &CGID_MSHTML, IDM_JUSTIFYLEFT, cmdf);
3601     test_QueryStatus(unk, &CGID_MSHTML, IDM_JUSTIFYRIGHT, cmdf);
3602     test_QueryStatus(unk, &CGID_MSHTML, IDM_ITALIC, cmdf);
3603     test_QueryStatus(unk, &CGID_MSHTML, IDM_UNDERLINE, cmdf);
3604     test_QueryStatus(unk, &CGID_MSHTML, IDM_HORIZONTALLINE, cmdf);
3605     test_QueryStatus(unk, &CGID_MSHTML, IDM_ORDERLIST, cmdf);
3606     test_QueryStatus(unk, &CGID_MSHTML, IDM_UNORDERLIST, cmdf);
3607     test_QueryStatus(unk, &CGID_MSHTML, IDM_INDENT, cmdf);
3608     test_QueryStatus(unk, &CGID_MSHTML, IDM_OUTDENT, cmdf);
3609     test_QueryStatus(unk, &CGID_MSHTML, IDM_DELETE, cmdf);
3610 }
3611
3612 static void test_OleCommandTarget(IHTMLDocument2 *doc)
3613 {
3614     IOleCommandTarget *cmdtrg;
3615     OLECMD cmds[OLECMDID_GETPRINTTEMPLATE];
3616     int i;
3617     HRESULT hres;
3618
3619     hres = IUnknown_QueryInterface(doc, &IID_IOleCommandTarget, (void**)&cmdtrg);
3620     ok(hres == S_OK, "QueryInterface(IID_IOleCommandTarget failed: %08x\n", hres);
3621     if(FAILED(hres))
3622         return;
3623
3624     for(i=0; i<OLECMDID_GETPRINTTEMPLATE; i++) {
3625         cmds[i].cmdID = i+1;
3626         cmds[i].cmdf = 0xf0f0;
3627     }
3628
3629     SET_EXPECT(QueryStatus_OPEN);
3630     SET_EXPECT(QueryStatus_NEW);
3631     hres = IOleCommandTarget_QueryStatus(cmdtrg, NULL, sizeof(cmds)/sizeof(cmds[0]), cmds, NULL);
3632     ok(hres == S_OK, "QueryStatus failed: %08x\n", hres);
3633     CHECK_CALLED(QueryStatus_OPEN);
3634     CHECK_CALLED(QueryStatus_NEW);
3635
3636     for(i=0; i<OLECMDID_GETPRINTTEMPLATE; i++) {
3637         ok(cmds[i].cmdID == i+1, "cmds[%d].cmdID canged to %x\n", i, cmds[i].cmdID);
3638         if(i+1 == OLECMDID_FIND)
3639             continue;
3640         ok(cmds[i].cmdf == expect_cmds[i+1], "cmds[%d].cmdf=%x, expected %x\n",
3641                 i+1, cmds[i].cmdf, expect_cmds[i+1]);
3642     }
3643
3644     ok(!cmds[OLECMDID_FIND-1].cmdf || cmds[OLECMDID_FIND-1].cmdf == (OLECMDF_SUPPORTED|OLECMDF_ENABLED),
3645        "cmds[OLECMDID_FIND].cmdf=%x\n", cmds[OLECMDID_FIND-1].cmdf);
3646
3647     IOleCommandTarget_Release(cmdtrg);
3648 }
3649
3650 static void test_OleCommandTarget_fail(IHTMLDocument2 *doc)
3651 {
3652     IOleCommandTarget *cmdtrg;
3653     int i;
3654     HRESULT hres;
3655
3656     OLECMD cmd[2] = {
3657         {OLECMDID_OPEN, 0xf0f0},
3658         {OLECMDID_GETPRINTTEMPLATE+1, 0xf0f0}
3659     };
3660
3661     hres = IUnknown_QueryInterface(doc, &IID_IOleCommandTarget, (void**)&cmdtrg);
3662     ok(hres == S_OK, "QueryInterface(IIDIOleCommandTarget failed: %08x\n", hres);
3663     if(FAILED(hres))
3664         return;
3665
3666     hres = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 0, NULL, NULL);
3667     ok(hres == S_OK, "QueryStatus failed: %08x\n", hres);
3668
3669     SET_EXPECT(QueryStatus_OPEN);
3670     hres = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 2, cmd, NULL);
3671     CHECK_CALLED(QueryStatus_OPEN);
3672
3673     ok(hres == OLECMDERR_E_NOTSUPPORTED,
3674             "QueryStatus failed: %08x, expected OLECMDERR_E_NOTSUPPORTED\n", hres);
3675     ok(cmd[1].cmdID == OLECMDID_GETPRINTTEMPLATE+1,
3676             "cmd[0].cmdID=%d, expected OLECMDID_GETPRINTTEMPLATE+1\n", cmd[0].cmdID);
3677     ok(cmd[1].cmdf == 0, "cmd[0].cmdf=%x, expected 0\n", cmd[0].cmdf);
3678     ok(cmd[0].cmdf == OLECMDF_SUPPORTED,
3679             "cmd[1].cmdf=%x, expected OLECMDF_SUPPORTED\n", cmd[1].cmdf);
3680
3681     hres = IOleCommandTarget_QueryStatus(cmdtrg, &IID_IHTMLDocument2, 2, cmd, NULL);
3682     ok(hres == OLECMDERR_E_UNKNOWNGROUP,
3683             "QueryStatus failed: %08x, expected OLECMDERR_E_UNKNOWNGROUP\n", hres);
3684
3685     for(i=0; i<OLECMDID_GETPRINTTEMPLATE; i++) {
3686         if(!expect_cmds[i]) {
3687             hres = IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_UPDATECOMMANDS,
3688                     OLECMDEXECOPT_DODEFAULT, NULL, NULL);
3689             ok(hres == OLECMDERR_E_NOTSUPPORTED,
3690                     "Exec failed: %08x, expected OLECMDERR_E_NOTSUPPORTED\n", hres);
3691         }
3692     }
3693
3694     hres = IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_GETPRINTTEMPLATE+1,
3695             OLECMDEXECOPT_DODEFAULT, NULL, NULL);
3696     ok(hres == OLECMDERR_E_NOTSUPPORTED,
3697             "Exec failed: %08x, expected OLECMDERR_E_NOTSUPPORTED\n", hres);
3698
3699     IOleCommandTarget_Release(cmdtrg);
3700 }
3701
3702 static void test_exec_onunload(IHTMLDocument2 *doc)
3703 {
3704     IOleCommandTarget *cmdtrg;
3705     VARIANT var;
3706     HRESULT hres;
3707
3708     hres = IUnknown_QueryInterface(doc, &IID_IOleCommandTarget, (void**)&cmdtrg);
3709     ok(hres == S_OK, "QueryInterface(IID_IOleCommandTarget) failed: %08x\n", hres);
3710     if(FAILED(hres))
3711         return;
3712
3713     memset(&var, 0x0a, sizeof(var));
3714     hres = IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_ONUNLOAD,
3715             OLECMDEXECOPT_DODEFAULT, NULL, &var);
3716     ok(hres == S_OK, "Exec(..., OLECMDID_ONUNLOAD, ...) failed: %08x\n", hres);
3717     ok(V_VT(&var) == VT_BOOL, "V_VT(var)=%d, expected VT_BOOL\n", V_VT(&var));
3718     ok(V_BOOL(&var) == VARIANT_TRUE, "V_BOOL(var)=%x, expected VARIANT_TRUE\n", V_BOOL(&var));
3719
3720     hres = IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_ONUNLOAD,
3721             OLECMDEXECOPT_DODEFAULT, NULL, NULL);
3722     ok(hres == S_OK, "Exec(..., OLECMDID_ONUNLOAD, ...) failed: %08x\n", hres);
3723
3724     IOleCommandTarget_Release(cmdtrg);
3725 }
3726
3727 static void test_exec_editmode(IUnknown *unk, BOOL loaded)
3728 {
3729     IOleCommandTarget *cmdtrg;
3730     HRESULT hres;
3731
3732     hres = IUnknown_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
3733     ok(hres == S_OK, "QueryInterface(IID_IOleCommandTarget) failed: %08x\n", hres);
3734     if(FAILED(hres))
3735         return;
3736
3737     editmode = TRUE;
3738
3739     if(loaded)
3740         load_state = LD_DOLOAD;
3741
3742     if(loaded)
3743         SET_EXPECT(GetClassID);
3744     SET_EXPECT(SetStatusText);
3745     SET_EXPECT(Exec_ShellDocView_37);
3746     SET_EXPECT(GetHostInfo);
3747     if(loaded)
3748         SET_EXPECT(GetDisplayName);
3749     SET_EXPECT(Invoke_AMBIENT_SILENT);
3750     SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
3751     SET_EXPECT(OnChanged_READYSTATE);
3752     SET_EXPECT(IsSystemMoniker);
3753     SET_EXPECT(Exec_ShellDocView_84);
3754     if(loaded)
3755         SET_EXPECT(BindToStorage);
3756     SET_EXPECT(InPlaceUIWindow_SetActiveObject);
3757     SET_EXPECT(HideUI);
3758     SET_EXPECT(ShowUI);
3759     SET_EXPECT(InPlaceFrame_SetBorderSpace);
3760
3761     expect_status_text = NULL;
3762     readystate_set_loading = TRUE;
3763
3764     hres = IOleCommandTarget_Exec(cmdtrg, &CGID_MSHTML, IDM_EDITMODE,
3765             OLECMDEXECOPT_DODEFAULT, NULL, NULL);
3766     ok(hres == S_OK, "Exec failed: %08x\n", hres);
3767
3768     if(loaded)
3769         CHECK_CALLED(GetClassID);
3770     CHECK_CALLED(SetStatusText);
3771     CHECK_CALLED(Exec_ShellDocView_37);
3772     CHECK_CALLED(GetHostInfo);
3773     if(loaded)
3774         CHECK_CALLED(GetDisplayName);
3775     CHECK_CALLED(Invoke_AMBIENT_SILENT);
3776     CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
3777     CHECK_CALLED(OnChanged_READYSTATE);
3778     SET_CALLED(IsSystemMoniker); /* IE7 */
3779     SET_CALLED(Exec_ShellDocView_84);
3780     if(loaded)
3781         CHECK_CALLED(BindToStorage);
3782     CHECK_CALLED(InPlaceUIWindow_SetActiveObject);
3783     CHECK_CALLED(HideUI);
3784     CHECK_CALLED(ShowUI);
3785     CHECK_CALLED(InPlaceFrame_SetBorderSpace);
3786
3787     test_timer(EXPECT_UPDATEUI|EXPECT_SETTITLE);
3788
3789     IOleCommandTarget_Release(cmdtrg);
3790
3791     hres = IOleCommandTarget_Exec(cmdtrg, &CGID_MSHTML, IDM_EDITMODE,
3792             OLECMDEXECOPT_DODEFAULT, NULL, NULL);
3793     ok(hres == S_OK, "Exec failed: %08x\n", hres);
3794 }
3795
3796 static void test_exec_fontname(IUnknown *unk, LPCWSTR name, LPCWSTR exname)
3797 {
3798    IOleCommandTarget *cmdtrg;
3799    VARIANT *in = NULL, _in, *out = NULL, _out;
3800    HRESULT hres;
3801
3802    hres = IUnknown_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
3803    ok(hres == S_OK, "QueryInterface(IIDIOleM=CommandTarget failed: %08x\n", hres);
3804    if(FAILED(hres))
3805        return;
3806
3807    if(name) {
3808        in = &_in;
3809        V_VT(in) = VT_BSTR;
3810        V_BSTR(in) = SysAllocString(name);
3811    }
3812
3813    if(exname) {
3814        out = &_out;
3815        V_VT(out) = VT_I4;
3816        V_I4(out) = 0xdeadbeef;
3817    }
3818
3819    hres = IOleCommandTarget_Exec(cmdtrg, &CGID_MSHTML, IDM_FONTNAME, 0, in, out);
3820    ok(hres == S_OK, "Exec(IDM_FONTNAME) failed: %08x\n", hres);
3821
3822    if(in)
3823        VariantClear(in);
3824
3825    if(out) {
3826        ok(V_VT(out) == VT_BSTR, "V_VT(out) = %x\n", V_VT(out));
3827        if(V_VT(out) == VT_BSTR) {
3828            if(exname)
3829                ok(!lstrcmpW(V_BSTR(out), name ? name : exname),
3830                   "unexpected fontname %s\n", wine_dbgstr_w(name));
3831            else
3832                ok(V_BSTR(out) == NULL, "V_BSTR(out) != NULL\n");
3833        }
3834        VariantClear(out);
3835    }
3836
3837    IOleCommandTarget_Release(cmdtrg);
3838 }
3839
3840 static void test_exec_noargs(IUnknown *unk, DWORD cmdid)
3841 {
3842     IOleCommandTarget *cmdtrg;
3843     HRESULT hres;
3844
3845     hres = IUnknown_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
3846     ok(hres == S_OK, "QueryInterface(IID_IOleCommandTarget) failed: %08x\n", hres);
3847     if(FAILED(hres))
3848         return;
3849
3850     hres = IOleCommandTarget_Exec(cmdtrg, &CGID_MSHTML, cmdid,
3851             OLECMDEXECOPT_DODEFAULT, NULL, NULL);
3852     ok(hres == S_OK, "Exec failed: %08x\n", hres);
3853
3854     IOleCommandTarget_Release(cmdtrg);
3855 }
3856
3857 static void test_IsDirty(IHTMLDocument2 *doc, HRESULT exhres)
3858 {
3859     IPersistStreamInit *perinit;
3860     IPersistMoniker *permon;
3861     IPersistFile *perfile;
3862     HRESULT hres;
3863
3864     hres = IUnknown_QueryInterface(doc, &IID_IPersistStreamInit, (void**)&perinit);
3865     ok(hres == S_OK, "QueryInterface(IID_IPersistStreamInit failed: %08x\n", hres);
3866     if(SUCCEEDED(hres)) {
3867         hres = IPersistStreamInit_IsDirty(perinit);
3868         ok(hres == exhres, "IsDirty() = %08x, expected %08x\n", hres, exhres);
3869         IPersistStreamInit_Release(perinit);
3870     }
3871
3872     hres = IUnknown_QueryInterface(doc, &IID_IPersistMoniker, (void**)&permon);
3873     ok(hres == S_OK, "QueryInterface(IID_IPersistMoniker failed: %08x\n", hres);
3874     if(SUCCEEDED(hres)) {
3875         hres = IPersistMoniker_IsDirty(permon);
3876         ok(hres == exhres, "IsDirty() = %08x, expected %08x\n", hres, exhres);
3877         IPersistMoniker_Release(permon);
3878     }
3879
3880     hres = IUnknown_QueryInterface(doc, &IID_IPersistFile, (void**)&perfile);
3881     ok(hres == S_OK, "QueryInterface(IID_IPersistFile failed: %08x\n", hres);
3882     if(SUCCEEDED(hres)) {
3883         hres = IPersistFile_IsDirty(perfile);
3884         ok(hres == exhres, "IsDirty() = %08x, expected %08x\n", hres, exhres);
3885         IPersistFile_Release(perfile);
3886     }
3887 }
3888
3889 static HWND create_container_window(void)
3890 {
3891     static const WCHAR wszHTMLDocumentTest[] =
3892         {'H','T','M','L','D','o','c','u','m','e','n','t','T','e','s','t',0};
3893     static WNDCLASSEXW wndclass = {
3894         sizeof(WNDCLASSEXW),
3895         0,
3896         wnd_proc,
3897         0, 0, NULL, NULL, NULL, NULL, NULL,
3898         wszHTMLDocumentTest,
3899         NULL
3900     };
3901
3902     RegisterClassExW(&wndclass);
3903     return CreateWindowW(wszHTMLDocumentTest, wszHTMLDocumentTest,
3904             WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
3905             515, 530, NULL, NULL, NULL, NULL);
3906 }
3907
3908 static void test_DoVerb(IOleObject *oleobj)
3909 {
3910     RECT rect = {0,0,500,500};
3911     HRESULT hres;
3912
3913     if(!container_locked) {
3914         SET_EXPECT(GetContainer);
3915         SET_EXPECT(LockContainer);
3916     }
3917     SET_EXPECT(ActivateMe);
3918     expect_LockContainer_fLock = TRUE;
3919
3920     hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite, -1, container_hwnd, &rect);
3921     ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
3922
3923     if(!container_locked) {
3924         CHECK_CALLED(GetContainer);
3925         CHECK_CALLED(LockContainer);
3926         container_locked = TRUE;
3927     }
3928     CHECK_CALLED(ActivateMe);
3929 }
3930
3931 #define CLIENTSITE_EXPECTPATH 0x00000001
3932 #define CLIENTSITE_SETNULL    0x00000002
3933 #define CLIENTSITE_DONTSET    0x00000004
3934
3935 static void test_ClientSite(IOleObject *oleobj, DWORD flags)
3936 {
3937     IOleClientSite *clientsite;
3938     HRESULT hres;
3939
3940     if(flags & CLIENTSITE_SETNULL) {
3941         hres = IOleObject_GetClientSite(oleobj, &clientsite);
3942         ok(clientsite == &ClientSite, "clientsite=%p, expected %p\n", clientsite, &ClientSite);
3943
3944         hres = IOleObject_SetClientSite(oleobj, NULL);
3945         ok(hres == S_OK, "SetClientSite failed: %08x\n", hres);
3946
3947         set_clientsite = FALSE;
3948     }
3949
3950     if(flags & CLIENTSITE_DONTSET)
3951         return;
3952
3953     hres = IOleObject_GetClientSite(oleobj, &clientsite);
3954     ok(hres == S_OK, "GetClientSite failed: %08x\n", hres);
3955     ok(clientsite == (set_clientsite ? &ClientSite : NULL), "GetClientSite() = %p, expected %p\n",
3956             clientsite, set_clientsite ? &ClientSite : NULL);
3957
3958     if(!set_clientsite) {
3959         SET_EXPECT(GetHostInfo);
3960         if(flags & CLIENTSITE_EXPECTPATH) {
3961             SET_EXPECT(GetOptionKeyPath);
3962             SET_EXPECT(GetOverrideKeyPath);
3963         }
3964         SET_EXPECT(GetWindow);
3965         if(flags & CLIENTSITE_EXPECTPATH)
3966             SET_EXPECT(Exec_DOCCANNAVIGATE);
3967         SET_EXPECT(QueryStatus_SETPROGRESSTEXT);
3968         SET_EXPECT(Exec_SETPROGRESSMAX);
3969         SET_EXPECT(Exec_SETPROGRESSPOS);
3970         SET_EXPECT(Invoke_AMBIENT_USERMODE);
3971         SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
3972         SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
3973         SET_EXPECT(Invoke_AMBIENT_SILENT);
3974         SET_EXPECT(Invoke_AMBIENT_USERAGENT);
3975         SET_EXPECT(Invoke_AMBIENT_PALETTE);
3976
3977         hres = IOleObject_SetClientSite(oleobj, &ClientSite);
3978         ok(hres == S_OK, "SetClientSite failed: %08x\n", hres);
3979
3980         CHECK_CALLED(GetHostInfo);
3981         if(flags & CLIENTSITE_EXPECTPATH) {
3982             CHECK_CALLED(GetOptionKeyPath);
3983             CHECK_CALLED(GetOverrideKeyPath);
3984         }
3985         CHECK_CALLED(GetWindow);
3986         if(flags & CLIENTSITE_EXPECTPATH)
3987             CHECK_CALLED(Exec_DOCCANNAVIGATE);
3988         CHECK_CALLED(QueryStatus_SETPROGRESSTEXT);
3989         CHECK_CALLED(Exec_SETPROGRESSMAX);
3990         CHECK_CALLED(Exec_SETPROGRESSPOS);
3991         CHECK_CALLED(Invoke_AMBIENT_USERMODE);
3992         CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
3993         CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); 
3994         CHECK_CALLED(Invoke_AMBIENT_SILENT);
3995         CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
3996         CHECK_CALLED(Invoke_AMBIENT_PALETTE);
3997
3998         set_clientsite = TRUE;
3999     }
4000
4001     hres = IOleObject_SetClientSite(oleobj, &ClientSite);
4002     ok(hres == S_OK, "SetClientSite failed: %08x\n", hres);
4003
4004     hres = IOleObject_GetClientSite(oleobj, &clientsite);
4005     ok(hres == S_OK, "GetClientSite failed: %08x\n", hres);
4006     ok(clientsite == &ClientSite, "GetClientSite() = %p, expected %p\n", clientsite, &ClientSite);
4007 }
4008
4009 static void test_OnAmbientPropertyChange(IHTMLDocument2 *doc)
4010 {
4011     IOleControl *control = NULL;
4012     HRESULT hres;
4013
4014     hres = IUnknown_QueryInterface(doc, &IID_IOleControl, (void**)&control);
4015     ok(hres == S_OK, "QueryInterface(IID_IOleControl failed: %08x\n", hres);
4016     if(FAILED(hres))
4017         return;
4018
4019     SET_EXPECT(Invoke_AMBIENT_USERMODE);
4020     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_USERMODE);
4021     ok(hres == S_OK, "OnAmbientChange failed: %08x\n", hres);
4022     CHECK_CALLED(Invoke_AMBIENT_USERMODE);
4023
4024     SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
4025     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_DLCONTROL);
4026     ok(hres == S_OK, "OnAmbientChange failed: %08x\n", hres);
4027     CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
4028
4029     SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
4030     SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
4031     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED);
4032     ok(hres == S_OK, "OnAmbientChange failed: %08x\n", hres);
4033     CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
4034     CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
4035
4036     SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
4037     SET_EXPECT(Invoke_AMBIENT_SILENT);
4038     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_SILENT);
4039     ok(hres == S_OK, "OnAmbientChange failed: %08x\n", hres);
4040     CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
4041     CHECK_CALLED(Invoke_AMBIENT_SILENT);
4042
4043     SET_EXPECT(Invoke_AMBIENT_USERAGENT);
4044     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_USERAGENT);
4045     ok(hres == S_OK, "OnAmbientChange failed: %08x\n", hres);
4046     CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
4047
4048     SET_EXPECT(Invoke_AMBIENT_PALETTE);
4049     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_PALETTE);
4050     ok(hres == S_OK, "OnAmbientChange failed: %08x\n", hres);
4051     CHECK_CALLED(Invoke_AMBIENT_PALETTE);
4052
4053     IOleControl_Release(control);
4054 }
4055
4056
4057
4058 static void test_OnAmbientPropertyChange2(IHTMLDocument2 *doc)
4059 {
4060     IOleControl *control = NULL;
4061     HRESULT hres;
4062
4063     hres = IUnknown_QueryInterface(doc, &IID_IOleControl, (void**)&control);
4064     ok(hres == S_OK, "QueryInterface(IID_IOleControl failed: %08x\n", hres);
4065     if(FAILED(hres))
4066         return;
4067
4068     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_PALETTE);
4069     ok(hres == S_OK, "OnAmbientPropertyChange failed: %08x\n", hres);
4070
4071     IOleControl_Release(control);
4072 }
4073
4074 static void test_Close(IHTMLDocument2 *doc, BOOL set_client)
4075 {
4076     IOleObject *oleobj = NULL;
4077     HRESULT hres;
4078
4079     hres = IUnknown_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj);
4080     ok(hres == S_OK, "QueryInterface(IID_IOleObject) failed: %08x\n", hres);
4081     if(FAILED(hres))
4082         return;
4083
4084     SET_EXPECT(GetContainer);
4085     SET_EXPECT(LockContainer);
4086     expect_LockContainer_fLock = FALSE;
4087     hres = IOleObject_Close(oleobj, OLECLOSE_NOSAVE);
4088     ok(hres == S_OK, "Close failed: %08x\n", hres);
4089     CHECK_CALLED(GetContainer);
4090     CHECK_CALLED(LockContainer);
4091     container_locked = FALSE;
4092
4093     if(set_client)
4094         test_ClientSite(oleobj, CLIENTSITE_SETNULL|CLIENTSITE_DONTSET);
4095
4096     IOleObject_Release(oleobj);
4097 }
4098
4099 static void test_Advise(IHTMLDocument2 *doc)
4100 {
4101     IOleObject *oleobj = NULL;
4102     IEnumSTATDATA *enum_advise = (void*)0xdeadbeef;
4103     DWORD conn;
4104     HRESULT hres;
4105
4106     hres = IUnknown_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj);
4107     ok(hres == S_OK, "QueryInterface(IID_IOleObject) failed: %08x\n", hres);
4108     if(FAILED(hres))
4109         return;
4110
4111     hres = IOleObject_Unadvise(oleobj, 0);
4112     ok(hres == OLE_E_NOCONNECTION, "Unadvise returned: %08x\n", hres);
4113
4114     hres = IOleObject_EnumAdvise(oleobj, &enum_advise);
4115     ok(hres == S_OK, "EnumAdvise returned: %08x\n", hres);
4116     ok(enum_advise == NULL, "enum_advise != NULL\n");
4117
4118     conn = -1;
4119     hres = IOleObject_Advise(oleobj, NULL, &conn);
4120     /* Old IE returns S_OK and sets conn to 1 */
4121     ok(hres == E_INVALIDARG || hres == S_OK, "Advise returned: %08x\n", hres);
4122     ok(conn == 0 || conn == 1, "conn = %d\n", conn);
4123
4124     hres = IOleObject_Advise(oleobj, (IAdviseSink*)&AdviseSink, NULL);
4125     ok(hres == E_INVALIDARG, "Advise returned: %08x\n", hres);
4126
4127     hres = IOleObject_Advise(oleobj, (IAdviseSink*)&AdviseSink, &conn);
4128     ok(hres == S_OK, "Advise returned: %08x\n", hres);
4129     ok(conn == 1, "conn = %d\n", conn);
4130
4131     hres = IOleObject_Advise(oleobj, (IAdviseSink*)&AdviseSink, &conn);
4132     ok(hres == S_OK, "Advise returned: %08x\n", hres);
4133     ok(conn == 2, "conn = %d\n", conn);
4134
4135     hres = IOleObject_Unadvise(oleobj, 1);
4136     ok(hres == S_OK, "Unadvise returned: %08x\n", hres);
4137
4138     hres = IOleObject_Unadvise(oleobj, 1);
4139     ok(hres == OLE_E_NOCONNECTION, "Unadvise returned: %08x\n", hres);
4140
4141     hres = IOleObject_Unadvise(oleobj, 2);
4142     ok(hres == S_OK, "Unadvise returned: %08x\n", hres);
4143
4144     IOleObject_Release(oleobj);
4145 }
4146
4147 static void test_OnFrameWindowActivate(IUnknown *unk)
4148 {
4149     IOleInPlaceActiveObject *inplaceact;
4150     HRESULT hres;
4151
4152     hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceActiveObject, (void**)&inplaceact);
4153     ok(hres == S_OK, "QueryInterface(IID_IOleInPlaceActiveObject) failed: %08x\n", hres);
4154     if(FAILED(hres))
4155         return;
4156
4157     if(set_clientsite) {
4158         expect_OnFrameWindowActivate_fActivate = TRUE;
4159         SET_EXPECT(OnFrameWindowActivate);
4160         hres = IOleInPlaceActiveObject_OnFrameWindowActivate(inplaceact, TRUE);
4161         ok(hres == S_OK, "OnFrameWindowActivate failed: %08x\n", hres);
4162         CHECK_CALLED(OnFrameWindowActivate);
4163
4164         SET_EXPECT(OnFrameWindowActivate);
4165         hres = IOleInPlaceActiveObject_OnFrameWindowActivate(inplaceact, TRUE);
4166         ok(hres == S_OK, "OnFrameWindowActivate failed: %08x\n", hres);
4167         CHECK_CALLED(OnFrameWindowActivate);
4168
4169         expect_OnFrameWindowActivate_fActivate = FALSE;
4170         SET_EXPECT(OnFrameWindowActivate);
4171         hres = IOleInPlaceActiveObject_OnFrameWindowActivate(inplaceact, FALSE);
4172         ok(hres == S_OK, "OnFrameWindowActivate failed: %08x\n", hres);
4173         CHECK_CALLED(OnFrameWindowActivate);
4174
4175         expect_OnFrameWindowActivate_fActivate = TRUE;
4176         SET_EXPECT(OnFrameWindowActivate);
4177         hres = IOleInPlaceActiveObject_OnFrameWindowActivate(inplaceact, TRUE);
4178         ok(hres == S_OK, "OnFrameWindowActivate failed: %08x\n", hres);
4179         CHECK_CALLED(OnFrameWindowActivate);
4180     }else {
4181         hres = IOleInPlaceActiveObject_OnFrameWindowActivate(inplaceact, FALSE);
4182         ok(hres == S_OK, "OnFrameWindowActivate failed: %08x\n", hres);
4183
4184         hres = IOleInPlaceActiveObject_OnFrameWindowActivate(inplaceact, TRUE);
4185         ok(hres == S_OK, "OnFrameWindowActivate failed: %08x\n", hres);
4186     }
4187
4188     IOleInPlaceActiveObject_Release(inplaceact);
4189 }
4190
4191 static void test_InPlaceDeactivate(IHTMLDocument2 *doc, BOOL expect_call)
4192 {
4193     IOleInPlaceObjectWindowless *windowlessobj = NULL;
4194     HRESULT hres;
4195
4196     hres = IUnknown_QueryInterface(doc, &IID_IOleInPlaceObjectWindowless,
4197             (void**)&windowlessobj);
4198     ok(hres == S_OK, "QueryInterface(IID_IOleInPlaceObjectWindowless) failed: %08x\n", hres);
4199     if(FAILED(hres))
4200         return;
4201
4202     if(expect_call) {
4203         SET_EXPECT(OnFocus_FALSE);
4204         if(ipsex)
4205             SET_EXPECT(OnInPlaceDeactivateEx);
4206         else
4207             SET_EXPECT(OnInPlaceDeactivate);
4208     }
4209     hres = IOleInPlaceObjectWindowless_InPlaceDeactivate(windowlessobj);
4210     ok(hres == S_OK, "InPlaceDeactivate failed: %08x\n", hres);
4211     if(expect_call) {
4212         CHECK_CALLED(OnFocus_FALSE);
4213         if(ipsex)
4214             CHECK_CALLED(OnInPlaceDeactivateEx);
4215         else
4216             CHECK_CALLED(OnInPlaceDeactivate);
4217     }
4218
4219     IOleInPlaceObjectWindowless_Release(windowlessobj);
4220 }
4221
4222 static void test_Activate(IHTMLDocument2 *doc, DWORD flags)
4223 {
4224     IOleObject *oleobj = NULL;
4225     IOleDocumentView *docview;
4226     GUID guid;
4227     HRESULT hres;
4228
4229     last_hwnd = hwnd;
4230
4231     if(view)
4232         IOleDocumentView_Release(view);
4233     view = NULL;
4234
4235     hres = IUnknown_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj);
4236     ok(hres == S_OK, "QueryInterface(IID_IOleObject) failed: %08x\n", hres);
4237
4238     hres = IOleObject_GetUserClassID(oleobj, NULL);
4239     ok(hres == E_INVALIDARG, "GetUserClassID returned: %08x, expected E_INVALIDARG\n", hres);
4240
4241     hres = IOleObject_GetUserClassID(oleobj, &guid);
4242     ok(hres == S_OK, "GetUserClassID failed: %08x\n", hres);
4243     ok(IsEqualGUID(&guid, &CLSID_HTMLDocument), "guid != CLSID_HTMLDocument\n");
4244
4245     test_OnFrameWindowActivate((IUnknown*)doc);
4246
4247     test_ClientSite(oleobj, flags);
4248     test_InPlaceDeactivate(doc, FALSE);
4249     test_DoVerb(oleobj);
4250
4251     if(call_UIActivate == CallUIActivate_AfterShow) {
4252         hres = IOleObject_QueryInterface(oleobj, &IID_IOleDocumentView, (void **)&docview);
4253         ok(hres == S_OK, "IOleObject_QueryInterface failed with error 0x%08x\n", hres);
4254
4255         SET_EXPECT(OnFocus_TRUE);
4256         SET_EXPECT(SetActiveObject);
4257         SET_EXPECT(ShowUI);
4258         SET_EXPECT(InPlaceUIWindow_SetActiveObject);
4259         SET_EXPECT(InPlaceFrame_SetBorderSpace);
4260         expect_status_text = NULL;
4261
4262         hres = IOleDocumentView_UIActivate(docview, TRUE);
4263         ok(hres == S_OK, "IOleDocumentView_UIActivate failed with error 0x%08x\n", hres);
4264
4265         CHECK_CALLED(OnFocus_TRUE);
4266         CHECK_CALLED(SetActiveObject);
4267         CHECK_CALLED(ShowUI);
4268         CHECK_CALLED(InPlaceUIWindow_SetActiveObject);
4269         CHECK_CALLED(InPlaceFrame_SetBorderSpace);
4270
4271         IOleDocumentView_Release(docview);
4272     }
4273
4274     IOleObject_Release(oleobj);
4275
4276     test_OnFrameWindowActivate((IUnknown*)doc);
4277 }
4278
4279 static void test_Window(IHTMLDocument2 *doc, BOOL expect_success)
4280 {
4281     IOleInPlaceActiveObject *activeobject = NULL;
4282     HWND tmp_hwnd;
4283     HRESULT hres;
4284
4285     hres = IOleDocumentView_QueryInterface(view, &IID_IOleInPlaceActiveObject, (void**)&activeobject);
4286     ok(hres == S_OK, "Could not get IOleInPlaceActiveObject interface: %08x\n", hres);
4287     if(FAILED(hres))
4288         return;
4289
4290     hres = IOleInPlaceActiveObject_GetWindow(activeobject, &tmp_hwnd);
4291
4292     if(expect_success) {
4293         ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
4294         ok(tmp_hwnd == hwnd, "tmp_hwnd=%p, expected %p\n", tmp_hwnd, hwnd);
4295     }else {
4296         ok(hres == E_FAIL, "GetWindow returned %08x, expected E_FAIL\n", hres);
4297         ok(IsWindow(hwnd), "hwnd is destroyed\n");
4298     }
4299
4300     IOleInPlaceActiveObject_Release(activeobject);
4301 }
4302
4303 static void test_CloseView(void)
4304 {
4305     IOleInPlaceSite *inplacesite = (IOleInPlaceSite*)0xff00ff00;
4306     HRESULT hres;
4307
4308     if(!view)
4309         return;
4310
4311     hres = IOleDocumentView_Show(view, FALSE);
4312     ok(hres == S_OK, "Show failed: %08x\n", hres);
4313
4314     hres = IOleDocumentView_CloseView(view, 0);
4315     ok(hres == S_OK, "CloseView failed: %08x\n", hres);
4316
4317     hres = IOleDocumentView_SetInPlaceSite(view, NULL);
4318     ok(hres == S_OK, "SetInPlaceSite failed: %08x\n", hres);
4319
4320     hres = IOleDocumentView_GetInPlaceSite(view, &inplacesite);
4321     ok(hres == S_OK, "SetInPlaceSite failed: %08x\n", hres);
4322     ok(inplacesite == NULL, "inplacesite=%p, expected NULL\n", inplacesite);
4323 }
4324
4325 static void test_UIDeactivate(void)
4326 {
4327     HRESULT hres;
4328
4329     if(call_UIActivate == CallUIActivate_AfterShow) {
4330         SET_EXPECT(InPlaceUIWindow_SetActiveObject);
4331     }
4332     if(call_UIActivate != CallUIActivate_None) {
4333         SET_EXPECT(SetActiveObject_null);
4334         SET_EXPECT(HideUI);
4335         SET_EXPECT(OnUIDeactivate);
4336     }
4337
4338     hres = IOleDocumentView_UIActivate(view, FALSE);
4339     ok(hres == S_OK, "UIActivate failed: %08x\n", hres);
4340
4341     if(call_UIActivate != CallUIActivate_None) {
4342         CHECK_CALLED(SetActiveObject_null);
4343         CHECK_CALLED(HideUI);
4344         CHECK_CALLED(OnUIDeactivate);
4345     }
4346     if(call_UIActivate == CallUIActivate_AfterShow) {
4347         CHECK_CALLED(InPlaceUIWindow_SetActiveObject);
4348     }
4349 }
4350
4351 static void test_Hide(void)
4352 {
4353     HRESULT hres;
4354
4355     if(!view)
4356         return;
4357
4358     hres = IOleDocumentView_Show(view, FALSE);
4359     ok(hres == S_OK, "Show failed: %08x\n", hres);
4360 }
4361
4362 static HRESULT create_document(IHTMLDocument2 **doc)
4363 {
4364     IHTMLDocument5 *doc5;
4365     HRESULT hres;
4366
4367     hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
4368             &IID_IHTMLDocument2, (void**)doc);
4369     ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
4370     if(FAILED(hres))
4371         return hres;
4372
4373     hres = IHTMLDocument2_QueryInterface(*doc, &IID_IHTMLDocument5, (void**)&doc5);
4374     if(SUCCEEDED(hres)) {
4375         IHTMLDocument5_Release(doc5);
4376     }else {
4377         win_skip("Could not get IHTMLDocument5, probably too old IE\n");
4378         IHTMLDocument2_Release(*doc);
4379     }
4380
4381     return hres;
4382 }
4383
4384 static void test_Navigate(IHTMLDocument2 *doc)
4385 {
4386     IHlinkTarget *hlink;
4387     HRESULT hres;
4388
4389     hres = IUnknown_QueryInterface(doc, &IID_IHlinkTarget, (void**)&hlink);
4390     ok(hres == S_OK, "QueryInterface(IID_IHlinkTarget) failed: %08x\n", hres);
4391
4392     SET_EXPECT(ActivateMe);
4393     hres = IHlinkTarget_Navigate(hlink, 0, NULL);
4394     ok(hres == S_OK, "Navigate failed: %08x\n", hres);
4395     CHECK_CALLED(ActivateMe);
4396
4397     IHlinkTarget_Release(hlink);
4398 }
4399
4400 static void test_external(IHTMLDocument2 *doc, BOOL initialized)
4401 {
4402     IDispatch *external;
4403     IHTMLWindow2 *htmlwin;
4404     HRESULT hres;
4405
4406     hres = IHTMLDocument2_get_parentWindow(doc, &htmlwin);
4407     ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres);
4408
4409     if(initialized)
4410         SET_EXPECT(GetExternal);
4411     external = (void*)0xdeadbeef;
4412     hres = IHTMLWindow2_get_external(htmlwin, &external);
4413     if(initialized) {
4414         ok(hres == S_FALSE || hres == S_OK, "get_external failed: %08x\n", hres);
4415         CHECK_CALLED(GetExternal);
4416         ok(external != NULL, "external == NULL\n");
4417     }else {
4418         ok(hres == S_OK, "get_external failed: %08x\n", hres);
4419         ok(external == NULL, "external != NULL\n");
4420     }
4421
4422     IHTMLWindow2_Release(htmlwin);
4423 }
4424
4425 static void test_StreamLoad(IHTMLDocument2 *doc)
4426 {
4427     IPersistStreamInit *init;
4428     HRESULT hres;
4429
4430     hres = IUnknown_QueryInterface(doc, &IID_IPersistStreamInit, (void**)&init);
4431     ok(hres == S_OK, "QueryInterface(IID_IPersistStreamInit) failed: %08x\n", hres);
4432     if(FAILED(hres))
4433         return;
4434
4435     SET_EXPECT(Invoke_AMBIENT_SILENT);
4436     SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
4437     SET_EXPECT(Exec_ShellDocView_37);
4438     SET_EXPECT(OnChanged_READYSTATE);
4439     SET_EXPECT(Read);
4440     readystate_set_loading = TRUE;
4441
4442     hres = IPersistStreamInit_Load(init, &Stream);
4443     ok(hres == S_OK, "Load failed: %08x\n", hres);
4444
4445     CHECK_CALLED(Invoke_AMBIENT_SILENT);
4446     CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
4447     CHECK_CALLED(Exec_ShellDocView_37);
4448     CHECK_CALLED(OnChanged_READYSTATE);
4449     CHECK_CALLED(Read);
4450
4451     test_timer(EXPECT_SETTITLE);
4452     test_GetCurMoniker((IUnknown*)doc, NULL, about_blank_url);
4453
4454     IPersistStreamInit_Release(init);
4455 }
4456
4457 static void test_StreamInitNew(IHTMLDocument2 *doc)
4458 {
4459     IPersistStreamInit *init;
4460     HRESULT hres;
4461
4462     hres = IUnknown_QueryInterface(doc, &IID_IPersistStreamInit, (void**)&init);
4463     ok(hres == S_OK, "QueryInterface(IID_IPersistStreamInit) failed: %08x\n", hres);
4464     if(FAILED(hres))
4465         return;
4466
4467     SET_EXPECT(Invoke_AMBIENT_SILENT);
4468     SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
4469     SET_EXPECT(Exec_ShellDocView_37);
4470     SET_EXPECT(OnChanged_READYSTATE);
4471     readystate_set_loading = TRUE;
4472
4473     hres = IPersistStreamInit_InitNew(init);
4474     ok(hres == S_OK, "Load failed: %08x\n", hres);
4475
4476     CHECK_CALLED(Invoke_AMBIENT_SILENT);
4477     CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
4478     CHECK_CALLED(Exec_ShellDocView_37);
4479     CHECK_CALLED(OnChanged_READYSTATE);
4480
4481     test_timer(EXPECT_SETTITLE);
4482     test_GetCurMoniker((IUnknown*)doc, NULL, about_blank_url);
4483
4484     IPersistStreamInit_Release(init);
4485 }
4486
4487 static void test_QueryInterface(IHTMLDocument2 *doc)
4488 {
4489     IUnknown *qi;
4490     HRESULT hres;
4491
4492     static const IID IID_UndocumentedScriptIface =
4493         {0x719c3050,0xf9d3,0x11cf,{0xa4,0x93,0x00,0x40,0x05,0x23,0xa8,0xa0}};
4494
4495     qi = (void*)0xdeadbeef;
4496     hres = IUnknown_QueryInterface(doc, &IID_IRunnableObject, (void**)&qi);
4497     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
4498     ok(qi == NULL, "qirunnable=%p, expected NULL\n", qi);
4499
4500     qi = (void*)0xdeadbeef;
4501     hres = IUnknown_QueryInterface(doc, &IID_IHTMLDOMNode, (void**)&qi);
4502     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
4503     ok(qi == NULL, "qi=%p, expected NULL\n", qi);
4504
4505     qi = (void*)0xdeadbeef;
4506     hres = IUnknown_QueryInterface(doc, &IID_IHTMLDOMNode2, (void**)&qi);
4507     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
4508     ok(qi == NULL, "qi=%p, expected NULL\n", qi);
4509
4510     qi = (void*)0xdeadbeef;
4511     hres = IUnknown_QueryInterface(doc, &IID_IPersistPropertyBag, (void**)&qi);
4512     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
4513     ok(qi == NULL, "qi=%p, expected NULL\n", qi);
4514
4515     qi = (void*)0xdeadbeef;
4516     hres = IUnknown_QueryInterface(doc, &IID_UndocumentedScriptIface, (void**)&qi);
4517     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
4518     ok(qi == NULL, "qi=%p, expected NULL\n", qi);
4519
4520     qi = (void*)0xdeadbeef;
4521     hres = IUnknown_QueryInterface(doc, &IID_IMarshal, (void**)&qi);
4522     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
4523     ok(qi == NULL, "qi=%p, expected NULL\n", qi);
4524
4525     qi = (void*)0xdeadbeef;
4526     hres = IUnknown_QueryInterface(doc, &IID_IExternalConnection, (void**)&qi);
4527     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
4528     ok(qi == NULL, "qi=%p, expected NULL\n", qi);
4529
4530     qi = (void*)0xdeadbeef;
4531     hres = IUnknown_QueryInterface(doc, &IID_IStdMarshalInfo, (void**)&qi);
4532     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
4533     ok(qi == NULL, "qi=%p, expected NULL\n", qi);
4534
4535     hres = IUnknown_QueryInterface(doc, &IID_IDispatch, (void**)&qi);
4536     ok(hres == S_OK, "Could not get IDispatch interface: %08x\n", hres);
4537     ok(qi != (IUnknown*)doc, "disp == doc\n");
4538     IUnknown_Release(qi);
4539 }
4540
4541 static void init_test(enum load_state_t ls) {
4542     doc_unk = NULL;
4543     hwnd = last_hwnd = NULL;
4544     set_clientsite = FALSE;
4545     load_from_stream = FALSE;
4546     call_UIActivate = CallUIActivate_None;
4547     load_state = ls;
4548     editmode = FALSE;
4549     stream_read = 0;
4550     protocol_read = 0;
4551     ipsex = FALSE;
4552     inplace_deactivated = FALSE;
4553     navigated_load = FALSE;
4554 }
4555
4556 static void test_HTMLDocument(BOOL do_load)
4557 {
4558     IHTMLDocument2 *doc;
4559     HRESULT hres;
4560     ULONG ref;
4561
4562     trace("Testing HTMLDocument (%s)...\n", (do_load ? "load" : "no load"));
4563
4564     init_test(do_load ? LD_DOLOAD : LD_NO);
4565
4566     hres = create_document(&doc);
4567     if(FAILED(hres))
4568         return;
4569     doc_unk = (IUnknown*)doc;
4570
4571     test_QueryInterface(doc);
4572     test_Advise(doc);
4573     test_IsDirty(doc, S_FALSE);
4574     test_MSHTML_QueryStatus(doc, OLECMDF_SUPPORTED);
4575     test_external(doc, FALSE);
4576     test_ViewAdviseSink(doc);
4577     test_ConnectionPointContainer(doc);
4578     test_GetCurMoniker((IUnknown*)doc, NULL, NULL);
4579     test_Persist(doc, &Moniker);
4580     if(!do_load)
4581         test_OnAmbientPropertyChange2(doc);
4582
4583     test_Activate(doc, CLIENTSITE_EXPECTPATH);
4584
4585     if(do_load) {
4586         test_download(DWL_CSS|DWL_TRYCSS);
4587         test_GetCurMoniker((IUnknown*)doc, &Moniker, NULL);
4588     }
4589
4590     test_MSHTML_QueryStatus(doc, OLECMDF_SUPPORTED);
4591     test_OleCommandTarget_fail(doc);
4592     test_OleCommandTarget(doc);
4593     test_OnAmbientPropertyChange(doc);
4594     test_Window(doc, TRUE);
4595     test_external(doc, TRUE);
4596
4597     test_UIDeactivate();
4598     test_OleCommandTarget(doc);
4599     test_Window(doc, TRUE);
4600     test_InPlaceDeactivate(doc, TRUE);
4601
4602     /* Calling test_OleCommandTarget here causes Segmentation Fault with native
4603      * MSHTML. It doesn't with Wine. */
4604
4605     test_Window(doc, FALSE);
4606     test_Hide();
4607     test_InPlaceDeactivate(doc, FALSE);
4608     test_CloseView();
4609     test_Close(doc, FALSE);
4610
4611     /* Activate HTMLDocument again */
4612     test_Activate(doc, CLIENTSITE_SETNULL);
4613     test_Window(doc, TRUE);
4614     test_OleCommandTarget(doc);
4615     test_UIDeactivate();
4616     test_InPlaceDeactivate(doc, TRUE);
4617     test_Close(doc, FALSE);
4618
4619     /* Activate HTMLDocument again, this time without UIActivate */
4620     call_UIActivate = CallUIActivate_None;
4621     test_Activate(doc, CLIENTSITE_SETNULL);
4622     test_Window(doc, TRUE);
4623
4624     test_UIDeactivate();
4625     test_InPlaceDeactivate(doc, TRUE);
4626     test_CloseView();
4627     test_CloseView();
4628     test_Close(doc, TRUE);
4629     test_OnAmbientPropertyChange2(doc);
4630     test_GetCurMoniker((IUnknown*)doc, do_load ? &Moniker : NULL, NULL);
4631
4632     if(!do_load) {
4633         /* Activate HTMLDocument again, calling UIActivate after showing the window */
4634         call_UIActivate = CallUIActivate_AfterShow;
4635         test_Activate(doc, 0);
4636         test_Window(doc, TRUE);
4637         test_OleCommandTarget(doc);
4638         test_UIDeactivate();
4639         test_InPlaceDeactivate(doc, TRUE);
4640         test_Close(doc, FALSE);
4641         call_UIActivate = CallUIActivate_None;
4642     }
4643
4644     if(view)
4645         IOleDocumentView_Release(view);
4646     view = NULL;
4647
4648     ok(IsWindow(hwnd), "hwnd is destroyed\n");
4649
4650     ref = IHTMLDocument2_Release(doc);
4651     ok(ref == 0, "ref=%d, expected 0\n", ref);
4652
4653     ok(!IsWindow(hwnd), "hwnd is not destroyed\n");
4654 }
4655
4656 static void test_HTMLDocument_hlink(void)
4657 {
4658     IHTMLDocument2 *doc;
4659     HRESULT hres;
4660     ULONG ref;
4661
4662     trace("Testing HTMLDocument (hlink)...\n");
4663
4664     init_test(LD_DOLOAD);
4665     ipsex = TRUE;
4666
4667     hres = create_document(&doc);
4668     if(FAILED(hres))
4669         return;
4670     doc_unk = (IUnknown*)doc;
4671
4672     test_ViewAdviseSink(doc);
4673     test_ConnectionPointContainer(doc);
4674     test_GetCurMoniker((IUnknown*)doc, NULL, NULL);
4675     test_Persist(doc, &Moniker);
4676     test_Navigate(doc);
4677     if(show_failed) {
4678         IUnknown_Release(doc);
4679         return;
4680     }
4681
4682     test_download(DWL_CSS|DWL_TRYCSS);
4683
4684     test_IsDirty(doc, S_FALSE);
4685     test_MSHTML_QueryStatus(doc, OLECMDF_SUPPORTED);
4686
4687     test_exec_onunload(doc);
4688     test_Window(doc, TRUE);
4689     test_InPlaceDeactivate(doc, TRUE);
4690     test_Close(doc, FALSE);
4691     test_IsDirty(doc, S_FALSE);
4692     test_GetCurMoniker((IUnknown*)doc, &Moniker, NULL);
4693     test_clear(doc);
4694     test_GetCurMoniker((IUnknown*)doc, &Moniker, NULL);
4695
4696     if(view)
4697         IOleDocumentView_Release(view);
4698     view = NULL;
4699
4700     ref = IHTMLDocument2_Release(doc);
4701     ok(ref == 0, "ref=%d, expected 0\n", ref);
4702 }
4703
4704 static void test_cookies(IHTMLDocument2 *doc)
4705 {
4706     WCHAR buf[1024];
4707     DWORD size;
4708     BSTR str, str2;
4709     BOOL b;
4710     HRESULT hres;
4711
4712     hres = IHTMLDocument2_get_cookie(doc, &str);
4713     ok(hres == S_OK, "get_cookie failed: %08x\n", hres);
4714     if(str) {
4715         size = sizeof(buf)/sizeof(WCHAR);
4716         b = InternetGetCookieW(http_urlW, NULL, buf, &size);
4717         ok(b, "InternetGetCookieW failed: %08x\n", GetLastError());
4718         ok(!lstrcmpW(buf, str), "cookie = %s, expected %s\n", wine_dbgstr_w(str), wine_dbgstr_w(buf));
4719         SysFreeString(str);
4720     }
4721
4722     str = a2bstr("test=testval");
4723     hres = IHTMLDocument2_put_cookie(doc, str);
4724     ok(hres == S_OK, "put_cookie failed: %08x\n", hres);
4725
4726     str2 = NULL;
4727     hres = IHTMLDocument2_get_cookie(doc, &str2);
4728     ok(hres == S_OK, "get_cookie failed: %08x\n", hres);
4729     ok(str2 != NULL, "cookie = NULL\n");
4730     size = sizeof(buf)/sizeof(WCHAR);
4731     b = InternetGetCookieW(http_urlW, NULL, buf, &size);
4732     ok(b, "InternetGetCookieW failed: %08x\n", GetLastError());
4733     ok(!lstrcmpW(buf, str2), "cookie = %s, expected %s\n", wine_dbgstr_w(str2), wine_dbgstr_w(buf));
4734     ok(strstrW(str2, str) != NULL, "could not find %s in %s\n", wine_dbgstr_w(str), wine_dbgstr_w(str2));
4735     SysFreeString(str);
4736     SysFreeString(str2);
4737
4738     str = a2bstr("test=testval2");
4739     hres = IHTMLDocument2_put_cookie(doc, str);
4740     ok(hres == S_OK, "put_cookie failed: %08x\n", hres);
4741
4742     str2 = NULL;
4743     hres = IHTMLDocument2_get_cookie(doc, &str2);
4744     ok(hres == S_OK, "get_cookie failed: %08x\n", hres);
4745     ok(str2 != NULL, "cookie = NULL\n");
4746     size = sizeof(buf)/sizeof(WCHAR);
4747     b = InternetGetCookieW(http_urlW, NULL, buf, &size);
4748     ok(b, "InternetGetCookieW failed: %08x\n", GetLastError());
4749     ok(!lstrcmpW(buf, str2), "cookie = %s, expected %s\n", wine_dbgstr_w(str2), wine_dbgstr_w(buf));
4750     ok(strstrW(str2, str) != NULL, "could not find %s in %s\n", wine_dbgstr_w(str), wine_dbgstr_w(str2));
4751     SysFreeString(str);
4752     SysFreeString(str2);
4753 }
4754
4755 static void test_HTMLDocument_http(void)
4756 {
4757     IMoniker *http_mon;
4758     IHTMLDocument2 *doc;
4759     ULONG ref;
4760     HRESULT hres;
4761
4762     trace("Testing HTMLDocument (http)...\n");
4763
4764     if(!winetest_interactive && is_ie_hardened()) {
4765         win_skip("IE running in Enhanced Security Configuration\n");
4766         return;
4767     }
4768
4769     init_test(LD_DOLOAD);
4770     ipsex = TRUE;
4771
4772     hres = create_document(&doc);
4773     if(FAILED(hres))
4774         return;
4775     doc_unk = (IUnknown*)doc;
4776
4777     hres = CreateURLMoniker(NULL, http_urlW, &http_mon);
4778     ok(hres == S_OK, "CreateURLMoniker failed: %08x\n", hres);
4779
4780     test_ViewAdviseSink(doc);
4781     test_ConnectionPointContainer(doc);
4782     test_GetCurMoniker((IUnknown*)doc, NULL, NULL);
4783     test_Persist(doc, http_mon);
4784     test_Navigate(doc);
4785     if(show_failed) {
4786         IUnknown_Release(doc);
4787         return;
4788     }
4789
4790     test_download(DWL_HTTP);
4791     test_cookies(doc);
4792     test_IsDirty(doc, S_FALSE);
4793     test_MSHTML_QueryStatus(doc, OLECMDF_SUPPORTED);
4794     test_GetCurMoniker((IUnknown*)doc, http_mon, NULL);
4795
4796     test_put_href(doc);
4797     test_open_window(doc);
4798
4799     test_InPlaceDeactivate(doc, TRUE);
4800     test_Close(doc, FALSE);
4801     test_IsDirty(doc, S_FALSE);
4802     test_GetCurMoniker((IUnknown*)doc, NULL, about_blank_url);
4803
4804     if(view)
4805         IOleDocumentView_Release(view);
4806     view = NULL;
4807
4808     ref = IHTMLDocument2_Release(doc);
4809     ok(!ref, "ref=%d, expected 0\n", ref);
4810
4811     ref = IMoniker_Release(http_mon);
4812     ok(!ref, "ref=%d, expected 0\n", ref);
4813 }
4814
4815 static void test_QueryService(IHTMLDocument2 *doc, BOOL success)
4816 {
4817     IServiceProvider *sp;
4818     IHlinkFrame *hf;
4819     HRESULT hres;
4820
4821     hres = IUnknown_QueryInterface(doc, &IID_IServiceProvider, (void**)&sp);
4822     ok(hres == S_OK, "QueryService returned %08x\n", hres);
4823
4824     hres = IServiceProvider_QueryService(sp, &IID_IHlinkFrame, &IID_IHlinkFrame, (void**)&hf);
4825     if(SUCCEEDED(hres))
4826         IHlinkFrame_Release(hf);
4827
4828     ok(hres == (success?S_OK:E_NOINTERFACE), "QueryService returned %08x, expected %08x\n", hres, success?S_OK:E_NOINTERFACE);
4829
4830     IServiceProvider_Release(sp);
4831 }
4832
4833 static void test_HTMLDocument_StreamLoad(void)
4834 {
4835     IHTMLDocument2 *doc;
4836     IOleObject *oleobj;
4837     DWORD conn;
4838     HRESULT hres;
4839     ULONG ref;
4840
4841     trace("Testing HTMLDocument (IPersistStreamInit)...\n");
4842
4843     init_test(LD_DOLOAD);
4844     load_from_stream = TRUE;
4845
4846     hres = create_document(&doc);
4847     if(FAILED(hres))
4848         return;
4849     doc_unk = (IUnknown*)doc;
4850
4851     hres = IUnknown_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj);
4852     ok(hres == S_OK, "Could not get IOleObject: %08x\n", hres);
4853
4854     hres = IOleObject_Advise(oleobj, (IAdviseSink*)&AdviseSink, &conn);
4855     ok(hres == S_OK, "Advise failed: %08x\n", hres);
4856
4857     test_readyState((IUnknown*)doc);
4858     test_IsDirty(doc, S_FALSE);
4859     test_ViewAdviseSink(doc);
4860     test_ConnectionPointContainer(doc);
4861     test_QueryService(doc, FALSE);
4862     test_ClientSite(oleobj, CLIENTSITE_EXPECTPATH);
4863     test_QueryService(doc, TRUE);
4864     test_DoVerb(oleobj);
4865     test_MSHTML_QueryStatus(doc, OLECMDF_SUPPORTED);
4866
4867     IOleObject_Release(oleobj);
4868
4869     test_GetCurMoniker((IUnknown*)doc, NULL, NULL);
4870     test_StreamLoad(doc);
4871     test_download(DWL_VERBDONE|DWL_TRYCSS);
4872     test_MSHTML_QueryStatus(doc, OLECMDF_SUPPORTED);
4873
4874     test_UIDeactivate();
4875     test_InPlaceDeactivate(doc, TRUE);
4876     SET_EXPECT(Advise_Close);
4877     test_Close(doc, FALSE);
4878     CHECK_CALLED(Advise_Close);
4879     test_IsDirty(doc, S_FALSE);
4880
4881     if(view) {
4882         IOleDocumentView_Release(view);
4883         view = NULL;
4884     }
4885
4886
4887     ref = IHTMLDocument2_Release(doc);
4888     ok(ref == 0, "ref=%d, expected 0\n", ref);
4889 }
4890
4891 static void test_HTMLDocument_StreamInitNew(void)
4892 {
4893     IHTMLDocument2 *doc;
4894     IOleObject *oleobj;
4895     DWORD conn;
4896     HRESULT hres;
4897     ULONG ref;
4898
4899     trace("Testing HTMLDocument (IPersistStreamInit)...\n");
4900
4901     init_test(LD_DOLOAD);
4902     load_from_stream = TRUE;
4903
4904     hres = create_document(&doc);
4905     if(FAILED(hres))
4906         return;
4907     doc_unk = (IUnknown*)doc;
4908
4909     hres = IUnknown_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj);
4910     ok(hres == S_OK, "Could not get IOleObject: %08x\n", hres);
4911
4912     hres = IOleObject_Advise(oleobj, (IAdviseSink*)&AdviseSink, &conn);
4913     ok(hres == S_OK, "Advise failed: %08x\n", hres);
4914
4915     test_readyState((IUnknown*)doc);
4916     test_IsDirty(doc, S_FALSE);
4917     test_ViewAdviseSink(doc);
4918     test_ConnectionPointContainer(doc);
4919     test_ClientSite(oleobj, CLIENTSITE_EXPECTPATH);
4920     test_DoVerb(oleobj);
4921     test_MSHTML_QueryStatus(doc, OLECMDF_SUPPORTED);
4922
4923     IOleObject_Release(oleobj);
4924
4925     test_GetCurMoniker((IUnknown*)doc, NULL, NULL);
4926     test_StreamInitNew(doc);
4927     test_download(DWL_VERBDONE|DWL_TRYCSS|DWL_EMPTY);
4928     test_MSHTML_QueryStatus(doc, OLECMDF_SUPPORTED);
4929
4930     test_UIDeactivate();
4931     test_InPlaceDeactivate(doc, TRUE);
4932     SET_EXPECT(Advise_Close);
4933     test_Close(doc, FALSE);
4934     CHECK_CALLED(Advise_Close);
4935     test_IsDirty(doc, S_FALSE);
4936
4937     if(view) {
4938         IOleDocumentView_Release(view);
4939         view = NULL;
4940     }
4941
4942
4943     ref = IHTMLDocument2_Release(doc);
4944     ok(ref == 0, "ref=%d, expected 0\n", ref);
4945 }
4946
4947 static void test_edit_uiactivate(IOleObject *oleobj)
4948 {
4949     IOleDocumentView *docview;
4950     HRESULT hres;
4951
4952     hres = IOleObject_QueryInterface(oleobj, &IID_IOleDocumentView, (void **)&docview);
4953     ok(hres == S_OK, "IOleObject_QueryInterface failed with error 0x%08x\n", hres);
4954
4955     SET_EXPECT(OnFocus_TRUE);
4956     SET_EXPECT(SetActiveObject);
4957     SET_EXPECT(ShowUI);
4958     SET_EXPECT(InPlaceUIWindow_SetActiveObject);
4959     SET_EXPECT(InPlaceFrame_SetBorderSpace);
4960     expect_status_text = NULL;
4961
4962     hres = IOleDocumentView_UIActivate(docview, TRUE);
4963     ok(hres == S_OK, "IOleDocumentView_UIActivate failed with error 0x%08x\n", hres);
4964
4965     CHECK_CALLED(OnFocus_TRUE);
4966     CHECK_CALLED(SetActiveObject);
4967     CHECK_CALLED(ShowUI);
4968     CHECK_CALLED(InPlaceUIWindow_SetActiveObject);
4969     CHECK_CALLED(InPlaceFrame_SetBorderSpace);
4970
4971     IOleDocumentView_Release(docview);
4972 }
4973
4974 static void test_editing_mode(BOOL do_load)
4975 {
4976     IHTMLDocument2 *doc;
4977     IUnknown *unk;
4978     IOleObject *oleobj;
4979     DWORD conn;
4980     HRESULT hres;
4981     ULONG ref;
4982
4983     trace("Testing HTMLDocument (edit%s)...\n", do_load ? " load" : "");
4984
4985     init_test(do_load ? LD_DOLOAD : LD_NO);
4986     call_UIActivate = CallUIActivate_AfterShow;
4987
4988     hres = create_document(&doc);
4989     if(FAILED(hres))
4990         return;
4991     unk = doc_unk = (IUnknown*)doc;
4992
4993     hres = IUnknown_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj);
4994     ok(hres == S_OK, "Could not get IOleObject: %08x\n", hres);
4995
4996     hres = IOleObject_Advise(oleobj, (IAdviseSink*)&AdviseSink, &conn);
4997     ok(hres == S_OK, "Advise failed: %08x\n", hres);
4998
4999     test_readyState((IUnknown*)doc);
5000     test_ViewAdviseSink(doc);
5001     test_ConnectionPointContainer(doc);
5002     test_ClientSite(oleobj, CLIENTSITE_EXPECTPATH);
5003     test_DoVerb(oleobj);
5004     test_edit_uiactivate(oleobj);
5005
5006     test_MSHTML_QueryStatus(doc, OLECMDF_SUPPORTED);
5007     if(do_load)
5008         test_Persist(doc, &Moniker);
5009     stream_read = protocol_read = 0;
5010     test_exec_editmode(unk, do_load);
5011     test_UIDeactivate();
5012     call_UIActivate = CallUIActivate_None;
5013     IOleObject_Release(oleobj);
5014
5015     test_MSHTML_QueryStatus(doc, OLECMDF_SUPPORTED);
5016     test_download(DWL_VERBDONE | (do_load ? DWL_CSS|DWL_TRYCSS : 0));
5017
5018     SET_EXPECT(SetStatusText); /* ignore race in native mshtml */
5019     test_timer(EXPECT_UPDATEUI);
5020     SET_CALLED(SetStatusText);
5021
5022     test_MSHTML_QueryStatus(doc, OLECMDF_SUPPORTED|OLECMDF_ENABLED);
5023
5024     if(!do_load) {
5025         test_exec_fontname(unk, NULL, wszTimesNewRoman);
5026         test_exec_fontname(unk, wszArial, wszTimesNewRoman);
5027         test_timer(EXPECT_UPDATEUI);
5028         test_exec_fontname(unk, NULL, wszArial);
5029
5030         test_exec_noargs(unk, IDM_JUSTIFYRIGHT);
5031         test_timer(EXPECT_UPDATEUI);
5032         test_QueryStatus(unk, &CGID_MSHTML, IDM_JUSTIFYRIGHT,
5033                          OLECMDF_SUPPORTED|OLECMDF_ENABLED|OLECMDF_LATCHED);
5034
5035         test_exec_noargs(unk, IDM_JUSTIFYCENTER);
5036         test_timer(EXPECT_UPDATEUI);
5037         test_QueryStatus(unk, &CGID_MSHTML, IDM_JUSTIFYRIGHT,
5038                          OLECMDF_SUPPORTED|OLECMDF_ENABLED);
5039         test_QueryStatus(unk, &CGID_MSHTML, IDM_JUSTIFYCENTER,
5040                          OLECMDF_SUPPORTED|OLECMDF_ENABLED|OLECMDF_LATCHED);
5041
5042         test_exec_noargs(unk, IDM_HORIZONTALLINE);
5043         test_timer(EXPECT_UPDATEUI);
5044         test_QueryStatus(unk, &CGID_MSHTML, IDM_HORIZONTALLINE,
5045                          OLECMDF_SUPPORTED|OLECMDF_ENABLED);
5046     }
5047
5048     test_UIDeactivate();
5049     test_InPlaceDeactivate(doc, TRUE);
5050     SET_EXPECT(Advise_Close);
5051     test_Close(doc, FALSE);
5052     CHECK_CALLED(Advise_Close);
5053
5054     if(view) {
5055         IOleDocumentView_Release(view);
5056         view = NULL;
5057     }
5058
5059     ref = IUnknown_Release(unk);
5060     ok(ref == 0, "ref=%d, expected 0\n", ref);
5061 }
5062
5063 static void test_UIActivate(BOOL do_load, BOOL use_ipsex, BOOL use_ipsw)
5064 {
5065     IHTMLDocument2 *doc;
5066     IOleObject *oleobj;
5067     IOleInPlaceSite *inplacesite;
5068     HRESULT hres;
5069     ULONG ref;
5070
5071     trace("Running OleDocumentView_UIActivate tests (%d %d %d)\n", do_load, use_ipsex, use_ipsw);
5072
5073     init_test(do_load ? LD_DOLOAD : LD_NO);
5074
5075     hres = create_document(&doc);
5076     if(FAILED(hres))
5077         return;
5078     doc_unk = (IUnknown*)doc;
5079
5080     ipsex = use_ipsex;
5081     ipsw = use_ipsw;
5082
5083     hres = IUnknown_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj);
5084     ok(hres == S_OK, "QueryInterface(IID_IOleObject) failed: %08x\n", hres);
5085
5086     hres = IUnknown_QueryInterface(doc, &IID_IOleDocumentView, (void**)&view);
5087     ok(hres == S_OK, "QueryInterface(IID_IOleDocumentView) failed: %08x\n", hres);
5088
5089     SET_EXPECT(Invoke_AMBIENT_USERMODE);
5090     SET_EXPECT(GetHostInfo);
5091     SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
5092     SET_EXPECT(Invoke_AMBIENT_SILENT);
5093     SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
5094     SET_EXPECT(Invoke_AMBIENT_USERAGENT);
5095     SET_EXPECT(Invoke_AMBIENT_PALETTE);
5096     SET_EXPECT(GetOptionKeyPath);
5097     SET_EXPECT(GetOverrideKeyPath);
5098     SET_EXPECT(GetWindow);
5099     SET_EXPECT(Exec_DOCCANNAVIGATE);
5100     SET_EXPECT(QueryStatus_SETPROGRESSTEXT);
5101     SET_EXPECT(Exec_SETPROGRESSMAX);
5102     SET_EXPECT(Exec_SETPROGRESSPOS);
5103
5104     hres = IOleObject_SetClientSite(oleobj, &ClientSite);
5105     ok(hres == S_OK, "SetClientSite failed: %08x\n", hres);
5106
5107     CHECK_CALLED(Invoke_AMBIENT_USERMODE);
5108     CHECK_CALLED(GetHostInfo);
5109     CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
5110     CHECK_CALLED(Invoke_AMBIENT_SILENT);
5111     CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
5112     CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
5113     CHECK_CALLED(Invoke_AMBIENT_PALETTE);
5114     CHECK_CALLED(GetOptionKeyPath);
5115     CHECK_CALLED(GetOverrideKeyPath);
5116     CHECK_CALLED(GetWindow);
5117     CHECK_CALLED(Exec_DOCCANNAVIGATE);
5118     CHECK_CALLED(QueryStatus_SETPROGRESSTEXT);
5119     CHECK_CALLED(Exec_SETPROGRESSMAX);
5120     CHECK_CALLED(Exec_SETPROGRESSPOS);
5121
5122     hres = IOleDocumentView_GetInPlaceSite(view, &inplacesite);
5123     ok(hres == S_OK, "GetInPlaceSite failed: %08x\n", hres);
5124     ok(inplacesite == NULL, "inplacesite = %p, expected NULL\n", inplacesite);
5125
5126     SET_EXPECT(GetContainer);
5127     SET_EXPECT(LockContainer);
5128     SET_EXPECT(CanInPlaceActivate);
5129     SET_EXPECT(GetWindowContext);
5130     SET_EXPECT(GetWindow);
5131     if(use_ipsex) {
5132         SET_EXPECT(OnInPlaceActivateEx);
5133         SET_EXPECT(RequestUIActivate);
5134     }
5135     else
5136         SET_EXPECT(OnInPlaceActivate);
5137     SET_EXPECT(OnUIActivate);
5138     SET_EXPECT(SetStatusText);
5139     SET_EXPECT(Exec_SETPROGRESSMAX);
5140     SET_EXPECT(Exec_SETPROGRESSPOS);
5141     SET_EXPECT(ShowUI);
5142     SET_EXPECT(InPlaceUIWindow_SetActiveObject);
5143     SET_EXPECT(InPlaceFrame_SetBorderSpace);
5144     SET_EXPECT(OnFocus_TRUE);
5145     SET_EXPECT(SetActiveObject);
5146     expect_LockContainer_fLock = TRUE;
5147
5148     hres = IOleDocumentView_UIActivate(view, TRUE);
5149     ok(hres == S_OK, "UIActivate failed: %08x\n", hres);
5150
5151     CHECK_CALLED(GetContainer);
5152     CHECK_CALLED(LockContainer);
5153     CHECK_CALLED(CanInPlaceActivate);
5154     CHECK_CALLED(GetWindowContext);
5155     CHECK_CALLED(GetWindow);
5156     if(use_ipsex) {
5157         CHECK_CALLED(OnInPlaceActivateEx);
5158         SET_EXPECT(RequestUIActivate);
5159     }
5160     else
5161         CHECK_CALLED(OnInPlaceActivate);
5162     CHECK_CALLED(OnUIActivate);
5163     CHECK_CALLED(SetStatusText);
5164     CHECK_CALLED(Exec_SETPROGRESSMAX);
5165     CHECK_CALLED(Exec_SETPROGRESSPOS);
5166     CHECK_CALLED(ShowUI);
5167     CHECK_CALLED(InPlaceUIWindow_SetActiveObject);
5168     CHECK_CALLED(InPlaceFrame_SetBorderSpace);
5169     CHECK_CALLED(OnFocus_TRUE);
5170     CHECK_CALLED(SetActiveObject);
5171     container_locked = TRUE;
5172
5173     SET_EXPECT(SetActiveObject_null);
5174     SET_EXPECT(InPlaceUIWindow_SetActiveObject);
5175     SET_EXPECT(HideUI);
5176     SET_EXPECT(OnUIDeactivate);
5177
5178     hres = IOleDocumentView_UIActivate(view, FALSE);
5179     ok(hres == S_OK, "UIActivate failed: %08x\n", hres);
5180
5181     CHECK_CALLED(SetActiveObject_null);
5182     CHECK_CALLED(InPlaceUIWindow_SetActiveObject);
5183     CHECK_CALLED(HideUI);
5184     CHECK_CALLED(OnUIDeactivate);
5185
5186     hres = IOleDocumentView_GetInPlaceSite(view, &inplacesite);
5187     ok(hres == S_OK, "GetInPlaceSite failed: %08x\n", hres);
5188     ok(inplacesite != NULL, "inplacesite = NULL\n");
5189     IOleInPlaceSite_Release(inplacesite);
5190
5191     SET_EXPECT(OnFocus_FALSE);
5192     if(use_ipsex)
5193         SET_EXPECT(OnInPlaceDeactivateEx);
5194     else
5195         SET_EXPECT(OnInPlaceDeactivate);
5196
5197     test_CloseView();
5198
5199     CHECK_CALLED(OnFocus_FALSE);
5200     if(use_ipsex)
5201         CHECK_CALLED(OnInPlaceDeactivateEx);
5202     else
5203         CHECK_CALLED(OnInPlaceDeactivate);
5204
5205     test_Close(doc, TRUE);
5206
5207     IOleObject_Release(oleobj);
5208     IOleDocumentView_Release(view);
5209     view = NULL;
5210
5211     ref = IHTMLDocument2_Release(doc);
5212     ok(ref == 0, "ref=%d, expected 0\n", ref);
5213 }
5214
5215 static void register_protocol(void)
5216 {
5217     IInternetSession *session;
5218     HRESULT hres;
5219
5220     static const WCHAR wsz_winetest[] = {'w','i','n','e','t','e','s','t',0};
5221
5222     hres = CoInternetGetSession(0, &session, 0);
5223     ok(hres == S_OK, "CoInternetGetSession failed: %08x\n", hres);
5224
5225     hres = IInternetSession_RegisterNameSpace(session, &ClassFactory, &IID_NULL,
5226             wsz_winetest, 0, NULL, 0);
5227     ok(hres == S_OK, "RegisterNameSpace failed: %08x\n", hres);
5228
5229     IInternetSession_Release(session);
5230 }
5231
5232 static void test_HTMLDoc_ISupportErrorInfo(void)
5233 {
5234     IHTMLDocument2 *doc;
5235     HRESULT hres;
5236     ISupportErrorInfo *sinfo;
5237     LONG ref;
5238
5239     hres = create_document(&doc);
5240     if(FAILED(hres))
5241         return;
5242
5243     hres = IUnknown_QueryInterface(doc, &IID_ISupportErrorInfo, (void**)&sinfo);
5244     ok(hres == S_OK, "got %x\n", hres);
5245     ok(sinfo != NULL, "got %p\n", sinfo);
5246     if(sinfo)
5247     {
5248         hres = ISupportErrorInfo_InterfaceSupportsErrorInfo(sinfo, &IID_IErrorInfo);
5249         ok(hres == S_FALSE, "Expected S_OK, got %x\n", hres);
5250         IUnknown_Release(sinfo);
5251     }
5252
5253     ref = IHTMLDocument2_Release(doc);
5254     ok(ref == 0, "ref=%d, expected 0\n", ref);
5255 }
5256
5257 static void test_IPersistHistory(void)
5258 {
5259     IHTMLDocument2 *doc;
5260     HRESULT hres;
5261     LONG ref;
5262     IPersistHistory *phist;
5263
5264     hres = create_document(&doc);
5265     if(FAILED(hres))
5266         return;
5267
5268     hres = IUnknown_QueryInterface(doc, &IID_IPersistHistory, (void**)&phist);
5269     ok(hres == S_OK, "QueryInterface returned %08x, expected S_OK\n", hres);
5270     if(hres == S_OK)
5271         IPersistHistory_Release(phist);
5272
5273     ref = IHTMLDocument2_Release(doc);
5274     ok(ref == 0, "ref=%d, expected 0\n", ref);
5275 }
5276
5277 START_TEST(htmldoc)
5278 {
5279     CoInitialize(NULL);
5280     container_hwnd = create_container_window();
5281     register_protocol();
5282
5283     test_HTMLDocument_hlink();
5284     if(!show_failed) {
5285         test_HTMLDocument(FALSE);
5286         test_HTMLDocument(TRUE);
5287         test_HTMLDocument_StreamLoad();
5288         test_HTMLDocument_StreamInitNew();
5289         test_editing_mode(FALSE);
5290         test_editing_mode(TRUE);
5291         test_HTMLDocument_http();
5292         test_UIActivate(FALSE, FALSE, FALSE);
5293         test_UIActivate(FALSE, TRUE, FALSE);
5294         test_UIActivate(FALSE, TRUE, TRUE);
5295         test_UIActivate(TRUE, FALSE, FALSE);
5296         test_UIActivate(TRUE, TRUE, FALSE);
5297         test_UIActivate(TRUE, TRUE, TRUE);
5298     }
5299     test_HTMLDoc_ISupportErrorInfo();
5300     test_IPersistHistory();
5301
5302     DestroyWindow(container_hwnd);
5303     CoUninitialize();
5304 }