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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
31 #include "shdeprecated.h"
35 #include "wine/debug.h"
37 #include "mshtml_private.h"
39 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
41 #define DOCHOST_DOCCANNAVIGATE 0
43 /**********************************************************
44 * IOleObject implementation
47 static inline HTMLDocument *impl_from_IOleObject(IOleObject *iface)
49 return CONTAINING_RECORD(iface, HTMLDocument, IOleObject_iface);
52 static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv)
54 HTMLDocument *This = impl_from_IOleObject(iface);
55 return htmldoc_query_interface(This, riid, ppv);
58 static ULONG WINAPI OleObject_AddRef(IOleObject *iface)
60 HTMLDocument *This = impl_from_IOleObject(iface);
61 return htmldoc_addref(This);
64 static ULONG WINAPI OleObject_Release(IOleObject *iface)
66 HTMLDocument *This = impl_from_IOleObject(iface);
67 return htmldoc_release(This);
70 static void update_hostinfo(HTMLDocumentObj *This, DOCHOSTUIINFO *hostinfo)
72 nsIScrollable *scrollable;
75 if(!This->nscontainer)
78 nsres = nsIWebBrowser_QueryInterface(This->nscontainer->webbrowser, &IID_nsIScrollable, (void**)&scrollable);
79 if(NS_SUCCEEDED(nsres)) {
80 nsres = nsIScrollable_SetDefaultScrollbarPreferences(scrollable, ScrollOrientation_Y,
81 (hostinfo->dwFlags & DOCHOSTUIFLAG_SCROLL_NO) ? Scrollbar_Never : Scrollbar_Always);
83 ERR("Could not set default Y scrollbar prefs: %08x\n", nsres);
85 nsres = nsIScrollable_SetDefaultScrollbarPreferences(scrollable, ScrollOrientation_X,
86 hostinfo->dwFlags & DOCHOSTUIFLAG_SCROLL_NO ? Scrollbar_Never : Scrollbar_Auto);
88 ERR("Could not set default X scrollbar prefs: %08x\n", nsres);
90 nsIScrollable_Release(scrollable);
92 ERR("Could not get nsIScrollable: %08x\n", nsres);
96 static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *pClientSite)
98 HTMLDocument *This = impl_from_IOleObject(iface);
99 IOleCommandTarget *cmdtrg = NULL;
100 IOleWindow *ole_window;
101 IServiceProvider *sp;
107 TRACE("(%p)->(%p)\n", This, pClientSite);
109 if(pClientSite == This->doc_obj->client)
112 if(This->doc_obj->client) {
113 IOleClientSite_Release(This->doc_obj->client);
114 This->doc_obj->client = NULL;
115 This->doc_obj->usermode = UNKNOWN_USERMODE;
118 if(This->doc_obj->hostui && !This->doc_obj->custom_hostui) {
119 IDocHostUIHandler_Release(This->doc_obj->hostui);
120 This->doc_obj->hostui = NULL;
123 if(This->doc_obj->doc_object_service) {
124 IDocObjectService_Release(This->doc_obj->doc_object_service);
125 This->doc_obj->doc_object_service = NULL;
128 memset(&This->doc_obj->hostinfo, 0, sizeof(DOCHOSTUIINFO));
133 IOleClientSite_AddRef(pClientSite);
134 This->doc_obj->client = pClientSite;
136 hres = IOleClientSite_QueryInterface(pClientSite, &IID_IServiceProvider, (void**)&sp);
137 if(SUCCEEDED(hres)) {
138 IBrowserService *browser_service;
139 IDocObjectService *doc_object_service;
141 hres = IServiceProvider_QueryService(sp, &IID_IShellBrowser,
142 &IID_IBrowserService, (void**)&browser_service);
143 if(SUCCEEDED(hres)) {
144 hres = IBrowserService_QueryInterface(browser_service,
145 &IID_IDocObjectService, (void**)&doc_object_service);
147 This->doc_obj->doc_object_service = doc_object_service;
149 IBrowserService_Release(browser_service);
152 IServiceProvider_Release(sp);
155 hostui_setup = This->doc_obj->hostui_setup;
157 if(!This->doc_obj->hostui) {
158 IDocHostUIHandler *uihandler;
160 This->doc_obj->custom_hostui = FALSE;
162 hres = IOleObject_QueryInterface(pClientSite, &IID_IDocHostUIHandler, (void**)&uihandler);
164 This->doc_obj->hostui = uihandler;
167 if(This->doc_obj->hostui) {
168 DOCHOSTUIINFO hostinfo;
169 LPOLESTR key_path = NULL, override_key_path = NULL;
170 IDocHostUIHandler2 *uihandler2;
172 memset(&hostinfo, 0, sizeof(DOCHOSTUIINFO));
173 hostinfo.cbSize = sizeof(DOCHOSTUIINFO);
174 hres = IDocHostUIHandler_GetHostInfo(This->doc_obj->hostui, &hostinfo);
175 if(SUCCEEDED(hres)) {
176 TRACE("hostinfo = {%u %08x %08x %s %s}\n",
177 hostinfo.cbSize, hostinfo.dwFlags, hostinfo.dwDoubleClick,
178 debugstr_w(hostinfo.pchHostCss), debugstr_w(hostinfo.pchHostNS));
179 update_hostinfo(This->doc_obj, &hostinfo);
180 This->doc_obj->hostinfo = hostinfo;
184 hres = IDocHostUIHandler_GetOptionKeyPath(This->doc_obj->hostui, &key_path, 0);
185 if(hres == S_OK && key_path) {
187 /* FIXME: use key_path */
188 TRACE("key_path = %s\n", debugstr_w(key_path));
190 CoTaskMemFree(key_path);
193 hres = IDocHostUIHandler_QueryInterface(This->doc_obj->hostui, &IID_IDocHostUIHandler2,
194 (void**)&uihandler2);
195 if(SUCCEEDED(hres)) {
196 hres = IDocHostUIHandler2_GetOverrideKeyPath(uihandler2, &override_key_path, 0);
197 if(hres == S_OK && override_key_path && override_key_path[0]) {
198 if(override_key_path[0]) {
199 /*FIXME: use override_key_path */
200 TRACE("override_key_path = %s\n", debugstr_w(override_key_path));
202 CoTaskMemFree(override_key_path);
204 IDocHostUIHandler2_Release(uihandler2);
207 This->doc_obj->hostui_setup = TRUE;
211 /* Native calls here GetWindow. What is it for?
212 * We don't have anything to do with it here (yet). */
213 hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleWindow, (void**)&ole_window);
214 if(SUCCEEDED(hres)) {
215 IOleWindow_GetWindow(ole_window, &hwnd);
216 IOleWindow_Release(ole_window);
219 hres = IOleClientSite_QueryInterface(pClientSite, &IID_IOleCommandTarget, (void**)&cmdtrg);
220 if(SUCCEEDED(hres)) {
222 OLECMD cmd = {OLECMDID_SETPROGRESSTEXT, 0};
225 V_VT(&var) = VT_UNKNOWN;
226 V_UNKNOWN(&var) = (IUnknown*)&This->window->IHTMLWindow2_iface;
227 IOleCommandTarget_Exec(cmdtrg, &CGID_DocHostCmdPriv, DOCHOST_DOCCANNAVIGATE, 0, &var, NULL);
230 IOleCommandTarget_QueryStatus(cmdtrg, NULL, 1, &cmd, NULL);
234 IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSMAX,
235 OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL);
236 IOleCommandTarget_Exec(cmdtrg, NULL, OLECMDID_SETPROGRESSPOS,
237 OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL);
239 IOleCommandTarget_Release(cmdtrg);
242 if(This->doc_obj->usermode == UNKNOWN_USERMODE)
243 IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface, DISPID_AMBIENT_USERMODE);
245 IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface,
246 DISPID_AMBIENT_OFFLINEIFNOTCONNECTED);
248 hres = get_client_disp_property(This->doc_obj->client, DISPID_AMBIENT_SILENT, &silent);
249 if(SUCCEEDED(hres)) {
250 if(V_VT(&silent) != VT_BOOL)
251 WARN("V_VT(silent) = %d\n", V_VT(&silent));
252 else if(V_BOOL(&silent))
253 FIXME("silent == true\n");
256 IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface, DISPID_AMBIENT_USERAGENT);
257 IOleControl_OnAmbientPropertyChange(&This->IOleControl_iface, DISPID_AMBIENT_PALETTE);
262 static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **ppClientSite)
264 HTMLDocument *This = impl_from_IOleObject(iface);
266 TRACE("(%p)->(%p)\n", This, ppClientSite);
271 if(This->doc_obj->client)
272 IOleClientSite_AddRef(This->doc_obj->client);
273 *ppClientSite = This->doc_obj->client;
278 static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szContainerApp, LPCOLESTR szContainerObj)
280 HTMLDocument *This = impl_from_IOleObject(iface);
281 FIXME("(%p)->(%s %s)\n", This, debugstr_w(szContainerApp), debugstr_w(szContainerObj));
285 static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
287 HTMLDocument *This = impl_from_IOleObject(iface);
289 TRACE("(%p)->(%08x)\n", This, dwSaveOption);
291 if(dwSaveOption == OLECLOSE_PROMPTSAVE)
292 FIXME("OLECLOSE_PROMPTSAVE not implemented\n");
294 if(This->doc_obj->in_place_active)
295 IOleInPlaceObjectWindowless_InPlaceDeactivate(&This->IOleInPlaceObjectWindowless_iface);
297 HTMLDocument_LockContainer(This->doc_obj, FALSE);
299 if(This->advise_holder)
300 IOleAdviseHolder_SendOnClose(This->advise_holder);
305 static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker *pmk)
307 HTMLDocument *This = impl_from_IOleObject(iface);
308 FIXME("(%p %d %p)->()\n", This, dwWhichMoniker, pmk);
312 static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
314 HTMLDocument *This = impl_from_IOleObject(iface);
315 FIXME("(%p)->(%d %d %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
319 static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, IDataObject *pDataObject, BOOL fCreation,
322 HTMLDocument *This = impl_from_IOleObject(iface);
323 FIXME("(%p)->(%p %x %d)\n", This, pDataObject, fCreation, dwReserved);
327 static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD dwReserved, IDataObject **ppDataObject)
329 HTMLDocument *This = impl_from_IOleObject(iface);
330 FIXME("(%p)->(%d %p)\n", This, dwReserved, ppDataObject);
334 static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite,
335 LONG lindex, HWND hwndParent, LPCRECT lprcPosRect)
337 HTMLDocument *This = impl_from_IOleObject(iface);
338 IOleDocumentSite *pDocSite;
341 TRACE("(%p)->(%d %p %p %d %p %p)\n", This, iVerb, lpmsg, pActiveSite, lindex, hwndParent, lprcPosRect);
343 if(iVerb != OLEIVERB_SHOW && iVerb != OLEIVERB_UIACTIVATE && iVerb != OLEIVERB_INPLACEACTIVATE) {
344 FIXME("iVerb = %d not supported\n", iVerb);
349 pActiveSite = This->doc_obj->client;
351 hres = IOleClientSite_QueryInterface(pActiveSite, &IID_IOleDocumentSite, (void**)&pDocSite);
352 if(SUCCEEDED(hres)) {
353 HTMLDocument_LockContainer(This->doc_obj, TRUE);
355 /* FIXME: Create new IOleDocumentView. See CreateView for more info. */
356 hres = IOleDocumentSite_ActivateMe(pDocSite, &This->IOleDocumentView_iface);
357 IOleDocumentSite_Release(pDocSite);
359 hres = IOleDocumentView_UIActivate(&This->IOleDocumentView_iface, TRUE);
360 if(SUCCEEDED(hres)) {
362 RECT rect; /* We need to pass rect as not const pointer */
364 IOleDocumentView_SetRect(&This->IOleDocumentView_iface, &rect);
366 IOleDocumentView_Show(&This->IOleDocumentView_iface, TRUE);
373 static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb)
375 HTMLDocument *This = impl_from_IOleObject(iface);
376 FIXME("(%p)->(%p)\n", This, ppEnumOleVerb);
380 static HRESULT WINAPI OleObject_Update(IOleObject *iface)
382 HTMLDocument *This = impl_from_IOleObject(iface);
383 FIXME("(%p)\n", This);
387 static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface)
389 HTMLDocument *This = impl_from_IOleObject(iface);
390 FIXME("(%p)\n", This);
394 static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID *pClsid)
396 HTMLDocument *This = impl_from_IOleObject(iface);
398 TRACE("(%p)->(%p)\n", This, pClsid);
403 *pClsid = CLSID_HTMLDocument;
407 static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD dwFormOfType, LPOLESTR *pszUserType)
409 HTMLDocument *This = impl_from_IOleObject(iface);
410 FIXME("(%p)->(%d %p)\n", This, dwFormOfType, pszUserType);
414 static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
416 HTMLDocument *This = impl_from_IOleObject(iface);
417 FIXME("(%p)->(%d %p)\n", This, dwDrawAspect, psizel);
421 static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
423 HTMLDocument *This = impl_from_IOleObject(iface);
424 FIXME("(%p)->(%d %p)\n", This, dwDrawAspect, psizel);
428 static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink, DWORD *pdwConnection)
430 HTMLDocument *This = impl_from_IOleObject(iface);
431 TRACE("(%p)->(%p %p)\n", This, pAdvSink, pdwConnection);
441 if(!This->advise_holder) {
442 CreateOleAdviseHolder(&This->advise_holder);
443 if(!This->advise_holder)
444 return E_OUTOFMEMORY;
447 return IOleAdviseHolder_Advise(This->advise_holder, pAdvSink, pdwConnection);
450 static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD dwConnection)
452 HTMLDocument *This = impl_from_IOleObject(iface);
453 TRACE("(%p)->(%d)\n", This, dwConnection);
455 if(!This->advise_holder)
456 return OLE_E_NOCONNECTION;
458 return IOleAdviseHolder_Unadvise(This->advise_holder, dwConnection);
461 static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **ppenumAdvise)
463 HTMLDocument *This = impl_from_IOleObject(iface);
465 if(!This->advise_holder) {
466 *ppenumAdvise = NULL;
470 return IOleAdviseHolder_EnumAdvise(This->advise_holder, ppenumAdvise);
473 static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus)
475 HTMLDocument *This = impl_from_IOleObject(iface);
476 FIXME("(%p)->(%d %p)\n", This, dwAspect, pdwStatus);
480 static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE *pLogpal)
482 HTMLDocument *This = impl_from_IOleObject(iface);
483 FIXME("(%p)->(%p)\n", This, pLogpal);
487 static const IOleObjectVtbl OleObjectVtbl = {
488 OleObject_QueryInterface,
491 OleObject_SetClientSite,
492 OleObject_GetClientSite,
493 OleObject_SetHostNames,
495 OleObject_SetMoniker,
496 OleObject_GetMoniker,
497 OleObject_InitFromData,
498 OleObject_GetClipboardData,
502 OleObject_IsUpToDate,
503 OleObject_GetUserClassID,
504 OleObject_GetUserType,
509 OleObject_EnumAdvise,
510 OleObject_GetMiscStatus,
511 OleObject_SetColorScheme
514 /**********************************************************
515 * IOleDocument implementation
518 static inline HTMLDocument *impl_from_IOleDocument(IOleDocument *iface)
520 return CONTAINING_RECORD(iface, HTMLDocument, IOleDocument_iface);
523 static HRESULT WINAPI OleDocument_QueryInterface(IOleDocument *iface, REFIID riid, void **ppv)
525 HTMLDocument *This = impl_from_IOleDocument(iface);
526 return htmldoc_query_interface(This, riid, ppv);
529 static ULONG WINAPI OleDocument_AddRef(IOleDocument *iface)
531 HTMLDocument *This = impl_from_IOleDocument(iface);
532 return htmldoc_addref(This);
535 static ULONG WINAPI OleDocument_Release(IOleDocument *iface)
537 HTMLDocument *This = impl_from_IOleDocument(iface);
538 return htmldoc_release(This);
541 static HRESULT WINAPI OleDocument_CreateView(IOleDocument *iface, IOleInPlaceSite *pIPSite, IStream *pstm,
542 DWORD dwReserved, IOleDocumentView **ppView)
544 HTMLDocument *This = impl_from_IOleDocument(iface);
547 TRACE("(%p)->(%p %p %d %p)\n", This, pIPSite, pstm, dwReserved, ppView);
553 * Windows implementation creates new IOleDocumentView when function is called for the
554 * first time and returns E_FAIL when it is called for the second time, but it doesn't matter
555 * if the application uses returned interfaces, passed to ActivateMe or returned by
556 * QueryInterface, so there is no reason to create new interface. This needs more testing.
560 hres = IOleDocumentView_SetInPlaceSite(&This->IOleDocumentView_iface, pIPSite);
566 FIXME("pstm is not supported\n");
568 IOleDocumentView_AddRef(&This->IOleDocumentView_iface);
569 *ppView = &This->IOleDocumentView_iface;
573 static HRESULT WINAPI OleDocument_GetDocMiscStatus(IOleDocument *iface, DWORD *pdwStatus)
575 HTMLDocument *This = impl_from_IOleDocument(iface);
576 FIXME("(%p)->(%p)\n", This, pdwStatus);
580 static HRESULT WINAPI OleDocument_EnumViews(IOleDocument *iface, IEnumOleDocumentViews **ppEnum,
581 IOleDocumentView **ppView)
583 HTMLDocument *This = impl_from_IOleDocument(iface);
584 FIXME("(%p)->(%p %p)\n", This, ppEnum, ppView);
588 static const IOleDocumentVtbl OleDocumentVtbl = {
589 OleDocument_QueryInterface,
592 OleDocument_CreateView,
593 OleDocument_GetDocMiscStatus,
594 OleDocument_EnumViews
597 /**********************************************************
598 * IOleControl implementation
601 static inline HTMLDocument *impl_from_IOleControl(IOleControl *iface)
603 return CONTAINING_RECORD(iface, HTMLDocument, IOleControl_iface);
606 static HRESULT WINAPI OleControl_QueryInterface(IOleControl *iface, REFIID riid, void **ppv)
608 HTMLDocument *This = impl_from_IOleControl(iface);
609 return htmldoc_query_interface(This, riid, ppv);
612 static ULONG WINAPI OleControl_AddRef(IOleControl *iface)
614 HTMLDocument *This = impl_from_IOleControl(iface);
615 return htmldoc_addref(This);
618 static ULONG WINAPI OleControl_Release(IOleControl *iface)
620 HTMLDocument *This = impl_from_IOleControl(iface);
621 return htmldoc_release(This);
624 static HRESULT WINAPI OleControl_GetControlInfo(IOleControl *iface, CONTROLINFO *pCI)
626 HTMLDocument *This = impl_from_IOleControl(iface);
627 FIXME("(%p)->(%p)\n", This, pCI);
631 static HRESULT WINAPI OleControl_OnMnemonic(IOleControl *iface, MSG *pMsg)
633 HTMLDocument *This = impl_from_IOleControl(iface);
634 FIXME("(%p)->(%p)\n", This, pMsg);
638 HRESULT get_client_disp_property(IOleClientSite *client, DISPID dispid, VARIANT *res)
640 IDispatch *disp = NULL;
641 DISPPARAMS dispparams = {NULL, 0};
645 hres = IOleClientSite_QueryInterface(client, &IID_IDispatch, (void**)&disp);
647 TRACE("Could not get IDispatch\n");
653 hres = IDispatch_Invoke(disp, dispid, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
654 DISPATCH_PROPERTYGET, &dispparams, res, NULL, &err);
656 IDispatch_Release(disp);
661 static HRESULT on_change_dlcontrol(HTMLDocument *This)
666 hres = get_client_disp_property(This->doc_obj->client, DISPID_AMBIENT_DLCONTROL, &res);
668 FIXME("unsupported dlcontrol %08x\n", V_I4(&res));
673 static HRESULT WINAPI OleControl_OnAmbientPropertyChange(IOleControl *iface, DISPID dispID)
675 HTMLDocument *This = impl_from_IOleControl(iface);
676 IOleClientSite *client;
680 client = This->doc_obj->client;
682 TRACE("client = NULL\n");
687 case DISPID_AMBIENT_USERMODE:
688 TRACE("(%p)->(DISPID_AMBIENT_USERMODE)\n", This);
689 hres = get_client_disp_property(client, DISPID_AMBIENT_USERMODE, &res);
693 if(V_VT(&res) == VT_BOOL) {
695 This->doc_obj->usermode = BROWSEMODE;
697 FIXME("edit mode is not supported\n");
698 This->doc_obj->usermode = EDITMODE;
701 FIXME("V_VT(res)=%d\n", V_VT(&res));
704 case DISPID_AMBIENT_DLCONTROL:
705 TRACE("(%p)->(DISPID_AMBIENT_DLCONTROL)\n", This);
706 return on_change_dlcontrol(This);
707 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:
708 TRACE("(%p)->(DISPID_AMBIENT_OFFLINEIFNOTCONNECTED)\n", This);
709 on_change_dlcontrol(This);
710 hres = get_client_disp_property(client, DISPID_AMBIENT_OFFLINEIFNOTCONNECTED, &res);
714 if(V_VT(&res) == VT_BOOL) {
716 FIXME("offline connection is not supported\n");
720 FIXME("V_VT(res)=%d\n", V_VT(&res));
723 case DISPID_AMBIENT_SILENT:
724 TRACE("(%p)->(DISPID_AMBIENT_SILENT)\n", This);
725 on_change_dlcontrol(This);
726 hres = get_client_disp_property(client, DISPID_AMBIENT_SILENT, &res);
730 if(V_VT(&res) == VT_BOOL) {
732 FIXME("silent mode is not supported\n");
736 FIXME("V_VT(res)=%d\n", V_VT(&res));
739 case DISPID_AMBIENT_USERAGENT:
740 TRACE("(%p)->(DISPID_AMBIENT_USERAGENT)\n", This);
741 hres = get_client_disp_property(client, DISPID_AMBIENT_USERAGENT, &res);
745 FIXME("not supported AMBIENT_USERAGENT\n");
748 case DISPID_AMBIENT_PALETTE:
749 TRACE("(%p)->(DISPID_AMBIENT_PALETTE)\n", This);
750 hres = get_client_disp_property(client, DISPID_AMBIENT_PALETTE, &res);
754 FIXME("not supported AMBIENT_PALETTE\n");
759 FIXME("(%p) unsupported dispID=%d\n", This, dispID);
763 static HRESULT WINAPI OleControl_FreezeEvents(IOleControl *iface, BOOL bFreeze)
765 HTMLDocument *This = impl_from_IOleControl(iface);
766 FIXME("(%p)->(%x)\n", This, bFreeze);
770 static const IOleControlVtbl OleControlVtbl = {
771 OleControl_QueryInterface,
774 OleControl_GetControlInfo,
775 OleControl_OnMnemonic,
776 OleControl_OnAmbientPropertyChange,
777 OleControl_FreezeEvents
780 /**********************************************************
781 * IObjectWithSite implementation
784 static inline HTMLDocument *impl_from_IObjectWithSite(IObjectWithSite *iface)
786 return CONTAINING_RECORD(iface, HTMLDocument, IObjectWithSite_iface);
789 static HRESULT WINAPI ObjectWithSite_QueryInterface(IObjectWithSite *iface, REFIID riid, void **ppv)
791 HTMLDocument *This = impl_from_IObjectWithSite(iface);
792 return htmldoc_query_interface(This, riid, ppv);
795 static ULONG WINAPI ObjectWithSite_AddRef(IObjectWithSite *iface)
797 HTMLDocument *This = impl_from_IObjectWithSite(iface);
798 return htmldoc_addref(This);
801 static ULONG WINAPI ObjectWithSite_Release(IObjectWithSite *iface)
803 HTMLDocument *This = impl_from_IObjectWithSite(iface);
804 return htmldoc_release(This);
807 static HRESULT WINAPI ObjectWithSite_SetSite(IObjectWithSite *iface, IUnknown *pUnkSite)
809 HTMLDocument *This = impl_from_IObjectWithSite(iface);
810 FIXME("(%p)->(%p)\n", This, pUnkSite);
814 static HRESULT WINAPI ObjectWithSite_GetSite(IObjectWithSite* iface, REFIID riid, PVOID *ppvSite)
816 HTMLDocument *This = impl_from_IObjectWithSite(iface);
817 FIXME("(%p)->(%p)\n", This, ppvSite);
821 static const IObjectWithSiteVtbl ObjectWithSiteVtbl = {
822 ObjectWithSite_QueryInterface,
823 ObjectWithSite_AddRef,
824 ObjectWithSite_Release,
825 ObjectWithSite_SetSite,
826 ObjectWithSite_GetSite
829 /**********************************************************
830 * IOleContainer implementation
833 static inline HTMLDocument *impl_from_IOleContainer(IOleContainer *iface)
835 return CONTAINING_RECORD(iface, HTMLDocument, IOleContainer_iface);
838 static HRESULT WINAPI OleContainer_QueryInterface(IOleContainer *iface, REFIID riid, void **ppv)
840 HTMLDocument *This = impl_from_IOleContainer(iface);
841 return htmldoc_query_interface(This, riid, ppv);
844 static ULONG WINAPI OleContainer_AddRef(IOleContainer *iface)
846 HTMLDocument *This = impl_from_IOleContainer(iface);
847 return htmldoc_addref(This);
850 static ULONG WINAPI OleContainer_Release(IOleContainer *iface)
852 HTMLDocument *This = impl_from_IOleContainer(iface);
853 return htmldoc_release(This);
856 static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindCtx *pbc, LPOLESTR pszDisplayName,
857 ULONG *pchEaten, IMoniker **ppmkOut)
859 HTMLDocument *This = impl_from_IOleContainer(iface);
860 FIXME("(%p)->(%p %s %p %p)\n", This, pbc, debugstr_w(pszDisplayName), pchEaten, ppmkOut);
864 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags, IEnumUnknown **ppenum)
866 HTMLDocument *This = impl_from_IOleContainer(iface);
867 FIXME("(%p)->(%x %p)\n", This, grfFlags, ppenum);
871 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)
873 HTMLDocument *This = impl_from_IOleContainer(iface);
874 FIXME("(%p)->(%x)\n", This, fLock);
878 static const IOleContainerVtbl OleContainerVtbl = {
879 OleContainer_QueryInterface,
881 OleContainer_Release,
882 OleContainer_ParseDisplayName,
883 OleContainer_EnumObjects,
884 OleContainer_LockContainer
887 /**********************************************************
888 * IObjectSafety implementation
891 static inline HTMLDocument *impl_from_IObjectSafety(IObjectSafety *iface)
893 return CONTAINING_RECORD(iface, HTMLDocument, IObjectSafety_iface);
896 static HRESULT WINAPI ObjectSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv)
898 HTMLDocument *This = impl_from_IObjectSafety(iface);
899 return htmldoc_query_interface(This, riid, ppv);
902 static ULONG WINAPI ObjectSafety_AddRef(IObjectSafety *iface)
904 HTMLDocument *This = impl_from_IObjectSafety(iface);
905 return htmldoc_addref(This);
908 static ULONG WINAPI ObjectSafety_Release(IObjectSafety *iface)
910 HTMLDocument *This = impl_from_IObjectSafety(iface);
911 return htmldoc_release(This);
914 static HRESULT WINAPI ObjectSafety_GetInterfaceSafetyOptions(IObjectSafety *iface,
915 REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions)
917 HTMLDocument *This = impl_from_IObjectSafety(iface);
918 FIXME("(%p)->(%s %p %p)\n", This, debugstr_guid(riid), pdwSupportedOptions, pdwEnabledOptions);
922 static HRESULT WINAPI ObjectSafety_SetInterfaceSafetyOptions(IObjectSafety *iface,
923 REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions)
925 HTMLDocument *This = impl_from_IObjectSafety(iface);
926 FIXME("(%p)->(%s %x %x)\n", This, debugstr_guid(riid), dwOptionSetMask, dwEnabledOptions);
928 if(IsEqualGUID(&IID_IPersistMoniker, riid) &&
929 dwOptionSetMask==INTERFACESAFE_FOR_UNTRUSTED_DATA &&
930 dwEnabledOptions==INTERFACESAFE_FOR_UNTRUSTED_DATA)
936 static const IObjectSafetyVtbl ObjectSafetyVtbl = {
937 ObjectSafety_QueryInterface,
939 ObjectSafety_Release,
940 ObjectSafety_GetInterfaceSafetyOptions,
941 ObjectSafety_SetInterfaceSafetyOptions
944 void HTMLDocument_LockContainer(HTMLDocumentObj *This, BOOL fLock)
946 IOleContainer *container;
949 if(!This->client || This->container_locked == fLock)
952 hres = IOleClientSite_GetContainer(This->client, &container);
953 if(SUCCEEDED(hres)) {
954 IOleContainer_LockContainer(container, fLock);
955 This->container_locked = fLock;
956 IOleContainer_Release(container);
960 void HTMLDocument_OleObj_Init(HTMLDocument *This)
962 This->IOleObject_iface.lpVtbl = &OleObjectVtbl;
963 This->IOleDocument_iface.lpVtbl = &OleDocumentVtbl;
964 This->IOleControl_iface.lpVtbl = &OleControlVtbl;
965 This->IObjectWithSite_iface.lpVtbl = &ObjectWithSiteVtbl;
966 This->IOleContainer_iface.lpVtbl = &OleContainerVtbl;
967 This->IObjectSafety_iface.lpVtbl = &ObjectSafetyVtbl;