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