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 #include "wine/debug.h"
36 #include "wine/unicode.h"
38 #include "mshtml_private.h"
40 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
42 static BOOL use_gecko_script(LPCWSTR url)
44 static const WCHAR fileW[] = {'f','i','l','e',':'};
45 static const WCHAR aboutW[] = {'a','b','o','u','t',':'};
47 return strncmpiW(fileW, url, sizeof(fileW)/sizeof(WCHAR))
48 && strncmpiW(aboutW, url, sizeof(aboutW)/sizeof(WCHAR));
51 void set_current_mon(HTMLDocument *This, IMoniker *mon)
56 IMoniker_Release(This->mon);
61 CoTaskMemFree(This->url);
71 hres = IMoniker_GetDisplayName(mon, NULL, NULL, &This->url);
73 WARN("GetDisplayName failed: %08x\n", hres);
75 set_script_mode(This->window, use_gecko_script(This->url) ? SCRIPTMODE_GECKO : SCRIPTMODE_ACTIVESCRIPT);
78 static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, BOOL *bind_complete)
80 nsChannelBSC *bscallback;
91 * "__PrecreatedObject"
92 * "BIND_CONTEXT_PARAM"
97 * "_ITransData_Object_"
101 IBindCtx_GetObjectParam(pibc, (LPOLESTR)SZ_HTML_CLIENTSITE_OBJECTPARAM, &unk);
103 IOleClientSite *client = NULL;
105 hres = IUnknown_QueryInterface(unk, &IID_IOleClientSite, (void**)&client);
106 if(SUCCEEDED(hres)) {
107 TRACE("Got client site %p\n", client);
108 IOleObject_SetClientSite(OLEOBJ(This), client);
109 IOleClientSite_Release(client);
112 IUnknown_Release(unk);
116 This->readystate = READYSTATE_LOADING;
117 call_property_onchanged(&This->cp_propnotif, DISPID_READYSTATE);
118 update_doc(This, UPDATE_TITLE);
120 HTMLDocument_LockContainer(This, TRUE);
122 hres = IMoniker_GetDisplayName(mon, pibc, NULL, &url);
124 WARN("GetDiaplayName failed: %08x\n", hres);
128 TRACE("got url: %s\n", debugstr_w(url));
130 set_current_mon(This, mon);
133 VARIANT silent, offline;
134 IOleCommandTarget *cmdtrg = NULL;
136 hres = get_client_disp_property(This->client, DISPID_AMBIENT_SILENT, &silent);
137 if(SUCCEEDED(hres)) {
138 if(V_VT(&silent) != VT_BOOL)
139 WARN("V_VT(silent) = %d\n", V_VT(&silent));
140 else if(V_BOOL(&silent))
141 FIXME("silent == true\n");
144 hres = get_client_disp_property(This->client,
145 DISPID_AMBIENT_OFFLINEIFNOTCONNECTED, &offline);
146 if(SUCCEEDED(hres)) {
147 if(V_VT(&silent) != VT_BOOL)
148 WARN("V_VT(offline) = %d\n", V_VT(&silent));
149 else if(V_BOOL(&silent))
150 FIXME("offline == true\n");
153 hres = IOleClientSite_QueryInterface(This->client, &IID_IOleCommandTarget,
155 if(SUCCEEDED(hres)) {
160 IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 37, 0, &var, NULL);
162 IOleCommandTarget_Release(cmdtrg);
166 bscallback = create_channelbsc(mon);
169 task = heap_alloc(sizeof(task_t));
172 task->task_id = TASK_SETPROGRESS;
178 task = heap_alloc(sizeof(task_t));
181 task->task_id = TASK_SETDOWNLOADSTATE;
186 if(This->nscontainer) {
187 This->nscontainer->bscallback = bscallback;
188 nsres = nsIWebNavigation_LoadURI(This->nscontainer->navigation, url,
189 LOAD_FLAGS_NONE, NULL, NULL, NULL);
190 This->nscontainer->bscallback = NULL;
191 if(NS_FAILED(nsres)) {
192 WARN("LoadURI failed: %08x\n", nsres);
193 IUnknown_Release((IUnknown*)bscallback);
199 set_document_bscallback(This, bscallback);
200 IUnknown_Release((IUnknown*)bscallback);
204 *bind_complete = FALSE;
208 static HRESULT get_doc_string(HTMLDocument *This, char **str)
216 WARN("NULL nsdoc\n");
220 nsres = nsIDOMHTMLDocument_QueryInterface(This->nsdoc, &IID_nsIDOMNode, (void**)&nsnode);
221 if(NS_FAILED(nsres)) {
222 ERR("Could not get nsIDOMNode failed: %08x\n", nsres);
226 nsAString_Init(&nsstr, NULL);
227 nsnode_to_nsstring(nsnode, &nsstr);
228 nsIDOMNode_Release(nsnode);
230 nsAString_GetData(&nsstr, &strw);
231 TRACE("%s\n", debugstr_w(strw));
233 *str = heap_strdupWtoA(strw);
235 nsAString_Finish(&nsstr);
241 /**********************************************************
242 * IPersistMoniker implementation
245 #define PERSISTMON_THIS(iface) DEFINE_THIS(HTMLDocument, PersistMoniker, iface)
247 static HRESULT WINAPI PersistMoniker_QueryInterface(IPersistMoniker *iface, REFIID riid,
250 HTMLDocument *This = PERSISTMON_THIS(iface);
251 return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppvObject);
254 static ULONG WINAPI PersistMoniker_AddRef(IPersistMoniker *iface)
256 HTMLDocument *This = PERSISTMON_THIS(iface);
257 return IHTMLDocument2_AddRef(HTMLDOC(This));
260 static ULONG WINAPI PersistMoniker_Release(IPersistMoniker *iface)
262 HTMLDocument *This = PERSISTMON_THIS(iface);
263 return IHTMLDocument2_Release(HTMLDOC(This));
266 static HRESULT WINAPI PersistMoniker_GetClassID(IPersistMoniker *iface, CLSID *pClassID)
268 HTMLDocument *This = PERSISTMON_THIS(iface);
269 return IPersist_GetClassID(PERSIST(This), pClassID);
272 static HRESULT WINAPI PersistMoniker_IsDirty(IPersistMoniker *iface)
274 HTMLDocument *This = PERSISTMON_THIS(iface);
276 TRACE("(%p)\n", This);
278 return IPersistStreamInit_IsDirty(PERSTRINIT(This));
281 static HRESULT WINAPI PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAvailable,
282 IMoniker *pimkName, LPBC pibc, DWORD grfMode)
284 HTMLDocument *This = PERSISTMON_THIS(iface);
285 BOOL bind_complete = FALSE;
288 TRACE("(%p)->(%x %p %p %08x)\n", This, fFullyAvailable, pimkName, pibc, grfMode);
290 hres = set_moniker(This, pimkName, pibc, &bind_complete);
295 return start_binding(This, (BSCallback*)This->bscallback, pibc);
300 static HRESULT WINAPI PersistMoniker_Save(IPersistMoniker *iface, IMoniker *pimkName,
301 LPBC pbc, BOOL fRemember)
303 HTMLDocument *This = PERSISTMON_THIS(iface);
304 FIXME("(%p)->(%p %p %x)\n", This, pimkName, pbc, fRemember);
308 static HRESULT WINAPI PersistMoniker_SaveCompleted(IPersistMoniker *iface, IMoniker *pimkName, LPBC pibc)
310 HTMLDocument *This = PERSISTMON_THIS(iface);
311 FIXME("(%p)->(%p %p)\n", This, pimkName, pibc);
315 static HRESULT WINAPI PersistMoniker_GetCurMoniker(IPersistMoniker *iface, IMoniker **ppimkName)
317 HTMLDocument *This = PERSISTMON_THIS(iface);
319 TRACE("(%p)->(%p)\n", This, ppimkName);
324 IMoniker_AddRef(This->mon);
325 *ppimkName = This->mon;
329 static const IPersistMonikerVtbl PersistMonikerVtbl = {
330 PersistMoniker_QueryInterface,
331 PersistMoniker_AddRef,
332 PersistMoniker_Release,
333 PersistMoniker_GetClassID,
334 PersistMoniker_IsDirty,
337 PersistMoniker_SaveCompleted,
338 PersistMoniker_GetCurMoniker
341 /**********************************************************
342 * IMonikerProp implementation
345 #define MONPROP_THIS(iface) DEFINE_THIS(HTMLDocument, MonikerProp, iface)
347 static HRESULT WINAPI MonikerProp_QueryInterface(IMonikerProp *iface, REFIID riid, void **ppvObject)
349 HTMLDocument *This = MONPROP_THIS(iface);
350 return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppvObject);
353 static ULONG WINAPI MonikerProp_AddRef(IMonikerProp *iface)
355 HTMLDocument *This = MONPROP_THIS(iface);
356 return IHTMLDocument2_AddRef(HTMLDOC(This));
359 static ULONG WINAPI MonikerProp_Release(IMonikerProp *iface)
361 HTMLDocument *This = MONPROP_THIS(iface);
362 return IHTMLDocument_Release(HTMLDOC(This));
365 static HRESULT WINAPI MonikerProp_PutProperty(IMonikerProp *iface, MONIKERPROPERTY mkp, LPCWSTR val)
367 HTMLDocument *This = MONPROP_THIS(iface);
369 TRACE("(%p)->(%d %s)\n", This, mkp, debugstr_w(val));
373 heap_free(This->mime);
374 This->mime = heap_strdupW(val);
381 FIXME("mkp %d\n", mkp);
388 static const IMonikerPropVtbl MonikerPropVtbl = {
389 MonikerProp_QueryInterface,
392 MonikerProp_PutProperty
395 /**********************************************************
396 * IPersistFile implementation
399 #define PERSISTFILE_THIS(iface) DEFINE_THIS(HTMLDocument, PersistFile, iface)
401 static HRESULT WINAPI PersistFile_QueryInterface(IPersistFile *iface, REFIID riid, void **ppvObject)
403 HTMLDocument *This = PERSISTFILE_THIS(iface);
404 return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppvObject);
407 static ULONG WINAPI PersistFile_AddRef(IPersistFile *iface)
409 HTMLDocument *This = PERSISTFILE_THIS(iface);
410 return IHTMLDocument2_AddRef(HTMLDOC(This));
413 static ULONG WINAPI PersistFile_Release(IPersistFile *iface)
415 HTMLDocument *This = PERSISTFILE_THIS(iface);
416 return IHTMLDocument2_Release(HTMLDOC(This));
419 static HRESULT WINAPI PersistFile_GetClassID(IPersistFile *iface, CLSID *pClassID)
421 HTMLDocument *This = PERSISTFILE_THIS(iface);
423 TRACE("(%p)->(%p)\n", This, pClassID);
428 *pClassID = CLSID_HTMLDocument;
432 static HRESULT WINAPI PersistFile_IsDirty(IPersistFile *iface)
434 HTMLDocument *This = PERSISTFILE_THIS(iface);
436 TRACE("(%p)\n", This);
438 return IPersistStreamInit_IsDirty(PERSTRINIT(This));
441 static HRESULT WINAPI PersistFile_Load(IPersistFile *iface, LPCOLESTR pszFileName, DWORD dwMode)
443 HTMLDocument *This = PERSISTFILE_THIS(iface);
444 FIXME("(%p)->(%s %08x)\n", This, debugstr_w(pszFileName), dwMode);
448 static HRESULT WINAPI PersistFile_Save(IPersistFile *iface, LPCOLESTR pszFileName, BOOL fRemember)
450 HTMLDocument *This = PERSISTFILE_THIS(iface);
456 TRACE("(%p)->(%s %x)\n", This, debugstr_w(pszFileName), fRemember);
458 file = CreateFileW(pszFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
459 FILE_ATTRIBUTE_NORMAL, NULL);
460 if(file == INVALID_HANDLE_VALUE) {
461 WARN("Could not create file: %u\n", GetLastError());
465 hres = get_doc_string(This, &str);
467 WriteFile(file, str, strlen(str), &written, NULL);
473 static HRESULT WINAPI PersistFile_SaveCompleted(IPersistFile *iface, LPCOLESTR pszFileName)
475 HTMLDocument *This = PERSISTFILE_THIS(iface);
476 FIXME("(%p)->(%s)\n", This, debugstr_w(pszFileName));
480 static HRESULT WINAPI PersistFile_GetCurFile(IPersistFile *iface, LPOLESTR *pszFileName)
482 HTMLDocument *This = PERSISTFILE_THIS(iface);
483 FIXME("(%p)->(%p)\n", This, pszFileName);
487 static const IPersistFileVtbl PersistFileVtbl = {
488 PersistFile_QueryInterface,
491 PersistFile_GetClassID,
495 PersistFile_SaveCompleted,
496 PersistFile_GetCurFile
499 #define PERSTRINIT_THIS(iface) DEFINE_THIS(HTMLDocument, PersistStreamInit, iface)
501 static HRESULT WINAPI PersistStreamInit_QueryInterface(IPersistStreamInit *iface,
502 REFIID riid, void **ppv)
504 HTMLDocument *This = PERSTRINIT_THIS(iface);
505 return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppv);
508 static ULONG WINAPI PersistStreamInit_AddRef(IPersistStreamInit *iface)
510 HTMLDocument *This = PERSTRINIT_THIS(iface);
511 return IHTMLDocument2_AddRef(HTMLDOC(This));
514 static ULONG WINAPI PersistStreamInit_Release(IPersistStreamInit *iface)
516 HTMLDocument *This = PERSTRINIT_THIS(iface);
517 return IHTMLDocument2_Release(HTMLDOC(This));
520 static HRESULT WINAPI PersistStreamInit_GetClassID(IPersistStreamInit *iface, CLSID *pClassID)
522 HTMLDocument *This = PERSTRINIT_THIS(iface);
523 return IPersist_GetClassID(PERSIST(This), pClassID);
526 static HRESULT WINAPI PersistStreamInit_IsDirty(IPersistStreamInit *iface)
528 HTMLDocument *This = PERSTRINIT_THIS(iface);
530 TRACE("(%p)\n", This);
532 if(This->usermode == EDITMODE)
533 return editor_is_dirty(This);
538 static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, LPSTREAM pStm)
540 HTMLDocument *This = PERSTRINIT_THIS(iface);
544 static const WCHAR about_blankW[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
546 TRACE("(%p)->(%p)\n", This, pStm);
548 hres = CreateURLMoniker(NULL, about_blankW, &mon);
550 WARN("CreateURLMoniker failed: %08x\n", hres);
554 hres = set_moniker(This, mon, NULL, NULL);
555 IMoniker_Release(mon);
559 return channelbsc_load_stream(This->bscallback, pStm);
562 static HRESULT WINAPI PersistStreamInit_Save(IPersistStreamInit *iface, LPSTREAM pStm,
565 HTMLDocument *This = PERSTRINIT_THIS(iface);
570 TRACE("(%p)->(%p %x)\n", This, pStm, fClearDirty);
572 hres = get_doc_string(This, &str);
576 hres = IStream_Write(pStm, str, strlen(str), &written);
578 FIXME("Write failed: %08x\n", hres);
583 set_dirty(This, VARIANT_FALSE);
588 static HRESULT WINAPI PersistStreamInit_GetSizeMax(IPersistStreamInit *iface,
589 ULARGE_INTEGER *pcbSize)
591 HTMLDocument *This = PERSTRINIT_THIS(iface);
592 FIXME("(%p)->(%p)\n", This, pcbSize);
596 static HRESULT WINAPI PersistStreamInit_InitNew(IPersistStreamInit *iface)
598 HTMLDocument *This = PERSTRINIT_THIS(iface);
599 FIXME("(%p)\n", This);
603 #undef PERSTRINIT_THIS
605 static const IPersistStreamInitVtbl PersistStreamInitVtbl = {
606 PersistStreamInit_QueryInterface,
607 PersistStreamInit_AddRef,
608 PersistStreamInit_Release,
609 PersistStreamInit_GetClassID,
610 PersistStreamInit_IsDirty,
611 PersistStreamInit_Load,
612 PersistStreamInit_Save,
613 PersistStreamInit_GetSizeMax,
614 PersistStreamInit_InitNew
617 /**********************************************************
618 * IPersistHistory implementation
621 #define PERSISTHIST_THIS(iface) DEFINE_THIS(HTMLDocument, PersistHistory, iface)
623 static HRESULT WINAPI PersistHistory_QueryInterface(IPersistHistory *iface, REFIID riid, void **ppvObject)
625 HTMLDocument *This = PERSISTHIST_THIS(iface);
626 return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppvObject);
629 static ULONG WINAPI PersistHistory_AddRef(IPersistHistory *iface)
631 HTMLDocument *This = PERSISTHIST_THIS(iface);
632 return IHTMLDocument2_AddRef(HTMLDOC(This));
635 static ULONG WINAPI PersistHistory_Release(IPersistHistory *iface)
637 HTMLDocument *This = PERSISTHIST_THIS(iface);
638 return IHTMLDocument2_Release(HTMLDOC(This));
641 static HRESULT WINAPI PersistHistory_GetClassID(IPersistHistory *iface, CLSID *pClassID)
643 HTMLDocument *This = PERSISTHIST_THIS(iface);
644 return IPersist_GetClassID(PERSIST(This), pClassID);
647 static HRESULT WINAPI PersistHistory_LoadHistory(IPersistHistory *iface, IStream *pStream, IBindCtx *pbc)
649 HTMLDocument *This = PERSISTHIST_THIS(iface);
650 FIXME("(%p)->(%p %p)\n", This, pStream, pbc);
654 static HRESULT WINAPI PersistHistory_SaveHistory(IPersistHistory *iface, IStream *pStream)
656 HTMLDocument *This = PERSISTHIST_THIS(iface);
657 FIXME("(%p)->(%p)\n", This, pStream);
661 static HRESULT WINAPI PersistHistory_SetPositionCookie(IPersistHistory *iface, DWORD dwPositioncookie)
663 HTMLDocument *This = PERSISTHIST_THIS(iface);
664 FIXME("(%p)->(%x)\n", This, dwPositioncookie);
668 static HRESULT WINAPI PersistHistory_GetPositionCookie(IPersistHistory *iface, DWORD *pdwPositioncookie)
670 HTMLDocument *This = PERSISTHIST_THIS(iface);
671 FIXME("(%p)->(%p)\n", This, pdwPositioncookie);
675 #undef PERSISTHIST_THIS
677 static const IPersistHistoryVtbl PersistHistoryVtbl = {
678 PersistHistory_QueryInterface,
679 PersistHistory_AddRef,
680 PersistHistory_Release,
681 PersistHistory_GetClassID,
682 PersistHistory_LoadHistory,
683 PersistHistory_SaveHistory,
684 PersistHistory_SetPositionCookie,
685 PersistHistory_GetPositionCookie
688 void HTMLDocument_Persist_Init(HTMLDocument *This)
690 This->lpPersistMonikerVtbl = &PersistMonikerVtbl;
691 This->lpPersistFileVtbl = &PersistFileVtbl;
692 This->lpMonikerPropVtbl = &MonikerPropVtbl;
693 This->lpPersistStreamInitVtbl = &PersistStreamInitVtbl;
694 This->lpPersistHistoryVtbl = &PersistHistoryVtbl;
696 This->bscallback = NULL;