mshtml: Fixed tests on IE7.
[wine] / dlls / mshtml / tests / htmldoc.c
1 /*
2  * Copyright 2005-2007 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 "ole2.h"
29 #include "mshtml.h"
30 #include "docobj.h"
31 #include "mshtmhst.h"
32 #include "mshtmdid.h"
33 #include "mshtmcid.h"
34 #include "hlink.h"
35 #include "idispids.h"
36 #include "shlguid.h"
37
38 #include "initguid.h"
39 DEFINE_OLEGUID(CGID_DocHostCmdPriv, 0x000214D4L, 0, 0);
40
41 #define DEFINE_EXPECT(func) \
42     static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
43
44 #define SET_EXPECT(func) \
45     expect_ ## func = TRUE
46
47 #define SET_CALLED(func) \
48     called_ ## func = TRUE
49
50 #define CHECK_EXPECT2(func) \
51     do { \
52         ok(expect_ ##func, "unexpected call " #func "\n"); \
53         called_ ## func = TRUE; \
54     }while(0)
55
56 #define CHECK_EXPECT(func) \
57     do { \
58         CHECK_EXPECT2(func); \
59         expect_ ## func = FALSE; \
60     }while(0)
61
62 #define CHECK_CALLED(func) \
63     do { \
64         ok(called_ ## func, "expected " #func "\n"); \
65         expect_ ## func = called_ ## func = FALSE; \
66     }while(0)
67
68 static IOleDocumentView *view = NULL;
69 static HWND container_hwnd = NULL, hwnd = NULL, last_hwnd = NULL;
70
71 DEFINE_EXPECT(LockContainer);
72 DEFINE_EXPECT(SetActiveObject);
73 DEFINE_EXPECT(GetWindow);
74 DEFINE_EXPECT(CanInPlaceActivate);
75 DEFINE_EXPECT(OnInPlaceActivate);
76 DEFINE_EXPECT(OnInPlaceActivateEx);
77 DEFINE_EXPECT(OnUIActivate);
78 DEFINE_EXPECT(GetWindowContext);
79 DEFINE_EXPECT(OnUIDeactivate);
80 DEFINE_EXPECT(OnInPlaceDeactivate);
81 DEFINE_EXPECT(OnInPlaceDeactivateEx);
82 DEFINE_EXPECT(GetContainer);
83 DEFINE_EXPECT(ShowUI);
84 DEFINE_EXPECT(ActivateMe);
85 DEFINE_EXPECT(GetHostInfo);
86 DEFINE_EXPECT(HideUI);
87 DEFINE_EXPECT(GetOptionKeyPath);
88 DEFINE_EXPECT(GetOverrideKeyPath);
89 DEFINE_EXPECT(SetStatusText);
90 DEFINE_EXPECT(QueryStatus_SETPROGRESSTEXT);
91 DEFINE_EXPECT(QueryStatus_OPEN);
92 DEFINE_EXPECT(QueryStatus_NEW);
93 DEFINE_EXPECT(Exec_SETPROGRESSMAX);
94 DEFINE_EXPECT(Exec_SETPROGRESSPOS);
95 DEFINE_EXPECT(Exec_HTTPEQUIV_DONE); 
96 DEFINE_EXPECT(Exec_SETDOWNLOADSTATE_0);
97 DEFINE_EXPECT(Exec_SETDOWNLOADSTATE_1);
98 DEFINE_EXPECT(Exec_ShellDocView_37);
99 DEFINE_EXPECT(Exec_UPDATECOMMANDS);
100 DEFINE_EXPECT(Exec_SETTITLE);
101 DEFINE_EXPECT(Exec_HTTPEQUIV);
102 DEFINE_EXPECT(Exec_MSHTML_PARSECOMPLETE);
103 DEFINE_EXPECT(Invoke_AMBIENT_USERMODE);
104 DEFINE_EXPECT(Invoke_AMBIENT_DLCONTROL);
105 DEFINE_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
106 DEFINE_EXPECT(Invoke_AMBIENT_SILENT);
107 DEFINE_EXPECT(Invoke_AMBIENT_USERAGENT);
108 DEFINE_EXPECT(Invoke_AMBIENT_PALETTE);
109 DEFINE_EXPECT(GetDropTarget);
110 DEFINE_EXPECT(UpdateUI);
111 DEFINE_EXPECT(Navigate);
112 DEFINE_EXPECT(OnFrameWindowActivate);
113 DEFINE_EXPECT(OnChanged_READYSTATE);
114 DEFINE_EXPECT(OnChanged_1005);
115 DEFINE_EXPECT(GetDisplayName);
116 DEFINE_EXPECT(BindToStorage);
117 DEFINE_EXPECT(Abort);
118 DEFINE_EXPECT(Read);
119 DEFINE_EXPECT(CreateInstance);
120 DEFINE_EXPECT(Start);
121 DEFINE_EXPECT(Terminate);
122 DEFINE_EXPECT(Protocol_Read);
123 DEFINE_EXPECT(LockRequest);
124 DEFINE_EXPECT(UnlockRequest);
125 DEFINE_EXPECT(OnFocus_TRUE);
126 DEFINE_EXPECT(OnFocus_FALSE);
127 DEFINE_EXPECT(RequestUIActivate);
128 DEFINE_EXPECT(InPlaceFrame_SetBorderSpace);
129 DEFINE_EXPECT(InPlaceUIWindow_SetActiveObject);
130 DEFINE_EXPECT(GetExternal);
131
132 static IUnknown *doc_unk;
133 static BOOL expect_LockContainer_fLock;
134 static BOOL expect_SetActiveObject_active, expect_InPlaceUIWindow_SetActiveObject_active = TRUE;
135 static BOOL ipsex;
136 static BOOL set_clientsite = FALSE, container_locked = FALSE;
137 static BOOL readystate_set_loading = FALSE, load_from_stream;
138 static BOOL editmode = FALSE;
139 static int stream_read, protocol_read;
140 static enum load_state_t {
141     LD_DOLOAD,
142     LD_LOADING,
143     LD_INTERACTIVE,
144     LD_COMPLETE,
145     LD_NO
146 } load_state;
147
148 static LPCOLESTR expect_status_text = NULL;
149
150 static const char html_page[] =
151 "<html>"
152 "<head><link rel=\"stylesheet\" type=\"text/css\" href=\"test.css\"></head>"
153 "<body>test</body>"
154 "</html>";
155
156 static const char css_data[] = "body {color: red}";
157
158 static const WCHAR doc_url[] = {'w','i','n','e','t','e','s','t',':','d','o','c',0};
159 static const WCHAR about_blank_url[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
160
161 static HRESULT QueryInterface(REFIID riid, void **ppv);
162 static void test_readyState(IUnknown*);
163 static void test_MSHTML_QueryStatus(IUnknown*,DWORD);
164 static BOOL nogecko = FALSE;
165
166 static void test_GetCurMoniker(IUnknown*,IMoniker*,LPCWSTR);
167
168 static const WCHAR wszTimesNewRoman[] =
169     {'T','i','m','e','s',' ','N','e','w',' ','R','o','m','a','n',0};
170 static const WCHAR wszArial[] =
171     {'A','r','i','a','l',0};
172
173 static const char *debugstr_guid(REFIID riid)
174 {
175     static char buf[50];
176
177     sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
178             riid->Data1, riid->Data2, riid->Data3, riid->Data4[0],
179             riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4],
180             riid->Data4[5], riid->Data4[6], riid->Data4[7]);
181
182     return buf;
183 }
184
185 #define EXPECT_UPDATEUI  1
186 #define EXPECT_SETTITLE  2
187
188 static void test_timer(DWORD flags)
189 {
190     BOOL *b = &called_Exec_SETTITLE;
191     MSG msg;
192
193     if(flags & EXPECT_UPDATEUI) {
194         SET_EXPECT(UpdateUI);
195         SET_EXPECT(Exec_UPDATECOMMANDS);
196         b = &called_UpdateUI;
197     }
198     if(flags & EXPECT_SETTITLE)
199         SET_EXPECT(Exec_SETTITLE);
200
201     while(!*b && GetMessage(&msg, hwnd, 0, 0)) {
202         TranslateMessage(&msg);
203         DispatchMessage(&msg);
204     }
205
206     if(flags & EXPECT_UPDATEUI) {
207         CHECK_CALLED(UpdateUI);
208         CHECK_CALLED(Exec_UPDATECOMMANDS);
209     }
210     if(flags & EXPECT_SETTITLE)
211         CHECK_CALLED(Exec_SETTITLE);
212 }
213
214 static HRESULT WINAPI Protocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv)
215 {
216     if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IInternetProtocol, riid)) {
217         *ppv = iface;
218         return S_OK;
219     }
220
221     *ppv = NULL;
222     return E_NOINTERFACE;
223 }
224
225 static ULONG WINAPI Protocol_AddRef(IInternetProtocol *iface)
226 {
227     return 2;
228 }
229
230 static ULONG WINAPI Protocol_Release(IInternetProtocol *iface)
231 {
232     return 1;
233 }
234
235 static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl,
236         IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
237         DWORD grfPI, DWORD dwReserved)
238 {
239     BINDINFO bindinfo;
240     DWORD bindf = 0;
241     HRESULT hres;
242
243     static const WCHAR wszTextCss[] = {'t','e','x','t','/','c','s','s',0};
244     static const WCHAR empty_str = {0};
245
246     CHECK_EXPECT(Start);
247
248     ok(pOIProtSink != NULL, "pOIProtSink == NULL\n");
249     ok(pOIBindInfo != NULL, "pOIBindInfo == NULL\n");
250     ok(!grfPI, "grfPI = %x\n", grfPI);
251     ok(!dwReserved, "dwReserved = %d\n", dwReserved);
252
253     memset(&bindinfo, 0, sizeof(bindinfo));
254     bindinfo.cbSize = sizeof(bindinfo);
255     hres = IInternetBindInfo_GetBindInfo(pOIBindInfo, &bindf, &bindinfo);
256     ok(hres == S_OK, "GetBindInfo failed: %08x\n", hres);
257     ok(bindf == (BINDF_FROMURLMON|BINDF_PULLDATA|BINDF_NEEDFILE|BINDF_ASYNCSTORAGE|BINDF_ASYNCHRONOUS),
258        "bindf = %x\n", bindf);
259
260     ok(bindinfo.cbSize == sizeof(bindinfo), "bindinfo.cbSize=%d\n", bindinfo.cbSize);
261     ok(bindinfo.szExtraInfo == NULL, "bindinfo.szExtraInfo=%p\n", bindinfo.szExtraInfo);
262     /* TODO: test stgmedData */
263     ok(bindinfo.grfBindInfoF == 0, "bindinfo.grfBinfInfoF=%08x\n", bindinfo.grfBindInfoF);
264     ok(bindinfo.dwBindVerb == 0, "bindinfo.dwBindVerb=%d\n", bindinfo.dwBindVerb);
265     ok(bindinfo.szCustomVerb == 0, "bindinfo.szCustomVerb=%p\n", bindinfo.szCustomVerb);
266     ok(bindinfo.cbstgmedData == 0, "bindinfo.cbstgmedData=%d\n", bindinfo.cbstgmedData);
267     ok(bindinfo.dwOptions == 0x80000, "bindinfo.dwOptions=%x\n", bindinfo.dwOptions);
268     ok(bindinfo.dwOptionsFlags == 0, "bindinfo.dwOptionsFlags=%d\n", bindinfo.dwOptionsFlags);
269     /* TODO: test dwCodePage */
270     /* TODO: test securityAttributes */
271     ok(IsEqualGUID(&IID_NULL, &bindinfo.iid), "unexpected bindinfo.iid\n");
272     ok(bindinfo.pUnk == NULL, "bindinfo.pUnk=%p\n", bindinfo.pUnk);
273     ok(bindinfo.dwReserved == 0, "bindinfo.dwReserved=%d\n", bindinfo.dwReserved);
274
275     hres = IInternetProtocolSink_ReportProgress(pOIProtSink,
276             BINDSTATUS_CACHEFILENAMEAVAILABLE, &empty_str);
277     ok(hres == S_OK, "ReportProgress(BINDSTATUS_CACHEFILENAMEAVAILABLE) failed: %08x\n", hres);
278
279     hres = IInternetProtocolSink_ReportProgress(pOIProtSink,
280             BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE, wszTextCss);
281     ok(hres == S_OK,
282        "ReportProgress(BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE) failed: %08x\n", hres);
283
284     hres = IInternetProtocolSink_ReportData(pOIProtSink,
285             BSCF_FIRSTDATANOTIFICATION | BSCF_LASTDATANOTIFICATION, 13, 13);
286     ok(hres == S_OK, "ReportData failed: %08x\n", hres);
287
288     hres = IInternetProtocolSink_ReportResult(pOIProtSink, S_OK, 0, NULL);
289     ok(hres == S_OK, "ReportResult failed: %08x\n", hres);
290
291     return S_OK;
292 }
293
294 static HRESULT WINAPI Protocol_Continue(IInternetProtocol *iface,
295         PROTOCOLDATA *pProtocolData)
296 {
297     ok(0, "unexpected call\n");
298     return E_NOTIMPL;
299 }
300
301 static HRESULT WINAPI Protocol_Abort(IInternetProtocol *iface, HRESULT hrReason,
302         DWORD dwOptions)
303 {
304     ok(0, "unexpected call\n");
305     return E_NOTIMPL;
306 }
307
308 static HRESULT WINAPI Protocol_Terminate(IInternetProtocol *iface, DWORD dwOptions)
309 {
310     CHECK_EXPECT(Terminate);
311     return S_OK;
312 }
313
314 static HRESULT WINAPI Protocol_Suspend(IInternetProtocol *iface)
315 {
316     ok(0, "unexpected call\n");
317     return E_NOTIMPL;
318 }
319
320 static HRESULT WINAPI Protocol_Resume(IInternetProtocol *iface)
321 {
322     ok(0, "unexpected call\n");
323     return E_NOTIMPL;
324 }
325
326 static HRESULT WINAPI Protocol_Read(IInternetProtocol *iface, void *pv,
327         ULONG cb, ULONG *pcbRead)
328 {
329     CHECK_EXPECT2(Protocol_Read);
330
331     ok(pv != NULL, "pv == NULL\n");
332     ok(cb > sizeof(css_data), "cb < sizeof(css_data)\n");
333     ok(pcbRead != NULL, "pcbRead == NULL\n");
334     ok(!*pcbRead, "*pcbRead=%d\n", *pcbRead);
335
336     if(protocol_read)
337         return S_FALSE;
338
339     protocol_read += *pcbRead = sizeof(css_data)-1;
340     memcpy(pv, css_data, sizeof(css_data)-1);
341     return S_OK;
342 }
343
344 static HRESULT WINAPI Protocol_Seek(IInternetProtocol *iface,
345         LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
346 {
347     ok(0, "unexpected call\n");
348     return E_NOTIMPL;
349 }
350
351 static HRESULT WINAPI Protocol_LockRequest(IInternetProtocol *iface, DWORD dwOptions)
352 {
353     CHECK_EXPECT(LockRequest);
354     return S_OK;
355 }
356
357 static HRESULT WINAPI Protocol_UnlockRequest(IInternetProtocol *iface)
358 {
359     CHECK_EXPECT(UnlockRequest);
360     return S_OK;
361 }
362
363 static const IInternetProtocolVtbl ProtocolVtbl = {
364     Protocol_QueryInterface,
365     Protocol_AddRef,
366     Protocol_Release,
367     Protocol_Start,
368     Protocol_Continue,
369     Protocol_Abort,
370     Protocol_Terminate,
371     Protocol_Suspend,
372     Protocol_Resume,
373     Protocol_Read,
374     Protocol_Seek,
375     Protocol_LockRequest,
376     Protocol_UnlockRequest
377 };
378
379 static IInternetProtocol Protocol = { &ProtocolVtbl };
380
381 static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
382 {
383     if(!IsEqualGUID(&IID_IInternetProtocolInfo, riid))
384         ok(0, "unexpected call\n");
385     return E_NOINTERFACE;
386 }
387
388 static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface)
389 {
390     return 2;
391 }
392
393 static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
394 {
395     return 1;
396 }
397
398 static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *pOuter,
399                                         REFIID riid, void **ppv)
400 {
401     if(IsEqualGUID(&IID_IInternetProtocolInfo, riid))
402         return E_NOINTERFACE;
403
404     CHECK_EXPECT(CreateInstance);
405     ok(ppv != NULL, "ppv == NULL\n");
406
407     *ppv = &Protocol;
408     return S_OK;
409 }
410
411 static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL dolock)
412 {
413     ok(0, "unexpected call\n");
414     return S_OK;
415 }
416
417 static const IClassFactoryVtbl ClassFactoryVtbl = {
418     ClassFactory_QueryInterface,
419     ClassFactory_AddRef,
420     ClassFactory_Release,
421     ClassFactory_CreateInstance,
422     ClassFactory_LockServer
423 };
424
425 static IClassFactory ClassFactory = { &ClassFactoryVtbl };
426
427 static HRESULT WINAPI HlinkFrame_QueryInterface(IHlinkFrame *iface, REFIID riid, void **ppv)
428 {
429     ok(0, "unexpected call\n");
430     return E_NOTIMPL;
431 }
432
433 static ULONG WINAPI HlinkFrame_AddRef(IHlinkFrame *iface)
434 {
435     return 2;
436 }
437
438 static ULONG WINAPI HlinkFrame_Release(IHlinkFrame *iface)
439 {
440     return 1;
441 }
442
443 static HRESULT WINAPI HlinkFrame_SetBrowseContext(IHlinkFrame *iface,
444                                                   IHlinkBrowseContext *pihlbc)
445 {
446     ok(0, "unexpected call\n");
447     return E_NOTIMPL;
448 }
449
450 static HRESULT WINAPI HlinkFrame_GetBrowseContext(IHlinkFrame *iface,
451                                                   IHlinkBrowseContext **ppihlbc)
452 {
453     ok(0, "unexpected call\n");
454     return E_NOTIMPL;
455 }
456
457 static HRESULT WINAPI HlinkFrame_Navigate(IHlinkFrame *iface, DWORD grfHLNF, LPBC pbc,
458                                           IBindStatusCallback *pibsc, IHlink *pihlNavigate)
459 {
460     HRESULT hres;
461
462     CHECK_EXPECT(Navigate);
463
464     ok(grfHLNF == 0, "grfHLNF=%d, expected 0\n", grfHLNF);
465     ok(pbc != NULL, "pbc == NULL\n");
466     ok(pibsc != NULL, "pubsc == NULL\n");
467     ok(pihlNavigate != NULL, "puhlNavigate == NULL\n");
468
469     if(pihlNavigate) {
470         LPWSTR frame_name = (LPWSTR)0xdeadbeef;
471         LPWSTR location = (LPWSTR)0xdeadbeef;
472         IHlinkSite *site;
473         IMoniker *mon = NULL;
474         DWORD site_data = 0xdeadbeef;
475
476         hres = IHlink_GetTargetFrameName(pihlNavigate, &frame_name);
477         ok(hres == S_FALSE, "GetTargetFrameName failed: %08x\n", hres);
478         ok(frame_name == NULL, "frame_name = %p\n", frame_name);
479
480         hres = IHlink_GetMonikerReference(pihlNavigate, 1, &mon, &location);
481         ok(hres == S_OK, "GetMonikerReference failed: %08x\n", hres);
482         ok(location == NULL, "location = %p\n", location);
483         ok(mon != NULL, "mon == NULL\n");
484
485         hres = IHlink_GetHlinkSite(pihlNavigate, &site, &site_data);
486         ok(hres == S_OK, "GetHlinkSite failed: %08x\n", hres);
487         ok(site == NULL, "site = %p\n, expected NULL\n", site);
488         ok(site_data == 0xdeadbeef, "site_data = %x\n", site_data);
489     }
490
491     return S_OK;
492 }
493
494 static HRESULT WINAPI HlinkFrame_OnNavigate(IHlinkFrame *iface, DWORD grfHLNF,
495         IMoniker *pimkTarget, LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName, DWORD dwreserved)
496 {
497     ok(0, "unexpected call\n");
498     return E_NOTIMPL;
499 }
500
501 static HRESULT WINAPI HlinkFrame_UpdateHlink(IHlinkFrame *iface, ULONG uHLID,
502         IMoniker *pimkTarget, LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName)
503 {
504     ok(0, "unexpected call\n");
505     return E_NOTIMPL;
506 }
507
508 static const IHlinkFrameVtbl HlinkFrameVtbl = {
509     HlinkFrame_QueryInterface,
510     HlinkFrame_AddRef,
511     HlinkFrame_Release,
512     HlinkFrame_SetBrowseContext,
513     HlinkFrame_GetBrowseContext,
514     HlinkFrame_Navigate,
515     HlinkFrame_OnNavigate,
516     HlinkFrame_UpdateHlink
517 };
518
519 static IHlinkFrame HlinkFrame = { &HlinkFrameVtbl };
520
521 static HRESULT WINAPI PropertyNotifySink_QueryInterface(IPropertyNotifySink *iface,
522         REFIID riid, void**ppv)
523 {
524     if(IsEqualGUID(&IID_IPropertyNotifySink, riid)) {
525         *ppv = iface;
526         return S_OK;
527     }
528
529     ok(0, "unexpected call\n");
530     return E_NOINTERFACE;
531 }
532
533 static ULONG WINAPI PropertyNotifySink_AddRef(IPropertyNotifySink *iface)
534 {
535     return 2;
536 }
537
538 static ULONG WINAPI PropertyNotifySink_Release(IPropertyNotifySink *iface)
539 {
540     return 1;
541 }
542
543 static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, DISPID dispID)
544 {
545     switch(dispID) {
546     case DISPID_READYSTATE:
547         CHECK_EXPECT2(OnChanged_READYSTATE);
548         test_MSHTML_QueryStatus(NULL, OLECMDF_SUPPORTED
549             | (editmode && (load_state == LD_INTERACTIVE || load_state == LD_COMPLETE)
550                ? OLECMDF_ENABLED : 0));
551
552         if(readystate_set_loading) {
553             readystate_set_loading = FALSE;
554             load_state = LD_LOADING;
555         }
556         test_readyState(NULL);
557         return S_OK;
558     case 1005:
559         CHECK_EXPECT(OnChanged_1005);
560         test_readyState(NULL);
561         load_state = LD_INTERACTIVE;
562         return S_OK;
563     }
564
565     ok(0, "unexpected id %d\n", dispID);
566     return E_NOTIMPL;
567 }
568
569 static HRESULT WINAPI PropertyNotifySink_OnRequestEdit(IPropertyNotifySink *iface, DISPID dispID)
570 {
571     ok(0, "unexpected call\n");
572     return E_NOTIMPL;
573 }
574
575 static IPropertyNotifySinkVtbl PropertyNotifySinkVtbl = {
576     PropertyNotifySink_QueryInterface,
577     PropertyNotifySink_AddRef,
578     PropertyNotifySink_Release,
579     PropertyNotifySink_OnChanged,
580     PropertyNotifySink_OnRequestEdit
581 };
582
583 static IPropertyNotifySink PropertyNotifySink = { &PropertyNotifySinkVtbl };
584
585 static HRESULT WINAPI Stream_QueryInterface(IStream *iface, REFIID riid, void **ppv)
586 {
587     ok(0, "unexpected call\n");
588     return E_NOINTERFACE;
589 }
590
591 static ULONG WINAPI Stream_AddRef(IStream *iface)
592 {
593     return 2;
594 }
595
596 static ULONG WINAPI Stream_Release(IStream *iface)
597 {
598     return 1;
599 }
600
601 static HRESULT WINAPI Stream_Read(IStream *iface, void *pv,
602                                   ULONG cb, ULONG *pcbRead)
603 {
604     CHECK_EXPECT2(Read);
605     ok(pv != NULL, "pv == NULL\n");
606     ok(cb > sizeof(html_page), "cb = %d\n", cb);
607     ok(pcbRead != NULL, "pcbRead == NULL\n");
608     ok(!*pcbRead, "*pcbRead = %d\n", *pcbRead);
609
610     if(stream_read)
611         return S_FALSE;
612
613     memcpy(pv, html_page, sizeof(html_page)-1);
614     stream_read += *pcbRead = sizeof(html_page)-1;
615     return S_OK;
616 }
617
618 static HRESULT WINAPI Stream_Write(IStream *iface, const void *pv,
619                                           ULONG cb, ULONG *pcbWritten)
620 {
621     ok(0, "unexpected call\n");
622     return E_NOTIMPL;
623 }
624
625 static HRESULT WINAPI Stream_Seek(IStream *iface, LARGE_INTEGER dlibMove,
626                                          DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
627 {
628     ok(0, "unexpected call\n");
629     return E_NOTIMPL;
630 }
631
632 static HRESULT WINAPI Stream_SetSize(IStream *iface, ULARGE_INTEGER libNewSize)
633 {
634     ok(0, "unexpected call\n");
635     return E_NOTIMPL;
636 }
637
638 static HRESULT WINAPI Stream_CopyTo(IStream *iface, IStream *pstm,
639         ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten)
640 {
641     ok(0, "unexpected call\n");
642     return E_NOTIMPL;
643 }
644
645 static HRESULT WINAPI Stream_Commit(IStream *iface, DWORD grfCommitFlags)
646 {
647     ok(0, "unexpected call\n");
648     return E_NOTIMPL;
649 }
650
651 static HRESULT WINAPI Stream_Revert(IStream *iface)
652 {
653     ok(0, "unexpected call\n");
654     return E_NOTIMPL;
655 }
656
657 static HRESULT WINAPI Stream_LockRegion(IStream *iface, ULARGE_INTEGER libOffset,
658                                                ULARGE_INTEGER cb, DWORD dwLockType)
659 {
660     ok(0, "unexpected call\n");
661     return E_NOTIMPL;
662 }
663
664 static HRESULT WINAPI Stream_UnlockRegion(IStream *iface,
665         ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
666 {
667     ok(0, "unexpected call\n");
668     return E_NOTIMPL;
669 }
670
671 static HRESULT WINAPI Stream_Stat(IStream *iface, STATSTG *pstatstg,
672                                          DWORD dwStatFlag)
673 {
674     ok(0, "unexpected call\n");
675     return E_NOTIMPL;
676 }
677
678 static HRESULT WINAPI Stream_Clone(IStream *iface, IStream **ppstm)
679 {
680     ok(0, "unexpected call\n");
681     return E_NOTIMPL;
682 }
683
684 static const IStreamVtbl StreamVtbl = {
685     Stream_QueryInterface,
686     Stream_AddRef,
687     Stream_Release,
688     Stream_Read,
689     Stream_Write,
690     Stream_Seek,
691     Stream_SetSize,
692     Stream_CopyTo,
693     Stream_Commit,
694     Stream_Revert,
695     Stream_LockRegion,
696     Stream_UnlockRegion,
697     Stream_Stat,
698     Stream_Clone
699 };
700
701 static IStream Stream = { &StreamVtbl };
702
703 static HRESULT WINAPI Binding_QueryInterface(IBinding *iface, REFIID riid, void **ppv)
704 {
705     if(IsEqualGUID(&IID_IWinInetHttpInfo, riid))
706         return E_NOINTERFACE; /* TODO */
707
708     if(IsEqualGUID(&IID_IWinInetInfo, riid))
709         return E_NOINTERFACE; /* TODO */
710
711     ok(0, "unexpected call\n");
712     return E_NOINTERFACE;
713 }
714
715 static ULONG WINAPI Binding_AddRef(IBinding *iface)
716 {
717     return 2;
718 }
719
720 static ULONG WINAPI Binding_Release(IBinding *iface)
721 {
722     return 1;
723 }
724
725 static HRESULT WINAPI Binding_Abort(IBinding *iface)
726 {
727     CHECK_EXPECT(Abort);
728     return S_OK;
729 }
730
731 static HRESULT WINAPI Binding_Suspend(IBinding *iface)
732 {
733     ok(0, "unexpected call\n");
734     return E_NOTIMPL;
735 }
736
737 static HRESULT WINAPI Binding_Resume(IBinding *iface)
738 {
739     ok(0, "unexpected call\n");
740     return E_NOTIMPL;
741 }
742
743 static HRESULT WINAPI Binding_SetPriority(IBinding *iface, LONG nPriority)
744 {
745     ok(0, "unexpected call\n");
746     return E_NOTIMPL;
747 }
748
749 static HRESULT WINAPI Binding_GetPriority(IBinding *iface, LONG *pnPriority)
750 {
751     ok(0, "unexpected call\n");
752     return E_NOTIMPL;
753 }
754
755 static HRESULT WINAPI Binding_GetBindResult(IBinding *iface, CLSID *pclsidProtocol,
756         DWORD *pdwResult, LPOLESTR *pszResult, DWORD *pdwReserved)
757 {
758     ok(0, "unexpected call\n");
759     return E_NOTIMPL;
760 }
761
762 static const IBindingVtbl BindingVtbl = {
763     Binding_QueryInterface,
764     Binding_AddRef,
765     Binding_Release,
766     Binding_Abort,
767     Binding_Suspend,
768     Binding_Resume,
769     Binding_SetPriority,
770     Binding_GetPriority,
771     Binding_GetBindResult
772 };
773
774 static IBinding Binding = { &BindingVtbl };
775
776 static HRESULT WINAPI Moniker_QueryInterface(IMoniker *iface, REFIID riid, void **ppv)
777 {
778     ok(0, "unexpected call\n");
779     return E_NOINTERFACE;
780 }
781
782 static ULONG WINAPI Moniker_AddRef(IMoniker *iface)
783 {
784     return 2;
785 }
786
787 static ULONG WINAPI Moniker_Release(IMoniker *iface)
788 {
789     return 1;
790 }
791
792 static HRESULT WINAPI Moniker_GetClassID(IMoniker *iface, CLSID *pClassID)
793 {
794     ok(0, "unexpected call\n");
795     return E_NOTIMPL;
796 }
797
798 static HRESULT WINAPI Moniker_IsDirty(IMoniker *iface)
799 {
800     ok(0, "unexpected call\n");
801     return E_NOTIMPL;
802 }
803
804 static HRESULT WINAPI Moniker_Load(IMoniker *iface, IStream *pStm)
805 {
806     ok(0, "unexpected call\n");
807     return E_NOTIMPL;
808 }
809
810 static HRESULT WINAPI Moniker_Save(IMoniker *iface, IStream *pStm, BOOL fClearDirty)
811 {
812     ok(0, "unexpected call\n");
813     return E_NOTIMPL;
814 }
815
816 static HRESULT WINAPI Moniker_GetSizeMax(IMoniker *iface, ULARGE_INTEGER *pcbSize)
817 {
818     ok(0, "unexpected call\n");
819     return E_NOTIMPL;
820 }
821
822 static HRESULT WINAPI Moniker_BindToObject(IMoniker *iface, IBindCtx *pcb, IMoniker *pmkToLeft,
823         REFIID riidResult, void **ppvResult)
824 {
825     ok(0, "unexpected call\n");
826     return E_NOTIMPL;
827 }
828
829 static HRESULT WINAPI Moniker_BindToStorage(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft,
830         REFIID riid, void **ppv)
831 {
832     IBindStatusCallback *callback = NULL;
833     FORMATETC formatetc = {0xc02d, NULL, 1, -1, TYMED_ISTREAM};
834     STGMEDIUM stgmedium;
835     BINDINFO bindinfo;
836     DWORD bindf;
837     HRESULT hres;
838
839     static OLECHAR BSCBHolder[] = { '_','B','S','C','B','_','H','o','l','d','e','r','_',0 };
840     static const WCHAR wszTextHtml[] = {'t','e','x','t','/','h','t','m','l',0};
841
842     CHECK_EXPECT(BindToStorage);
843
844     ok(pbc != NULL, "pbc == NULL\n");
845     ok(pmkToLeft == NULL, "pmkToLeft=%p\n", pmkToLeft);
846     ok(IsEqualGUID(&IID_IStream, riid), "unexpected riid\n");
847     ok(ppv != NULL, "ppv == NULL\n");
848     ok(*ppv == NULL, "*ppv=%p\n", *ppv);
849
850     hres = IBindCtx_GetObjectParam(pbc, BSCBHolder, (IUnknown**)&callback);
851     ok(hres == S_OK, "GetObjectParam failed: %08x\n", hres);
852     ok(callback != NULL, "callback == NULL\n");
853
854     memset(&bindinfo, 0xf0, sizeof(bindinfo));
855     bindinfo.cbSize = sizeof(bindinfo);
856
857     hres = IBindStatusCallback_GetBindInfo(callback, &bindf, &bindinfo);
858     ok(hres == S_OK, "GetBindInfo failed: %08x\n", hres);
859     ok(bindf == (BINDF_PULLDATA|BINDF_ASYNCSTORAGE|BINDF_ASYNCHRONOUS), "bindf = %08x\n", bindf);
860     ok(bindinfo.cbSize == sizeof(bindinfo), "bindinfo.cbSize=%d\n", bindinfo.cbSize);
861     ok(bindinfo.szExtraInfo == NULL, "bindinfo.szExtraInfo=%p\n", bindinfo.szExtraInfo);
862     /* TODO: test stgmedData */
863     ok(bindinfo.grfBindInfoF == 0, "bindinfo.grfBinfInfoF=%08x\n", bindinfo.grfBindInfoF);
864     ok(bindinfo.dwBindVerb == 0, "bindinfo.dwBindVerb=%d\n", bindinfo.dwBindVerb);
865     ok(bindinfo.szCustomVerb == 0, "bindinfo.szCustomVerb=%p\n", bindinfo.szCustomVerb);
866     ok(bindinfo.cbstgmedData == 0, "bindinfo.cbstgmedData=%d\n", bindinfo.cbstgmedData);
867     ok(bindinfo.dwOptions == 0x80000 || bindinfo.dwOptions == 0x4080000,
868        "bindinfo.dwOptions=%x\n", bindinfo.dwOptions);
869     ok(bindinfo.dwOptionsFlags == 0, "bindinfo.dwOptionsFlags=%d\n", bindinfo.dwOptionsFlags);
870     /* TODO: test dwCodePage */
871     /* TODO: test securityAttributes */
872     ok(IsEqualGUID(&IID_NULL, &bindinfo.iid), "unexpected bindinfo.iid\n");
873     ok(bindinfo.pUnk == NULL, "bindinfo.pUnk=%p\n", bindinfo.pUnk);
874     ok(bindinfo.dwReserved == 0, "bindinfo.dwReserved=%d\n", bindinfo.dwReserved);
875
876     hres = IBindStatusCallback_OnStartBinding(callback, 0, &Binding);
877     ok(hres == S_OK, "OnStartBinding failed: %08x\n", hres);
878
879     hres = IBindStatusCallback_OnProgress(callback, 0, 0, BINDSTATUS_MIMETYPEAVAILABLE,
880                                           wszTextHtml);
881     ok(hres == S_OK, "OnProgress(BINDSTATUS_MIMETYPEAVAILABLE) failed: %08x\n", hres);
882
883     hres = IBindStatusCallback_OnProgress(callback, sizeof(html_page)-1, sizeof(html_page)-1,
884                                           BINDSTATUS_BEGINDOWNLOADDATA, doc_url);
885     ok(hres == S_OK, "OnProgress(BINDSTATUS_BEGINDOWNLOADDATA) failed: %08x\n", hres);
886
887     SET_EXPECT(Read);
888     stgmedium.tymed = TYMED_ISTREAM;
889     U(stgmedium).pstm = &Stream;
890     stgmedium.pUnkForRelease = (IUnknown*)iface;
891     hres = IBindStatusCallback_OnDataAvailable(callback,
892             BSCF_FIRSTDATANOTIFICATION|BSCF_LASTDATANOTIFICATION,
893             sizeof(html_page)-1, &formatetc, &stgmedium);
894     ok(hres == S_OK, "OnDataAvailable failed: %08x\n", hres);
895     CHECK_CALLED(Read);
896
897     hres = IBindStatusCallback_OnProgress(callback, sizeof(html_page)-1, sizeof(html_page)-1,
898             BINDSTATUS_ENDDOWNLOADDATA, NULL);
899     ok(hres == S_OK, "OnProgress(BINDSTATUS_ENDDOWNLOADDATA) failed: %08x\n", hres);
900
901     hres = IBindStatusCallback_OnStopBinding(callback, S_OK, NULL);
902     ok(hres == S_OK, "OnStopBinding failed: %08x\n", hres);
903
904     IBindStatusCallback_Release(callback);
905
906     return S_OK;
907 }
908
909 static HRESULT WINAPI Moniker_Reduce(IMoniker *iface, IBindCtx *pbc, DWORD dwReduceHowFar,
910         IMoniker **ppmkToLeft, IMoniker **ppmkReduced)
911 {
912     ok(0, "unexpected call\n");
913     return E_NOTIMPL;
914 }
915
916 static HRESULT WINAPI Moniker_ComposeWith(IMoniker *iface, IMoniker *pmkRight,
917         BOOL fOnlyIfNotGeneric, IMoniker **ppnkComposite)
918 {
919     ok(0, "unexpected call\n");
920     return E_NOTIMPL;
921 }
922
923 static HRESULT WINAPI Moniker_Enum(IMoniker *iface, BOOL fForwrd, IEnumMoniker **ppenumMoniker)
924 {
925     ok(0, "unexpected call\n");
926     return E_NOTIMPL;
927 }
928
929 static HRESULT WINAPI Moniker_IsEqual(IMoniker *iface, IMoniker *pmkOtherMoniker)
930 {
931     ok(0, "unexpected call\n");
932     return E_NOTIMPL;
933 }
934
935 static HRESULT WINAPI Moniker_Hash(IMoniker *iface, DWORD *pdwHash)
936 {
937     ok(0, "unexpected call\n");
938     return E_NOTIMPL;
939 }
940
941 static HRESULT WINAPI Moniker_IsRunning(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft,
942         IMoniker *pmkNewlyRunning)
943 {
944     ok(0, "unexpected call\n");
945     return E_NOTIMPL;
946 }
947
948 static HRESULT WINAPI Moniker_GetTimeOfLastChange(IMoniker *iface, IBindCtx *pbc,
949         IMoniker *pmkToLeft, FILETIME *pFileTime)
950 {
951     ok(0, "unexpected call\n");
952     return E_NOTIMPL;
953 }
954
955 static HRESULT WINAPI Moniker_Inverse(IMoniker *iface, IMoniker **ppmk)
956 {
957     ok(0, "unexpected call\n");
958     return E_NOTIMPL;
959 }
960
961 static HRESULT WINAPI Moniker_CommonPrefixWith(IMoniker *iface, IMoniker *pmkOther,
962         IMoniker **ppmkPrefix)
963 {
964     ok(0, "unexpected call\n");
965     return E_NOTIMPL;
966 }
967
968 static HRESULT WINAPI Moniker_RelativePathTo(IMoniker *iface, IMoniker *pmkOther,
969         IMoniker **pmkRelPath)
970 {
971     ok(0, "unexpected call\n");
972     return E_NOTIMPL;
973 }
974
975 static HRESULT WINAPI Moniker_GetDisplayName(IMoniker *iface, IBindCtx *pbc,
976         IMoniker *pmkToLeft, LPOLESTR *ppszDisplayName)
977 {
978     CHECK_EXPECT2(GetDisplayName);
979
980     /* ok(pbc != NULL, "pbc == NULL\n"); */
981     ok(pmkToLeft == NULL, "pmkToLeft=%p\n", pmkToLeft);
982     ok(ppszDisplayName != NULL, "ppszDisplayName == NULL\n");
983
984     *ppszDisplayName = CoTaskMemAlloc(sizeof(doc_url));
985     memcpy(*ppszDisplayName, doc_url, sizeof(doc_url));
986
987     return S_OK;
988 }
989
990 static HRESULT WINAPI Moniker_ParseDisplayName(IMoniker *iface, IBindCtx *pbc,
991         IMoniker *pmkToLeft, LPOLESTR pszDisplayName, ULONG *pchEaten, IMoniker **ppmkOut)
992 {
993     ok(0, "unexpected call\n");
994     return E_NOTIMPL;
995 }
996
997 static HRESULT WINAPI Moniker_IsSystemMoniker(IMoniker *iface, DWORD *pdwMksys)
998 {
999     ok(0, "unexpected call\n");
1000     return E_NOTIMPL;
1001 }
1002
1003 static const IMonikerVtbl MonikerVtbl = {
1004     Moniker_QueryInterface,
1005     Moniker_AddRef,
1006     Moniker_Release,
1007     Moniker_GetClassID,
1008     Moniker_IsDirty,
1009     Moniker_Load,
1010     Moniker_Save,
1011     Moniker_GetSizeMax,
1012     Moniker_BindToObject,
1013     Moniker_BindToStorage,
1014     Moniker_Reduce,
1015     Moniker_ComposeWith,
1016     Moniker_Enum,
1017     Moniker_IsEqual,
1018     Moniker_Hash,
1019     Moniker_IsRunning,
1020     Moniker_GetTimeOfLastChange,
1021     Moniker_Inverse,
1022     Moniker_CommonPrefixWith,
1023     Moniker_RelativePathTo,
1024     Moniker_GetDisplayName,
1025     Moniker_ParseDisplayName,
1026     Moniker_IsSystemMoniker
1027 };
1028
1029 static IMoniker Moniker = { &MonikerVtbl };
1030
1031 static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv)
1032 {
1033     return QueryInterface(riid, ppv);
1034 }
1035
1036 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
1037 {
1038     return 2;
1039 }
1040
1041 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
1042 {
1043     return 1;
1044 }
1045
1046 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc,
1047         LPOLESTR pszDiaplayName, ULONG *pchEaten, IMoniker **ppmkOut)
1048 {
1049     ok(0, "unexpected call\n");
1050     return E_NOTIMPL;
1051 }
1052
1053 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags,
1054         IEnumUnknown **ppenum)
1055 {
1056     ok(0, "unexpected call\n");
1057     return E_NOTIMPL;
1058 }
1059
1060 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
1061 {
1062     CHECK_EXPECT(LockContainer);
1063     ok(expect_LockContainer_fLock == fLock, "fLock=%x, expected %x\n", fLock, expect_LockContainer_fLock);
1064     return S_OK;
1065 }
1066
1067 static const IOleContainerVtbl OleContainerVtbl = {
1068     OleContainer_QueryInterface,
1069     OleContainer_AddRef,
1070     OleContainer_Release,
1071     OleContainer_ParseDisplayName,
1072     OleContainer_EnumObjects,
1073     OleContainer_LockContainer
1074 };
1075
1076 static IOleContainer OleContainer = { &OleContainerVtbl };
1077
1078 static HRESULT WINAPI InPlaceFrame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, void **ppv)
1079 {
1080     ok(0, "unexpected call\n");
1081     return E_NOINTERFACE;
1082 }
1083
1084 static ULONG WINAPI InPlaceFrame_AddRef(IOleInPlaceFrame *iface)
1085 {
1086     return 2;
1087 }
1088
1089 static ULONG WINAPI InPlaceFrame_Release(IOleInPlaceFrame *iface)
1090 {
1091     return 1;
1092 }
1093
1094 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
1095 {
1096     ok(0, "unexpected call\n");
1097     return E_NOTIMPL;
1098 }
1099
1100 static HRESULT WINAPI InPlaceFrame_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
1101 {
1102     ok(0, "unexpected call\n");
1103     return E_NOTIMPL;
1104 }
1105
1106 static HRESULT WINAPI InPlaceFrame_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
1107 {
1108     ok(0, "unexpected call\n");
1109     return E_NOTIMPL;
1110 }
1111
1112 static HRESULT WINAPI InPlaceFrame_RequestBorderSpace(IOleInPlaceFrame *iface,
1113         LPCBORDERWIDTHS pborderwidths)
1114 {
1115     ok(0, "unexpected call\n");
1116     return E_NOTIMPL;
1117 }
1118
1119 static HRESULT WINAPI InPlaceFrame_SetBorderSpace(IOleInPlaceFrame *iface,
1120         LPCBORDERWIDTHS pborderwidths)
1121 {
1122     CHECK_EXPECT(InPlaceFrame_SetBorderSpace);
1123     return S_OK;
1124 }
1125
1126 static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame *iface,
1127         IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
1128 {
1129     static const WCHAR wszHTML_Document[] =
1130         {'H','T','M','L',' ','D','o','c','u','m','e','n','t',0};
1131
1132     CHECK_EXPECT2(InPlaceUIWindow_SetActiveObject);
1133
1134     if(expect_InPlaceUIWindow_SetActiveObject_active) {
1135         ok(pActiveObject != NULL, "pActiveObject = NULL\n");
1136         if(pActiveObject && PRIMARYLANGID(GetSystemDefaultLangID()) == LANG_ENGLISH)
1137             ok(!lstrcmpW(wszHTML_Document, pszObjName), "pszObjName != \"HTML Document\"\n");
1138     }
1139     else {
1140         ok(pActiveObject == NULL, "pActiveObject=%p, expected NULL\n", pActiveObject);
1141         ok(pszObjName == NULL, "pszObjName=%p, expected NULL\n", pszObjName);
1142     }
1143     expect_InPlaceUIWindow_SetActiveObject_active = !expect_InPlaceUIWindow_SetActiveObject_active;
1144     return S_OK;
1145 }
1146
1147 static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
1148         IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
1149 {
1150     static const WCHAR wszHTML_Document[] =
1151         {'H','T','M','L',' ','D','o','c','u','m','e','n','t',0};
1152
1153     CHECK_EXPECT2(SetActiveObject);
1154
1155     if(expect_SetActiveObject_active) {
1156         ok(pActiveObject != NULL, "pActiveObject = NULL\n");
1157         if(pActiveObject && PRIMARYLANGID(GetSystemDefaultLangID()) == LANG_ENGLISH)
1158             ok(!lstrcmpW(wszHTML_Document, pszObjName), "pszObjName != \"HTML Document\"\n");
1159     }else {
1160         ok(pActiveObject == NULL, "pActiveObject=%p, expected NULL\n", pActiveObject);
1161         ok(pszObjName == NULL, "pszObjName=%p, expected NULL\n", pszObjName);
1162     }
1163
1164     return S_OK;
1165 }
1166
1167 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
1168         LPOLEMENUGROUPWIDTHS lpMenuWidths)
1169 {
1170     ok(0, "unexpected call\n");
1171     return E_NOTIMPL;
1172 }
1173
1174 static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared,
1175         HOLEMENU holemenu, HWND hwndActiveObject)
1176 {
1177     ok(0, "unexpected call\n");
1178     return E_NOTIMPL;
1179 }
1180
1181 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
1182 {
1183     ok(0, "unexpected call\n");
1184     return E_NOTIMPL;
1185 }
1186
1187 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
1188 {
1189     CHECK_EXPECT2(SetStatusText);
1190     if(!expect_status_text)
1191         ok(pszStatusText == NULL, "pszStatusText=%p, expected NULL\n", pszStatusText);
1192     return S_OK;
1193 }
1194
1195 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
1196 {
1197     ok(0, "unexpected call\n");
1198     return E_NOTIMPL;
1199 }
1200
1201 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
1202 {
1203     ok(0, "unexpected call\n");
1204     return E_NOTIMPL;
1205 }
1206
1207 static const IOleInPlaceFrameVtbl InPlaceFrameVtbl = {
1208     InPlaceFrame_QueryInterface,
1209     InPlaceFrame_AddRef,
1210     InPlaceFrame_Release,
1211     InPlaceFrame_GetWindow,
1212     InPlaceFrame_ContextSensitiveHelp,
1213     InPlaceFrame_GetBorder,
1214     InPlaceFrame_RequestBorderSpace,
1215     InPlaceFrame_SetBorderSpace,
1216     InPlaceFrame_SetActiveObject,
1217     InPlaceFrame_InsertMenus,
1218     InPlaceFrame_SetMenu,
1219     InPlaceFrame_RemoveMenus,
1220     InPlaceFrame_SetStatusText,
1221     InPlaceFrame_EnableModeless,
1222     InPlaceFrame_TranslateAccelerator
1223 };
1224
1225 static IOleInPlaceFrame InPlaceFrame = { &InPlaceFrameVtbl };
1226
1227 static const IOleInPlaceFrameVtbl InPlaceUIWindowVtbl = {
1228     InPlaceFrame_QueryInterface,
1229     InPlaceFrame_AddRef,
1230     InPlaceFrame_Release,
1231     InPlaceFrame_GetWindow,
1232     InPlaceFrame_ContextSensitiveHelp,
1233     InPlaceFrame_GetBorder,
1234     InPlaceFrame_RequestBorderSpace,
1235     InPlaceFrame_SetBorderSpace,
1236     InPlaceUIWindow_SetActiveObject,
1237 };
1238
1239 static IOleInPlaceFrame InPlaceUIWindow = { &InPlaceUIWindowVtbl };
1240
1241 static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSiteEx *iface, REFIID riid, void **ppv)
1242 {
1243     return QueryInterface(riid, ppv);
1244 }
1245
1246 static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSiteEx *iface)
1247 {
1248     return 2;
1249 }
1250
1251 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSiteEx *iface)
1252 {
1253     return 1;
1254 }
1255
1256 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd)
1257 {
1258     CHECK_EXPECT(GetWindow);
1259     ok(phwnd != NULL, "phwnd = NULL\n");
1260     *phwnd = container_hwnd;
1261     return S_OK;
1262 }
1263
1264 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSiteEx *iface, BOOL fEnterMode)
1265 {
1266     ok(0, "unexpected call\n");
1267     return E_NOTIMPL;
1268 }
1269
1270 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSiteEx *iface)
1271 {
1272     CHECK_EXPECT(CanInPlaceActivate);
1273     return S_OK;
1274 }
1275
1276 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSiteEx *iface)
1277 {
1278     CHECK_EXPECT(OnInPlaceActivate);
1279     return S_OK;
1280 }
1281
1282 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSiteEx *iface)
1283 {
1284     CHECK_EXPECT(OnUIActivate);
1285     return S_OK;
1286 }
1287
1288 static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSiteEx *iface,
1289         IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
1290         LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
1291 {
1292     static const RECT rect = {0,0,500,500};
1293
1294     CHECK_EXPECT(GetWindowContext);
1295
1296     ok(ppFrame != NULL, "ppFrame = NULL\n");
1297     if(ppFrame)
1298         *ppFrame = &InPlaceFrame;
1299     ok(ppDoc != NULL, "ppDoc = NULL\n");
1300     if(ppDoc)
1301         *ppDoc = (IOleInPlaceUIWindow*)&InPlaceUIWindow;
1302     ok(lprcPosRect != NULL, "lprcPosRect = NULL\n");
1303     if(lprcPosRect)
1304         memcpy(lprcPosRect, &rect, sizeof(RECT));
1305     ok(lprcClipRect != NULL, "lprcClipRect = NULL\n");
1306     if(lprcClipRect)
1307         memcpy(lprcClipRect, &rect, sizeof(RECT));
1308     ok(lpFrameInfo != NULL, "lpFrameInfo = NULL\n");
1309     if(lpFrameInfo) {
1310         lpFrameInfo->cb = sizeof(*lpFrameInfo);
1311         lpFrameInfo->fMDIApp = FALSE;
1312         lpFrameInfo->hwndFrame = container_hwnd;
1313         lpFrameInfo->haccel = NULL;
1314         lpFrameInfo->cAccelEntries = 0;
1315     }
1316
1317     return S_OK;
1318 }
1319
1320 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSiteEx *iface, SIZE scrollExtant)
1321 {
1322     ok(0, "unexpected call\n");
1323     return E_NOTIMPL;
1324 }
1325
1326 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSiteEx *iface, BOOL fUndoable)
1327 {
1328     CHECK_EXPECT(OnUIDeactivate);
1329     ok(!fUndoable, "fUndoable = TRUE\n");
1330     return S_OK;
1331 }
1332
1333 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSiteEx *iface)
1334 {
1335     CHECK_EXPECT(OnInPlaceDeactivate);
1336     return S_OK;
1337 }
1338
1339 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSiteEx *iface)
1340 {
1341     ok(0, "unexpected call\n");
1342     return E_NOTIMPL;
1343 }
1344
1345 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSiteEx *iface)
1346 {
1347     ok(0, "unexpected call\n");
1348     return E_NOTIMPL;
1349 }
1350
1351 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSiteEx *iface, LPCRECT lprcPosRect)
1352 {
1353     ok(0, "unexpected call\n");
1354     return E_NOTIMPL;
1355 }
1356
1357 static HRESULT WINAPI InPlaceSiteEx_OnInPlaceActivateEx(IOleInPlaceSiteEx *iface, BOOL *pfNoRedraw, DWORD dwFlags)
1358 {
1359     CHECK_EXPECT(OnInPlaceActivateEx);
1360
1361     ok(pfNoRedraw != NULL, "pfNoRedraw == NULL\n");
1362     ok(!*pfNoRedraw, "*pfNoRedraw == TRUE\n");
1363     ok(dwFlags == 0, "dwFlags = %08x\n", dwFlags);
1364
1365     return S_OK;
1366 }
1367
1368 static HRESULT WINAPI InPlaceSiteEx_OnInPlaceDeactivateEx(IOleInPlaceSiteEx *iface, BOOL fNoRedraw)
1369 {
1370     CHECK_EXPECT(OnInPlaceDeactivateEx);
1371
1372     ok(fNoRedraw, "fNoRedraw == FALSE\n");
1373
1374     return S_OK;
1375 }
1376
1377 static HRESULT WINAPI InPlaceSiteEx_RequestUIActivate(IOleInPlaceSiteEx *iface)
1378 {
1379     CHECK_EXPECT(RequestUIActivate);
1380     return S_OK;
1381 }
1382
1383 static const IOleInPlaceSiteExVtbl InPlaceSiteVtbl = {
1384     InPlaceSite_QueryInterface,
1385     InPlaceSite_AddRef,
1386     InPlaceSite_Release,
1387     InPlaceSite_GetWindow,
1388     InPlaceSite_ContextSensitiveHelp,
1389     InPlaceSite_CanInPlaceActivate,
1390     InPlaceSite_OnInPlaceActivate,
1391     InPlaceSite_OnUIActivate,
1392     InPlaceSite_GetWindowContext,
1393     InPlaceSite_Scroll,
1394     InPlaceSite_OnUIDeactivate,
1395     InPlaceSite_OnInPlaceDeactivate,
1396     InPlaceSite_DiscardUndoState,
1397     InPlaceSite_DeactivateAndUndo,
1398     InPlaceSite_OnPosRectChange,
1399     InPlaceSiteEx_OnInPlaceActivateEx,
1400     InPlaceSiteEx_OnInPlaceDeactivateEx,
1401     InPlaceSiteEx_RequestUIActivate
1402 };
1403
1404 static IOleInPlaceSiteEx InPlaceSiteEx = { &InPlaceSiteVtbl };
1405
1406 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
1407 {
1408     return QueryInterface(riid, ppv);
1409 }
1410
1411 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
1412 {
1413     return 2;
1414 }
1415
1416 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
1417 {
1418     return 1;
1419 }
1420
1421 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
1422 {
1423     ok(0, "unexpected call\n");
1424     return E_NOTIMPL;
1425 }
1426
1427 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAsign, DWORD dwWhichMoniker,
1428         IMoniker **ppmon)
1429 {
1430     ok(0, "unexpected call\n");
1431     return E_NOTIMPL;
1432 }
1433
1434 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
1435 {
1436     CHECK_EXPECT(GetContainer);
1437     ok(ppContainer != NULL, "ppContainer = NULL\n");
1438     *ppContainer = &OleContainer;
1439     return S_OK;
1440 }
1441
1442 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
1443 {
1444     ok(0, "unexpected call\n");
1445     return E_NOTIMPL;
1446 }
1447
1448 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
1449 {
1450     ok(0, "unexpected call\n");
1451     return E_NOTIMPL;
1452 }
1453
1454 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
1455 {
1456     ok(0, "unexpected call\n");
1457     return E_NOTIMPL;
1458 }
1459
1460 static const IOleClientSiteVtbl ClientSiteVtbl = {
1461     ClientSite_QueryInterface,
1462     ClientSite_AddRef,
1463     ClientSite_Release,
1464     ClientSite_SaveObject,
1465     ClientSite_GetMoniker,
1466     ClientSite_GetContainer,
1467     ClientSite_ShowObject,
1468     ClientSite_OnShowWindow,
1469     ClientSite_RequestNewObjectLayout
1470 };
1471
1472 static IOleClientSite ClientSite = { &ClientSiteVtbl };
1473
1474 static HRESULT WINAPI DocumentSite_QueryInterface(IOleDocumentSite *iface, REFIID riid, void **ppv)
1475 {
1476     return QueryInterface(riid, ppv);
1477 }
1478
1479 static ULONG WINAPI DocumentSite_AddRef(IOleDocumentSite *iface)
1480 {
1481     return 2;
1482 }
1483
1484 static ULONG WINAPI DocumentSite_Release(IOleDocumentSite *iface)
1485 {
1486     return 1;
1487 }
1488
1489 typedef enum
1490 {
1491     CallUIActivate_None,
1492     CallUIActivate_ActivateMe,
1493     CallUIActivate_AfterShow,
1494 } CallUIActivate;
1495
1496 static BOOL call_UIActivate = CallUIActivate_ActivateMe;
1497 static HRESULT WINAPI DocumentSite_ActivateMe(IOleDocumentSite *iface, IOleDocumentView *pViewToActivate)
1498 {
1499     IOleDocument *document;
1500     HRESULT hres;
1501
1502     CHECK_EXPECT(ActivateMe);
1503     ok(pViewToActivate != NULL, "pViewToActivate = NULL\n");
1504
1505     hres = IOleDocumentView_QueryInterface(pViewToActivate, &IID_IOleDocument, (void**)&document);
1506     ok(hres == S_OK, "could not get IOleDocument: %08x\n", hres);
1507
1508     if(SUCCEEDED(hres)) {
1509         hres = IOleDocument_CreateView(document, (IOleInPlaceSite*)&InPlaceSiteEx, NULL, 0, &view);
1510         ok(hres == S_OK, "CreateView failed: %08x\n", hres);
1511
1512         if(SUCCEEDED(hres)) {
1513             IOleInPlaceActiveObject *activeobj = NULL;
1514             IOleInPlaceSite *inplacesite = NULL;
1515             HWND tmp_hwnd = NULL;
1516             static RECT rect = {0,0,400,500};
1517
1518             hres = IOleDocumentView_GetInPlaceSite(view, &inplacesite);
1519             ok(hres == S_OK, "GetInPlaceSite failed: %08x\n", hres);
1520             ok(inplacesite == (IOleInPlaceSite*)&InPlaceSiteEx, "inplacesite=%p, expected %p\n",
1521                     inplacesite, &InPlaceSiteEx);
1522
1523             hres = IOleDocumentView_SetInPlaceSite(view, (IOleInPlaceSite*)&InPlaceSiteEx);
1524             ok(hres == S_OK, "SetInPlaceSite failed: %08x\n", hres);
1525
1526             hres = IOleDocumentView_GetInPlaceSite(view, &inplacesite);
1527             ok(hres == S_OK, "GetInPlaceSite failed: %08x\n", hres);
1528             ok(inplacesite == (IOleInPlaceSite*)&InPlaceSiteEx, "inplacesite=%p, expected %p\n",
1529                     inplacesite, &InPlaceSiteEx);
1530
1531             hres = IOleDocumentView_QueryInterface(view, &IID_IOleInPlaceActiveObject, (void**)&activeobj);
1532             ok(hres == S_OK, "Could not get IOleInPlaceActiveObject: %08x\n", hres);
1533
1534             if(activeobj) {
1535                 IOleInPlaceActiveObject_GetWindow(activeobj, &hwnd);
1536                 ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
1537                 ok(hwnd == NULL, "hwnd=%p, expeted NULL\n", hwnd);
1538             }
1539             
1540             if(call_UIActivate == CallUIActivate_ActivateMe) {
1541                 SET_EXPECT(CanInPlaceActivate);
1542                 SET_EXPECT(GetWindowContext);
1543                 SET_EXPECT(GetWindow);
1544                 if(ipsex)
1545                     SET_EXPECT(OnInPlaceActivateEx);
1546                 else
1547                     SET_EXPECT(OnInPlaceActivate);
1548                 SET_EXPECT(SetStatusText);
1549                 SET_EXPECT(Exec_SETPROGRESSMAX);
1550                 SET_EXPECT(Exec_SETPROGRESSPOS);
1551                 SET_EXPECT(OnUIActivate);
1552                 SET_EXPECT(SetActiveObject);
1553                 SET_EXPECT(ShowUI);
1554                 expect_SetActiveObject_active = TRUE;
1555                 expect_status_text = NULL;
1556
1557                 hres = IOleDocumentView_UIActivate(view, TRUE);
1558
1559                 if(FAILED(hres)) {
1560                     trace("UIActivate failed: %08x\n", hres);
1561                     return hres;
1562                 }
1563                 ok(hres == S_OK, "UIActivate failed: %08x\n", hres);
1564
1565                 CHECK_CALLED(CanInPlaceActivate);
1566                 CHECK_CALLED(GetWindowContext);
1567                 CHECK_CALLED(GetWindow);
1568                 if(ipsex)
1569                     CHECK_CALLED(OnInPlaceActivateEx);
1570                 else
1571                     CHECK_CALLED(OnInPlaceActivate);
1572                 CHECK_CALLED(SetStatusText);
1573                 CHECK_CALLED(Exec_SETPROGRESSMAX);
1574                 CHECK_CALLED(Exec_SETPROGRESSPOS);
1575                 CHECK_CALLED(OnUIActivate);
1576                 CHECK_CALLED(SetActiveObject);
1577                 CHECK_CALLED(ShowUI);
1578
1579                 if(activeobj) {
1580                     hres = IOleInPlaceActiveObject_GetWindow(activeobj, &hwnd);
1581                     ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
1582                     ok(hwnd != NULL, "hwnd == NULL\n");
1583                     if(last_hwnd)
1584                         ok(hwnd == last_hwnd, "hwnd != last_hwnd\n");
1585                 }
1586
1587                 hres = IOleDocumentView_UIActivate(view, TRUE);
1588                 ok(hres == S_OK, "UIActivate failed: %08x\n", hres);
1589
1590                 if(activeobj) {
1591                     hres = IOleInPlaceActiveObject_GetWindow(activeobj, &tmp_hwnd);
1592                     ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
1593                     ok(tmp_hwnd == hwnd, "tmp_hwnd=%p, expected %p\n", tmp_hwnd, hwnd);
1594                 }
1595             }
1596
1597             hres = IOleDocumentView_SetRect(view, &rect);
1598             ok(hres == S_OK, "SetRect failed: %08x\n", hres);
1599
1600             if(call_UIActivate == CallUIActivate_ActivateMe) {
1601                 hres = IOleDocumentView_Show(view, TRUE);
1602                 ok(hres == S_OK, "Show failed: %08x\n", hres);
1603             }else {
1604                 SET_EXPECT(CanInPlaceActivate);
1605                 SET_EXPECT(GetWindowContext);
1606                 SET_EXPECT(GetWindow);
1607                 if(ipsex)
1608                     SET_EXPECT(OnInPlaceActivateEx);
1609                 else
1610                     SET_EXPECT(OnInPlaceActivate);
1611                 SET_EXPECT(SetStatusText);
1612                 SET_EXPECT(Exec_SETPROGRESSMAX);
1613                 SET_EXPECT(Exec_SETPROGRESSPOS);
1614                 SET_EXPECT(OnUIActivate);
1615                 expect_status_text = (load_state == LD_COMPLETE ? (LPCOLESTR)0xdeadbeef : NULL);
1616
1617                 hres = IOleDocumentView_Show(view, TRUE);
1618                 ok(hres == S_OK, "Show failed: %08x\n", hres);
1619
1620                 CHECK_CALLED(CanInPlaceActivate);
1621                 CHECK_CALLED(GetWindowContext);
1622                 CHECK_CALLED(GetWindow);
1623                 if(ipsex)
1624                     CHECK_CALLED(OnInPlaceActivateEx);
1625                 else
1626                     CHECK_CALLED(OnInPlaceActivate);
1627                 CHECK_CALLED(SetStatusText);
1628                 CHECK_CALLED(Exec_SETPROGRESSMAX);
1629                 CHECK_CALLED(Exec_SETPROGRESSPOS);
1630
1631                 if(activeobj) {
1632                     hres = IOleInPlaceActiveObject_GetWindow(activeobj, &hwnd);
1633                     ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
1634                     ok(hwnd != NULL, "hwnd == NULL\n");
1635                     if(last_hwnd)
1636                         ok(hwnd == last_hwnd, "hwnd != last_hwnd\n");
1637                 }
1638             }
1639
1640             test_timer(EXPECT_UPDATEUI | ((load_state == LD_LOADING) ? EXPECT_SETTITLE : 0));
1641
1642             if(activeobj)
1643                 IOleInPlaceActiveObject_Release(activeobj);
1644         }
1645
1646         IOleDocument_Release(document);
1647     }
1648
1649     return S_OK;
1650 }
1651
1652 static const IOleDocumentSiteVtbl DocumentSiteVtbl = {
1653     DocumentSite_QueryInterface,
1654     DocumentSite_AddRef,
1655     DocumentSite_Release,
1656     DocumentSite_ActivateMe
1657 };
1658
1659 static IOleDocumentSite DocumentSite = { &DocumentSiteVtbl };
1660
1661 static HRESULT WINAPI OleControlSite_QueryInterface(IOleControlSite *iface, REFIID riid, void **ppv)
1662 {
1663     return QueryInterface(riid, ppv);
1664 }
1665
1666 static ULONG WINAPI OleControlSite_AddRef(IOleControlSite *iface)
1667 {
1668     return 2;
1669 }
1670
1671 static ULONG WINAPI OleControlSite_Release(IOleControlSite *iface)
1672 {
1673     return 1;
1674 }
1675
1676 static HRESULT WINAPI OleControlSite_OnControlInfoChanged(IOleControlSite *iface)
1677 {
1678     ok(0, "unexpected call\n");
1679     return E_NOTIMPL;
1680 }
1681
1682 static HRESULT WINAPI OleControlSite_LockInPlaceActive(IOleControlSite *iface, BOOL fLock)
1683 {
1684     ok(0, "unexpected call\n");
1685     return E_NOTIMPL;
1686 }
1687
1688 static HRESULT WINAPI OleControlSite_GetExtendedControl(IOleControlSite *iface, IDispatch **ppDisp)
1689 {
1690     ok(0, "unexpected call\n");
1691     return E_NOTIMPL;
1692 }
1693
1694 static HRESULT WINAPI OleControlSite_TransformCoords(IOleControlSite *iface, POINTL *pPtHimetric,
1695         POINTF *pPtfContainer, DWORD dwFlags)
1696 {
1697     ok(0, "unexpected call\n");
1698     return E_NOTIMPL;
1699 }
1700
1701 static HRESULT WINAPI OleControlSite_TranslateAccelerator(IOleControlSite *iface,
1702         MSG *pMsg, DWORD grfModifiers)
1703 {
1704     ok(0, "unexpected call\n");
1705     return E_NOTIMPL;
1706 }
1707
1708 static HRESULT WINAPI OleControlSite_OnFocus(IOleControlSite *iface, BOOL fGotFocus)
1709 {
1710     if(fGotFocus)
1711         CHECK_EXPECT(OnFocus_TRUE);
1712     else
1713         CHECK_EXPECT2(OnFocus_FALSE);
1714     return S_OK;
1715 }
1716
1717 static HRESULT WINAPI OleControlSite_ShowPropertyFrame(IOleControlSite *iface)
1718 {
1719     ok(0, "unexpected call\n");
1720     return E_NOTIMPL;
1721 }
1722
1723 static const IOleControlSiteVtbl OleControlSiteVtbl = {
1724     OleControlSite_QueryInterface,
1725     OleControlSite_AddRef,
1726     OleControlSite_Release,
1727     OleControlSite_OnControlInfoChanged,
1728     OleControlSite_LockInPlaceActive,
1729     OleControlSite_GetExtendedControl,
1730     OleControlSite_TransformCoords,
1731     OleControlSite_TranslateAccelerator,
1732     OleControlSite_OnFocus,
1733     OleControlSite_ShowPropertyFrame
1734 };
1735
1736 static IOleControlSite OleControlSite = { &OleControlSiteVtbl };
1737
1738 static HRESULT WINAPI DocHostUIHandler_QueryInterface(IDocHostUIHandler2 *iface, REFIID riid, void **ppv)
1739 {
1740     return QueryInterface(riid, ppv);
1741 }
1742
1743 static ULONG WINAPI DocHostUIHandler_AddRef(IDocHostUIHandler2 *iface)
1744 {
1745     return 2;
1746 }
1747
1748 static ULONG WINAPI DocHostUIHandler_Release(IDocHostUIHandler2 *iface)
1749 {
1750     return 1;
1751 }
1752
1753 static HRESULT WINAPI DocHostUIHandler_ShowContextMenu(IDocHostUIHandler2 *iface, DWORD dwID, POINT *ppt,
1754         IUnknown *pcmdtReserved, IDispatch *pdicpReserved)
1755 {
1756     ok(0, "unexpected call\n");
1757     return E_NOTIMPL;
1758 }
1759
1760 static HRESULT WINAPI DocHostUIHandler_GetHostInfo(IDocHostUIHandler2 *iface, DOCHOSTUIINFO *pInfo)
1761 {
1762     CHECK_EXPECT(GetHostInfo);
1763     ok(pInfo != NULL, "pInfo=NULL\n");
1764     if(pInfo) {
1765         ok(pInfo->cbSize == sizeof(DOCHOSTUIINFO), "pInfo->cbSize=%u\n", pInfo->cbSize);
1766         ok(!pInfo->dwFlags, "pInfo->dwFlags=%08x, expected 0\n", pInfo->dwFlags);
1767         pInfo->dwFlags = DOCHOSTUIFLAG_DISABLE_HELP_MENU | DOCHOSTUIFLAG_DISABLE_SCRIPT_INACTIVE
1768             | DOCHOSTUIFLAG_ACTIVATE_CLIENTHIT_ONLY | DOCHOSTUIFLAG_ENABLE_INPLACE_NAVIGATION
1769             | DOCHOSTUIFLAG_IME_ENABLE_RECONVERSION;
1770         ok(!pInfo->dwDoubleClick, "pInfo->dwDoubleClick=%08x, expected 0\n", pInfo->dwDoubleClick);
1771         ok(!pInfo->pchHostCss, "pInfo->pchHostCss=%p, expected NULL\n", pInfo->pchHostCss);
1772         ok(!pInfo->pchHostNS, "pInfo->pchhostNS=%p, expected NULL\n", pInfo->pchHostNS);
1773     }
1774     return S_OK;
1775 }
1776
1777 static HRESULT WINAPI DocHostUIHandler_ShowUI(IDocHostUIHandler2 *iface, DWORD dwID,
1778         IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget,
1779         IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
1780 {
1781     CHECK_EXPECT(ShowUI);
1782
1783     if (editmode)
1784         ok(dwID == DOCHOSTUITYPE_AUTHOR, "dwID=%d, expected DOCHOSTUITYPE_AUTHOR\n", dwID);
1785     else
1786         ok(dwID == DOCHOSTUITYPE_BROWSE, "dwID=%d, expected DOCHOSTUITYPE_BROWSE\n", dwID);
1787     ok(pActiveObject != NULL, "pActiveObject = NULL\n");
1788     ok(pCommandTarget != NULL, "pCommandTarget = NULL\n");
1789     ok(pFrame == &InPlaceFrame, "pFrame=%p, expected %p\n", pFrame, &InPlaceFrame);
1790     if (expect_InPlaceUIWindow_SetActiveObject_active)
1791         ok(pDoc == (IOleInPlaceUIWindow *)&InPlaceUIWindow, "pDoc=%p, expected %p\n", pDoc, &InPlaceUIWindow);
1792     else
1793         ok(pDoc == NULL, "pDoc=%p, expected NULL\n", pDoc);
1794
1795     return S_OK;
1796 }
1797
1798 static HRESULT WINAPI DocHostUIHandler_HideUI(IDocHostUIHandler2 *iface)
1799 {
1800     CHECK_EXPECT(HideUI);
1801     return S_OK;
1802 }
1803
1804 static HRESULT WINAPI DocHostUIHandler_UpdateUI(IDocHostUIHandler2 *iface)
1805 {
1806     CHECK_EXPECT(UpdateUI);
1807     return S_OK;
1808 }
1809
1810 static HRESULT WINAPI DocHostUIHandler_EnableModeless(IDocHostUIHandler2 *iface, BOOL fEnable)
1811 {
1812     ok(0, "unexpected call\n");
1813     return E_NOTIMPL;
1814 }
1815
1816 static HRESULT WINAPI DocHostUIHandler_OnDocWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
1817 {
1818     ok(0, "unexpected call\n");
1819     return E_NOTIMPL;
1820 }
1821
1822 static BOOL expect_OnFrameWindowActivate_fActivate;
1823 static HRESULT WINAPI DocHostUIHandler_OnFrameWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
1824 {
1825     CHECK_EXPECT2(OnFrameWindowActivate);
1826     ok(fActivate == expect_OnFrameWindowActivate_fActivate, "fActivate=%x\n", fActivate);
1827     return S_OK;
1828 }
1829
1830 static HRESULT WINAPI DocHostUIHandler_ResizeBorder(IDocHostUIHandler2 *iface, LPCRECT prcBorder,
1831         IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
1832 {
1833     ok(0, "unexpected call\n");
1834     return E_NOTIMPL;
1835 }
1836
1837 static HRESULT WINAPI DocHostUIHandler_TranslateAccelerator(IDocHostUIHandler2 *iface, LPMSG lpMsg,
1838         const GUID *pguidCmdGroup, DWORD nCmdID)
1839 {
1840     ok(0, "unexpected call\n");
1841     return E_NOTIMPL;
1842 }
1843
1844 static HRESULT WINAPI DocHostUIHandler_GetOptionKeyPath(IDocHostUIHandler2 *iface,
1845         LPOLESTR *pchKey, DWORD dw)
1846 {
1847     CHECK_EXPECT(GetOptionKeyPath);
1848     ok(pchKey != NULL, "pchKey = NULL\n");
1849     ok(!dw, "dw=%d, expected 0\n", dw);
1850     if(pchKey)
1851         ok(!*pchKey, "*pchKey=%p, expected NULL\n", *pchKey);
1852     return S_OK;
1853 }
1854
1855 static HRESULT WINAPI DocHostUIHandler_GetDropTarget(IDocHostUIHandler2 *iface,
1856         IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
1857 {
1858     CHECK_EXPECT(GetDropTarget);
1859     /* TODO */
1860     return E_NOTIMPL;
1861 }
1862
1863 static HRESULT WINAPI DocHostUIHandler_GetExternal(IDocHostUIHandler2 *iface, IDispatch **ppDispatch)
1864 {
1865     CHECK_EXPECT(GetExternal);
1866     *ppDispatch = (void*)1;
1867     return S_FALSE;
1868 }
1869
1870 static HRESULT WINAPI DocHostUIHandler_TranslateUrl(IDocHostUIHandler2 *iface, DWORD dwTranslate,
1871         OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
1872 {
1873     ok(0, "unexpected call\n");
1874     return E_NOTIMPL;
1875 }
1876
1877 static HRESULT WINAPI DocHostUIHandler_FilterDataObject(IDocHostUIHandler2 *iface, IDataObject *pDO,
1878         IDataObject **ppPORet)
1879 {
1880     ok(0, "unexpected call\n");
1881     return E_NOTIMPL;
1882 }
1883
1884 static HRESULT WINAPI DocHostUIHandler_GetOverrideKeyPath(IDocHostUIHandler2 *iface,
1885         LPOLESTR *pchKey, DWORD dw)
1886 {
1887     CHECK_EXPECT(GetOverrideKeyPath);
1888     ok(pchKey != NULL, "pchKey = NULL\n");
1889     if(pchKey)
1890         ok(!*pchKey, "*pchKey=%p, expected NULL\n", *pchKey);
1891     ok(!dw, "dw=%d, xepected 0\n", dw);
1892     return S_OK;
1893 }
1894
1895 static const IDocHostUIHandler2Vtbl DocHostUIHandlerVtbl = {
1896     DocHostUIHandler_QueryInterface,
1897     DocHostUIHandler_AddRef,
1898     DocHostUIHandler_Release,
1899     DocHostUIHandler_ShowContextMenu,
1900     DocHostUIHandler_GetHostInfo,
1901     DocHostUIHandler_ShowUI,
1902     DocHostUIHandler_HideUI,
1903     DocHostUIHandler_UpdateUI,
1904     DocHostUIHandler_EnableModeless,
1905     DocHostUIHandler_OnDocWindowActivate,
1906     DocHostUIHandler_OnFrameWindowActivate,
1907     DocHostUIHandler_ResizeBorder,
1908     DocHostUIHandler_TranslateAccelerator,
1909     DocHostUIHandler_GetOptionKeyPath,
1910     DocHostUIHandler_GetDropTarget,
1911     DocHostUIHandler_GetExternal,
1912     DocHostUIHandler_TranslateUrl,
1913     DocHostUIHandler_FilterDataObject,
1914     DocHostUIHandler_GetOverrideKeyPath
1915 };
1916
1917 static IDocHostUIHandler2 DocHostUIHandler = { &DocHostUIHandlerVtbl };
1918
1919 static HRESULT WINAPI OleCommandTarget_QueryInterface(IOleCommandTarget *iface,
1920         REFIID riid, void **ppv)
1921 {
1922     return QueryInterface(riid, ppv);
1923 }
1924
1925 static ULONG WINAPI OleCommandTarget_AddRef(IOleCommandTarget *iface)
1926 {
1927     return 2;
1928 }
1929
1930 static ULONG WINAPI OleCommandTarget_Release(IOleCommandTarget *iface)
1931 {
1932     return 1;
1933 }
1934
1935 static HRESULT WINAPI OleCommandTarget_QueryStatus(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
1936         ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
1937 {
1938     ok(!pguidCmdGroup, "pguidCmdGroup != MULL\n");
1939     ok(cCmds == 1, "cCmds=%d, expected 1\n", cCmds);
1940     ok(!pCmdText, "pCmdText != NULL\n");
1941
1942     switch(prgCmds[0].cmdID) {
1943     case OLECMDID_SETPROGRESSTEXT:
1944         CHECK_EXPECT(QueryStatus_SETPROGRESSTEXT);
1945         prgCmds[0].cmdf = OLECMDF_ENABLED;
1946         return S_OK;
1947     case OLECMDID_OPEN:
1948         CHECK_EXPECT(QueryStatus_OPEN);
1949         prgCmds[0].cmdf = 0;
1950         return S_OK;
1951     case OLECMDID_NEW:
1952         CHECK_EXPECT(QueryStatus_NEW);
1953         prgCmds[0].cmdf = 0;
1954         return S_OK;
1955     default:
1956         ok(0, "unexpected command %d\n", prgCmds[0].cmdID);
1957     };
1958
1959     return E_FAIL;
1960 }
1961
1962 static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
1963         DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
1964 {
1965     test_readyState(NULL);
1966
1967     if(!pguidCmdGroup) {
1968         switch(nCmdID) {
1969         case OLECMDID_SETPROGRESSMAX:
1970             CHECK_EXPECT2(Exec_SETPROGRESSMAX);
1971             ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt);
1972             ok(pvaIn != NULL, "pvaIn == NULL\n");
1973             if(pvaIn) {
1974                 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
1975                 if(load_state == LD_NO)
1976                     ok(V_I4(pvaIn) == 0, "V_I4(pvaIn)=%d, expected 0\n", V_I4(pvaIn));
1977             }
1978             ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
1979             return S_OK;
1980         case OLECMDID_SETPROGRESSPOS:
1981             CHECK_EXPECT2(Exec_SETPROGRESSPOS);
1982             ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt);
1983             ok(pvaIn != NULL, "pvaIn == NULL\n");
1984             if(pvaIn) {
1985                 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
1986                 if(load_state == LD_NO)
1987                     ok(V_I4(pvaIn) == 0, "V_I4(pvaIn)=%d, expected 0\n", V_I4(pvaIn));
1988             }
1989             ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
1990             return S_OK;
1991         case OLECMDID_HTTPEQUIV_DONE:
1992             CHECK_EXPECT(Exec_HTTPEQUIV_DONE);
1993             ok(nCmdexecopt == 0, "nCmdexecopts=%08x\n", nCmdexecopt);
1994             ok(pvaOut == NULL, "pvaOut=%p\n", pvaOut);
1995             ok(pvaIn == NULL, "pvaIn=%p\n", pvaIn);
1996             load_state = LD_COMPLETE;
1997             return S_OK;
1998         case OLECMDID_SETDOWNLOADSTATE:
1999             ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt);
2000             ok(pvaOut == NULL, "pvaOut=%p\n", pvaOut);
2001             ok(pvaIn != NULL, "pvaIn == NULL\n");
2002             ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d\n", V_VT(pvaIn));
2003
2004             switch(V_I4(pvaIn)) {
2005             case 0:
2006                 CHECK_EXPECT(Exec_SETDOWNLOADSTATE_0);
2007                 load_state = LD_INTERACTIVE;
2008                 break;
2009             case 1:
2010                 CHECK_EXPECT(Exec_SETDOWNLOADSTATE_1);
2011                 break;
2012             default:
2013                 ok(0, "unexpevted V_I4(pvaIn)=%d\n", V_I4(pvaIn));
2014             }
2015
2016             return S_OK;
2017         case OLECMDID_UPDATECOMMANDS:
2018             CHECK_EXPECT(Exec_UPDATECOMMANDS);
2019             ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt);
2020             ok(pvaIn == NULL, "pvaIn=%p\n", pvaIn);
2021             ok(pvaOut == NULL, "pvaOut=%p\n", pvaOut);
2022             return S_OK;
2023         case OLECMDID_SETTITLE:
2024             CHECK_EXPECT2(Exec_SETTITLE);
2025             ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt);
2026             ok(pvaIn != NULL, "pvaIn == NULL\n");
2027             ok(pvaOut == NULL, "pvaOut=%p\n", pvaOut);
2028             ok(V_VT(pvaIn) == VT_BSTR, "V_VT(pvaIn)=%d\n", V_VT(pvaIn));
2029             ok(V_BSTR(pvaIn) != NULL, "V_BSTR(pvaIn) == NULL\n"); /* TODO */
2030             return S_OK;
2031         case OLECMDID_HTTPEQUIV:
2032             CHECK_EXPECT2(Exec_HTTPEQUIV);
2033             ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt);
2034             /* TODO */
2035             return S_OK;
2036         default:
2037             ok(0, "unexpected command %d\n", nCmdID);
2038             return E_FAIL;
2039         };
2040     }
2041
2042     if(IsEqualGUID(&CGID_ShellDocView, pguidCmdGroup)) {
2043         ok(nCmdexecopt == 0, "nCmdexecopts=%08x\n", nCmdexecopt);
2044
2045         switch(nCmdID) {
2046         case 37:
2047             CHECK_EXPECT2(Exec_ShellDocView_37);
2048
2049             if(load_from_stream)
2050                 test_GetCurMoniker(doc_unk, NULL, about_blank_url);
2051             else if(!editmode)
2052                 test_GetCurMoniker(doc_unk, &Moniker, NULL);
2053
2054             ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
2055             ok(pvaIn != NULL, "pvaIn == NULL\n");
2056             if(pvaIn) {
2057                 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
2058                 ok(V_I4(pvaIn) == 0, "V_I4(pvaIn)=%d, expected 0\n", V_I4(pvaIn));
2059             }
2060             return S_OK;
2061         default:
2062             ok(0, "unexpected command %d\n", nCmdID);
2063             return E_FAIL;
2064         };
2065     }
2066
2067     if(IsEqualGUID(&CGID_MSHTML, pguidCmdGroup)) {
2068         ok(nCmdexecopt == 0, "nCmdexecopts=%08x\n", nCmdexecopt);
2069
2070         switch(nCmdID) {
2071         case IDM_PARSECOMPLETE:
2072             CHECK_EXPECT(Exec_MSHTML_PARSECOMPLETE);
2073             ok(pvaIn == NULL, "pvaIn != NULL\n");
2074             ok(pvaOut == NULL, "pvaOut != NULL\n");
2075             return S_OK;
2076         default:
2077             ok(0, "unexpected command %d\n", nCmdID);
2078         };
2079     }
2080
2081     if(IsEqualGUID(&CGID_DocHostCmdPriv, pguidCmdGroup))
2082         return E_FAIL; /* TODO */
2083
2084     ok(0, "unexpected call\n");
2085     return E_NOTIMPL;
2086 }
2087
2088 static IOleCommandTargetVtbl OleCommandTargetVtbl = {
2089     OleCommandTarget_QueryInterface,
2090     OleCommandTarget_AddRef,
2091     OleCommandTarget_Release,
2092     OleCommandTarget_QueryStatus,
2093     OleCommandTarget_Exec
2094 };
2095
2096 static IOleCommandTarget OleCommandTarget = { &OleCommandTargetVtbl };
2097
2098 static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
2099 {
2100     return QueryInterface(riid, ppv);
2101 }
2102
2103 static ULONG WINAPI Dispatch_AddRef(IDispatch *iface)
2104 {
2105     return 2;
2106 }
2107
2108 static ULONG WINAPI Dispatch_Release(IDispatch *iface)
2109 {
2110     return 1;
2111 }
2112
2113 static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
2114 {
2115     ok(0, "unexpected call\n");
2116     return E_NOTIMPL;
2117 }
2118
2119 static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid,
2120         ITypeInfo **ppTInfo)
2121 {
2122     ok(0, "unexpected call\n");
2123     return E_NOTIMPL;
2124 }
2125
2126 static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
2127         UINT cNames, LCID lcid, DISPID *rgDispId)
2128 {
2129     ok(0, "unexpected call\n");
2130     return E_NOTIMPL;
2131 }
2132
2133 static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
2134         LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
2135         EXCEPINFO *pExcepInfo, UINT *puArgErr)
2136 {
2137     ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n");
2138     ok(pDispParams != NULL, "pDispParams == NULL\n");
2139     ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo);
2140     ok(puArgErr != NULL, "puArgErr == NULL\n");
2141     ok(V_VT(pVarResult) == 0, "V_VT(pVarResult)=%d, expected 0\n", V_VT(pVarResult));
2142     ok(wFlags == DISPATCH_PROPERTYGET, "wFlags=%08x, expected DISPATCH_PROPERTYGET\n", wFlags);
2143     test_readyState(NULL);
2144
2145     switch(dispIdMember) {
2146     case DISPID_AMBIENT_USERMODE:
2147         CHECK_EXPECT2(Invoke_AMBIENT_USERMODE);
2148         V_VT(pVarResult) = VT_BOOL;
2149         V_BOOL(pVarResult) = VARIANT_TRUE;
2150         return S_OK;
2151     case DISPID_AMBIENT_DLCONTROL:
2152         CHECK_EXPECT2(Invoke_AMBIENT_DLCONTROL);
2153         return E_FAIL;
2154     case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
2155         CHECK_EXPECT2(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2156         return E_FAIL;
2157     case DISPID_AMBIENT_SILENT:
2158         CHECK_EXPECT2(Invoke_AMBIENT_SILENT);
2159         V_VT(pVarResult) = VT_BOOL;
2160         V_BOOL(pVarResult) = VARIANT_FALSE;
2161         return S_OK;
2162     case DISPID_AMBIENT_USERAGENT:
2163         CHECK_EXPECT(Invoke_AMBIENT_USERAGENT);
2164         return E_FAIL;
2165     case DISPID_AMBIENT_PALETTE:
2166         CHECK_EXPECT(Invoke_AMBIENT_PALETTE);
2167         return E_FAIL;
2168     };
2169
2170     ok(0, "unexpected dispid %d\n", dispIdMember);
2171     return E_FAIL;
2172 }
2173
2174 static IDispatchVtbl DispatchVtbl = {
2175     Dispatch_QueryInterface,
2176     Dispatch_AddRef,
2177     Dispatch_Release,
2178     Dispatch_GetTypeInfoCount,
2179     Dispatch_GetTypeInfo,
2180     Dispatch_GetIDsOfNames,
2181     Dispatch_Invoke
2182 };
2183
2184 static IDispatch Dispatch = { &DispatchVtbl };
2185
2186 static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface,
2187                                                      REFIID riid, void **ppv)
2188 {
2189     return QueryInterface(riid, ppv);
2190 }
2191
2192 static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
2193 {
2194     return 2;
2195 }
2196
2197 static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
2198 {
2199     return 1;
2200 }
2201
2202 static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService,
2203                                     REFIID riid, void **ppv)
2204 {
2205     /*
2206      * Services used by HTMLDocument:
2207      *
2208      * IOleUndoManager
2209      * IInternetSecurityManager
2210      * ITargetFrame
2211      * {D5F78C80-5252-11CF-90FA-00AA0042106E}
2212      * HTMLFrameBase
2213      * IShellObject
2214      * {3050F312-98B5-11CF-BB82-00AA00BDCE0B}
2215      * {53A2D5B1-D2FC-11D0-84E0-006097C9987D}
2216      * {AD7F6C62-F6BD-11D2-959B-006097C553C8}
2217      * DefView (?)
2218      * {6D12FE80-7911-11CF-9534-0000C05BAE0B}
2219      * IElementBehaviorFactory
2220      * {3050F429-98B5-11CF-BB82-00AA00BDCE0B}
2221      * STopLevelBrowser
2222      * IHTMLWindow2
2223      * IInternetProtocol
2224      * IWebBrowserApp
2225      * UrlHostory
2226      * IHTMLEditHost
2227      * IHlinkFrame
2228      */
2229
2230     if(IsEqualGUID(&IID_IHlinkFrame, guidService)) {
2231         ok(IsEqualGUID(&IID_IHlinkFrame, riid), "unexpected riid\n");
2232         *ppv = &HlinkFrame;
2233         return S_OK;
2234     }
2235
2236     return E_NOINTERFACE;
2237 }
2238
2239 static const IServiceProviderVtbl ServiceProviderVtbl = {
2240     ServiceProvider_QueryInterface,
2241     ServiceProvider_AddRef,
2242     ServiceProvider_Release,
2243     ServiceProvider_QueryService
2244 };
2245
2246 static IServiceProvider ServiceProvider = { &ServiceProviderVtbl };
2247
2248 DEFINE_GUID(IID_unk1, 0xD48A6EC6,0x6A4A,0x11CF,0x94,0xA7,0x44,0x45,0x53,0x54,0x00,0x00); /* HTMLWindow2 ? */
2249 DEFINE_GUID(IID_unk2, 0x7BB0B520,0xB1A7,0x11D2,0xBB,0x23,0x00,0xC0,0x4F,0x79,0xAB,0xCD);
2250 DEFINE_GUID(IID_unk3, 0x000670BA,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
2251
2252 static HRESULT QueryInterface(REFIID riid, void **ppv)
2253 {
2254     *ppv = NULL;
2255
2256     if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IOleClientSite, riid))
2257         *ppv = &ClientSite;
2258     else if(IsEqualGUID(&IID_IOleDocumentSite, riid))
2259         *ppv = &DocumentSite;
2260     else if(IsEqualGUID(&IID_IDocHostUIHandler, riid) || IsEqualGUID(&IID_IDocHostUIHandler2, riid))
2261         *ppv = &DocHostUIHandler;
2262     else if(IsEqualGUID(&IID_IOleContainer, riid))
2263         *ppv = &OleContainer;
2264     else if(IsEqualGUID(&IID_IOleWindow, riid) || IsEqualGUID(&IID_IOleInPlaceSite, riid))
2265         *ppv = &InPlaceSiteEx;
2266     else if(IsEqualGUID(&IID_IOleCommandTarget , riid))
2267         *ppv = &OleCommandTarget;
2268     else if(IsEqualGUID(&IID_IDispatch, riid))
2269         *ppv = &Dispatch;
2270     else if(IsEqualGUID(&IID_IServiceProvider, riid))
2271         *ppv = &ServiceProvider;
2272     else if(IsEqualGUID(&IID_IOleInPlaceSiteEx, riid))
2273         *ppv = ipsex ? &InPlaceSiteEx : NULL;
2274     else if(IsEqualGUID(&IID_IOleControlSite, riid))
2275         *ppv = &OleControlSite;
2276     else if(IsEqualGUID(&IID_IDocHostShowUI, riid))
2277         return E_NOINTERFACE; /* TODO */
2278     else if(IsEqualGUID(&IID_IProxyManager, riid))
2279         return E_NOINTERFACE; /* ? */
2280     else if(IsEqualGUID(&IID_unk1, riid))
2281         return E_NOINTERFACE; /* HTMLWindow2 ? */
2282     else if(IsEqualGUID(&IID_unk2, riid))
2283         return E_NOINTERFACE; /* ? */
2284     else if(IsEqualGUID(&IID_unk3, riid))
2285         return E_NOINTERFACE; /* ? */
2286     else
2287         ok(0, "unexpected riid %s\n", debugstr_guid(riid));
2288
2289     if(*ppv)
2290         return S_OK;
2291     return E_NOINTERFACE;
2292 }
2293
2294 static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
2295 {
2296     return DefWindowProc(hwnd, msg, wParam, lParam);
2297 }
2298
2299 static void test_readyState(IUnknown *unk)
2300 {
2301     IHTMLDocument2 *htmldoc;
2302     BSTR state;
2303     HRESULT hres;
2304
2305     static const WCHAR wszUninitialized[] = {'u','n','i','n','i','t','i','a','l','i','z','e','d',0};
2306     static const WCHAR wszLoading[] = {'l','o','a','d','i','n','g',0};
2307     static const WCHAR wszInteractive[] = {'i','n','t','e','r','a','c','t','i','v','e',0};
2308     static const WCHAR wszComplete[] = {'c','o','m','p','l','e','t','e',0};
2309
2310     static const LPCWSTR expected_state[] = {
2311         wszUninitialized,
2312         wszLoading,
2313         wszInteractive,
2314         wszComplete,
2315         wszUninitialized
2316     };
2317
2318     if(!unk)
2319         unk = doc_unk;
2320
2321     hres = IUnknown_QueryInterface(unk, &IID_IHTMLDocument2, (void**)&htmldoc);
2322     ok(hres == S_OK, "QueryInterface(IID_IHTMLDocument2) failed: %08x\n", hres);
2323     if(FAILED(hres))
2324         return;
2325
2326     hres = IHTMLDocument2_get_readyState(htmldoc, NULL);
2327     ok(hres == E_POINTER, "get_readyState failed: %08x, expected\n", hres);
2328
2329     hres = IHTMLDocument2_get_readyState(htmldoc, &state);
2330     ok(hres == S_OK, "get_ReadyState failed: %08x\n", hres);
2331     ok(!lstrcmpW(state, expected_state[load_state]), "unexpected state, expected %d\n", load_state);
2332
2333     IHTMLDocument_Release(htmldoc);
2334 }
2335
2336 static void test_ConnectionPoint(IConnectionPointContainer *container, REFIID riid)
2337 {
2338     IConnectionPointContainer *tmp_container = NULL;
2339     IConnectionPoint *cp;
2340     IID iid;
2341     HRESULT hres;
2342
2343     hres = IConnectionPointContainer_FindConnectionPoint(container, riid, &cp);
2344     ok(hres == S_OK, "FindConnectionPoint failed: %08x\n", hres);
2345     if(FAILED(hres))
2346         return;
2347
2348     hres = IConnectionPoint_GetConnectionInterface(cp, &iid);
2349     ok(hres == S_OK, "GetConnectionInterface failed: %08x\n", hres);
2350     ok(IsEqualGUID(riid, &iid), "wrong iid\n");
2351
2352     hres = IConnectionPoint_GetConnectionInterface(cp, NULL);
2353     ok(hres == E_POINTER, "GetConnectionInterface failed: %08x, expected E_POINTER\n", hres);
2354
2355     hres = IConnectionPoint_GetConnectionPointContainer(cp, &tmp_container);
2356     ok(hres == S_OK, "GetConnectionPointContainer failed: %08x\n", hres);
2357     ok(tmp_container == container, "container != tmp_container\n");
2358     if(SUCCEEDED(hres))
2359         IConnectionPointContainer_Release(tmp_container);
2360
2361     hres = IConnectionPoint_GetConnectionPointContainer(cp, NULL);
2362     ok(hres == E_POINTER, "GetConnectionPointContainer failed: %08x, expected E_POINTER\n", hres);
2363
2364     if(IsEqualGUID(&IID_IPropertyNotifySink, riid)) {
2365         DWORD cookie;
2366
2367         hres = IConnectionPoint_Advise(cp, (IUnknown*)&PropertyNotifySink, &cookie);
2368         ok(hres == S_OK, "Advise failed: %08x\n", hres);
2369     }
2370
2371     IConnectionPoint_Release(cp);
2372 }
2373
2374 static void test_ConnectionPointContainer(IUnknown *unk)
2375 {
2376     IConnectionPointContainer *container;
2377     HRESULT hres;
2378
2379     hres = IUnknown_QueryInterface(unk, &IID_IConnectionPointContainer, (void**)&container);
2380     ok(hres == S_OK, "QueryInterface(IID_IConnectionPointContainer) failed: %08x\n", hres);
2381     if(FAILED(hres))
2382         return;
2383
2384     test_ConnectionPoint(container, &IID_IPropertyNotifySink);
2385     test_ConnectionPoint(container, &DIID_HTMLDocumentEvents);
2386     test_ConnectionPoint(container, &DIID_HTMLDocumentEvents2);
2387
2388     IConnectionPointContainer_Release(container);
2389 }
2390
2391 static void test_GetCurMoniker(IUnknown *unk, IMoniker *exmon, LPCWSTR exurl)
2392 {
2393     IHTMLDocument2 *doc;
2394     IPersistMoniker *permon;
2395     IMoniker *mon = (void*)0xdeadbeef;
2396     BSTR doc_url = (void*)0xdeadbeef;
2397     HRESULT hres;
2398
2399     hres = IUnknown_QueryInterface(unk, &IID_IPersistMoniker, (void**)&permon);
2400     ok(hres == S_OK, "QueryInterface(IID_IPersistMoniker) failed: %08x\n", hres);
2401     if(FAILED(hres))
2402         return;
2403
2404     hres = IUnknown_QueryInterface(unk, &IID_IHTMLDocument2, (void**)&doc);
2405     ok(hres == S_OK, "QueryInterface(IID_IHTMLDocument2) failed: %08x\n", hres);
2406
2407     hres = IHTMLDocument2_get_URL(doc, &doc_url);
2408     ok(hres == S_OK, "get_URL failed: %08x\n", hres);
2409
2410     hres = IPersistMoniker_GetCurMoniker(permon, &mon);
2411     IPersistMoniker_Release(permon);
2412
2413     if(exmon) {
2414         BSTR url;
2415         BOOL exb = expect_GetDisplayName;
2416         BOOL clb = called_GetDisplayName;
2417
2418         ok(hres == S_OK, "GetCurrentMoniker failed: %08x\n", hres);
2419         ok(mon == exmon, "mon(%p) != exmon(%p)\n", mon, exmon);
2420
2421         SET_EXPECT(GetDisplayName);
2422         hres = IMoniker_GetDisplayName(mon, NULL, NULL, &url);
2423         ok(hres == S_OK, "GetDisplayName failed: %08x\n", hres);
2424         CHECK_CALLED(GetDisplayName);
2425         expect_GetDisplayName = exb;
2426         called_GetDisplayName = clb;
2427
2428         SysFreeString(url);
2429         ok(!lstrcmpW(url, doc_url), "url != doc_url\n");
2430     }else if(exurl) {
2431         BSTR url;
2432
2433         ok(hres == S_OK, "GetCurrentMoniker failed: %08x\n", hres);
2434
2435         hres = IMoniker_GetDisplayName(mon, NULL, NULL, &url);
2436         ok(hres == S_OK, "GetDisplayName failed: %08x\n", hres);
2437
2438         ok(!lstrcmpW(url, exurl), "unexpected url\n");
2439         ok(!lstrcmpW(url, doc_url), "url != doc_url\n");
2440
2441         SysFreeString(url);
2442     }else {
2443         ok(hres == E_UNEXPECTED,
2444            "GetCurrentMoniker failed: %08x, expected E_UNEXPECTED\n", hres);
2445         ok(mon == (IMoniker*)0xdeadbeef, "mon=%p\n", mon);
2446         ok(!lstrcmpW(doc_url, about_blank_url), "doc_url is not about:blank\n");
2447     }
2448
2449     SysFreeString(doc_url);
2450     IHTMLDocument_Release(doc);
2451     if(mon && mon != (void*)0xdeadbeef)
2452         IMoniker_Release(mon);
2453 }
2454
2455 static void test_Load(IPersistMoniker *persist)
2456 {
2457     IBindCtx *bind;
2458     HRESULT hres;
2459     WCHAR sz_html_clientsite_objectparam[MAX_PATH];
2460
2461     lstrcpyW(sz_html_clientsite_objectparam, SZ_HTML_CLIENTSITE_OBJECTPARAM);
2462
2463     test_readyState((IUnknown*)persist);
2464
2465     CreateBindCtx(0, &bind);
2466     IBindCtx_RegisterObjectParam(bind, sz_html_clientsite_objectparam,
2467                                  (IUnknown*)&ClientSite);
2468
2469     SET_EXPECT(GetDisplayName);
2470     if(!set_clientsite) {
2471         SET_EXPECT(Invoke_AMBIENT_USERMODE);
2472         SET_EXPECT(GetHostInfo);
2473         SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
2474         SET_EXPECT(Invoke_AMBIENT_SILENT);
2475         SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2476         SET_EXPECT(Invoke_AMBIENT_USERAGENT);
2477         SET_EXPECT(Invoke_AMBIENT_PALETTE);
2478         SET_EXPECT(GetOptionKeyPath);
2479         SET_EXPECT(GetOverrideKeyPath);
2480         SET_EXPECT(GetWindow);
2481         SET_EXPECT(QueryStatus_SETPROGRESSTEXT);
2482         SET_EXPECT(Exec_SETPROGRESSMAX);
2483         SET_EXPECT(Exec_SETPROGRESSPOS);
2484         SET_EXPECT(Exec_ShellDocView_37);
2485     }
2486     if(!container_locked) {
2487         SET_EXPECT(GetContainer);
2488         SET_EXPECT(LockContainer);
2489     }
2490     SET_EXPECT(OnChanged_READYSTATE);
2491     SET_EXPECT(BindToStorage);
2492     if(set_clientsite) {
2493         SET_EXPECT(Invoke_AMBIENT_SILENT);
2494         SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2495         SET_EXPECT(Exec_ShellDocView_37);
2496     }
2497     expect_LockContainer_fLock = TRUE;
2498     readystate_set_loading = TRUE;
2499
2500     hres = IPersistMoniker_Load(persist, FALSE, &Moniker, bind, 0x12);
2501     ok(hres == S_OK, "Load failed: %08x\n", hres);
2502
2503     CHECK_CALLED(GetDisplayName);
2504     if(!set_clientsite) {
2505         CHECK_CALLED(Invoke_AMBIENT_USERMODE);
2506         CHECK_CALLED(GetHostInfo);
2507         CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
2508         CHECK_CALLED(Invoke_AMBIENT_SILENT);
2509         CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2510         CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
2511         CHECK_CALLED(Invoke_AMBIENT_PALETTE);
2512         CHECK_CALLED(GetOptionKeyPath);
2513         CHECK_CALLED(GetOverrideKeyPath);
2514         CHECK_CALLED(GetWindow);
2515         CHECK_CALLED(QueryStatus_SETPROGRESSTEXT);
2516         CHECK_CALLED(Exec_SETPROGRESSMAX);
2517         CHECK_CALLED(Exec_SETPROGRESSPOS);
2518         CHECK_CALLED(Exec_ShellDocView_37);
2519     }
2520     if(!container_locked) {
2521         CHECK_CALLED(GetContainer);
2522         CHECK_CALLED(LockContainer);
2523         container_locked = TRUE;
2524     }
2525     CHECK_CALLED(OnChanged_READYSTATE);
2526     CHECK_CALLED(BindToStorage);
2527     if(set_clientsite) {
2528         CHECK_CALLED(Invoke_AMBIENT_SILENT);
2529         CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2530         CHECK_CALLED(Exec_ShellDocView_37);
2531     }
2532
2533     set_clientsite = container_locked = TRUE;
2534
2535     test_GetCurMoniker((IUnknown*)persist, &Moniker, NULL);
2536
2537     IBindCtx_Release(bind);
2538
2539     test_readyState((IUnknown*)persist);
2540 }
2541
2542 static void test_download(BOOL verb_done, BOOL css_dwl)
2543 {
2544     HWND hwnd;
2545     MSG msg;
2546
2547     hwnd = FindWindowA("Internet Explorer_Hidden", NULL);
2548     ok(hwnd != NULL, "Could not find hidden window\n");
2549
2550     test_readyState(NULL);
2551
2552     if(verb_done) {
2553         SET_EXPECT(Exec_SETPROGRESSMAX);
2554         if(!load_from_stream)
2555             SET_EXPECT(GetHostInfo);
2556     }
2557     SET_EXPECT(SetStatusText);
2558     SET_EXPECT(Exec_SETDOWNLOADSTATE_1);
2559     SET_EXPECT(GetDropTarget);
2560     if(css_dwl) {
2561         SET_EXPECT(CreateInstance);
2562         SET_EXPECT(Start);
2563         SET_EXPECT(LockRequest);
2564         SET_EXPECT(Terminate);
2565         SET_EXPECT(Protocol_Read);
2566         SET_EXPECT(UnlockRequest);
2567     }
2568     SET_EXPECT(OnChanged_1005);
2569     SET_EXPECT(OnChanged_READYSTATE);
2570     SET_EXPECT(Exec_SETPROGRESSPOS);
2571     SET_EXPECT(Exec_SETDOWNLOADSTATE_0);
2572     SET_EXPECT(Exec_MSHTML_PARSECOMPLETE);
2573     SET_EXPECT(Exec_HTTPEQUIV_DONE);
2574     expect_status_text = (LPWSTR)0xdeadbeef; /* TODO */
2575
2576     while(!called_Exec_HTTPEQUIV_DONE && GetMessage(&msg, NULL, 0, 0)) {
2577         TranslateMessage(&msg);
2578         DispatchMessage(&msg);
2579     }
2580
2581     if(verb_done) {
2582         CHECK_CALLED(Exec_SETPROGRESSMAX);
2583         if(!load_from_stream)
2584             CHECK_CALLED(GetHostInfo);
2585     }
2586     CHECK_CALLED(SetStatusText);
2587     CHECK_CALLED(Exec_SETDOWNLOADSTATE_1);
2588     CHECK_CALLED(GetDropTarget);
2589     if(css_dwl) {
2590         if(called_CreateInstance) {
2591             CHECK_CALLED(CreateInstance);
2592             CHECK_CALLED(Start);
2593             CHECK_CALLED(LockRequest);
2594             CHECK_CALLED(Terminate);
2595             CHECK_CALLED(Protocol_Read);
2596             CHECK_CALLED(UnlockRequest);
2597         }else {
2598             skip("CreateInstance not called. Assuming no Gecko installed.\n");
2599
2600             SET_CALLED(CreateInstance);
2601             SET_CALLED(Start);
2602             SET_CALLED(LockRequest);
2603             SET_CALLED(Terminate);
2604             SET_CALLED(Protocol_Read);
2605             SET_CALLED(UnlockRequest);
2606
2607             nogecko = TRUE;
2608         }
2609     }
2610     CHECK_CALLED(OnChanged_1005);
2611     CHECK_CALLED(OnChanged_READYSTATE);
2612     CHECK_CALLED(Exec_SETPROGRESSPOS);
2613     CHECK_CALLED(Exec_SETDOWNLOADSTATE_0);
2614     CHECK_CALLED(Exec_MSHTML_PARSECOMPLETE);
2615     CHECK_CALLED(Exec_HTTPEQUIV_DONE);
2616
2617     load_state = LD_COMPLETE;
2618
2619     test_readyState(NULL);
2620 }
2621
2622 static void test_Persist(IUnknown *unk)
2623 {
2624     IPersistMoniker *persist_mon;
2625     IPersistFile *persist_file;
2626     GUID guid;
2627     HRESULT hres;
2628
2629     hres = IUnknown_QueryInterface(unk, &IID_IPersistFile, (void**)&persist_file);
2630     ok(hres == S_OK, "QueryInterface(IID_IPersist) failed: %08x\n", hres);
2631     if(SUCCEEDED(hres)) {
2632         hres = IPersist_GetClassID(persist_file, NULL);
2633         ok(hres == E_INVALIDARG, "GetClassID returned: %08x, expected E_INVALIDARG\n", hres);
2634
2635         hres = IPersist_GetClassID(persist_file, &guid);
2636         ok(hres == S_OK, "GetClassID failed: %08x\n", hres);
2637         ok(IsEqualGUID(&CLSID_HTMLDocument, &guid), "guid != CLSID_HTMLDocument\n");
2638
2639         IPersist_Release(persist_file);
2640     }
2641
2642     hres = IUnknown_QueryInterface(unk, &IID_IPersistMoniker, (void**)&persist_mon);
2643     ok(hres == S_OK, "QueryInterface(IID_IPersistMoniker) failed: %08x\n", hres);
2644     if(SUCCEEDED(hres)) {
2645         hres = IPersistMoniker_GetClassID(persist_mon, NULL);
2646         ok(hres == E_INVALIDARG, "GetClassID returned: %08x, expected E_INVALIDARG\n", hres);
2647
2648         hres = IPersistMoniker_GetClassID(persist_mon, &guid);
2649         ok(hres == S_OK, "GetClassID failed: %08x\n", hres);
2650         ok(IsEqualGUID(&CLSID_HTMLDocument, &guid), "guid != CLSID_HTMLDocument\n");
2651
2652         if(load_state == LD_DOLOAD)
2653             test_Load(persist_mon);
2654
2655         test_readyState(unk);
2656
2657         IPersistMoniker_Release(persist_mon);
2658     }
2659 }
2660
2661 static const OLECMDF expect_cmds[OLECMDID_GETPRINTTEMPLATE+1] = {
2662     0,
2663     OLECMDF_SUPPORTED,                  /* OLECMDID_OPEN */
2664     OLECMDF_SUPPORTED,                  /* OLECMDID_NEW */
2665     OLECMDF_SUPPORTED,                  /* OLECMDID_SAVE */
2666     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_SAVEAS */
2667     OLECMDF_SUPPORTED,                  /* OLECMDID_SAVECOPYAS */
2668     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_PRINT */
2669     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_PRINTPREVIEW */
2670     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_PAGESETUP */
2671     OLECMDF_SUPPORTED,                  /* OLECMDID_SPELL */
2672     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_PROPERTIES */
2673     OLECMDF_SUPPORTED,                  /* OLECMDID_CUT */
2674     OLECMDF_SUPPORTED,                  /* OLECMDID_COPY */
2675     OLECMDF_SUPPORTED,                  /* OLECMDID_PASTE */
2676     OLECMDF_SUPPORTED,                  /* OLECMDID_PASTESPECIAL */
2677     OLECMDF_SUPPORTED,                  /* OLECMDID_UNDO */
2678     OLECMDF_SUPPORTED,                  /* OLECMDID_REDO */
2679     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_SELECTALL */
2680     OLECMDF_SUPPORTED,                  /* OLECMDID_CLEARSELECTION */
2681     OLECMDF_SUPPORTED,                  /* OLECMDID_ZOOM */
2682     OLECMDF_SUPPORTED,                  /* OLECMDID_GETZOOMRANGE */
2683     0,
2684     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_REFRESH */
2685     OLECMDF_SUPPORTED|OLECMDF_ENABLED,  /* OLECMDID_STOP */
2686     0,0,0,0,0,0,
2687     OLECMDF_SUPPORTED,                  /* OLECMDID_STOPDOWNLOAD */
2688     0,0,
2689     OLECMDF_SUPPORTED,                  /* OLECMDID_DELETE */
2690     0,0,
2691     OLECMDF_SUPPORTED,                  /* OLECMDID_ENABLE_INTERACTION */
2692     OLECMDF_SUPPORTED,                  /* OLECMDID_ONUNLOAD */
2693     0,0,0,0,0,
2694     OLECMDF_SUPPORTED,                  /* OLECMDID_SHOWPAGESETUP */
2695     OLECMDF_SUPPORTED,                  /* OLECMDID_SHOWPRINT */
2696     0,0,
2697     OLECMDF_SUPPORTED,                  /* OLECMDID_CLOSE */
2698     0,0,0,
2699     OLECMDF_SUPPORTED,                  /* OLECMDID_SETPRINTTEMPLATE */
2700     OLECMDF_SUPPORTED                   /* OLECMDID_GETPRINTTEMPLATE */
2701 };
2702
2703 static void test_QueryStatus(IUnknown *unk, REFIID cgid, ULONG cmdid, DWORD cmdf)
2704 {
2705     IOleCommandTarget *cmdtrg;
2706     OLECMD olecmd = {cmdid, 0};
2707     HRESULT hres;
2708
2709     hres = IUnknown_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
2710     ok(hres == S_OK, "QueryInterface(IID_IOleCommandTarget failed: %08x\n", hres);
2711     if(FAILED(hres))
2712         return;
2713
2714     hres = IOleCommandTarget_QueryStatus(cmdtrg, cgid, 1, &olecmd, NULL);
2715     ok(hres == S_OK, "QueryStatus(%u) failed: %08x\n", cmdid, hres);
2716
2717     IOleCommandTarget_Release(cmdtrg);
2718
2719     ok(olecmd.cmdID == cmdid, "cmdID changed\n");
2720     ok(olecmd.cmdf == cmdf, "(%u) cmdf=%08x, expected %08x\n", cmdid, olecmd.cmdf, cmdf);
2721 }
2722
2723 static void test_MSHTML_QueryStatus(IUnknown *unk, DWORD cmdf)
2724 {
2725     if(!unk)
2726         unk = doc_unk;
2727
2728     test_QueryStatus(unk, &CGID_MSHTML, IDM_FONTNAME, cmdf);
2729     test_QueryStatus(unk, &CGID_MSHTML, IDM_FONTSIZE, cmdf);
2730     test_QueryStatus(unk, &CGID_MSHTML, IDM_SELECTALL, cmdf|OLECMDF_ENABLED);
2731     test_QueryStatus(unk, &CGID_MSHTML, IDM_BOLD, cmdf);
2732     test_QueryStatus(unk, &CGID_MSHTML, IDM_FORECOLOR, cmdf);
2733     test_QueryStatus(unk, &CGID_MSHTML, IDM_JUSTIFYCENTER, cmdf);
2734     test_QueryStatus(unk, &CGID_MSHTML, IDM_JUSTIFYLEFT, cmdf);
2735     test_QueryStatus(unk, &CGID_MSHTML, IDM_JUSTIFYRIGHT, cmdf);
2736     test_QueryStatus(unk, &CGID_MSHTML, IDM_ITALIC, cmdf);
2737     test_QueryStatus(unk, &CGID_MSHTML, IDM_UNDERLINE, cmdf);
2738     test_QueryStatus(unk, &CGID_MSHTML, IDM_HORIZONTALLINE, cmdf);
2739     test_QueryStatus(unk, &CGID_MSHTML, IDM_ORDERLIST, cmdf);
2740     test_QueryStatus(unk, &CGID_MSHTML, IDM_UNORDERLIST, cmdf);
2741     test_QueryStatus(unk, &CGID_MSHTML, IDM_INDENT, cmdf);
2742     test_QueryStatus(unk, &CGID_MSHTML, IDM_OUTDENT, cmdf);
2743     test_QueryStatus(unk, &CGID_MSHTML, IDM_DELETE, cmdf);
2744 }
2745
2746 static void test_OleCommandTarget(IUnknown *unk)
2747 {
2748     IOleCommandTarget *cmdtrg;
2749     OLECMD cmds[OLECMDID_GETPRINTTEMPLATE];
2750     int i;
2751     HRESULT hres;
2752
2753     hres = IUnknown_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
2754     ok(hres == S_OK, "QueryInterface(IID_IOleCommandTarget failed: %08x\n", hres);
2755     if(FAILED(hres))
2756         return;
2757
2758     for(i=0; i<OLECMDID_GETPRINTTEMPLATE; i++) {
2759         cmds[i].cmdID = i+1;
2760         cmds[i].cmdf = 0xf0f0;
2761     }
2762
2763     SET_EXPECT(QueryStatus_OPEN);
2764     SET_EXPECT(QueryStatus_NEW);
2765     hres = IOleCommandTarget_QueryStatus(cmdtrg, NULL, sizeof(cmds)/sizeof(cmds[0]), cmds, NULL);
2766     ok(hres == S_OK, "QueryStatus failed: %08x\n", hres);
2767     CHECK_CALLED(QueryStatus_OPEN);
2768     CHECK_CALLED(QueryStatus_NEW);
2769
2770     for(i=0; i<OLECMDID_GETPRINTTEMPLATE; i++) {
2771         ok(cmds[i].cmdID == i+1, "cmds[%d].cmdID canged to %x\n", i, cmds[i].cmdID);
2772         ok(cmds[i].cmdf == expect_cmds[i+1], "cmds[%d].cmdf=%x, expected %x\n",
2773                 i+1, cmds[i].cmdf, expect_cmds[i+1]);
2774     }
2775
2776     IOleCommandTarget_Release(cmdtrg);
2777 }
2778
2779 static void test_OleCommandTarget_fail(IUnknown *unk)
2780 {
2781     IOleCommandTarget *cmdtrg;
2782     int i;
2783     HRESULT hres;
2784
2785     OLECMD cmd[2] = {
2786         {OLECMDID_OPEN, 0xf0f0},
2787         {OLECMDID_GETPRINTTEMPLATE+1, 0xf0f0}
2788     };
2789
2790     hres = IUnknown_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
2791     ok(hres == S_OK, "QueryInterface(IIDIOleCommandTarget failed: %08x\n", hres);
2792     if(FAILED(hres))
2793         return;
2794
2795     hres = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 0, NULL, NULL);
2796     ok(hres == S_OK, "QueryStatus failed: %08x\n", hres);
2797
2798     SET_EXPECT(QueryStatus_OPEN);
2799     hres = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 2, cmd, NULL);
2800     CHECK_CALLED(QueryStatus_OPEN);
2801
2802     ok(hres == OLECMDERR_E_NOTSUPPORTED,
2803             "QueryStatus failed: %08x, expected OLECMDERR_E_NOTSUPPORTED\n", hres);
2804     ok(cmd[1].cmdID == OLECMDID_GETPRINTTEMPLATE+1,
2805             "cmd[0].cmdID=%d, expected OLECMDID_GETPRINTTEMPLATE+1\n", cmd[0].cmdID);
2806     ok(cmd[1].cmdf == 0, "cmd[0].cmdf=%x, expected 0\n", cmd[0].cmdf);
2807     ok(cmd[0].cmdf == OLECMDF_SUPPORTED,
2808             "cmd[1].cmdf=%x, expected OLECMDF_SUPPORTED\n", cmd[1].cmdf);
2809
2810     hres = IOleCommandTarget_QueryStatus(cmdtrg, &IID_IHTMLDocument2, 2, cmd, NULL);
2811     ok(hres == OLECMDERR_E_UNKNOWNGROUP,
2812             "QueryStatus failed: %08x, expected OLECMDERR_E_UNKNOWNGROUP\n", hres);
2813
2814     for(i=0; i<OLECMDID_GETPRINTTEMPLATE; i++) {
2815         if(!expect_cmds[i]) {
2816             hres = IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_UPDATECOMMANDS,
2817                     OLECMDEXECOPT_DODEFAULT, NULL, NULL);
2818             ok(hres == OLECMDERR_E_NOTSUPPORTED,
2819                     "Exec failed: %08x, expected OLECMDERR_E_NOTSUPPORTED\n", hres);
2820         }
2821     }
2822
2823     hres = IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_GETPRINTTEMPLATE+1,
2824             OLECMDEXECOPT_DODEFAULT, NULL, NULL);
2825     ok(hres == OLECMDERR_E_NOTSUPPORTED,
2826             "Exec failed: %08x, expected OLECMDERR_E_NOTSUPPORTED\n", hres);
2827
2828     IOleCommandTarget_Release(cmdtrg);
2829 }
2830
2831 static void test_exec_onunload(IUnknown *unk)
2832 {
2833     IOleCommandTarget *cmdtrg;
2834     VARIANT var;
2835     HRESULT hres;
2836
2837     hres = IUnknown_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
2838     ok(hres == S_OK, "QueryInterface(IID_IOleCommandTarget) failed: %08x\n", hres);
2839     if(FAILED(hres))
2840         return;
2841
2842     memset(&var, 0x0a, sizeof(var));
2843     hres = IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_ONUNLOAD,
2844             OLECMDEXECOPT_DODEFAULT, NULL, &var);
2845     ok(hres == S_OK, "Exec(..., OLECMDID_ONUNLOAD, ...) failed: %08x\n", hres);
2846     ok(V_VT(&var) == VT_BOOL, "V_VT(var)=%d, expected VT_BOOL\n", V_VT(&var));
2847     ok(V_BOOL(&var) == VARIANT_TRUE, "V_BOOL(var)=%x, expected VARIANT_TRUE\n", V_BOOL(&var));
2848
2849     hres = IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_ONUNLOAD,
2850             OLECMDEXECOPT_DODEFAULT, NULL, NULL);
2851     ok(hres == S_OK, "Exec(..., OLECMDID_ONUNLOAD, ...) failed: %08x\n", hres);
2852
2853     IOleCommandTarget_Release(cmdtrg);
2854 }
2855
2856 static void test_exec_editmode(IUnknown *unk)
2857 {
2858     IOleCommandTarget *cmdtrg;
2859     HRESULT hres;
2860
2861     hres = IUnknown_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
2862     ok(hres == S_OK, "QueryInterface(IID_IOleCommandTarget) failed: %08x\n", hres);
2863     if(FAILED(hres))
2864         return;
2865
2866     editmode = TRUE;
2867
2868     SET_EXPECT(SetStatusText);
2869     SET_EXPECT(Exec_ShellDocView_37);
2870     SET_EXPECT(GetHostInfo);
2871     SET_EXPECT(Invoke_AMBIENT_SILENT);
2872     SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2873     SET_EXPECT(OnChanged_READYSTATE);
2874     SET_EXPECT(InPlaceUIWindow_SetActiveObject);
2875     SET_EXPECT(HideUI);
2876     SET_EXPECT(ShowUI);
2877     SET_EXPECT(InPlaceFrame_SetBorderSpace);
2878     expect_status_text = NULL;
2879     readystate_set_loading = TRUE;
2880
2881     hres = IOleCommandTarget_Exec(cmdtrg, &CGID_MSHTML, IDM_EDITMODE,
2882             OLECMDEXECOPT_DODEFAULT, NULL, NULL);
2883     ok(hres == S_OK, "Exec failed: %08x\n", hres);
2884
2885     CHECK_CALLED(SetStatusText);
2886     CHECK_CALLED(Exec_ShellDocView_37);
2887     CHECK_CALLED(GetHostInfo);
2888     CHECK_CALLED(Invoke_AMBIENT_SILENT);
2889     CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
2890     CHECK_CALLED(OnChanged_READYSTATE);
2891     CHECK_CALLED(InPlaceUIWindow_SetActiveObject);
2892     CHECK_CALLED(HideUI);
2893     CHECK_CALLED(ShowUI);
2894     CHECK_CALLED(InPlaceFrame_SetBorderSpace);
2895
2896     test_timer(EXPECT_UPDATEUI|EXPECT_SETTITLE);
2897
2898     IOleCommandTarget_Release(cmdtrg);
2899
2900     hres = IOleCommandTarget_Exec(cmdtrg, &CGID_MSHTML, IDM_EDITMODE,
2901             OLECMDEXECOPT_DODEFAULT, NULL, NULL);
2902     ok(hres == S_OK, "Exec failed: %08x\n", hres);
2903 }
2904
2905 static void test_exec_fontname(IUnknown *unk, LPCWSTR name, LPCWSTR exname)
2906 {
2907    IOleCommandTarget *cmdtrg;
2908    VARIANT *in = NULL, _in, *out = NULL, _out;
2909    HRESULT hres;
2910
2911    hres = IUnknown_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
2912    ok(hres == S_OK, "QueryInterface(IIDIOleM=CommandTarget failed: %08x\n", hres);
2913    if(FAILED(hres))
2914        return;
2915
2916    if(name) {
2917        in = &_in;
2918        V_VT(in) = VT_BSTR;
2919        V_BSTR(in) = SysAllocString(name);
2920    }
2921
2922    if(exname) {
2923        out = &_out;
2924        V_VT(out) = VT_I4;
2925        V_I4(out) = 0xdeadbeef;
2926    }
2927
2928    hres = IOleCommandTarget_Exec(cmdtrg, &CGID_MSHTML, IDM_FONTNAME, 0, in, out);
2929    if(!nogecko)
2930        ok(hres == S_OK, "Exec(IDM_FONTNAME) failed: %08x\n", hres);
2931
2932    if(in)
2933        VariantClear(in);
2934
2935    if(out && !nogecko) {
2936        ok(V_VT(out) == VT_BSTR, "V_VT(out) = %x\n", V_VT(out));
2937        if(V_VT(out) == VT_BSTR)
2938            ok(!lstrcmpW(V_BSTR(out), name ? name : exname), "unexpected fontname\n");
2939        VariantClear(out);
2940    }
2941
2942    IOleCommandTarget_Release(cmdtrg);
2943 }
2944
2945 static void test_exec_noargs(IUnknown *unk, DWORD cmdid)
2946 {
2947     IOleCommandTarget *cmdtrg;
2948     HRESULT hres;
2949
2950     hres = IUnknown_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
2951     ok(hres == S_OK, "QueryInterface(IID_IOleCommandTarget) failed: %08x\n", hres);
2952     if(FAILED(hres))
2953         return;
2954
2955     hres = IOleCommandTarget_Exec(cmdtrg, &CGID_MSHTML, cmdid,
2956             OLECMDEXECOPT_DODEFAULT, NULL, NULL);
2957     ok(hres == S_OK, "Exec failed: %08x\n", hres);
2958
2959     IOleCommandTarget_Release(cmdtrg);
2960 }
2961
2962 static void test_IsDirty(IUnknown *unk, HRESULT exhres)
2963 {
2964     IPersistStreamInit *perinit;
2965     IPersistMoniker *permon;
2966     IPersistFile *perfile;
2967     HRESULT hres;
2968
2969     hres = IUnknown_QueryInterface(unk, &IID_IPersistStreamInit, (void**)&perinit);
2970     ok(hres == S_OK, "QueryInterface(IID_IPersistStreamInit failed: %08x\n", hres);
2971     if(SUCCEEDED(hres)) {
2972         hres = IPersistStreamInit_IsDirty(perinit);
2973         ok(hres == exhres, "IsDirty() = %08x, expected %08x\n", hres, exhres);
2974         IPersistStreamInit_Release(perinit);
2975     }
2976
2977     hres = IUnknown_QueryInterface(unk, &IID_IPersistMoniker, (void**)&permon);
2978     ok(hres == S_OK, "QueryInterface(IID_IPersistMoniker failed: %08x\n", hres);
2979     if(SUCCEEDED(hres)) {
2980         hres = IPersistMoniker_IsDirty(permon);
2981         ok(hres == exhres, "IsDirty() = %08x, expected %08x\n", hres, exhres);
2982         IPersistMoniker_Release(permon);
2983     }
2984
2985     hres = IUnknown_QueryInterface(unk, &IID_IPersistFile, (void**)&perfile);
2986     ok(hres == S_OK, "QueryInterface(IID_IPersistFile failed: %08x\n", hres);
2987     if(SUCCEEDED(hres)) {
2988         hres = IPersistFile_IsDirty(perfile);
2989         ok(hres == exhres, "IsDirty() = %08x, expected %08x\n", hres, exhres);
2990         IPersistFile_Release(perfile);
2991     }
2992 }
2993
2994 static HWND create_container_window(void)
2995 {
2996     static const WCHAR wszHTMLDocumentTest[] =
2997         {'H','T','M','L','D','o','c','u','m','e','n','t','T','e','s','t',0};
2998     static WNDCLASSEXW wndclass = {
2999         sizeof(WNDCLASSEXW),
3000         0,
3001         wnd_proc,
3002         0, 0, NULL, NULL, NULL, NULL, NULL,
3003         wszHTMLDocumentTest,
3004         NULL
3005     };
3006
3007     RegisterClassExW(&wndclass);
3008     return CreateWindowW(wszHTMLDocumentTest, wszHTMLDocumentTest,
3009             WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
3010             CW_USEDEFAULT, NULL, NULL, NULL, NULL);
3011 }
3012
3013 static HRESULT test_DoVerb(IOleObject *oleobj)
3014 {
3015     RECT rect = {0,0,500,500};
3016     HRESULT hres;
3017
3018     if(!container_locked) {
3019         SET_EXPECT(GetContainer);
3020         SET_EXPECT(LockContainer);
3021     }
3022     SET_EXPECT(ActivateMe);
3023     expect_LockContainer_fLock = TRUE;
3024
3025     hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite, -1, container_hwnd, &rect);
3026     if(FAILED(hres))
3027         return hres;
3028     ok(hres == S_OK, "DoVerb failed: %08x\n", hres);
3029
3030     if(!container_locked) {
3031         CHECK_CALLED(GetContainer);
3032         CHECK_CALLED(LockContainer);
3033         container_locked = TRUE;
3034     }
3035     CHECK_CALLED(ActivateMe);
3036
3037     return hres;
3038 }
3039
3040 #define CLIENTSITE_EXPECTPATH 0x00000001
3041 #define CLIENTSITE_SETNULL    0x00000002
3042 #define CLIENTSITE_DONTSET    0x00000004
3043
3044 static void test_ClientSite(IOleObject *oleobj, DWORD flags)
3045 {
3046     IOleClientSite *clientsite;
3047     HRESULT hres;
3048
3049     if(flags & CLIENTSITE_SETNULL) {
3050         hres = IOleObject_GetClientSite(oleobj, &clientsite);
3051         ok(clientsite == &ClientSite, "clientsite=%p, expected %p\n", clientsite, &ClientSite);
3052
3053         hres = IOleObject_SetClientSite(oleobj, NULL);
3054         ok(hres == S_OK, "SetClientSite failed: %08x\n", hres);
3055
3056         set_clientsite = FALSE;
3057     }
3058
3059     if(flags & CLIENTSITE_DONTSET)
3060         return;
3061
3062     hres = IOleObject_GetClientSite(oleobj, &clientsite);
3063     ok(hres == S_OK, "GetClientSite failed: %08x\n", hres);
3064     ok(clientsite == (set_clientsite ? &ClientSite : NULL), "GetClientSite() = %p, expected %p\n",
3065             clientsite, set_clientsite ? &ClientSite : NULL);
3066
3067     if(!set_clientsite) {
3068         SET_EXPECT(GetHostInfo);
3069         if(flags & CLIENTSITE_EXPECTPATH) {
3070             SET_EXPECT(GetOptionKeyPath);
3071             SET_EXPECT(GetOverrideKeyPath);
3072         }
3073         SET_EXPECT(GetWindow);
3074         SET_EXPECT(QueryStatus_SETPROGRESSTEXT);
3075         SET_EXPECT(Exec_SETPROGRESSMAX);
3076         SET_EXPECT(Exec_SETPROGRESSPOS);
3077         SET_EXPECT(Invoke_AMBIENT_USERMODE);
3078         SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
3079         SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
3080         SET_EXPECT(Invoke_AMBIENT_SILENT);
3081         SET_EXPECT(Invoke_AMBIENT_USERAGENT);
3082         SET_EXPECT(Invoke_AMBIENT_PALETTE);
3083
3084         hres = IOleObject_SetClientSite(oleobj, &ClientSite);
3085         ok(hres == S_OK, "SetClientSite failed: %08x\n", hres);
3086
3087         CHECK_CALLED(GetHostInfo);
3088         if(flags & CLIENTSITE_EXPECTPATH) {
3089             CHECK_CALLED(GetOptionKeyPath);
3090             CHECK_CALLED(GetOverrideKeyPath);
3091         }
3092         CHECK_CALLED(GetWindow);
3093         CHECK_CALLED(QueryStatus_SETPROGRESSTEXT);
3094         CHECK_CALLED(Exec_SETPROGRESSMAX);
3095         CHECK_CALLED(Exec_SETPROGRESSPOS);
3096         CHECK_CALLED(Invoke_AMBIENT_USERMODE);
3097         CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
3098         CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); 
3099         CHECK_CALLED(Invoke_AMBIENT_SILENT);
3100         CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
3101         CHECK_CALLED(Invoke_AMBIENT_PALETTE);
3102
3103         set_clientsite = TRUE;
3104     }
3105
3106     hres = IOleObject_SetClientSite(oleobj, &ClientSite);
3107     ok(hres == S_OK, "SetClientSite failed: %08x\n", hres);
3108
3109     hres = IOleObject_GetClientSite(oleobj, &clientsite);
3110     ok(hres == S_OK, "GetClientSite failed: %08x\n", hres);
3111     ok(clientsite == &ClientSite, "GetClientSite() = %p, expected %p\n", clientsite, &ClientSite);
3112 }
3113
3114 static void test_OnAmbientPropertyChange(IUnknown *unk)
3115 {
3116     IOleControl *control = NULL;
3117     HRESULT hres;
3118
3119     hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
3120     ok(hres == S_OK, "QueryInterface(IID_IOleControl failed: %08x\n", hres);
3121     if(FAILED(hres))
3122         return;
3123
3124     SET_EXPECT(Invoke_AMBIENT_USERMODE);
3125     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_USERMODE);
3126     ok(hres == S_OK, "OnAmbientChange failed: %08x\n", hres);
3127     CHECK_CALLED(Invoke_AMBIENT_USERMODE);
3128
3129     SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
3130     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_DLCONTROL);
3131     ok(hres == S_OK, "OnAmbientChange failed: %08x\n", hres);
3132     CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
3133
3134     SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
3135     SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
3136     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED);
3137     ok(hres == S_OK, "OnAmbientChange failed: %08x\n", hres);
3138     CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
3139     CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
3140
3141     SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
3142     SET_EXPECT(Invoke_AMBIENT_SILENT);
3143     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_SILENT);
3144     ok(hres == S_OK, "OnAmbientChange failed: %08x\n", hres);
3145     CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
3146     CHECK_CALLED(Invoke_AMBIENT_SILENT);
3147
3148     SET_EXPECT(Invoke_AMBIENT_USERAGENT);
3149     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_USERAGENT);
3150     ok(hres == S_OK, "OnAmbientChange failed: %08x\n", hres);
3151     CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
3152
3153     SET_EXPECT(Invoke_AMBIENT_PALETTE);
3154     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_PALETTE);
3155     ok(hres == S_OK, "OnAmbientChange failed: %08x\n", hres);
3156     CHECK_CALLED(Invoke_AMBIENT_PALETTE);
3157
3158     IOleControl_Release(control);
3159 }
3160
3161
3162
3163 static void test_OnAmbientPropertyChange2(IUnknown *unk)
3164 {
3165     IOleControl *control = NULL;
3166     HRESULT hres;
3167
3168     hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
3169     ok(hres == S_OK, "QueryInterface(IID_IOleControl failed: %08x\n", hres);
3170     if(FAILED(hres))
3171         return;
3172
3173     hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_PALETTE);
3174     ok(hres == S_OK, "OnAmbientPropertyChange failed: %08x\n", hres);
3175
3176     IOleControl_Release(control);
3177 }
3178
3179 static void test_Close(IUnknown *unk, BOOL set_client)
3180 {
3181     IOleObject *oleobj = NULL;
3182     HRESULT hres;
3183
3184     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
3185     ok(hres == S_OK, "QueryInterface(IID_IOleObject) failed: %08x\n", hres);
3186     if(FAILED(hres))
3187         return;
3188
3189     SET_EXPECT(GetContainer);
3190     SET_EXPECT(LockContainer);
3191     expect_LockContainer_fLock = FALSE;
3192     hres = IOleObject_Close(oleobj, OLECLOSE_NOSAVE);
3193     ok(hres == S_OK, "Close failed: %08x\n", hres);
3194     CHECK_CALLED(GetContainer);
3195     CHECK_CALLED(LockContainer);
3196     container_locked = FALSE;
3197
3198     if(set_client)
3199         test_ClientSite(oleobj, CLIENTSITE_SETNULL|CLIENTSITE_DONTSET);
3200
3201     IOleObject_Release(oleobj);
3202 }
3203
3204 static void test_OnFrameWindowActivate(IUnknown *unk)
3205 {
3206     IOleInPlaceActiveObject *inplaceact;
3207     HRESULT hres;
3208
3209     hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceActiveObject, (void**)&inplaceact);
3210     ok(hres == S_OK, "QueryInterface(IID_IOleInPlaceActiveObject) failed: %08x\n", hres);
3211     if(FAILED(hres))
3212         return;
3213
3214     if(set_clientsite) {
3215         expect_OnFrameWindowActivate_fActivate = TRUE;
3216         SET_EXPECT(OnFrameWindowActivate);
3217         hres = IOleInPlaceActiveObject_OnFrameWindowActivate(inplaceact, TRUE);
3218         ok(hres == S_OK, "OnFrameWindowActivate failed: %08x\n", hres);
3219         CHECK_CALLED(OnFrameWindowActivate);
3220
3221         SET_EXPECT(OnFrameWindowActivate);
3222         hres = IOleInPlaceActiveObject_OnFrameWindowActivate(inplaceact, TRUE);
3223         ok(hres == S_OK, "OnFrameWindowActivate failed: %08x\n", hres);
3224         CHECK_CALLED(OnFrameWindowActivate);
3225
3226         expect_OnFrameWindowActivate_fActivate = FALSE;
3227         SET_EXPECT(OnFrameWindowActivate);
3228         hres = IOleInPlaceActiveObject_OnFrameWindowActivate(inplaceact, FALSE);
3229         ok(hres == S_OK, "OnFrameWindowActivate failed: %08x\n", hres);
3230         CHECK_CALLED(OnFrameWindowActivate);
3231
3232         expect_OnFrameWindowActivate_fActivate = TRUE;
3233         SET_EXPECT(OnFrameWindowActivate);
3234         hres = IOleInPlaceActiveObject_OnFrameWindowActivate(inplaceact, TRUE);
3235         ok(hres == S_OK, "OnFrameWindowActivate failed: %08x\n", hres);
3236         CHECK_CALLED(OnFrameWindowActivate);
3237     }else {
3238         hres = IOleInPlaceActiveObject_OnFrameWindowActivate(inplaceact, FALSE);
3239         ok(hres == S_OK, "OnFrameWindowActivate failed: %08x\n", hres);
3240
3241         hres = IOleInPlaceActiveObject_OnFrameWindowActivate(inplaceact, TRUE);
3242         ok(hres == S_OK, "OnFrameWindowActivate failed: %08x\n", hres);
3243     }
3244
3245     IOleInPlaceActiveObject_Release(inplaceact);
3246 }
3247
3248 static void test_InPlaceDeactivate(IUnknown *unk, BOOL expect_call)
3249 {
3250     IOleInPlaceObjectWindowless *windowlessobj = NULL;
3251     HRESULT hres;
3252
3253     hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceObjectWindowless,
3254             (void**)&windowlessobj);
3255     ok(hres == S_OK, "QueryInterface(IID_IOleInPlaceObjectWindowless) failed: %08x\n", hres);
3256     if(FAILED(hres))
3257         return;
3258
3259     if(expect_call) {
3260         SET_EXPECT(OnFocus_FALSE);
3261         if(ipsex)
3262             SET_EXPECT(OnInPlaceDeactivateEx);
3263         else
3264             SET_EXPECT(OnInPlaceDeactivate);
3265     }
3266     hres = IOleInPlaceObjectWindowless_InPlaceDeactivate(windowlessobj);
3267     ok(hres == S_OK, "InPlaceDeactivate failed: %08x\n", hres);
3268     if(expect_call) {
3269         CHECK_CALLED(OnFocus_FALSE);
3270         if(ipsex)
3271             CHECK_CALLED(OnInPlaceDeactivateEx);
3272         else
3273             CHECK_CALLED(OnInPlaceDeactivate);
3274     }
3275
3276     IOleInPlaceObjectWindowless_Release(windowlessobj);
3277 }
3278
3279 static HRESULT test_Activate(IUnknown *unk, DWORD flags)
3280 {
3281     IOleObject *oleobj = NULL;
3282     IOleDocumentView *docview;
3283     GUID guid;
3284     HRESULT hres;
3285
3286     last_hwnd = hwnd;
3287
3288     if(view)
3289         IOleDocumentView_Release(view);
3290     view = NULL;
3291
3292     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
3293     ok(hres == S_OK, "QueryInterface(IID_IOleObject) failed: %08x\n", hres);
3294     if(FAILED(hres))
3295         return hres;
3296
3297     hres = IOleObject_GetUserClassID(oleobj, NULL);
3298     ok(hres == E_INVALIDARG, "GetUserClassID returned: %08x, expected E_INVALIDARG\n", hres);
3299
3300     hres = IOleObject_GetUserClassID(oleobj, &guid);
3301     ok(hres == S_OK, "GetUserClassID failed: %08x\n", hres);
3302     ok(IsEqualGUID(&guid, &CLSID_HTMLDocument), "guid != CLSID_HTMLDocument\n");
3303
3304     test_OnFrameWindowActivate(unk);
3305
3306     test_ClientSite(oleobj, flags);
3307     test_InPlaceDeactivate(unk, FALSE);
3308
3309     hres = test_DoVerb(oleobj);
3310
3311     if(call_UIActivate == CallUIActivate_AfterShow) {
3312         hres = IOleObject_QueryInterface(oleobj, &IID_IOleDocumentView, (void **)&docview);
3313         ok(hres == S_OK, "IOleObject_QueryInterface failed with error 0x%08x\n", hres);
3314
3315         SET_EXPECT(OnFocus_TRUE);
3316         SET_EXPECT(SetActiveObject);
3317         SET_EXPECT(ShowUI);
3318         SET_EXPECT(InPlaceUIWindow_SetActiveObject);
3319         SET_EXPECT(InPlaceFrame_SetBorderSpace);
3320         expect_SetActiveObject_active = TRUE;
3321         expect_status_text = NULL;
3322
3323         hres = IOleDocumentView_UIActivate(docview, TRUE);
3324         ok(hres == S_OK, "IOleDocumentView_UIActivate failed with error 0x%08x\n", hres);
3325
3326         CHECK_CALLED(OnFocus_TRUE);
3327         CHECK_CALLED(SetActiveObject);
3328         CHECK_CALLED(ShowUI);
3329         CHECK_CALLED(InPlaceUIWindow_SetActiveObject);
3330         CHECK_CALLED(InPlaceFrame_SetBorderSpace);
3331
3332         IOleDocumentView_Release(docview);
3333     }
3334
3335     IOleObject_Release(oleobj);
3336
3337     test_OnFrameWindowActivate(unk);
3338
3339     return hres;
3340 }
3341
3342 static void test_Window(IUnknown *unk, BOOL expect_success)
3343 {
3344     IOleInPlaceActiveObject *activeobject = NULL;
3345     HWND tmp_hwnd;
3346     HRESULT hres;
3347
3348     hres = IOleDocumentView_QueryInterface(view, &IID_IOleInPlaceActiveObject, (void**)&activeobject);
3349     ok(hres == S_OK, "Could not get IOleInPlaceActiveObject interface: %08x\n", hres);
3350     if(FAILED(hres))
3351         return;
3352
3353     hres = IOleInPlaceActiveObject_GetWindow(activeobject, &tmp_hwnd);
3354
3355     if(expect_success) {
3356         ok(hres == S_OK, "GetWindow failed: %08x\n", hres);
3357         ok(tmp_hwnd == hwnd, "tmp_hwnd=%p, expected %p\n", tmp_hwnd, hwnd);
3358     }else {
3359         ok(hres == E_FAIL, "GetWindow returned %08x, expected E_FAIL\n", hres);
3360         ok(IsWindow(hwnd), "hwnd is destroyed\n");
3361     }
3362
3363     IOleInPlaceActiveObject_Release(activeobject);
3364 }
3365
3366 static void test_CloseView(void)
3367 {
3368     IOleInPlaceSite *inplacesite = (IOleInPlaceSite*)0xff00ff00;
3369     HRESULT hres;
3370
3371     if(!view)
3372         return;
3373
3374     hres = IOleDocumentView_Show(view, FALSE);
3375     ok(hres == S_OK, "Show failed: %08x\n", hres);
3376
3377     hres = IOleDocumentView_CloseView(view, 0);
3378     ok(hres == S_OK, "CloseView failed: %08x\n", hres);
3379
3380     hres = IOleDocumentView_SetInPlaceSite(view, NULL);
3381     ok(hres == S_OK, "SetInPlaceSite failed: %08x\n", hres);
3382
3383     hres = IOleDocumentView_GetInPlaceSite(view, &inplacesite);
3384     ok(hres == S_OK, "SetInPlaceSite failed: %08x\n", hres);
3385     ok(inplacesite == NULL, "inplacesite=%p, expected NULL\n", inplacesite);
3386 }
3387
3388 static void test_UIDeactivate(void)
3389 {
3390     HRESULT hres;
3391
3392     if(call_UIActivate == CallUIActivate_AfterShow) {
3393         SET_EXPECT(InPlaceUIWindow_SetActiveObject);
3394     }
3395     if(call_UIActivate != CallUIActivate_None) {
3396         SET_EXPECT(SetActiveObject);
3397         SET_EXPECT(HideUI);
3398         SET_EXPECT(OnUIDeactivate);
3399     }
3400
3401     expect_SetActiveObject_active = FALSE;
3402     hres = IOleDocumentView_UIActivate(view, FALSE);
3403     ok(hres == S_OK, "UIActivate failed: %08x\n", hres);
3404
3405     if(call_UIActivate != CallUIActivate_None) {
3406         CHECK_CALLED(SetActiveObject);
3407         CHECK_CALLED(HideUI);
3408         CHECK_CALLED(OnUIDeactivate);
3409     }
3410     if(call_UIActivate == CallUIActivate_AfterShow) {
3411         CHECK_CALLED(InPlaceUIWindow_SetActiveObject);
3412     }
3413 }
3414
3415 static void test_Hide(void)
3416 {
3417     HRESULT hres;
3418
3419     if(!view)
3420         return;
3421
3422     hres = IOleDocumentView_Show(view, FALSE);
3423     ok(hres == S_OK, "Show failed: %08x\n", hres);
3424 }
3425
3426 static HRESULT create_document(IUnknown **unk)
3427 {
3428     HRESULT hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
3429             &IID_IUnknown, (void**)unk);
3430     ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
3431     return hres;
3432 }
3433
3434 static void test_Navigate(IUnknown *unk)
3435 {
3436     IHlinkTarget *hlink;
3437     HRESULT hres;
3438
3439     hres = IUnknown_QueryInterface(unk, &IID_IHlinkTarget, (void**)&hlink);
3440     ok(hres == S_OK, "QueryInterface(IID_IHlinkTarget) failed: %08x\n", hres);
3441
3442     SET_EXPECT(ActivateMe);
3443     hres = IHlinkTarget_Navigate(hlink, 0, NULL);
3444     ok(hres == S_OK, "Navigate failed: %08x\n", hres);
3445     CHECK_CALLED(ActivateMe);
3446
3447     IHlinkTarget_Release(hlink);
3448 }
3449
3450 static void test_external(IUnknown *unk, BOOL initialized)
3451 {
3452     IDispatch *external;
3453     IHTMLDocument2 *doc;
3454     IHTMLWindow2 *htmlwin;
3455     HRESULT hres;
3456
3457     hres = IUnknown_QueryInterface(unk, &IID_IHTMLDocument2, (void**)&doc);
3458     ok(hres == S_OK, "QueryInterface(IID_IHTMLWindow2) failed: %08x\n", hres);
3459
3460     hres = IHTMLDocument2_get_parentWindow(doc, &htmlwin);
3461     IHTMLDocument2_Release(doc);
3462     ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres);
3463
3464     if(initialized)
3465         SET_EXPECT(GetExternal);
3466     external = (void*)0xdeadbeef;
3467     hres = IHTMLWindow2_get_external(htmlwin, &external);
3468     if(initialized) {
3469         ok(hres == S_FALSE, "get_external failed: %08x\n", hres);
3470         CHECK_CALLED(GetExternal);
3471         ok(external == (void*)1, "external != NULL\n");
3472     }else {
3473         ok(hres == S_OK, "get_external failed: %08x\n", hres);
3474         ok(external == NULL, "external != NULL\n");
3475     }
3476
3477     IHTMLWindow2_Release(htmlwin);
3478 }
3479
3480 static void test_StreamLoad(IUnknown *unk)
3481 {
3482     IPersistStreamInit *init;
3483     HRESULT hres;
3484
3485     hres = IUnknown_QueryInterface(unk, &IID_IPersistStreamInit, (void**)&init);
3486     ok(hres == S_OK, "QueryInterface(IID_IPersistStreamInit) failed: %08x\n", hres);
3487     if(FAILED(hres))
3488         return;
3489
3490     SET_EXPECT(Invoke_AMBIENT_SILENT);
3491     SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
3492     SET_EXPECT(Exec_ShellDocView_37);
3493     SET_EXPECT(OnChanged_READYSTATE);
3494     SET_EXPECT(Read);
3495     readystate_set_loading = TRUE;
3496
3497     hres = IPersistStreamInit_Load(init, &Stream);
3498     ok(hres == S_OK, "Load failed: %08x\n", hres);
3499
3500     CHECK_CALLED(Invoke_AMBIENT_SILENT);
3501     CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
3502     CHECK_CALLED(Exec_ShellDocView_37);
3503     CHECK_CALLED(OnChanged_READYSTATE);
3504     CHECK_CALLED(Read);
3505
3506     test_timer(EXPECT_SETTITLE);
3507     test_GetCurMoniker(unk, NULL, about_blank_url);
3508
3509     IPersistStreamInit_Release(init);
3510 }
3511
3512 static void test_QueryInterface(IUnknown *unk)
3513 {
3514     IUnknown *qi;
3515     HRESULT hres;
3516
3517     qi = (void*)0xdeadbeef;
3518     hres = IUnknown_QueryInterface(unk, &IID_IRunnableObject, (void**)&qi);
3519     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
3520     ok(qi == NULL, "runnable=%p, ezpected NULL\n", qi);
3521
3522     qi = (void*)0xdeadbeef;
3523     hres = IUnknown_QueryInterface(unk, &IID_IHTMLDOMNode, (void**)&qi);
3524     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
3525     ok(qi == NULL, "runnable=%p, ezpected NULL\n", qi);
3526
3527     qi = (void*)0xdeadbeef;
3528     hres = IUnknown_QueryInterface(unk, &IID_IHTMLDOMNode2, (void**)&qi);
3529     ok(hres == E_NOINTERFACE, "QueryInterface returned %08x, expected E_NOINTERFACE\n", hres);
3530     ok(qi == NULL, "runnable=%p, ezpected NULL\n", qi);
3531 }
3532
3533 static void init_test(enum load_state_t ls) {
3534     doc_unk = NULL;
3535     hwnd = last_hwnd = NULL;
3536     set_clientsite = FALSE;
3537     load_from_stream = FALSE;
3538     call_UIActivate = CallUIActivate_None;
3539     load_state = ls;
3540     editmode = FALSE;
3541     stream_read = 0;
3542     protocol_read = 0;
3543     ipsex = FALSE;
3544 }
3545
3546 static void test_HTMLDocument(enum load_state_t ls)
3547 {
3548     IUnknown *unk;
3549     HRESULT hres;
3550     ULONG ref;
3551
3552     trace("Testing HTMLDocument (%s)...\n", (ls == LD_DOLOAD ? " load" : "no load"));
3553
3554     init_test(ls);
3555
3556     hres = create_document(&unk);
3557     if(FAILED(hres))
3558         return;
3559     doc_unk = unk;
3560
3561     test_QueryInterface(unk);
3562     test_IsDirty(unk, S_FALSE);
3563     test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED);
3564     test_external(unk, FALSE);
3565     test_ConnectionPointContainer(unk);
3566     test_GetCurMoniker(unk, NULL, NULL);
3567     test_Persist(unk);
3568     if(load_state == LD_NO)
3569         test_OnAmbientPropertyChange2(unk);
3570
3571     hres = test_Activate(unk, CLIENTSITE_EXPECTPATH);
3572     if(FAILED(hres)) {
3573         IUnknown_Release(unk);
3574         return;
3575     }
3576
3577     if(load_state == LD_LOADING) {
3578         test_download(FALSE, TRUE);
3579         test_GetCurMoniker(unk, &Moniker, NULL);
3580     }
3581
3582     test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED);
3583     test_OleCommandTarget_fail(unk);
3584     test_OleCommandTarget(unk);
3585     test_OnAmbientPropertyChange(unk);
3586     test_Window(unk, TRUE);
3587     test_external(unk, TRUE);
3588
3589     test_UIDeactivate();
3590     test_OleCommandTarget(unk);
3591     test_Window(unk, TRUE);
3592     test_InPlaceDeactivate(unk, TRUE);
3593
3594     /* Calling test_OleCommandTarget here couses Segmentation Fault with native
3595      * MSHTML. It doesn't with Wine. */
3596
3597     test_Window(unk, FALSE);
3598     test_Hide();
3599     test_InPlaceDeactivate(unk, FALSE);
3600     test_CloseView();
3601     test_Close(unk, FALSE);
3602
3603     /* Activate HTMLDocument again */
3604     test_Activate(unk, CLIENTSITE_SETNULL);
3605     test_Window(unk, TRUE);
3606     test_OleCommandTarget(unk);
3607     test_UIDeactivate();
3608     test_InPlaceDeactivate(unk, TRUE);
3609     test_Close(unk, FALSE);
3610
3611     /* Activate HTMLDocument again, this time without UIActivate */
3612     call_UIActivate = CallUIActivate_None;
3613     test_Activate(unk, CLIENTSITE_SETNULL);
3614     test_Window(unk, TRUE);
3615     test_UIDeactivate();
3616     test_InPlaceDeactivate(unk, TRUE);
3617     test_CloseView();
3618     test_CloseView();
3619     test_Close(unk, TRUE);
3620     test_OnAmbientPropertyChange2(unk);
3621     test_GetCurMoniker(unk, load_state == LD_NO ? NULL : &Moniker, NULL);
3622
3623     if(ls != LD_DOLOAD) {
3624         /* Activate HTMLDocument again, calling UIActivate after showing the window */
3625         call_UIActivate = CallUIActivate_AfterShow;
3626         test_Activate(unk, 0);
3627         test_Window(unk, TRUE);
3628         test_OleCommandTarget(unk);
3629         test_UIDeactivate();
3630         test_InPlaceDeactivate(unk, TRUE);
3631         test_Close(unk, FALSE);
3632         call_UIActivate = CallUIActivate_None;
3633     }
3634
3635     if(view)
3636         IOleDocumentView_Release(view);
3637     view = NULL;
3638
3639     ok(IsWindow(hwnd), "hwnd is destroyed\n");
3640
3641     ref = IUnknown_Release(unk);
3642     ok(ref == 0, "ref=%d, expected 0\n", ref);
3643
3644     ok(!IsWindow(hwnd), "hwnd is not destroyed\n");
3645 }
3646
3647 static void test_HTMLDocument_hlink(void)
3648 {
3649     IUnknown *unk;
3650     HRESULT hres;
3651     ULONG ref;
3652
3653     trace("Testing HTMLDocument (hlink)...\n");
3654
3655     init_test(LD_DOLOAD);
3656     ipsex = TRUE;
3657
3658     hres = create_document(&unk);
3659     if(FAILED(hres))
3660         return;
3661     doc_unk = unk;
3662
3663     test_ConnectionPointContainer(unk);
3664     test_GetCurMoniker(unk, NULL, NULL);
3665     test_Persist(unk);
3666     test_Navigate(unk);
3667
3668     test_download(FALSE, TRUE);
3669
3670     test_IsDirty(unk, S_FALSE);
3671     test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED);
3672     test_exec_onunload(unk);
3673     test_Window(unk, TRUE);
3674     test_InPlaceDeactivate(unk, TRUE);
3675     test_Close(unk, FALSE);
3676     test_IsDirty(unk, S_FALSE);
3677     test_GetCurMoniker(unk, &Moniker, NULL);
3678
3679     if(view)
3680         IOleDocumentView_Release(view);
3681     view = NULL;
3682
3683     ref = IUnknown_Release(unk);
3684     ok(ref == 0, "ref=%d, expected 0\n", ref);
3685 }
3686
3687 static void test_HTMLDocument_StreamLoad(void)
3688 {
3689     IOleObject *oleobj;
3690     IUnknown *unk;
3691     HRESULT hres;
3692     ULONG ref;
3693
3694     trace("Testing HTMLDocument (IPersistStreamInit)...\n");
3695
3696     init_test(LD_DOLOAD);
3697     load_from_stream = TRUE;
3698
3699     hres = create_document(&unk);
3700     if(FAILED(hres))
3701         return;
3702     doc_unk = unk;
3703
3704     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
3705     ok(hres == S_OK, "Could not get IOleObject: %08x\n", hres);
3706
3707     test_readyState(unk);
3708     test_IsDirty(unk, S_FALSE);
3709     test_ConnectionPointContainer(unk);
3710     test_ClientSite(oleobj, CLIENTSITE_EXPECTPATH);
3711     test_DoVerb(oleobj);
3712     test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED);
3713
3714     IOleObject_Release(oleobj);
3715
3716     test_GetCurMoniker(unk, NULL, NULL);
3717     test_StreamLoad(unk);
3718     test_download(TRUE, FALSE);
3719
3720     test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED);
3721     test_UIDeactivate();
3722     test_InPlaceDeactivate(unk, TRUE);
3723     test_Close(unk, FALSE);
3724     test_IsDirty(unk, S_FALSE);
3725
3726     if(view) {
3727         IOleDocumentView_Release(view);
3728         view = NULL;
3729     }
3730
3731
3732     ref = IUnknown_Release(unk);
3733     ok(ref == 0, "ref=%d, expected 0\n", ref);
3734 }
3735
3736 static void test_edit_uiactivate(IOleObject *oleobj)
3737 {
3738     IOleDocumentView *docview;
3739     HRESULT hres;
3740
3741     hres = IOleObject_QueryInterface(oleobj, &IID_IOleDocumentView, (void **)&docview);
3742     ok(hres == S_OK, "IOleObject_QueryInterface failed with error 0x%08x\n", hres);
3743
3744     SET_EXPECT(OnFocus_TRUE);
3745     SET_EXPECT(SetActiveObject);
3746     SET_EXPECT(ShowUI);
3747     SET_EXPECT(InPlaceUIWindow_SetActiveObject);
3748     SET_EXPECT(InPlaceFrame_SetBorderSpace);
3749     expect_SetActiveObject_active = TRUE;
3750     expect_status_text = NULL;
3751
3752     hres = IOleDocumentView_UIActivate(docview, TRUE);
3753     ok(hres == S_OK, "IOleDocumentView_UIActivate failed with error 0x%08x\n", hres);
3754
3755     CHECK_CALLED(OnFocus_TRUE);
3756     CHECK_CALLED(SetActiveObject);
3757     CHECK_CALLED(ShowUI);
3758     CHECK_CALLED(InPlaceUIWindow_SetActiveObject);
3759     CHECK_CALLED(InPlaceFrame_SetBorderSpace);
3760
3761     IOleDocumentView_Release(docview);
3762 }
3763
3764 static void test_editing_mode(void)
3765 {
3766     IUnknown *unk;
3767     IOleObject *oleobj;
3768     HRESULT hres;
3769     ULONG ref;
3770
3771     trace("Testing HTMLDocument (edit)...\n");
3772
3773     init_test(LD_DOLOAD);
3774     call_UIActivate = CallUIActivate_AfterShow;
3775
3776     hres = create_document(&unk);
3777     if(FAILED(hres))
3778         return;
3779     doc_unk = unk;
3780
3781     hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
3782     ok(hres == S_OK, "Could not get IOleObject: %08x\n", hres);
3783
3784     test_readyState(unk);
3785     test_ConnectionPointContainer(unk);
3786     test_ClientSite(oleobj, CLIENTSITE_EXPECTPATH);
3787     test_DoVerb(oleobj);
3788     test_edit_uiactivate(oleobj);
3789
3790     test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED);
3791
3792     test_exec_editmode(unk);
3793     test_UIDeactivate();
3794     call_UIActivate = CallUIActivate_None;
3795     IOleObject_Release(oleobj);
3796
3797     test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED);
3798     test_download(TRUE, FALSE);
3799     test_timer(EXPECT_UPDATEUI);
3800     test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED|OLECMDF_ENABLED);
3801
3802     test_exec_fontname(unk, NULL, wszTimesNewRoman);
3803     test_exec_fontname(unk, wszArial, wszTimesNewRoman);
3804     test_timer(EXPECT_UPDATEUI);
3805     test_exec_fontname(unk, NULL, wszArial);
3806
3807     test_exec_noargs(unk, IDM_JUSTIFYRIGHT);
3808     test_timer(EXPECT_UPDATEUI);
3809     if(!nogecko)
3810         test_QueryStatus(unk, &CGID_MSHTML, IDM_JUSTIFYRIGHT,
3811                          OLECMDF_SUPPORTED|OLECMDF_ENABLED|OLECMDF_LATCHED);
3812
3813     test_exec_noargs(unk, IDM_JUSTIFYCENTER);
3814     test_timer(EXPECT_UPDATEUI);
3815     test_QueryStatus(unk, &CGID_MSHTML, IDM_JUSTIFYRIGHT,
3816                      OLECMDF_SUPPORTED|OLECMDF_ENABLED);
3817     if(!nogecko)
3818         test_QueryStatus(unk, &CGID_MSHTML, IDM_JUSTIFYCENTER,
3819                          OLECMDF_SUPPORTED|OLECMDF_ENABLED|OLECMDF_LATCHED);
3820
3821     test_exec_noargs(unk, IDM_HORIZONTALLINE);
3822     test_timer(EXPECT_UPDATEUI);
3823     test_QueryStatus(unk, &CGID_MSHTML, IDM_HORIZONTALLINE,
3824                      OLECMDF_SUPPORTED|OLECMDF_ENABLED);
3825
3826     test_UIDeactivate();
3827     test_InPlaceDeactivate(unk, TRUE);
3828     test_Close(unk, FALSE);
3829
3830     if(view) {
3831         IOleDocumentView_Release(view);
3832         view = NULL;
3833     }
3834
3835     ref = IUnknown_Release(unk);
3836     ok(ref == 0, "ref=%d, expected 0\n", ref);
3837 }
3838
3839 static void register_protocol(void)
3840 {
3841     IInternetSession *session;
3842     HRESULT hres;
3843
3844     static const WCHAR wsz_winetest[] = {'w','i','n','e','t','e','s','t',0};
3845
3846     hres = CoInternetGetSession(0, &session, 0);
3847     ok(hres == S_OK, "CoInternetGetSession failed: %08x\n", hres);
3848
3849     hres = IInternetSession_RegisterNameSpace(session, &ClassFactory, &IID_NULL,
3850             wsz_winetest, 0, NULL, 0);
3851     ok(hres == S_OK, "RegisterNameSpace failed: %08x\n", hres);
3852
3853     IInternetSession_Release(session);
3854 }
3855
3856 static void gecko_installer_workaround(BOOL disable)
3857 {
3858     HKEY hkey;
3859     DWORD res;
3860
3861     static BOOL has_url = FALSE;
3862     static char url[2048];
3863
3864     if(!disable && !has_url)
3865         return;
3866
3867     res = RegOpenKey(HKEY_CURRENT_USER, "Software\\Wine\\MSHTML", &hkey);
3868     if(res != ERROR_SUCCESS)
3869         return;
3870
3871     if(disable) {
3872         DWORD type, size = sizeof(url);
3873
3874         res = RegQueryValueEx(hkey, "GeckoUrl", NULL, &type, (PVOID)url, &size);
3875         if(res == ERROR_SUCCESS && type == REG_SZ)
3876             has_url = TRUE;
3877
3878         RegDeleteValue(hkey, "GeckoUrl");
3879     }else {
3880         RegSetValueEx(hkey, "GeckoUrl", 0, REG_SZ, (PVOID)url, lstrlenA(url)+1);
3881     }
3882
3883     RegCloseKey(hkey);
3884 }
3885
3886 START_TEST(htmldoc)
3887 {
3888     gecko_installer_workaround(TRUE);
3889
3890     CoInitialize(NULL);
3891     container_hwnd = create_container_window();
3892     register_protocol();
3893
3894     test_HTMLDocument(LD_NO);
3895     test_HTMLDocument(LD_DOLOAD);
3896     test_HTMLDocument_hlink();
3897     test_HTMLDocument_StreamLoad();
3898     test_editing_mode();
3899
3900     DestroyWindow(container_hwnd);
3901     CoUninitialize();
3902
3903     gecko_installer_workaround(FALSE);
3904 }