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
25 #define NONAMELESSUNION
26 #define NONAMELESSSTRUCT
35 #define NO_SHLWAPI_REG
38 #include "wine/debug.h"
40 #include "mshtml_private.h"
41 #include "htmlevent.h"
45 WINE_DEFAULT_DEBUG_CHANNEL(mshtml
);
47 /* Undocumented notification, see tests */
48 #define CMDID_EXPLORER_UPDATEHISTORY 38
55 } download_proc_task_t
;
57 static BOOL
use_gecko_script(HTMLWindow
*window
)
62 hres
= IInternetSecurityManager_MapUrlToZone(window
->secmgr
, window
->url
, &zone
, 0);
64 WARN("Could not map %s to zone: %08x\n", debugstr_w(window
->url
), hres
);
68 TRACE("zone %d\n", zone
);
69 if(zone
== URLZONE_LOCAL_MACHINE
|| zone
== URLZONE_TRUSTED
|| !window
->uri
)
72 hres
= IUri_GetScheme(window
->uri
, &scheme
);
73 return FAILED(hres
) || scheme
!= URL_SCHEME_ABOUT
;
76 static void notify_travellog_update(HTMLDocumentObj
*doc
)
78 IOleCommandTarget
*cmdtrg
;
81 if(!doc
->is_webbrowser
)
84 /* Don't notify if we were in about: page */
85 if(doc
->basedoc
.window
->uri
) {
88 hres
= IUri_GetScheme(doc
->basedoc
.window
->uri
, &scheme
);
89 if(SUCCEEDED(hres
) && scheme
== URL_SCHEME_ABOUT
)
93 hres
= IOleClientSite_QueryInterface(doc
->client
, &IID_IOleCommandTarget
, (void**)&cmdtrg
);
100 IOleCommandTarget_Exec(cmdtrg
, &CGID_Explorer
, CMDID_EXPLORER_UPDATEHISTORY
, 0, &vin
, NULL
);
101 IOleCommandTarget_Release(cmdtrg
);
105 void set_current_uri(HTMLWindow
*window
, IUri
*uri
)
108 IUri_Release(window
->uri
);
112 SysFreeString(window
->url
);
121 IUri_GetDisplayUri(uri
, &window
->url
);
124 void set_current_mon(HTMLWindow
*This
, IMoniker
*mon
)
126 IUriContainer
*uri_container
;
132 notify_travellog_update(This
->doc_obj
);
133 IMoniker_Release(This
->mon
);
140 IMoniker_AddRef(mon
);
143 hres
= IMoniker_QueryInterface(mon
, &IID_IUriContainer
, (void**)&uri_container
);
144 if(SUCCEEDED(hres
)) {
145 hres
= IUriContainer_GetIUri(uri_container
, &uri
);
146 IUriContainer_Release(uri_container
);
148 WARN("GetIUri failed: %08x\n", hres
);
156 hres
= IMoniker_GetDisplayName(mon
, NULL
, NULL
, &url
);
157 if(SUCCEEDED(hres
)) {
158 hres
= CreateUri(url
, 0, 0, &uri
);
160 WARN("CrateUri failed: %08x\n", hres
);
161 set_current_uri(This
, NULL
);
162 This
->url
= SysAllocString(url
);
168 WARN("GetDisplayName failed: %08x\n", hres
);
172 set_current_uri(This
, uri
);
175 set_script_mode(This
, use_gecko_script(This
) ? SCRIPTMODE_GECKO
: SCRIPTMODE_ACTIVESCRIPT
);
178 HRESULT
create_relative_uri(HTMLWindow
*window
, const WCHAR
*rel_uri
, IUri
**uri
)
181 ? CoInternetCombineUrlEx(window
->uri
, rel_uri
, URL_ESCAPE_SPACES_ONLY
|URL_DONT_ESCAPE_EXTRA_INFO
, uri
, 0)
182 : CreateUri(rel_uri
, 0, 0, uri
);
185 void set_download_state(HTMLDocumentObj
*doc
, int state
)
188 IOleCommandTarget
*olecmd
;
191 hres
= IOleClientSite_QueryInterface(doc
->client
, &IID_IOleCommandTarget
, (void**)&olecmd
);
192 if(SUCCEEDED(hres
)) {
198 IOleCommandTarget_Exec(olecmd
, NULL
, OLECMDID_SETDOWNLOADSTATE
,
199 OLECMDEXECOPT_DONTPROMPTUSER
, &var
, NULL
);
200 IOleCommandTarget_Release(olecmd
);
204 doc
->download_state
= state
;
207 static void set_progress_proc(task_t
*_task
)
209 docobj_task_t
*task
= (docobj_task_t
*)_task
;
210 IOleCommandTarget
*olecmd
= NULL
;
211 HTMLDocumentObj
*doc
= task
->doc
;
214 TRACE("(%p)\n", doc
);
217 IOleClientSite_QueryInterface(doc
->client
, &IID_IOleCommandTarget
, (void**)&olecmd
);
220 VARIANT progress_max
, progress
;
222 V_VT(&progress_max
) = VT_I4
;
223 V_I4(&progress_max
) = 0; /* FIXME */
224 IOleCommandTarget_Exec(olecmd
, NULL
, OLECMDID_SETPROGRESSMAX
, OLECMDEXECOPT_DONTPROMPTUSER
,
225 &progress_max
, NULL
);
227 V_VT(&progress
) = VT_I4
;
228 V_I4(&progress
) = 0; /* FIXME */
229 IOleCommandTarget_Exec(olecmd
, NULL
, OLECMDID_SETPROGRESSPOS
, OLECMDEXECOPT_DONTPROMPTUSER
,
231 IOleCommandTarget_Release(olecmd
);
234 if(doc
->usermode
== EDITMODE
&& doc
->hostui
) {
235 DOCHOSTUIINFO hostinfo
;
237 memset(&hostinfo
, 0, sizeof(DOCHOSTUIINFO
));
238 hostinfo
.cbSize
= sizeof(DOCHOSTUIINFO
);
239 hres
= IDocHostUIHandler_GetHostInfo(doc
->hostui
, &hostinfo
);
241 /* FIXME: use hostinfo */
242 TRACE("hostinfo = {%u %08x %08x %s %s}\n",
243 hostinfo
.cbSize
, hostinfo
.dwFlags
, hostinfo
.dwDoubleClick
,
244 debugstr_w(hostinfo
.pchHostCss
), debugstr_w(hostinfo
.pchHostNS
));
248 static void set_downloading_proc(task_t
*_task
)
250 download_proc_task_t
*task
= (download_proc_task_t
*)_task
;
251 HTMLDocumentObj
*doc
= task
->doc
;
254 TRACE("(%p)\n", doc
);
256 set_statustext(doc
, IDS_STATUS_DOWNLOADINGFROM
, task
->url
);
258 if(task
->set_download
)
259 set_download_state(doc
, 1);
265 IAdviseSink_OnViewChange(doc
->view_sink
, DVASPECT_CONTENT
, -1);
268 IDropTarget
*drop_target
= NULL
;
270 hres
= IDocHostUIHandler_GetDropTarget(doc
->hostui
, NULL
/* FIXME */, &drop_target
);
271 if(SUCCEEDED(hres
) && drop_target
) {
272 FIXME("Use IDropTarget\n");
273 IDropTarget_Release(drop_target
);
278 static void set_downloading_task_destr(task_t
*_task
)
280 download_proc_task_t
*task
= (download_proc_task_t
*)_task
;
282 CoTaskMemFree(task
->url
);
286 void prepare_for_binding(HTMLDocument
*This
, IMoniker
*mon
, BOOL navigated_binding
)
290 if(This
->doc_obj
->client
) {
291 VARIANT silent
, offline
;
293 hres
= get_client_disp_property(This
->doc_obj
->client
, DISPID_AMBIENT_SILENT
, &silent
);
294 if(SUCCEEDED(hres
)) {
295 if(V_VT(&silent
) != VT_BOOL
)
296 WARN("V_VT(silent) = %d\n", V_VT(&silent
));
297 else if(V_BOOL(&silent
))
298 FIXME("silent == true\n");
301 hres
= get_client_disp_property(This
->doc_obj
->client
,
302 DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
, &offline
);
303 if(SUCCEEDED(hres
)) {
304 if(V_VT(&offline
) != VT_BOOL
)
305 WARN("V_VT(offline) = %d\n", V_VT(&offline
));
306 else if(V_BOOL(&offline
))
307 FIXME("offline == true\n");
311 if(This
->window
->mon
) {
312 update_doc(This
, UPDATE_TITLE
|UPDATE_UI
);
314 update_doc(This
, UPDATE_TITLE
);
315 set_current_mon(This
->window
, mon
);
318 if(This
->doc_obj
->client
) {
319 IOleCommandTarget
*cmdtrg
= NULL
;
321 hres
= IOleClientSite_QueryInterface(This
->doc_obj
->client
, &IID_IOleCommandTarget
,
323 if(SUCCEEDED(hres
)) {
326 if(!navigated_binding
) {
329 IOleCommandTarget_Exec(cmdtrg
, &CGID_ShellDocView
, 37, 0, &var
, NULL
);
331 V_VT(&var
) = VT_UNKNOWN
;
332 V_UNKNOWN(&var
) = (IUnknown
*)&This
->window
->IHTMLWindow2_iface
;
333 V_VT(&out
) = VT_EMPTY
;
334 hres
= IOleCommandTarget_Exec(cmdtrg
, &CGID_ShellDocView
, 63, 0, &var
, &out
);
339 IOleCommandTarget_Release(cmdtrg
);
344 HRESULT
set_moniker(HTMLDocument
*This
, IMoniker
*mon
, IBindCtx
*pibc
, nsChannelBSC
*async_bsc
, BOOL set_download
)
346 download_proc_task_t
*download_task
;
347 nsChannelBSC
*bscallback
;
352 hres
= IMoniker_GetDisplayName(mon
, pibc
, NULL
, &url
);
354 WARN("GetDiaplayName failed: %08x\n", hres
);
358 TRACE("got url: %s\n", debugstr_w(url
));
360 set_ready_state(This
->window
, READYSTATE_LOADING
);
362 hres
= create_doc_uri(This
->window
, url
, &nsuri
);
363 if(SUCCEEDED(hres
)) {
365 bscallback
= async_bsc
;
367 hres
= create_channelbsc(mon
, NULL
, NULL
, 0, &bscallback
);
370 if(SUCCEEDED(hres
)) {
371 remove_target_tasks(This
->task_magic
);
372 abort_document_bindings(This
->doc_node
);
374 hres
= load_nsuri(This
->window
, nsuri
, bscallback
, 0/*LOAD_INITIAL_DOCUMENT_URI*/);
375 nsISupports_Release((nsISupports
*)nsuri
); /* FIXME */
377 set_window_bscallback(This
->window
, bscallback
);
378 if(bscallback
!= async_bsc
)
379 IUnknown_Release((IUnknown
*)bscallback
);
387 HTMLDocument_LockContainer(This
->doc_obj
, TRUE
);
389 if(This
->doc_obj
->frame
) {
392 task
= heap_alloc(sizeof(docobj_task_t
));
393 task
->doc
= This
->doc_obj
;
394 push_task(&task
->header
, set_progress_proc
, NULL
, This
->doc_obj
->basedoc
.task_magic
);
397 download_task
= heap_alloc(sizeof(download_proc_task_t
));
398 download_task
->doc
= This
->doc_obj
;
399 download_task
->set_download
= set_download
;
400 download_task
->url
= url
;
401 push_task(&download_task
->header
, set_downloading_proc
, set_downloading_task_destr
, This
->doc_obj
->basedoc
.task_magic
);
406 void set_ready_state(HTMLWindow
*window
, READYSTATE readystate
)
408 window
->readystate
= readystate
;
410 if(window
->doc_obj
&& window
->doc_obj
->basedoc
.window
== window
)
411 call_property_onchanged(&window
->doc_obj
->basedoc
.cp_propnotif
, DISPID_READYSTATE
);
413 fire_event(window
->doc
, EVENTID_READYSTATECHANGE
, FALSE
, window
->doc
->node
.nsnode
, NULL
);
415 if(window
->frame_element
)
416 fire_event(window
->frame_element
->element
.node
.doc
, EVENTID_READYSTATECHANGE
,
417 TRUE
, window
->frame_element
->element
.node
.nsnode
, NULL
);
420 static HRESULT
get_doc_string(HTMLDocumentNode
*This
, char **str
)
429 WARN("NULL nsdoc\n");
433 nsres
= nsIDOMHTMLDocument_QueryInterface(This
->nsdoc
, &IID_nsIDOMNode
, (void**)&nsnode
);
434 if(NS_FAILED(nsres
)) {
435 ERR("Could not get nsIDOMNode failed: %08x\n", nsres
);
439 nsAString_Init(&nsstr
, NULL
);
440 hres
= nsnode_to_nsstring(nsnode
, &nsstr
);
441 nsIDOMNode_Release(nsnode
);
443 nsAString_Finish(&nsstr
);
447 nsAString_GetData(&nsstr
, &strw
);
448 TRACE("%s\n", debugstr_w(strw
));
450 *str
= heap_strdupWtoA(strw
);
452 nsAString_Finish(&nsstr
);
455 return E_OUTOFMEMORY
;
460 /**********************************************************
461 * IPersistMoniker implementation
464 static inline HTMLDocument
*impl_from_IPersistMoniker(IPersistMoniker
*iface
)
466 return CONTAINING_RECORD(iface
, HTMLDocument
, IPersistMoniker_iface
);
469 static HRESULT WINAPI
PersistMoniker_QueryInterface(IPersistMoniker
*iface
, REFIID riid
, void **ppv
)
471 HTMLDocument
*This
= impl_from_IPersistMoniker(iface
);
472 return htmldoc_query_interface(This
, riid
, ppv
);
475 static ULONG WINAPI
PersistMoniker_AddRef(IPersistMoniker
*iface
)
477 HTMLDocument
*This
= impl_from_IPersistMoniker(iface
);
478 return htmldoc_addref(This
);
481 static ULONG WINAPI
PersistMoniker_Release(IPersistMoniker
*iface
)
483 HTMLDocument
*This
= impl_from_IPersistMoniker(iface
);
484 return htmldoc_release(This
);
487 static HRESULT WINAPI
PersistMoniker_GetClassID(IPersistMoniker
*iface
, CLSID
*pClassID
)
489 HTMLDocument
*This
= impl_from_IPersistMoniker(iface
);
490 return IPersist_GetClassID(&This
->IPersistFile_iface
, pClassID
);
493 static HRESULT WINAPI
PersistMoniker_IsDirty(IPersistMoniker
*iface
)
495 HTMLDocument
*This
= impl_from_IPersistMoniker(iface
);
497 TRACE("(%p)\n", This
);
499 return IPersistStreamInit_IsDirty(&This
->IPersistStreamInit_iface
);
502 static HRESULT WINAPI
PersistMoniker_Load(IPersistMoniker
*iface
, BOOL fFullyAvailable
,
503 IMoniker
*pimkName
, LPBC pibc
, DWORD grfMode
)
505 HTMLDocument
*This
= impl_from_IPersistMoniker(iface
);
508 TRACE("(%p)->(%x %p %p %08x)\n", This
, fFullyAvailable
, pimkName
, pibc
, grfMode
);
511 IUnknown
*unk
= NULL
;
515 * "__PrecreatedObject"
516 * "BIND_CONTEXT_PARAM"
517 * "__HTMLLOADOPTIONS"
520 * "_ITransData_Object_"
524 IBindCtx_GetObjectParam(pibc
, (LPOLESTR
)SZ_HTML_CLIENTSITE_OBJECTPARAM
, &unk
);
526 IOleClientSite
*client
= NULL
;
528 hres
= IUnknown_QueryInterface(unk
, &IID_IOleClientSite
, (void**)&client
);
529 if(SUCCEEDED(hres
)) {
530 TRACE("Got client site %p\n", client
);
531 IOleObject_SetClientSite(&This
->IOleObject_iface
, client
);
532 IOleClientSite_Release(client
);
535 IUnknown_Release(unk
);
539 prepare_for_binding(This
, pimkName
, FALSE
);
540 hres
= set_moniker(This
, pimkName
, pibc
, NULL
, TRUE
);
544 return start_binding(This
->window
, NULL
, (BSCallback
*)This
->window
->bscallback
, pibc
);
547 static HRESULT WINAPI
PersistMoniker_Save(IPersistMoniker
*iface
, IMoniker
*pimkName
,
548 LPBC pbc
, BOOL fRemember
)
550 HTMLDocument
*This
= impl_from_IPersistMoniker(iface
);
551 FIXME("(%p)->(%p %p %x)\n", This
, pimkName
, pbc
, fRemember
);
555 static HRESULT WINAPI
PersistMoniker_SaveCompleted(IPersistMoniker
*iface
, IMoniker
*pimkName
, LPBC pibc
)
557 HTMLDocument
*This
= impl_from_IPersistMoniker(iface
);
558 FIXME("(%p)->(%p %p)\n", This
, pimkName
, pibc
);
562 static HRESULT WINAPI
PersistMoniker_GetCurMoniker(IPersistMoniker
*iface
, IMoniker
**ppimkName
)
564 HTMLDocument
*This
= impl_from_IPersistMoniker(iface
);
566 TRACE("(%p)->(%p)\n", This
, ppimkName
);
568 if(!This
->window
|| !This
->window
->mon
)
571 IMoniker_AddRef(This
->window
->mon
);
572 *ppimkName
= This
->window
->mon
;
576 static const IPersistMonikerVtbl PersistMonikerVtbl
= {
577 PersistMoniker_QueryInterface
,
578 PersistMoniker_AddRef
,
579 PersistMoniker_Release
,
580 PersistMoniker_GetClassID
,
581 PersistMoniker_IsDirty
,
584 PersistMoniker_SaveCompleted
,
585 PersistMoniker_GetCurMoniker
588 /**********************************************************
589 * IMonikerProp implementation
592 static inline HTMLDocument
*impl_from_IMonikerProp(IMonikerProp
*iface
)
594 return CONTAINING_RECORD(iface
, HTMLDocument
, IMonikerProp_iface
);
597 static HRESULT WINAPI
MonikerProp_QueryInterface(IMonikerProp
*iface
, REFIID riid
, void **ppv
)
599 HTMLDocument
*This
= impl_from_IMonikerProp(iface
);
600 return htmldoc_query_interface(This
, riid
, ppv
);
603 static ULONG WINAPI
MonikerProp_AddRef(IMonikerProp
*iface
)
605 HTMLDocument
*This
= impl_from_IMonikerProp(iface
);
606 return htmldoc_addref(This
);
609 static ULONG WINAPI
MonikerProp_Release(IMonikerProp
*iface
)
611 HTMLDocument
*This
= impl_from_IMonikerProp(iface
);
612 return htmldoc_release(This
);
615 static HRESULT WINAPI
MonikerProp_PutProperty(IMonikerProp
*iface
, MONIKERPROPERTY mkp
, LPCWSTR val
)
617 HTMLDocument
*This
= impl_from_IMonikerProp(iface
);
619 TRACE("(%p)->(%d %s)\n", This
, mkp
, debugstr_w(val
));
623 heap_free(This
->doc_obj
->mime
);
624 This
->doc_obj
->mime
= heap_strdupW(val
);
631 FIXME("mkp %d\n", mkp
);
638 static const IMonikerPropVtbl MonikerPropVtbl
= {
639 MonikerProp_QueryInterface
,
642 MonikerProp_PutProperty
645 /**********************************************************
646 * IPersistFile implementation
649 static inline HTMLDocument
*impl_from_IPersistFile(IPersistFile
*iface
)
651 return CONTAINING_RECORD(iface
, HTMLDocument
, IPersistFile_iface
);
654 static HRESULT WINAPI
PersistFile_QueryInterface(IPersistFile
*iface
, REFIID riid
, void **ppv
)
656 HTMLDocument
*This
= impl_from_IPersistFile(iface
);
657 return htmldoc_query_interface(This
, riid
, ppv
);
660 static ULONG WINAPI
PersistFile_AddRef(IPersistFile
*iface
)
662 HTMLDocument
*This
= impl_from_IPersistFile(iface
);
663 return htmldoc_addref(This
);
666 static ULONG WINAPI
PersistFile_Release(IPersistFile
*iface
)
668 HTMLDocument
*This
= impl_from_IPersistFile(iface
);
669 return htmldoc_release(This
);
672 static HRESULT WINAPI
PersistFile_GetClassID(IPersistFile
*iface
, CLSID
*pClassID
)
674 HTMLDocument
*This
= impl_from_IPersistFile(iface
);
676 TRACE("(%p)->(%p)\n", This
, pClassID
);
681 *pClassID
= CLSID_HTMLDocument
;
685 static HRESULT WINAPI
PersistFile_IsDirty(IPersistFile
*iface
)
687 HTMLDocument
*This
= impl_from_IPersistFile(iface
);
689 TRACE("(%p)\n", This
);
691 return IPersistStreamInit_IsDirty(&This
->IPersistStreamInit_iface
);
694 static HRESULT WINAPI
PersistFile_Load(IPersistFile
*iface
, LPCOLESTR pszFileName
, DWORD dwMode
)
696 HTMLDocument
*This
= impl_from_IPersistFile(iface
);
697 FIXME("(%p)->(%s %08x)\n", This
, debugstr_w(pszFileName
), dwMode
);
701 static HRESULT WINAPI
PersistFile_Save(IPersistFile
*iface
, LPCOLESTR pszFileName
, BOOL fRemember
)
703 HTMLDocument
*This
= impl_from_IPersistFile(iface
);
709 TRACE("(%p)->(%s %x)\n", This
, debugstr_w(pszFileName
), fRemember
);
711 file
= CreateFileW(pszFileName
, GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
,
712 FILE_ATTRIBUTE_NORMAL
, NULL
);
713 if(file
== INVALID_HANDLE_VALUE
) {
714 WARN("Could not create file: %u\n", GetLastError());
718 hres
= get_doc_string(This
->doc_node
, &str
);
720 WriteFile(file
, str
, strlen(str
), &written
, NULL
);
726 static HRESULT WINAPI
PersistFile_SaveCompleted(IPersistFile
*iface
, LPCOLESTR pszFileName
)
728 HTMLDocument
*This
= impl_from_IPersistFile(iface
);
729 FIXME("(%p)->(%s)\n", This
, debugstr_w(pszFileName
));
733 static HRESULT WINAPI
PersistFile_GetCurFile(IPersistFile
*iface
, LPOLESTR
*pszFileName
)
735 HTMLDocument
*This
= impl_from_IPersistFile(iface
);
736 FIXME("(%p)->(%p)\n", This
, pszFileName
);
740 static const IPersistFileVtbl PersistFileVtbl
= {
741 PersistFile_QueryInterface
,
744 PersistFile_GetClassID
,
748 PersistFile_SaveCompleted
,
749 PersistFile_GetCurFile
752 static inline HTMLDocument
*impl_from_IPersistStreamInit(IPersistStreamInit
*iface
)
754 return CONTAINING_RECORD(iface
, HTMLDocument
, IPersistStreamInit_iface
);
757 static HRESULT WINAPI
PersistStreamInit_QueryInterface(IPersistStreamInit
*iface
,
758 REFIID riid
, void **ppv
)
760 HTMLDocument
*This
= impl_from_IPersistStreamInit(iface
);
761 return htmldoc_query_interface(This
, riid
, ppv
);
764 static ULONG WINAPI
PersistStreamInit_AddRef(IPersistStreamInit
*iface
)
766 HTMLDocument
*This
= impl_from_IPersistStreamInit(iface
);
767 return htmldoc_addref(This
);
770 static ULONG WINAPI
PersistStreamInit_Release(IPersistStreamInit
*iface
)
772 HTMLDocument
*This
= impl_from_IPersistStreamInit(iface
);
773 return htmldoc_release(This
);
776 static HRESULT WINAPI
PersistStreamInit_GetClassID(IPersistStreamInit
*iface
, CLSID
*pClassID
)
778 HTMLDocument
*This
= impl_from_IPersistStreamInit(iface
);
779 return IPersist_GetClassID(&This
->IPersistFile_iface
, pClassID
);
782 static HRESULT WINAPI
PersistStreamInit_IsDirty(IPersistStreamInit
*iface
)
784 HTMLDocument
*This
= impl_from_IPersistStreamInit(iface
);
786 TRACE("(%p)\n", This
);
788 if(This
->doc_obj
->usermode
== EDITMODE
)
789 return editor_is_dirty(This
);
794 static HRESULT WINAPI
PersistStreamInit_Load(IPersistStreamInit
*iface
, LPSTREAM pStm
)
796 HTMLDocument
*This
= impl_from_IPersistStreamInit(iface
);
800 static const WCHAR about_blankW
[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
802 TRACE("(%p)->(%p)\n", This
, pStm
);
804 hres
= CreateURLMoniker(NULL
, about_blankW
, &mon
);
806 WARN("CreateURLMoniker failed: %08x\n", hres
);
810 prepare_for_binding(This
, mon
, FALSE
);
811 hres
= set_moniker(This
, mon
, NULL
, NULL
, TRUE
);
812 IMoniker_Release(mon
);
816 return channelbsc_load_stream(This
->window
->bscallback
, pStm
);
819 static HRESULT WINAPI
PersistStreamInit_Save(IPersistStreamInit
*iface
, LPSTREAM pStm
,
822 HTMLDocument
*This
= impl_from_IPersistStreamInit(iface
);
827 TRACE("(%p)->(%p %x)\n", This
, pStm
, fClearDirty
);
829 hres
= get_doc_string(This
->doc_node
, &str
);
833 hres
= IStream_Write(pStm
, str
, strlen(str
), &written
);
835 FIXME("Write failed: %08x\n", hres
);
840 set_dirty(This
, VARIANT_FALSE
);
845 static HRESULT WINAPI
PersistStreamInit_GetSizeMax(IPersistStreamInit
*iface
,
846 ULARGE_INTEGER
*pcbSize
)
848 HTMLDocument
*This
= impl_from_IPersistStreamInit(iface
);
849 FIXME("(%p)->(%p)\n", This
, pcbSize
);
853 static HRESULT WINAPI
PersistStreamInit_InitNew(IPersistStreamInit
*iface
)
855 HTMLDocument
*This
= impl_from_IPersistStreamInit(iface
);
859 static const WCHAR about_blankW
[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
861 TRACE("(%p)\n", This
);
863 hres
= CreateURLMoniker(NULL
, about_blankW
, &mon
);
865 WARN("CreateURLMoniker failed: %08x\n", hres
);
869 prepare_for_binding(This
, mon
, FALSE
);
870 hres
= set_moniker(This
, mon
, NULL
, NULL
, FALSE
);
871 IMoniker_Release(mon
);
875 return channelbsc_load_stream(This
->window
->bscallback
, NULL
);
878 static const IPersistStreamInitVtbl PersistStreamInitVtbl
= {
879 PersistStreamInit_QueryInterface
,
880 PersistStreamInit_AddRef
,
881 PersistStreamInit_Release
,
882 PersistStreamInit_GetClassID
,
883 PersistStreamInit_IsDirty
,
884 PersistStreamInit_Load
,
885 PersistStreamInit_Save
,
886 PersistStreamInit_GetSizeMax
,
887 PersistStreamInit_InitNew
890 /**********************************************************
891 * IPersistHistory implementation
894 static inline HTMLDocument
*impl_from_IPersistHistory(IPersistHistory
*iface
)
896 return CONTAINING_RECORD(iface
, HTMLDocument
, IPersistHistory_iface
);
899 static HRESULT WINAPI
PersistHistory_QueryInterface(IPersistHistory
*iface
, REFIID riid
, void **ppv
)
901 HTMLDocument
*This
= impl_from_IPersistHistory(iface
);
902 return htmldoc_query_interface(This
, riid
, ppv
);
905 static ULONG WINAPI
PersistHistory_AddRef(IPersistHistory
*iface
)
907 HTMLDocument
*This
= impl_from_IPersistHistory(iface
);
908 return htmldoc_addref(This
);
911 static ULONG WINAPI
PersistHistory_Release(IPersistHistory
*iface
)
913 HTMLDocument
*This
= impl_from_IPersistHistory(iface
);
914 return htmldoc_release(This
);
917 static HRESULT WINAPI
PersistHistory_GetClassID(IPersistHistory
*iface
, CLSID
*pClassID
)
919 HTMLDocument
*This
= impl_from_IPersistHistory(iface
);
920 return IPersist_GetClassID(&This
->IPersistFile_iface
, pClassID
);
923 static HRESULT WINAPI
PersistHistory_LoadHistory(IPersistHistory
*iface
, IStream
*pStream
, IBindCtx
*pbc
)
925 HTMLDocument
*This
= impl_from_IPersistHistory(iface
);
926 FIXME("(%p)->(%p %p)\n", This
, pStream
, pbc
);
930 static HRESULT WINAPI
PersistHistory_SaveHistory(IPersistHistory
*iface
, IStream
*pStream
)
932 HTMLDocument
*This
= impl_from_IPersistHistory(iface
);
933 FIXME("(%p)->(%p)\n", This
, pStream
);
937 static HRESULT WINAPI
PersistHistory_SetPositionCookie(IPersistHistory
*iface
, DWORD dwPositioncookie
)
939 HTMLDocument
*This
= impl_from_IPersistHistory(iface
);
940 FIXME("(%p)->(%x)\n", This
, dwPositioncookie
);
944 static HRESULT WINAPI
PersistHistory_GetPositionCookie(IPersistHistory
*iface
, DWORD
*pdwPositioncookie
)
946 HTMLDocument
*This
= impl_from_IPersistHistory(iface
);
947 FIXME("(%p)->(%p)\n", This
, pdwPositioncookie
);
951 static const IPersistHistoryVtbl PersistHistoryVtbl
= {
952 PersistHistory_QueryInterface
,
953 PersistHistory_AddRef
,
954 PersistHistory_Release
,
955 PersistHistory_GetClassID
,
956 PersistHistory_LoadHistory
,
957 PersistHistory_SaveHistory
,
958 PersistHistory_SetPositionCookie
,
959 PersistHistory_GetPositionCookie
962 void HTMLDocument_Persist_Init(HTMLDocument
*This
)
964 This
->IPersistMoniker_iface
.lpVtbl
= &PersistMonikerVtbl
;
965 This
->IPersistFile_iface
.lpVtbl
= &PersistFileVtbl
;
966 This
->IMonikerProp_iface
.lpVtbl
= &MonikerPropVtbl
;
967 This
->IPersistStreamInit_iface
.lpVtbl
= &PersistStreamInitVtbl
;
968 This
->IPersistHistory_iface
.lpVtbl
= &PersistHistoryVtbl
;