2 * Copyright 2005 Jacek Caban
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.
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.
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #include <wine/test.h>
36 DEFINE_SHLGUID(CGID_Undocumented, 0x000214D4L, 0, 0);
37 DEFINE_GUID(CGID_MSHTML, 0xDE4BA900,0x59CA,0x11CF,0x95,0x92, 0x44,0x45,0x53,0x54,0x00,0x00);
39 #define DEFINE_EXPECT(func) \
40 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
42 #define SET_EXPECT(func) \
43 expect_ ## func = TRUE
45 #define CHECK_EXPECT(func) \
46 ok(expect_ ##func, "unexpected call\n"); \
47 expect_ ## func = FALSE; \
48 called_ ## func = TRUE
50 #define CHECK_EXPECT2(func) \
51 ok(expect_ ##func, "unexpected call\n"); \
52 called_ ## func = TRUE
54 #define CHECK_CALLED(func) \
55 ok(called_ ## func, "expected " #func "\n"); \
56 expect_ ## func = called_ ## func = FALSE
58 static IOleDocumentView *view = NULL;
59 static HWND container_hwnd = NULL, hwnd = NULL, last_hwnd = NULL;
61 DEFINE_EXPECT(LockContainer);
62 DEFINE_EXPECT(SetActiveObject);
63 DEFINE_EXPECT(GetWindow);
64 DEFINE_EXPECT(CanInPlaceActivate);
65 DEFINE_EXPECT(OnInPlaceActivate);
66 DEFINE_EXPECT(OnUIActivate);
67 DEFINE_EXPECT(GetWindowContext);
68 DEFINE_EXPECT(OnUIDeactivate);
69 DEFINE_EXPECT(OnInPlaceDeactivate);
70 DEFINE_EXPECT(GetContainer);
71 DEFINE_EXPECT(ShowUI);
72 DEFINE_EXPECT(ActivateMe);
73 DEFINE_EXPECT(GetHostInfo);
74 DEFINE_EXPECT(HideUI);
75 DEFINE_EXPECT(GetOptionKeyPath);
76 DEFINE_EXPECT(GetOverrideKeyPath);
77 DEFINE_EXPECT(SetStatusText);
78 DEFINE_EXPECT(QueryStatus_SETPROGRESSTEXT);
79 DEFINE_EXPECT(QueryStatus_OPEN);
80 DEFINE_EXPECT(QueryStatus_NEW);
81 DEFINE_EXPECT(Exec_SETPROGRESSMAX);
82 DEFINE_EXPECT(Exec_SETPROGRESSPOS);
83 DEFINE_EXPECT(Exec_HTTPEQUIV_DONE);
84 DEFINE_EXPECT(Exec_SETDOWNLOADSTATE);
85 DEFINE_EXPECT(Exec_ShellDocView_37);
86 DEFINE_EXPECT(Exec_UPDATECOMMANDS);
87 DEFINE_EXPECT(Exec_SETTITLE);
88 DEFINE_EXPECT(Exec_HTTPEQUIV);
89 DEFINE_EXPECT(Exec_MSHTML_2315);
90 DEFINE_EXPECT(Invoke_AMBIENT_USERMODE);
91 DEFINE_EXPECT(Invoke_AMBIENT_DLCONTROL);
92 DEFINE_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
93 DEFINE_EXPECT(Invoke_AMBIENT_SILENT);
94 DEFINE_EXPECT(Invoke_AMBIENT_USERAGENT);
95 DEFINE_EXPECT(Invoke_AMBIENT_PALETTE);
96 DEFINE_EXPECT(GetDropTarget);
97 DEFINE_EXPECT(UpdateUI);
99 static BOOL expect_LockContainer_fLock;
100 static BOOL expect_SetActiveObject_active;
101 static BOOL set_clientsite = FALSE, container_locked = FALSE;
109 static LPCOLESTR expect_status_text = NULL;
111 static HRESULT QueryInterface(REFIID riid, void **ppv);
113 static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv)
115 return QueryInterface(riid, ppv);
118 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
123 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
128 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc,
129 LPOLESTR pszDiaplayName, ULONG *pchEaten, IMoniker **ppmkOut)
131 ok(0, "unexpected call\n");
135 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags,
136 IEnumUnknown **ppenum)
138 ok(0, "unexpected call\n");
142 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
144 CHECK_EXPECT(LockContainer);
145 ok(expect_LockContainer_fLock == fLock, "fLock=%x, expected %x\n", fLock, expect_LockContainer_fLock);
149 static const IOleContainerVtbl OleContainerVtbl = {
150 OleContainer_QueryInterface,
152 OleContainer_Release,
153 OleContainer_ParseDisplayName,
154 OleContainer_EnumObjects,
155 OleContainer_LockContainer
158 static IOleContainer OleContainer = { &OleContainerVtbl };
160 static HRESULT WINAPI InPlaceFrame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, void **ppv)
162 return QueryInterface(riid, ppv);
165 static ULONG WINAPI InPlaceFrame_AddRef(IOleInPlaceFrame *iface)
170 static ULONG WINAPI InPlaceFrame_Release(IOleInPlaceFrame *iface)
175 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
177 ok(0, "unexpected call\n");
181 static HRESULT WINAPI InPlaceFrame_ContextSensitiveHelp(IOleInPlaceFrame *iface, BOOL fEnterMode)
183 ok(0, "unexpected call\n");
187 static HRESULT WINAPI InPlaceFrame_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
189 ok(0, "unexpected call\n");
193 static HRESULT WINAPI InPlaceFrame_RequestBorderSpace(IOleInPlaceFrame *iface,
194 LPCBORDERWIDTHS pborderwidths)
196 ok(0, "unexpected call\n");
200 static HRESULT WINAPI InPlaceFrame_SetBorderSpace(IOleInPlaceFrame *iface,
201 LPCBORDERWIDTHS pborderwidths)
203 ok(0, "unexpected call\n");
207 static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
208 IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
210 static const WCHAR wszHTML_Document[] =
211 {'H','T','M','L',' ','D','o','c','u','m','e','n','t',0};
213 ok(expect_SetActiveObject, "unexpected call\n");
214 called_SetActiveObject = TRUE;
216 if(expect_SetActiveObject_active) {
217 ok(pActiveObject != NULL, "pActiveObject = NULL\n");
218 if(pActiveObject && PRIMARYLANGID(GetSystemDefaultLangID()) == LANG_ENGLISH)
219 ok(!lstrcmpW(wszHTML_Document, pszObjName), "pszObjName != \"HTML Document\"\n");
221 ok(pActiveObject == NULL, "pActiveObject=%p, expected NULL\n", pActiveObject);
222 ok(pszObjName == NULL, "pszObjName=%p, expected NULL\n", pszObjName);
228 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
229 LPOLEMENUGROUPWIDTHS lpMenuWidths)
231 ok(0, "unexpected call\n");
235 static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared,
236 HOLEMENU holemenu, HWND hwndActiveObject)
238 ok(0, "unexpected call\n");
242 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
244 ok(0, "unexpected call\n");
248 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLESTR pszStatusText)
250 CHECK_EXPECT2(SetStatusText);
251 if(!expect_status_text)
252 ok(pszStatusText == NULL, "pszStatusText=%p, expected NULL\n", pszStatusText);
256 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
258 ok(0, "unexpected call\n");
262 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg, WORD wID)
264 ok(0, "unexpected call\n");
268 static const IOleInPlaceFrameVtbl InPlaceFrameVtbl = {
269 InPlaceFrame_QueryInterface,
271 InPlaceFrame_Release,
272 InPlaceFrame_GetWindow,
273 InPlaceFrame_ContextSensitiveHelp,
274 InPlaceFrame_GetBorder,
275 InPlaceFrame_RequestBorderSpace,
276 InPlaceFrame_SetBorderSpace,
277 InPlaceFrame_SetActiveObject,
278 InPlaceFrame_InsertMenus,
279 InPlaceFrame_SetMenu,
280 InPlaceFrame_RemoveMenus,
281 InPlaceFrame_SetStatusText,
282 InPlaceFrame_EnableModeless,
283 InPlaceFrame_TranslateAccelerator
286 static IOleInPlaceFrame InPlaceFrame = { &InPlaceFrameVtbl };
288 static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSite *iface, REFIID riid, void **ppv)
290 return QueryInterface(riid, ppv);
293 static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSite *iface)
298 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSite *iface)
303 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSite *iface, HWND *phwnd)
305 CHECK_EXPECT(GetWindow);
306 ok(phwnd != NULL, "phwnd = NULL\n");
307 *phwnd = container_hwnd;
311 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSite *iface, BOOL fEnterMode)
313 ok(0, "unexpected call\n");
317 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSite *iface)
319 CHECK_EXPECT(CanInPlaceActivate);
323 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSite *iface)
325 CHECK_EXPECT(OnInPlaceActivate);
329 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSite *iface)
331 CHECK_EXPECT(OnUIActivate);
335 static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSite *iface,
336 IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
337 LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
339 static const RECT rect = {0,0,500,500};
341 CHECK_EXPECT(GetWindowContext);
343 ok(ppFrame != NULL, "ppFrame = NULL\n");
345 *ppFrame = &InPlaceFrame;
346 ok(ppDoc != NULL, "ppDoc = NULL\n");
349 ok(lprcPosRect != NULL, "lprcPosRect = NULL\n");
351 memcpy(lprcPosRect, &rect, sizeof(RECT));
352 ok(lprcClipRect != NULL, "lprcClipRect = NULL\n");
354 memcpy(lprcClipRect, &rect, sizeof(RECT));
355 ok(lpFrameInfo != NULL, "lpFrameInfo = NULL\n");
357 lpFrameInfo->cb = sizeof(*lpFrameInfo);
358 lpFrameInfo->fMDIApp = FALSE;
359 lpFrameInfo->hwndFrame = container_hwnd;
360 lpFrameInfo->haccel = NULL;
361 lpFrameInfo->cAccelEntries = 0;
367 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSite *iface, SIZE scrollExtant)
369 ok(0, "unexpected call\n");
373 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSite *iface, BOOL fUndoable)
375 CHECK_EXPECT(OnUIDeactivate);
376 ok(!fUndoable, "fUndoable = TRUE\n");
380 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSite *iface)
382 CHECK_EXPECT(OnInPlaceDeactivate);
386 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSite *iface)
388 ok(0, "unexpected call\n");
392 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSite *iface)
394 ok(0, "unexpected call\n");
398 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSite *iface, LPCRECT lprcPosRect)
400 ok(0, "unexpected call\n");
404 static const IOleInPlaceSiteVtbl InPlaceSiteVtbl = {
405 InPlaceSite_QueryInterface,
408 InPlaceSite_GetWindow,
409 InPlaceSite_ContextSensitiveHelp,
410 InPlaceSite_CanInPlaceActivate,
411 InPlaceSite_OnInPlaceActivate,
412 InPlaceSite_OnUIActivate,
413 InPlaceSite_GetWindowContext,
415 InPlaceSite_OnUIDeactivate,
416 InPlaceSite_OnInPlaceDeactivate,
417 InPlaceSite_DiscardUndoState,
418 InPlaceSite_DeactivateAndUndo,
419 InPlaceSite_OnPosRectChange
422 static IOleInPlaceSite InPlaceSite = { &InPlaceSiteVtbl };
424 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
426 return QueryInterface(riid, ppv);
429 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
434 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
439 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
441 ok(0, "unexpected call\n");
445 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAsign, DWORD dwWhichMoniker,
448 ok(0, "unexpected call\n");
452 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
454 CHECK_EXPECT(GetContainer);
455 ok(ppContainer != NULL, "ppContainer = NULL\n");
456 *ppContainer = &OleContainer;
460 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
462 ok(0, "unexpected call\n");
466 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
468 ok(0, "unexpected call\n");
472 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
474 ok(0, "unexpected call\n");
478 static const IOleClientSiteVtbl ClientSiteVtbl = {
479 ClientSite_QueryInterface,
482 ClientSite_SaveObject,
483 ClientSite_GetMoniker,
484 ClientSite_GetContainer,
485 ClientSite_ShowObject,
486 ClientSite_OnShowWindow,
487 ClientSite_RequestNewObjectLayout
490 static IOleClientSite ClientSite = { &ClientSiteVtbl };
492 static HRESULT WINAPI DocumentSite_QueryInterface(IOleDocumentSite *iface, REFIID riid, void **ppv)
494 return QueryInterface(riid, ppv);
497 static ULONG WINAPI DocumentSite_AddRef(IOleDocumentSite *iface)
502 static ULONG WINAPI DocumentSite_Release(IOleDocumentSite *iface)
507 static BOOL call_UIActivate = TRUE;
508 static HRESULT WINAPI DocumentSite_ActivateMe(IOleDocumentSite *iface, IOleDocumentView *pViewToActivate)
510 IOleDocument *document;
513 CHECK_EXPECT(ActivateMe);
514 ok(pViewToActivate != NULL, "pViewToActivate = NULL\n");
516 hres = IOleDocumentView_QueryInterface(pViewToActivate, &IID_IOleDocument, (void**)&document);
517 ok(hres == S_OK, "could not get IOleDocument: %08lx\n", hres);
519 if(SUCCEEDED(hres)) {
520 hres = IOleDocument_CreateView(document, &InPlaceSite, NULL, 0, &view);
521 ok(hres == S_OK, "CreateView failed: %08lx\n", hres);
523 if(SUCCEEDED(hres)) {
524 IOleInPlaceActiveObject *activeobj = NULL;
525 IOleInPlaceSite *inplacesite = NULL;
526 HWND tmp_hwnd = NULL;
527 static RECT rect = {0,0,400,500};
529 hres = IOleDocumentView_GetInPlaceSite(view, &inplacesite);
530 ok(hres == S_OK, "GetInPlaceSite failed: %08lx\n", hres);
531 ok(inplacesite == &InPlaceSite, "inplacesite=%p, expected %p\n",
532 inplacesite, &InPlaceSite);
534 hres = IOleDocumentView_SetInPlaceSite(view, &InPlaceSite);
535 ok(hres == S_OK, "SetInPlaceSite failed: %08lx\n", hres);
537 hres = IOleDocumentView_GetInPlaceSite(view, &inplacesite);
538 ok(hres == S_OK, "GetInPlaceSite failed: %08lx\n", hres);
539 ok(inplacesite == &InPlaceSite, "inplacesite=%p, expected %p\n",
540 inplacesite, &InPlaceSite);
542 hres = IOleDocumentView_QueryInterface(view, &IID_IOleInPlaceActiveObject, (void**)&activeobj);
543 ok(hres == S_OK, "Could not get IOleInPlaceActiveObject: %08lx\n", hres);
546 IOleInPlaceActiveObject_GetWindow(activeobj, &hwnd);
547 ok(hres == S_OK, "GetWindow failed: %08lx\n", hres);
548 ok(hwnd == NULL, "hwnd=%p, expeted NULL\n", hwnd);
551 if(call_UIActivate) {
552 SET_EXPECT(CanInPlaceActivate);
553 SET_EXPECT(GetWindowContext);
554 SET_EXPECT(GetWindow);
555 SET_EXPECT(OnInPlaceActivate);
556 SET_EXPECT(SetStatusText);
557 SET_EXPECT(Exec_SETPROGRESSMAX);
558 SET_EXPECT(Exec_SETPROGRESSPOS);
559 SET_EXPECT(OnUIActivate);
560 SET_EXPECT(SetActiveObject);
562 expect_SetActiveObject_active = TRUE;
563 expect_status_text = NULL;
565 hres = IOleDocumentView_UIActivate(view, TRUE);
568 trace("UIActivate failed: %08lx\n", hres);
571 ok(hres == S_OK, "UIActivate failed: %08lx\n", hres);
573 CHECK_CALLED(CanInPlaceActivate);
574 CHECK_CALLED(GetWindowContext);
575 CHECK_CALLED(GetWindow);
576 CHECK_CALLED(OnInPlaceActivate);
577 CHECK_CALLED(SetStatusText);
578 CHECK_CALLED(Exec_SETPROGRESSMAX);
579 CHECK_CALLED(Exec_SETPROGRESSPOS);
580 CHECK_CALLED(OnUIActivate);
581 CHECK_CALLED(SetActiveObject);
582 CHECK_CALLED(ShowUI);
585 hres = IOleInPlaceActiveObject_GetWindow(activeobj, &hwnd);
586 ok(hres == S_OK, "GetWindow failed: %08lx\n", hres);
587 ok(hwnd != NULL, "hwnd == NULL\n");
589 ok(hwnd == last_hwnd, "hwnd != last_hwnd\n");
592 hres = IOleDocumentView_UIActivate(view, TRUE);
593 ok(hres == S_OK, "UIActivate failed: %08lx\n", hres);
596 hres = IOleInPlaceActiveObject_GetWindow(activeobj, &tmp_hwnd);
597 ok(hres == S_OK, "GetWindow failed: %08lx\n", hres);
598 ok(tmp_hwnd == hwnd, "tmp_hwnd=%p, expected %p\n", tmp_hwnd, hwnd);
602 hres = IOleDocumentView_SetRect(view, &rect);
603 ok(hres == S_OK, "SetRect failed: %08lx\n", hres);
605 if(call_UIActivate) {
606 hres = IOleDocumentView_Show(view, TRUE);
607 ok(hres == S_OK, "Show failed: %08lx\n", hres);
609 SET_EXPECT(CanInPlaceActivate);
610 SET_EXPECT(GetWindowContext);
611 SET_EXPECT(GetWindow);
612 SET_EXPECT(OnInPlaceActivate);
613 SET_EXPECT(SetStatusText);
614 SET_EXPECT(Exec_SETPROGRESSMAX);
615 SET_EXPECT(Exec_SETPROGRESSPOS);
616 SET_EXPECT(OnUIActivate);
617 expect_status_text = (load_state == LD_LOADED ? (LPCOLESTR)0xdeadbeef : NULL);
619 hres = IOleDocumentView_Show(view, TRUE);
620 ok(hres == S_OK, "Show failed: %08lx\n", hres);
622 CHECK_CALLED(CanInPlaceActivate);
623 CHECK_CALLED(GetWindowContext);
624 CHECK_CALLED(GetWindow);
625 CHECK_CALLED(OnInPlaceActivate);
626 CHECK_CALLED(SetStatusText);
627 CHECK_CALLED(Exec_SETPROGRESSMAX);
628 CHECK_CALLED(Exec_SETPROGRESSPOS);
631 hres = IOleInPlaceActiveObject_GetWindow(activeobj, &hwnd);
632 ok(hres == S_OK, "GetWindow failed: %08lx\n", hres);
633 ok(hwnd != NULL, "hwnd == NULL\n");
635 ok(hwnd == last_hwnd, "hwnd != last_hwnd\n");
640 IOleInPlaceActiveObject_Release(activeobj);
643 IOleDocument_Release(document);
649 static const IOleDocumentSiteVtbl DocumentSiteVtbl = {
650 DocumentSite_QueryInterface,
652 DocumentSite_Release,
653 DocumentSite_ActivateMe
656 static IOleDocumentSite DocumentSite = { &DocumentSiteVtbl };
658 static HRESULT WINAPI DocHostUIHandler_QueryInterface(IDocHostUIHandler2 *iface, REFIID riid, void **ppv)
660 return QueryInterface(riid, ppv);
663 static ULONG WINAPI DocHostUIHandler_AddRef(IDocHostUIHandler2 *iface)
668 static ULONG WINAPI DocHostUIHandler_Release(IDocHostUIHandler2 *iface)
673 static HRESULT WINAPI DocHostUIHandler_ShowContextMenu(IDocHostUIHandler2 *iface, DWORD dwID, POINT *ppt,
674 IUnknown *pcmdtReserved, IDispatch *pdicpReserved)
676 ok(0, "unexpected call\n");
680 static HRESULT WINAPI DocHostUIHandler_GetHostInfo(IDocHostUIHandler2 *iface, DOCHOSTUIINFO *pInfo)
682 CHECK_EXPECT(GetHostInfo);
683 ok(pInfo != NULL, "pInfo=NULL\n");
685 ok(pInfo->cbSize == sizeof(DOCHOSTUIINFO), "pInfo->cbSize=%lu, expected %u\n",
686 pInfo->cbSize, sizeof(DOCHOSTUIINFO));
687 ok(!pInfo->dwFlags, "pInfo->dwFlags=%08lx, expected 0\n", pInfo->dwFlags);
688 pInfo->dwFlags = DOCHOSTUIFLAG_DISABLE_HELP_MENU | DOCHOSTUIFLAG_DISABLE_SCRIPT_INACTIVE
689 | DOCHOSTUIFLAG_ACTIVATE_CLIENTHIT_ONLY | DOCHOSTUIFLAG_ENABLE_INPLACE_NAVIGATION
690 | DOCHOSTUIFLAG_IME_ENABLE_RECONVERSION;
691 ok(!pInfo->dwDoubleClick, "pInfo->dwDoubleClick=%08lx, expected 0\n", pInfo->dwDoubleClick);
692 ok(!pInfo->pchHostCss, "pInfo->pchHostCss=%p, expected NULL\n", pInfo->pchHostCss);
693 ok(!pInfo->pchHostNS, "pInfo->pchhostNS=%p, expected NULL\n", pInfo->pchHostNS);
698 static HRESULT WINAPI DocHostUIHandler_ShowUI(IDocHostUIHandler2 *iface, DWORD dwID,
699 IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget,
700 IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
702 CHECK_EXPECT(ShowUI);
704 ok(dwID == 0, "dwID=%ld, expected 0\n", dwID);
705 ok(pActiveObject != NULL, "pActiveObject = NULL\n");
706 ok(pCommandTarget != NULL, "pCommandTarget = NULL\n");
707 ok(pFrame == &InPlaceFrame, "pFrame=%p, expected %p\n", pFrame, &InPlaceFrame);
708 ok(pDoc == NULL, "pDoc=%p, expected NULL\n", pDoc);
713 static HRESULT WINAPI DocHostUIHandler_HideUI(IDocHostUIHandler2 *iface)
715 CHECK_EXPECT(HideUI);
719 static HRESULT WINAPI DocHostUIHandler_UpdateUI(IDocHostUIHandler2 *iface)
721 CHECK_EXPECT(UpdateUI);
725 static HRESULT WINAPI DocHostUIHandler_EnableModeless(IDocHostUIHandler2 *iface, BOOL fEnable)
727 ok(0, "unexpected call\n");
731 static HRESULT WINAPI DocHostUIHandler_OnDocWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
733 ok(0, "unexpected call\n");
737 static HRESULT WINAPI DocHostUIHandler_OnFrameWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate)
739 ok(0, "unexpected call\n");
743 static HRESULT WINAPI DocHostUIHandler_ResizeBorder(IDocHostUIHandler2 *iface, LPCRECT prcBorder,
744 IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
746 ok(0, "unexpected call\n");
750 static HRESULT WINAPI DocHostUIHandler_TranslateAccelerator(IDocHostUIHandler2 *iface, LPMSG lpMsg,
751 const GUID *pguidCmdGroup, DWORD nCmdID)
753 ok(0, "unexpected call\n");
757 static HRESULT WINAPI DocHostUIHandler_GetOptionKeyPath(IDocHostUIHandler2 *iface,
758 LPOLESTR *pchKey, DWORD dw)
760 CHECK_EXPECT(GetOptionKeyPath);
761 ok(pchKey != NULL, "pchKey = NULL\n");
762 ok(!dw, "dw=%ld, expected 0\n", dw);
764 ok(!*pchKey, "*pchKey=%p, expected NULL\n", *pchKey);
768 static HRESULT WINAPI DocHostUIHandler_GetDropTarget(IDocHostUIHandler2 *iface,
769 IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
771 CHECK_EXPECT(GetDropTarget);
776 static HRESULT WINAPI DocHostUIHandler_GetExternal(IDocHostUIHandler2 *iface, IDispatch **ppDispatch)
778 ok(0, "unexpected call\n");
782 static HRESULT WINAPI DocHostUIHandler_TranslateUrl(IDocHostUIHandler2 *iface, DWORD dwTranslate,
783 OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
785 ok(0, "unexpected call\n");
789 static HRESULT WINAPI DocHostUIHandler_FilterDataObject(IDocHostUIHandler2 *iface, IDataObject *pDO,
790 IDataObject **ppPORet)
792 ok(0, "unexpected call\n");
796 static HRESULT WINAPI DocHostUIHandler_GetOverrideKeyPath(IDocHostUIHandler2 *iface,
797 LPOLESTR *pchKey, DWORD dw)
799 CHECK_EXPECT(GetOverrideKeyPath);
800 ok(pchKey != NULL, "pchKey = NULL\n");
802 ok(!*pchKey, "*pchKey=%p, expected NULL\n", *pchKey);
803 ok(!dw, "dw=%ld, xepected 0\n", dw);
807 static const IDocHostUIHandler2Vtbl DocHostUIHandlerVtbl = {
808 DocHostUIHandler_QueryInterface,
809 DocHostUIHandler_AddRef,
810 DocHostUIHandler_Release,
811 DocHostUIHandler_ShowContextMenu,
812 DocHostUIHandler_GetHostInfo,
813 DocHostUIHandler_ShowUI,
814 DocHostUIHandler_HideUI,
815 DocHostUIHandler_UpdateUI,
816 DocHostUIHandler_EnableModeless,
817 DocHostUIHandler_OnDocWindowActivate,
818 DocHostUIHandler_OnFrameWindowActivate,
819 DocHostUIHandler_ResizeBorder,
820 DocHostUIHandler_TranslateAccelerator,
821 DocHostUIHandler_GetOptionKeyPath,
822 DocHostUIHandler_GetDropTarget,
823 DocHostUIHandler_GetExternal,
824 DocHostUIHandler_TranslateUrl,
825 DocHostUIHandler_FilterDataObject,
826 DocHostUIHandler_GetOverrideKeyPath
829 static IDocHostUIHandler2 DocHostUIHandler = { &DocHostUIHandlerVtbl };
831 static HRESULT WINAPI OleCommandTarget_QueryInterface(IOleCommandTarget *iface,
832 REFIID riid, void **ppv)
834 return QueryInterface(riid, ppv);
837 static ULONG WINAPI OleCommandTarget_AddRef(IOleCommandTarget *iface)
842 static ULONG WINAPI OleCommandTarget_Release(IOleCommandTarget *iface)
847 static HRESULT WINAPI OleCommandTarget_QueryStatus(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
848 ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
850 ok(!pguidCmdGroup, "pguidCmdGroup != MULL\n");
851 ok(cCmds == 1, "cCmds=%ld, expected 1\n", cCmds);
852 ok(!pCmdText, "pCmdText != NULL\n");
854 switch(prgCmds[0].cmdID) {
855 case OLECMDID_SETPROGRESSTEXT:
856 CHECK_EXPECT(QueryStatus_SETPROGRESSTEXT);
857 prgCmds[0].cmdf = OLECMDF_ENABLED;
860 CHECK_EXPECT(QueryStatus_OPEN);
864 CHECK_EXPECT(QueryStatus_NEW);
868 ok(0, "unexpected command %ld\n", prgCmds[0].cmdID);
874 static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
875 DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
879 case OLECMDID_SETPROGRESSMAX:
880 CHECK_EXPECT2(Exec_SETPROGRESSMAX);
881 ok(pvaIn != NULL, "pvaIn == NULL\n");
883 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
884 if(load_state == LD_NO)
885 ok(V_I4(pvaIn) == 0, "V_I4(pvaIn)=%ld, expected 0\n", V_I4(pvaIn));
887 ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
889 case OLECMDID_SETPROGRESSPOS:
890 CHECK_EXPECT2(Exec_SETPROGRESSPOS);
891 ok(pvaIn != NULL, "pvaIn == NULL\n");
893 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
894 if(load_state == LD_NO)
895 ok(V_I4(pvaIn) == 0, "V_I4(pvaIn)=%ld, expected 0\n", V_I4(pvaIn));
897 ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
899 case OLECMDID_HTTPEQUIV_DONE:
900 CHECK_EXPECT(Exec_HTTPEQUIV_DONE);
903 case OLECMDID_SETDOWNLOADSTATE:
904 CHECK_EXPECT2(Exec_SETDOWNLOADSTATE);
907 case OLECMDID_UPDATECOMMANDS:
908 CHECK_EXPECT(Exec_UPDATECOMMANDS);
911 case OLECMDID_SETTITLE:
912 CHECK_EXPECT2(Exec_SETTITLE);
915 case OLECMDID_HTTPEQUIV:
916 CHECK_EXPECT2(Exec_HTTPEQUIV);
920 ok(0, "unexpected command %ld\n", nCmdID);
925 if(IsEqualGUID(&CGID_ShellDocView, pguidCmdGroup)) {
928 CHECK_EXPECT(Exec_ShellDocView_37);
929 ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
930 ok(pvaIn != NULL, "pvaIn == NULL\n");
932 ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d, expected VT_I4\n", V_VT(pvaIn));
933 ok(V_I4(pvaIn) == 0, "V_I4(pvaIn)=%ld, expected 0\n", V_I4(pvaIn));
937 ok(0, "unexpected command %ld\n", nCmdID);
942 if(IsEqualGUID(&CGID_MSHTML, pguidCmdGroup)) {
945 CHECK_EXPECT(Exec_MSHTML_2315);
949 ok(0, "unexpected command %ld\n", nCmdID);
953 if(IsEqualGUID(&CGID_Undocumented, pguidCmdGroup))
954 return E_FAIL; /* TODO */
956 ok(0, "unexpected call\n");
960 static IOleCommandTargetVtbl OleCommandTargetVtbl = {
961 OleCommandTarget_QueryInterface,
962 OleCommandTarget_AddRef,
963 OleCommandTarget_Release,
964 OleCommandTarget_QueryStatus,
965 OleCommandTarget_Exec
968 static IOleCommandTarget OleCommandTarget = { &OleCommandTargetVtbl };
970 static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
972 return QueryInterface(riid, ppv);
975 static ULONG WINAPI Dispatch_AddRef(IDispatch *iface)
980 static ULONG WINAPI Dispatch_Release(IDispatch *iface)
985 static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
987 ok(0, "unexpected call\n");
991 static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid,
994 ok(0, "unexpected call\n");
998 static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
999 UINT cNames, LCID lcid, DISPID *rgDispId)
1001 ok(0, "unexpected call\n");
1005 static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
1006 LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
1007 EXCEPINFO *pExcepInfo, UINT *puArgErr)
1009 ok(IsEqualGUID(&IID_NULL, riid), "riid != IID_NULL\n");
1010 ok(pDispParams != NULL, "pDispParams == NULL\n");
1011 ok(pExcepInfo == NULL, "pExcepInfo=%p, expected NULL\n", pExcepInfo);
1012 ok(puArgErr != NULL, "puArgErr == NULL\n");
1013 ok(V_VT(pVarResult) == 0, "V_VT(pVarResult)=%d, expected 0\n", V_VT(pVarResult));
1014 ok(wFlags == DISPATCH_PROPERTYGET, "wFlags=%08x, expected DISPATCH_PROPERTYGET\n", wFlags);
1016 switch(dispIdMember) {
1017 case DISPID_AMBIENT_USERMODE:
1018 CHECK_EXPECT2(Invoke_AMBIENT_USERMODE);
1019 V_VT(pVarResult) = VT_BOOL;
1020 V_BOOL(pVarResult) = VARIANT_TRUE;
1022 case DISPID_AMBIENT_DLCONTROL:
1023 CHECK_EXPECT2(Invoke_AMBIENT_DLCONTROL);
1025 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
1026 CHECK_EXPECT2(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1028 case DISPID_AMBIENT_SILENT:
1029 CHECK_EXPECT2(Invoke_AMBIENT_SILENT);
1030 V_VT(pVarResult) = VT_BOOL;
1031 V_BOOL(pVarResult) = VARIANT_FALSE;
1033 case DISPID_AMBIENT_USERAGENT:
1034 CHECK_EXPECT(Invoke_AMBIENT_USERAGENT);
1036 case DISPID_AMBIENT_PALETTE:
1037 CHECK_EXPECT(Invoke_AMBIENT_PALETTE);
1041 ok(0, "unexpected dispid %ld\n", dispIdMember);
1045 static IDispatchVtbl DispatchVtbl = {
1046 Dispatch_QueryInterface,
1049 Dispatch_GetTypeInfoCount,
1050 Dispatch_GetTypeInfo,
1051 Dispatch_GetIDsOfNames,
1055 static IDispatch Dispatch = { &DispatchVtbl };
1057 static HRESULT QueryInterface(REFIID riid, void **ppv)
1061 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IOleClientSite, riid))
1063 else if(IsEqualGUID(&IID_IOleDocumentSite, riid))
1064 *ppv = &DocumentSite;
1065 else if(IsEqualGUID(&IID_IDocHostUIHandler, riid) || IsEqualGUID(&IID_IDocHostUIHandler2, riid))
1066 *ppv = &DocHostUIHandler;
1067 else if(IsEqualGUID(&IID_IOleContainer, riid))
1068 *ppv = &OleContainer;
1069 else if(IsEqualGUID(&IID_IOleWindow, riid) || IsEqualGUID(&IID_IOleInPlaceSite, riid))
1070 *ppv = &InPlaceSite;
1071 else if(IsEqualGUID(&IID_IOleInPlaceUIWindow, riid) || IsEqualGUID(&IID_IOleInPlaceFrame, riid))
1072 *ppv = &InPlaceFrame;
1073 else if(IsEqualGUID(&IID_IOleCommandTarget , riid))
1074 *ppv = &OleCommandTarget;
1075 else if(IsEqualGUID(&IID_IDispatch, riid))
1080 * {D48A6EC6-6A4A-11CF-94A7-444553540000}
1081 * {7BB0B520-B1A7-11D2-BB23-00C04F79ABCD}
1082 * {000670BA-0000-0000-C000-000000000046}
1087 return E_NOINTERFACE;
1090 static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
1092 return DefWindowProc(hwnd, msg, wParam, lParam);
1095 static void test_Load(IPersistMoniker *persist)
1101 static WCHAR wszClientSiteParam[] = {'{','d','4','d','b','6','8','5','0','-',
1102 '5','3','8','5','-','1','1','d','0','-','8','9','e','9','-','0','0','a',
1103 '0','c','9','0','a','9','0','a','c','}',0};
1104 static const WCHAR wszWineHQ[] =
1105 {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g','/',0};
1107 hres = CreateURLMoniker(NULL, wszWineHQ, &mon);
1108 ok(hres == S_OK, "CreateURLMoniker failed: %08lx\n", hres);
1112 CreateBindCtx(0, &bind);
1113 IBindCtx_RegisterObjectParam(bind, wszClientSiteParam, (IUnknown*)&ClientSite);
1115 SET_EXPECT(GetHostInfo);
1116 SET_EXPECT(GetOptionKeyPath);
1117 SET_EXPECT(GetOverrideKeyPath);
1118 SET_EXPECT(GetWindow);
1119 SET_EXPECT(QueryStatus_SETPROGRESSTEXT);
1120 SET_EXPECT(Exec_SETPROGRESSMAX);
1121 SET_EXPECT(Exec_SETPROGRESSPOS);
1122 SET_EXPECT(Invoke_AMBIENT_USERMODE);
1123 SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
1124 SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1125 SET_EXPECT(Invoke_AMBIENT_SILENT);
1126 SET_EXPECT(Invoke_AMBIENT_USERAGENT);
1127 SET_EXPECT(Invoke_AMBIENT_PALETTE);
1128 SET_EXPECT(GetContainer);
1129 SET_EXPECT(LockContainer);
1130 SET_EXPECT(Exec_ShellDocView_37);
1131 expect_LockContainer_fLock = TRUE;
1133 hres = IPersistMoniker_Load(persist, FALSE, mon, bind, 0x12);
1135 ok(hres == S_OK, "Load failed: %08lx\n", hres);
1138 CHECK_CALLED(GetHostInfo);
1139 CHECK_CALLED(GetOptionKeyPath);
1140 CHECK_CALLED(GetOverrideKeyPath);
1141 CHECK_CALLED(GetWindow);
1142 CHECK_CALLED(QueryStatus_SETPROGRESSTEXT);
1143 CHECK_CALLED(Exec_SETPROGRESSMAX);
1144 CHECK_CALLED(Exec_SETPROGRESSPOS);
1145 CHECK_CALLED(Invoke_AMBIENT_USERMODE);
1146 CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
1147 CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1148 CHECK_CALLED(Invoke_AMBIENT_SILENT);
1149 CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
1150 CHECK_CALLED(Invoke_AMBIENT_PALETTE);
1151 CHECK_CALLED(GetContainer);
1152 CHECK_CALLED(LockContainer);
1153 CHECK_CALLED(Exec_ShellDocView_37);
1155 set_clientsite = container_locked = TRUE;
1157 IBindCtx_Release(bind);
1158 IMoniker_Release(mon);
1161 #ifdef DOWNLOAD_TEST
1163 static void test_download(void)
1167 load_state = LD_LOADING;
1169 SET_EXPECT(Exec_SETDOWNLOADSTATE);
1170 SET_EXPECT(GetDropTarget);
1171 SET_EXPECT(SetStatusText);
1172 SET_EXPECT(UpdateUI);
1173 SET_EXPECT(Exec_UPDATECOMMANDS);
1174 SET_EXPECT(Exec_SETTITLE);
1175 SET_EXPECT(Exec_HTTPEQUIV);
1176 SET_EXPECT(Exec_SETPROGRESSMAX);
1177 SET_EXPECT(Exec_SETPROGRESSPOS);
1178 SET_EXPECT(Exec_MSHTML_2315);
1179 SET_EXPECT(Exec_HTTPEQUIV_DONE);
1180 expect_status_text = (LPCOLESTR)0xdeadbeef; /* TODO */
1182 while(!called_Exec_HTTPEQUIV_DONE && GetMessage(&msg, NULL, 0, 0)) {
1183 TranslateMessage(&msg);
1184 DispatchMessage(&msg);
1187 CHECK_CALLED(Exec_SETDOWNLOADSTATE);
1188 CHECK_CALLED(GetDropTarget);
1189 CHECK_CALLED(SetStatusText);
1190 CHECK_CALLED(UpdateUI);
1191 CHECK_CALLED(Exec_UPDATECOMMANDS);
1192 CHECK_CALLED(Exec_SETTITLE);
1193 CHECK_CALLED(Exec_HTTPEQUIV);
1194 CHECK_CALLED(Exec_SETPROGRESSMAX);
1195 CHECK_CALLED(Exec_SETPROGRESSPOS);
1196 CHECK_CALLED(Exec_MSHTML_2315);
1197 CHECK_CALLED(Exec_HTTPEQUIV_DONE);
1199 load_state = LD_LOADED;
1204 static void test_Persist(IUnknown *unk)
1206 IPersistMoniker *persist_mon;
1207 IPersistFile *persist_file;
1211 hres = IUnknown_QueryInterface(unk, &IID_IPersistFile, (void**)&persist_file);
1212 ok(hres == S_OK, "QueryInterface(IID_IPersist) failed: %08lx\n", hres);
1213 if(SUCCEEDED(hres)) {
1214 hres = IPersist_GetClassID(persist_file, NULL);
1215 ok(hres == E_INVALIDARG, "GetClassID returned: %08lx, expected E_INVALIDARG\n", hres);
1217 hres = IPersist_GetClassID(persist_file, &guid);
1218 ok(hres == S_OK, "GetClassID failed: %08lx\n", hres);
1219 ok(IsEqualGUID(&CLSID_HTMLDocument, &guid), "guid != CLSID_HTMLDocument\n");
1221 IPersist_Release(persist_file);
1224 hres = IUnknown_QueryInterface(unk, &IID_IPersistMoniker, (void**)&persist_mon);
1225 ok(hres == S_OK, "QueryInterface(IID_IPersistMoniker) failed: %08lx\n", hres);
1226 if(SUCCEEDED(hres)) {
1227 hres = IPersistMoniker_GetClassID(persist_mon, NULL);
1228 ok(hres == E_INVALIDARG, "GetClassID returned: %08lx, expected E_INVALIDARG\n", hres);
1230 hres = IPersistMoniker_GetClassID(persist_mon, &guid);
1231 ok(hres == S_OK, "GetClassID failed: %08lx\n", hres);
1232 ok(IsEqualGUID(&CLSID_HTMLDocument, &guid), "guid != CLSID_HTMLDocument\n");
1234 if(load_state == LD_DOLOAD)
1235 test_Load(persist_mon);
1237 IPersistMoniker_Release(persist_mon);
1241 static const OLECMDF expect_cmds[OLECMDID_GETPRINTTEMPLATE+1] = {
1243 OLECMDF_SUPPORTED, /* OLECMDID_OPEN */
1244 OLECMDF_SUPPORTED, /* OLECMDID_NEW */
1245 OLECMDF_SUPPORTED, /* OLECMDID_SAVE */
1246 OLECMDF_SUPPORTED|OLECMDF_ENABLED, /* OLECMDID_SAVEAS */
1247 OLECMDF_SUPPORTED, /* OLECMDID_SAVECOPYAS */
1248 OLECMDF_SUPPORTED|OLECMDF_ENABLED, /* OLECMDID_PRINT */
1249 OLECMDF_SUPPORTED|OLECMDF_ENABLED, /* OLECMDID_PRINTPREVIEW */
1250 OLECMDF_SUPPORTED|OLECMDF_ENABLED, /* OLECMDID_PAGESETUP */
1251 OLECMDF_SUPPORTED, /* OLECMDID_SPELL */
1252 OLECMDF_SUPPORTED|OLECMDF_ENABLED, /* OLECMDID_PROPERTIES */
1253 OLECMDF_SUPPORTED, /* OLECMDID_CUT */
1254 OLECMDF_SUPPORTED, /* OLECMDID_COPY */
1255 OLECMDF_SUPPORTED, /* OLECMDID_PASTE */
1256 OLECMDF_SUPPORTED, /* OLECMDID_PASTESPECIAL */
1257 OLECMDF_SUPPORTED, /* OLECMDID_UNDO */
1258 OLECMDF_SUPPORTED, /* OLECMDID_REDO */
1259 OLECMDF_SUPPORTED|OLECMDF_ENABLED, /* OLECMDID_SELECTALL */
1260 OLECMDF_SUPPORTED, /* OLECMDID_CLEARSELECTION */
1261 OLECMDF_SUPPORTED, /* OLECMDID_ZOOM */
1262 OLECMDF_SUPPORTED, /* OLECMDID_GETZOOMRANGE */
1264 OLECMDF_SUPPORTED|OLECMDF_ENABLED, /* OLECMDID_REFRESH */
1265 OLECMDF_SUPPORTED|OLECMDF_ENABLED, /* OLECMDID_STOP */
1267 OLECMDF_SUPPORTED, /* OLECMDID_STOPDOWNLOAD */
1269 OLECMDF_SUPPORTED, /* OLECMDID_DELETE */
1271 OLECMDF_SUPPORTED, /* OLECMDID_ENABLE_INTERACTION */
1272 OLECMDF_SUPPORTED, /* OLECMDID_ONUNLOAD */
1274 OLECMDF_SUPPORTED, /* OLECMDID_SHOWPAGESETUP */
1275 OLECMDF_SUPPORTED, /* OLECMDID_SHOWPRINT */
1277 OLECMDF_SUPPORTED, /* OLECMDID_CLOSE */
1279 OLECMDF_SUPPORTED, /* OLECMDID_SETPRINTTEMPLATE */
1280 OLECMDF_SUPPORTED /* OLECMDID_GETPRINTTEMPLATE */
1283 static void test_OleCommandTarget(IUnknown *unk)
1285 IOleCommandTarget *cmdtrg;
1286 OLECMD cmds[OLECMDID_GETPRINTTEMPLATE];
1290 hres = IUnknown_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
1291 ok(hres == S_OK, "QueryInterface(IIDIOleM=CommandTarget failed: %08lx\n", hres);
1295 for(i=0; i<OLECMDID_GETPRINTTEMPLATE; i++) {
1296 cmds[i].cmdID = i+1;
1297 cmds[i].cmdf = 0xf0f0;
1300 SET_EXPECT(QueryStatus_OPEN);
1301 SET_EXPECT(QueryStatus_NEW);
1302 hres = IOleCommandTarget_QueryStatus(cmdtrg, NULL, sizeof(cmds)/sizeof(cmds[0]), cmds, NULL);
1303 ok(hres == S_OK, "QueryStatus failed: %08lx\n", hres);
1304 CHECK_CALLED(QueryStatus_OPEN);
1305 CHECK_CALLED(QueryStatus_NEW);
1307 for(i=0; i<OLECMDID_GETPRINTTEMPLATE; i++) {
1308 ok(cmds[i].cmdID == i+1, "cmds[%d].cmdID canged to %lx\n", i, cmds[i].cmdID);
1309 ok(cmds[i].cmdf == expect_cmds[i+1], "cmds[%d].cmdf=%lx, expected %x\n",
1310 i+1, cmds[i].cmdf, expect_cmds[i+1]);
1313 IOleCommandTarget_Release(cmdtrg);
1316 static void test_OleCommandTarget_fail(IUnknown *unk)
1318 IOleCommandTarget *cmdtrg;
1323 {OLECMDID_OPEN, 0xf0f0},
1324 {OLECMDID_GETPRINTTEMPLATE+1, 0xf0f0}
1327 hres = IUnknown_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg);
1328 ok(hres == S_OK, "QueryInterface(IIDIOleM=CommandTarget failed: %08lx\n", hres);
1332 hres = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 0, NULL, NULL);
1333 ok(hres == S_OK, "QueryStatus failed: %08lx\n", hres);
1335 SET_EXPECT(QueryStatus_OPEN);
1336 hres = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 2, cmd, NULL);
1337 CHECK_CALLED(QueryStatus_OPEN);
1339 ok(hres == OLECMDERR_E_NOTSUPPORTED,
1340 "QueryStatus failed: %08lx, expected OLECMDERR_E_NOTSUPPORTED\n", hres);
1341 ok(cmd[1].cmdID == OLECMDID_GETPRINTTEMPLATE+1,
1342 "cmd[0].cmdID=%ld, expected OLECMDID_GETPRINTTEMPLATE+1\n", cmd[0].cmdID);
1343 ok(cmd[1].cmdf == 0, "cmd[0].cmdf=%lx, expected 0\n", cmd[0].cmdf);
1344 ok(cmd[0].cmdf == OLECMDF_SUPPORTED,
1345 "cmd[1].cmdf=%lx, expected OLECMDF_SUPPORTED\n", cmd[1].cmdf);
1347 hres = IOleCommandTarget_QueryStatus(cmdtrg, &IID_IHTMLDocument2, 2, cmd, NULL);
1348 ok(hres == OLECMDERR_E_UNKNOWNGROUP,
1349 "QueryStatus failed: %08lx, expected OLECMDERR_E_UNKNOWNGROUP\n", hres);
1351 for(i=0; i<OLECMDID_GETPRINTTEMPLATE; i++) {
1352 if(!expect_cmds[i]) {
1353 hres = IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_UPDATECOMMANDS,
1354 OLECMDEXECOPT_DODEFAULT, NULL, NULL);
1355 ok(hres == OLECMDERR_E_NOTSUPPORTED,
1356 "Exec failed: %08lx, expected OLECMDERR_E_NOTSUPPORTED\n", hres);
1360 hres = IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_GETPRINTTEMPLATE+1,
1361 OLECMDEXECOPT_DODEFAULT, NULL, NULL);
1362 ok(hres == OLECMDERR_E_NOTSUPPORTED,
1363 "Exec failed: %08lx, expected OLECMDERR_E_NOTSUPPORTED\n", hres);
1365 IOleCommandTarget_Release(cmdtrg);
1368 static HWND create_container_window(void)
1370 static const WCHAR wszHTMLDocumentTest[] =
1371 {'H','T','M','L','D','o','c','u','m','e','n','t','T','e','s','t',0};
1372 static WNDCLASSEXW wndclass = {
1373 sizeof(WNDCLASSEXW),
1376 0, 0, NULL, NULL, NULL, NULL, NULL,
1377 wszHTMLDocumentTest,
1381 RegisterClassExW(&wndclass);
1382 return CreateWindowW(wszHTMLDocumentTest, wszHTMLDocumentTest,
1383 WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
1384 CW_USEDEFAULT, NULL, NULL, NULL, NULL);
1387 static HRESULT test_DoVerb(IOleObject *oleobj)
1389 RECT rect = {0,0,500,500};
1392 if(!container_locked) {
1393 SET_EXPECT(GetContainer);
1394 SET_EXPECT(LockContainer);
1396 SET_EXPECT(ActivateMe);
1397 expect_LockContainer_fLock = TRUE;
1399 hres = IOleObject_DoVerb(oleobj, OLEIVERB_SHOW, NULL, &ClientSite, -1, container_hwnd, &rect);
1402 ok(hres == S_OK, "DoVerb failed: %08lx\n", hres);
1404 if(!container_locked) {
1405 CHECK_CALLED(GetContainer);
1406 CHECK_CALLED(LockContainer);
1407 container_locked = TRUE;
1409 CHECK_CALLED(ActivateMe);
1414 #define CLIENTSITE_EXPECTPATH 0x00000001
1415 #define CLIENTSITE_SETNULL 0x00000002
1416 #define CLIENTSITE_DONTSET 0x00000004
1418 static void test_ClientSite(IOleObject *oleobj, DWORD flags)
1420 IOleClientSite *clientsite;
1423 if(flags & CLIENTSITE_SETNULL) {
1424 hres = IOleObject_GetClientSite(oleobj, &clientsite);
1425 ok(clientsite == &ClientSite, "clientsite=%p, expected %p\n", clientsite, &ClientSite);
1427 hres = IOleObject_SetClientSite(oleobj, NULL);
1428 ok(hres == S_OK, "SetClientSite failed: %08lx\n", hres);
1430 set_clientsite = FALSE;
1433 if(flags & CLIENTSITE_DONTSET)
1436 hres = IOleObject_GetClientSite(oleobj, &clientsite);
1437 ok(hres == S_OK, "GetClientSite failed: %08lx\n", hres);
1438 ok(clientsite == (set_clientsite ? &ClientSite : NULL), "GetClientSite() = %p, expected %p\n",
1439 clientsite, set_clientsite ? &ClientSite : NULL);
1441 if(!set_clientsite) {
1442 SET_EXPECT(GetHostInfo);
1443 if(flags & CLIENTSITE_EXPECTPATH) {
1444 SET_EXPECT(GetOptionKeyPath);
1445 SET_EXPECT(GetOverrideKeyPath);
1447 SET_EXPECT(GetWindow);
1448 SET_EXPECT(QueryStatus_SETPROGRESSTEXT);
1449 SET_EXPECT(Exec_SETPROGRESSMAX);
1450 SET_EXPECT(Exec_SETPROGRESSPOS);
1451 SET_EXPECT(Invoke_AMBIENT_USERMODE);
1452 SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
1453 SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1454 SET_EXPECT(Invoke_AMBIENT_SILENT);
1455 SET_EXPECT(Invoke_AMBIENT_USERAGENT);
1456 SET_EXPECT(Invoke_AMBIENT_PALETTE);
1458 hres = IOleObject_SetClientSite(oleobj, &ClientSite);
1459 ok(hres == S_OK, "SetClientSite failed: %08lx\n", hres);
1461 CHECK_CALLED(GetHostInfo);
1462 if(flags & CLIENTSITE_EXPECTPATH) {
1463 CHECK_CALLED(GetOptionKeyPath);
1464 CHECK_CALLED(GetOverrideKeyPath);
1466 CHECK_CALLED(GetWindow);
1467 CHECK_CALLED(QueryStatus_SETPROGRESSTEXT);
1468 CHECK_CALLED(Exec_SETPROGRESSMAX);
1469 CHECK_CALLED(Exec_SETPROGRESSPOS);
1470 CHECK_CALLED(Invoke_AMBIENT_USERMODE);
1471 CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
1472 CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1473 CHECK_CALLED(Invoke_AMBIENT_SILENT);
1474 CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
1475 CHECK_CALLED(Invoke_AMBIENT_PALETTE);
1477 set_clientsite = TRUE;
1480 hres = IOleObject_SetClientSite(oleobj, &ClientSite);
1481 ok(hres == S_OK, "SetClientSite failed: %08lx\n", hres);
1483 hres = IOleObject_GetClientSite(oleobj, &clientsite);
1484 ok(hres == S_OK, "GetClientSite failed: %08lx\n", hres);
1485 ok(clientsite == &ClientSite, "GetClientSite() = %p, expected %p\n", clientsite, &ClientSite);
1488 static void test_OnAmbientPropertyChange(IUnknown *unk)
1490 IOleControl *control = NULL;
1493 hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
1494 ok(hres == S_OK, "QueryInterface(IID_IOleControl failed: %08lx\n", hres);
1498 SET_EXPECT(Invoke_AMBIENT_USERMODE);
1499 hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_USERMODE);
1500 ok(hres == S_OK, "OnAmbientChange failed: %08lx\n", hres);
1501 CHECK_CALLED(Invoke_AMBIENT_USERMODE);
1503 SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
1504 hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_DLCONTROL);
1505 ok(hres == S_OK, "OnAmbientChange failed: %08lx\n", hres);
1506 CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
1508 SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
1509 SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1510 hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED);
1511 ok(hres == S_OK, "OnAmbientChange failed: %08lx\n", hres);
1512 CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
1513 CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
1515 SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
1516 SET_EXPECT(Invoke_AMBIENT_SILENT);
1517 hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_SILENT);
1518 ok(hres == S_OK, "OnAmbientChange failed: %08lx\n", hres);
1519 CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
1520 CHECK_CALLED(Invoke_AMBIENT_SILENT);
1522 SET_EXPECT(Invoke_AMBIENT_USERAGENT);
1523 hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_USERAGENT);
1524 ok(hres == S_OK, "OnAmbientChange failed: %08lx\n", hres);
1525 CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
1527 SET_EXPECT(Invoke_AMBIENT_PALETTE);
1528 hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_PALETTE);
1529 ok(hres == S_OK, "OnAmbientChange failed: %08lx\n", hres);
1530 CHECK_CALLED(Invoke_AMBIENT_PALETTE);
1532 IOleControl_Release(control);
1537 static void test_OnAmbientPropertyChange2(IUnknown *unk)
1539 IOleControl *control = NULL;
1542 hres = IUnknown_QueryInterface(unk, &IID_IOleControl, (void**)&control);
1543 ok(hres == S_OK, "QueryInterface(IID_IOleControl failed: %08lx\n", hres);
1547 hres = IOleControl_OnAmbientPropertyChange(control, DISPID_AMBIENT_PALETTE);
1548 ok(hres == S_OK, "OnAmbientPropertyChange failed: %08lx\n", hres);
1550 IOleControl_Release(control);
1553 static void test_Close(IUnknown *unk, BOOL set_client)
1555 IOleObject *oleobj = NULL;
1558 hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
1559 ok(hres == S_OK, "QueryInterface(IID_IOleObject) failed: %08lx\n", hres);
1563 SET_EXPECT(GetContainer);
1564 SET_EXPECT(LockContainer);
1565 expect_LockContainer_fLock = FALSE;
1566 hres = IOleObject_Close(oleobj, OLECLOSE_NOSAVE);
1567 ok(hres == S_OK, "Close failed: %08lx\n", hres);
1568 CHECK_CALLED(GetContainer);
1569 CHECK_CALLED(LockContainer);
1570 container_locked = FALSE;
1573 test_ClientSite(oleobj, CLIENTSITE_SETNULL|CLIENTSITE_DONTSET);
1575 IOleObject_Release(oleobj);
1578 static void test_InPlaceDeactivate(IUnknown *unk, BOOL expect_call)
1580 IOleInPlaceObjectWindowless *windowlessobj = NULL;
1583 hres = IUnknown_QueryInterface(unk, &IID_IOleInPlaceObjectWindowless,
1584 (void**)&windowlessobj);
1585 ok(hres == S_OK, "QueryInterface(IID_IOleInPlaceObjectWindowless) failed: %08lx\n", hres);
1589 if(expect_call) SET_EXPECT(OnInPlaceDeactivate);
1590 hres = IOleInPlaceObjectWindowless_InPlaceDeactivate(windowlessobj);
1591 ok(hres == S_OK, "InPlaceDeactivate failed: %08lx\n", hres);
1592 if(expect_call) CHECK_CALLED(OnInPlaceDeactivate);
1594 IOleInPlaceObjectWindowless_Release(windowlessobj);
1597 static HRESULT test_Activate(IUnknown *unk, DWORD flags)
1599 IOleObject *oleobj = NULL;
1606 IOleDocumentView_Release(view);
1609 hres = IUnknown_QueryInterface(unk, &IID_IOleObject, (void**)&oleobj);
1610 ok(hres == S_OK, "QueryInterface(IID_IOleObject) failed: %08lx\n", hres);
1614 hres = IOleObject_GetUserClassID(oleobj, NULL);
1615 ok(hres == E_INVALIDARG, "GetUserClassID returned: %08lx, expected E_INVALIDARG\n", hres);
1617 hres = IOleObject_GetUserClassID(oleobj, &guid);
1618 ok(hres == S_OK, "GetUserClassID failed: %08lx\n", hres);
1619 ok(IsEqualGUID(&guid, &CLSID_HTMLDocument), "guid != CLSID_HTMLDocument\n");
1621 test_ClientSite(oleobj, flags);
1622 test_InPlaceDeactivate(unk, FALSE);
1624 hres = test_DoVerb(oleobj);
1626 IOleObject_Release(oleobj);
1630 static void test_Window(IUnknown *unk, BOOL expect_success)
1632 IOleInPlaceActiveObject *activeobject = NULL;
1636 hres = IOleDocumentView_QueryInterface(view, &IID_IOleInPlaceActiveObject, (void**)&activeobject);
1637 ok(hres == S_OK, "Could not get IOleInPlaceActiveObject interface: %08lx\n", hres);
1641 hres = IOleInPlaceActiveObject_GetWindow(activeobject, &tmp_hwnd);
1643 if(expect_success) {
1644 ok(hres == S_OK, "GetWindow failed: %08lx\n", hres);
1645 ok(tmp_hwnd == hwnd, "tmp_hwnd=%p, expected %p\n", tmp_hwnd, hwnd);
1647 ok(hres == E_FAIL, "GetWindow returned %08lx, expected E_FAIL\n", hres);
1648 ok(IsWindow(hwnd), "hwnd is destroyed\n");
1651 IOleInPlaceActiveObject_Release(activeobject);
1654 static void test_CloseView(void)
1656 IOleInPlaceSite *inplacesite = (IOleInPlaceSite*)0xff00ff00;
1662 hres = IOleDocumentView_Show(view, FALSE);
1663 ok(hres == S_OK, "Show failed: %08lx\n", hres);
1665 hres = IOleDocumentView_CloseView(view, 0);
1666 ok(hres == S_OK, "CloseView failed: %08lx\n", hres);
1668 hres = IOleDocumentView_SetInPlaceSite(view, NULL);
1669 ok(hres == S_OK, "SetInPlaceSite failed: %08lx\n", hres);
1671 hres = IOleDocumentView_GetInPlaceSite(view, &inplacesite);
1672 ok(hres == S_OK, "SetInPlaceSite failed: %08lx\n", hres);
1673 ok(inplacesite == NULL, "inplacesite=%p, expected NULL\n", inplacesite);
1676 static void test_UIDeactivate(void)
1680 if(call_UIActivate) {
1681 SET_EXPECT(SetActiveObject);
1683 SET_EXPECT(OnUIDeactivate);
1686 expect_SetActiveObject_active = FALSE;
1687 hres = IOleDocumentView_UIActivate(view, FALSE);
1688 ok(hres == S_OK, "UIActivate failed: %08lx\n", hres);
1690 if(call_UIActivate) {
1691 CHECK_CALLED(SetActiveObject);
1692 CHECK_CALLED(HideUI);
1693 CHECK_CALLED(OnUIDeactivate);
1697 static void test_Hide(void)
1704 hres = IOleDocumentView_Show(view, FALSE);
1705 ok(hres == S_OK, "Show failed: %08lx\n", hres);
1708 static HRESULT create_document(IUnknown **unk)
1710 HRESULT hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1711 &IID_IUnknown, (void**)unk);
1712 ok(hres == S_OK, "CoCreateInstance failed: %08lx\n", hres);
1716 static void test_Navigate(IUnknown *unk)
1718 IHlinkTarget *hlink;
1721 hres = IUnknown_QueryInterface(unk, &IID_IHlinkTarget, (void**)&hlink);
1722 ok(hres == S_OK, "QueryInterface(IID_IHlinkTarget) failed: %08lx\n", hres);
1724 SET_EXPECT(ActivateMe);
1725 hres = IHlinkTarget_Navigate(hlink, 0, NULL);
1726 ok(hres == S_OK, "Navigate failed: %08lx\n", hres);
1727 CHECK_CALLED(ActivateMe);
1729 IHlinkTarget_Release(hlink);
1732 static void test_HTMLDocument(void)
1738 hwnd = last_hwnd = NULL;
1740 hres = create_document(&unk);
1745 if(load_state == LD_NO)
1746 test_OnAmbientPropertyChange2(unk);
1748 hres = test_Activate(unk, CLIENTSITE_EXPECTPATH);
1750 IUnknown_Release(unk);
1754 #ifdef DOWNLOAD_TEST
1755 if(load_state == LD_DOLOAD)
1759 test_OleCommandTarget_fail(unk);
1760 test_OleCommandTarget(unk);
1761 test_OnAmbientPropertyChange(unk);
1762 test_Window(unk, TRUE);
1763 test_UIDeactivate();
1764 test_OleCommandTarget(unk);
1765 test_Window(unk, TRUE);
1766 test_InPlaceDeactivate(unk, TRUE);
1768 /* Calling test_OleCommandTarget here couses Segmentation Fault with native
1769 * MSHTML. It doesn't with Wine. */
1771 test_Window(unk, FALSE);
1773 test_InPlaceDeactivate(unk, FALSE);
1775 test_Close(unk, FALSE);
1777 /* Activate HTMLDocument again */
1778 test_Activate(unk, CLIENTSITE_SETNULL);
1779 test_Window(unk, TRUE);
1780 test_OleCommandTarget(unk);
1781 test_UIDeactivate();
1782 test_InPlaceDeactivate(unk, TRUE);
1783 test_Close(unk, FALSE);
1785 /* Activate HTMLDocument again, this time without UIActivate */
1786 call_UIActivate = FALSE;
1787 test_Activate(unk, CLIENTSITE_SETNULL);
1788 test_Window(unk, TRUE);
1789 test_UIDeactivate();
1790 test_InPlaceDeactivate(unk, TRUE);
1793 test_Close(unk, TRUE);
1794 test_OnAmbientPropertyChange2(unk);
1797 IOleDocumentView_Release(view);
1800 ok(IsWindow(hwnd), "hwnd is destroyed\n");
1802 ref = IUnknown_Release(unk);
1803 ok(ref == 0, "ref=%ld, expected 0\n", ref);
1805 ok(!IsWindow(hwnd), "hwnd is not destroyed\n");
1809 static void test_HTMLDocument_hlink(void)
1815 hwnd = last_hwnd = NULL;
1817 hres = create_document(&unk);
1824 #ifdef DOWNLOAD_TEST
1828 test_Window(unk, TRUE);
1829 test_InPlaceDeactivate(unk, TRUE);
1830 test_Close(unk, FALSE);
1833 IOleDocumentView_Release(view);
1836 ref = IUnknown_Release(unk);
1837 ok(ref == 0, "ref=%ld, expected 0\n", ref);
1844 container_hwnd = create_container_window();
1847 test_HTMLDocument();
1848 load_state = LD_DOLOAD;
1849 test_HTMLDocument();
1850 load_state = LD_DOLOAD;
1851 test_HTMLDocument_hlink();
1853 DestroyWindow(container_hwnd);