diff --git a/dlls/mshtml/Makefile.in b/dlls/mshtml/Makefile.in index e50b8f8ec3d..097ba70d9c8 100644 --- a/dlls/mshtml/Makefile.in +++ b/dlls/mshtml/Makefile.in @@ -1,7 +1,7 @@ MODULE = mshtml.dll IMPORTLIB = mshtml IMPORTS = strmiids uuid urlmon shlwapi shell32 ole32 oleaut32 user32 gdi32 advapi32 -DELAYIMPORTS = wininet +DELAYIMPORTS = wininet inetcomm C_SRCS = \ conpoint.c \ diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 940519af7af..b672c2d7cd1 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -5075,7 +5075,7 @@ static dispex_static_data_t HTMLDocumentObj_dispex = { HTMLDocumentObj_iface_tids }; -HRESULT HTMLDocument_Create(IUnknown *outer, REFIID riid, void **ppv) +static HRESULT create_document_object(BOOL is_mhtml, IUnknown *outer, REFIID riid, void **ppv) { mozIDOMWindowProxy *mozwindow; HTMLDocumentObj *doc; @@ -5083,8 +5083,6 @@ HRESULT HTMLDocument_Create(IUnknown *outer, REFIID riid, void **ppv) nsresult nsres; HRESULT hres; - TRACE("(%p %s %p)\n", outer, debugstr_mshtml_guid(riid), ppv); - if(outer && !IsEqualGUID(&IID_IUnknown, riid)) { *ppv = NULL; return E_INVALIDARG; @@ -5102,6 +5100,7 @@ HRESULT HTMLDocument_Create(IUnknown *outer, REFIID riid, void **ppv) init_doc(&doc->basedoc, outer ? outer : &doc->IUnknown_outer, &doc->dispex.IDispatchEx_iface); TargetContainer_Init(doc); doc->basedoc.doc_obj = doc; + doc->is_mhtml = is_mhtml; doc->usermode = UNKNOWN_USERMODE; @@ -5149,8 +5148,14 @@ HRESULT HTMLDocument_Create(IUnknown *outer, REFIID riid, void **ppv) return S_OK; } +HRESULT HTMLDocument_Create(IUnknown *outer, REFIID riid, void **ppv) +{ + TRACE("(%p %s %p)\n", outer, debugstr_mshtml_guid(riid), ppv); + return create_document_object(FALSE, outer, riid, ppv); +} + HRESULT MHTMLDocument_Create(IUnknown *outer, REFIID riid, void **ppv) { - FIXME("(%p %s %p)\n", outer, debugstr_mshtml_guid(riid), ppv); - return E_NOTIMPL; + TRACE("(%p %s %p)\n", outer, debugstr_mshtml_guid(riid), ppv); + return create_document_object(TRUE, outer, riid, ppv); } diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 9c8b94cc8a1..f27b6743a9a 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -640,6 +640,7 @@ struct HTMLDocumentObj { HWND hwnd; HWND tooltips_hwnd; + BOOL is_mhtml; BOOL request_uiactivate; BOOL in_place_active; BOOL ui_active; diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c index 2735ab570f0..363a95538d4 100644 --- a/dlls/mshtml/persist.c +++ b/dlls/mshtml/persist.c @@ -29,6 +29,7 @@ #include "ole2.h" #include "shlguid.h" #include "idispids.h" +#include "mimeole.h" #define NO_SHLWAPI_REG #include "shlwapi.h" @@ -587,6 +588,7 @@ static HRESULT WINAPI PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAva IMoniker *pimkName, LPBC pibc, DWORD grfMode) { HTMLDocument *This = impl_from_IPersistMoniker(iface); + IMoniker *mon; HRESULT hres; TRACE("(%p)->(%x %p %p %08x)\n", This, fFullyAvailable, pimkName, pibc, grfMode); @@ -620,9 +622,22 @@ static HRESULT WINAPI PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAva } } - prepare_for_binding(This, pimkName, FALSE); + if(This->doc_obj->is_mhtml) { + IUnknown *unk; + + hres = MimeOleObjectFromMoniker(0, pimkName, pibc, &IID_IUnknown, (void**)&unk, &mon); + if(FAILED(hres)) + return hres; + IUnknown_Release(unk); + pibc = NULL; + }else { + IMoniker_AddRef(mon = pimkName); + } + + prepare_for_binding(This, mon, FALSE); call_docview_84(This->doc_obj); - hres = set_moniker(This->window, pimkName, NULL, pibc, NULL, TRUE); + hres = set_moniker(This->window, mon, NULL, pibc, NULL, TRUE); + IMoniker_Release(mon); if(FAILED(hres)) return hres;