static IHTMLDocument2 *create_doc_from_url(const char *start_url) { BSTR url; IBindCtx *bc; IMoniker *url_mon; IPersistMoniker *persist_mon; IHTMLDocument2 *doc; HRESULT hres; hres = CreateBindCtx(0, &bc); ok(hres == S_OK, "CreateBindCtx failed: 0x%08x\n", hres); url = a2bstr(start_url); hres = CreateURLMoniker(NULL, url, &url_mon); ok(hres == S_OK, "CreateURLMoniker failed: 0x%08x\n", hres); hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER, &IID_IHTMLDocument2, (void**)&doc); ok(hres == S_OK, "CoCreateInstance failed: 0x%08x\n", hres); hres = IHTMLDocument2_QueryInterface(doc, &IID_IPersistMoniker, (void**)&persist_mon); ok(hres == S_OK, "IHTMLDocument2_QueryInterface failed: 0x%08x\n", hres); hres = IPersistMoniker_Load(persist_mon, FALSE, url_mon, bc, STGM_SHARE_EXCLUSIVE | STGM_READWRITE); ok(hres == S_OK, "IPersistMoniker_Load failed: 0x%08x\n", hres); IPersistMoniker_Release(persist_mon); IMoniker_Release(url_mon); IBindCtx_Release(bc); SysFreeString(url); doc_complete = FALSE; notif_doc = doc; do_advise((IUnknown*)doc, &IID_IPropertyNotifySink, (IUnknown*)&PropertyNotifySink); pump_msgs(&doc_complete); return doc; }
static HRESULT http_load_hack(DocHost *This, IMoniker *mon, IBindStatusCallback *callback, IBindCtx *bindctx) { IPersistMoniker *persist; IUnknown *doc; HRESULT hres; /* * FIXME: * We should use URLMoniker's BindToObject instead creating HTMLDocument here. * This should be fixed when mshtml.dll and urlmon.dll will be good enough. */ hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, &IID_IUnknown, (void**)&doc); if(FAILED(hres)) { ERR("Could not create HTMLDocument: %08x\n", hres); return hres; } hres = IUnknown_QueryInterface(doc, &IID_IPersistMoniker, (void**)&persist); if(FAILED(hres)) { IUnknown_Release(doc); return hres; } hres = IPersistMoniker_Load(persist, FALSE, mon, bindctx, 0); IPersistMoniker_Release(persist); if(SUCCEEDED(hres)) hres = IBindStatusCallback_OnObjectAvailable(callback, &IID_IUnknown, doc); else WARN("Load failed: %08x\n", hres); IUnknown_Release(doc); return IBindStatusCallback_OnStopBinding(callback, hres, NULL); }
static HRESULT create_mime_object(Binding *binding, const CLSID *clsid, LPCWSTR clsid_str) { IPersistMoniker *persist; HRESULT hres; hres = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, &binding->iid, (void**)&binding->obj); if(FAILED(hres)) { WARN("CoCreateInstance failed: %08x\n", hres); return INET_E_CANNOT_INSTANTIATE_OBJECT; } binding->state |= BINDING_OBJAVAIL; hres = IUnknown_QueryInterface(binding->obj, &IID_IPersistMoniker, (void**)&persist); if(SUCCEEDED(hres)) { IMonikerProp *prop; hres = IPersistMoniker_QueryInterface(persist, &IID_IMonikerProp, (void**)&prop); if(SUCCEEDED(hres)) { IMonikerProp_PutProperty(prop, MIMETYPEPROP, binding->mime); IMonikerProp_PutProperty(prop, CLASSIDPROP, clsid_str); IMonikerProp_Release(prop); } load_doc_mon(binding, persist); IPersistMoniker_Release(persist); } else { FIXME("Could not get IPersistMoniker: %08x\n", hres); /* FIXME: Try query IPersistFile */ } IBindStatusCallback_OnObjectAvailable(binding->callback, &binding->iid, binding->obj); return S_OK; }
static HRESULT WINAPI XMLView_PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAvailable, IMoniker *pimkName, LPBC pibc, DWORD grfMode) { static const WCHAR XSLParametersW[] = {'X','S','L','P','a','r','a','m','e','t','e','r','s',0}; static const WCHAR XMLBufferStreamW[] = {'X','M','L','B','u','f','f','e','r','S','t','r','e','a','m',0}; static const WCHAR DWNBINDINFOW[] = {'_','_','D','W','N','B','I','N','D','I','N','F','O',0}; static const WCHAR HTMLLOADOPTIONSW[] = {'_','_','H','T','M','L','L','O','A','D','O','P','T','I','O','N','S',0}; static const WCHAR BSCBHolderW[] = { '_','B','S','C','B','_','H','o','l','d','e','r','_',0 }; XMLView *This = impl_from_IPersistMoniker(iface); IPersistMoniker *html_persist_mon; IBindStatusCallback *bsc, *bsc_html; IBindCtx *bindctx; IStream *stream; IMoniker *mon; IUnknown *unk; HRESULT hres; TRACE("(%p)->(%x %p %p %x)\n", This, fFullyAvailable, pimkName, pibc, grfMode); hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)XSLParametersW, &unk); if(SUCCEEDED(hres)) { FIXME("ignoring XSLParameters\n"); IUnknown_Release(unk); } hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)XMLBufferStreamW, &unk); if(SUCCEEDED(hres)) { FIXME("ignoring XMLBufferStream\n"); IUnknown_Release(unk); } hres = CreateBindCtx(0, &bindctx); if(FAILED(hres)) return hres; hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)DWNBINDINFOW, &unk); if(SUCCEEDED(hres)) { IBindCtx_RegisterObjectParam(bindctx, (LPOLESTR)DWNBINDINFOW, unk); IUnknown_Release(unk); } hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)HTMLLOADOPTIONSW, &unk); if(SUCCEEDED(hres)) { IBindCtx_RegisterObjectParam(bindctx, (LPOLESTR)HTMLLOADOPTIONSW, unk); IUnknown_Release(unk); } hres = IBindCtx_GetObjectParam(pibc, (LPOLESTR)SZ_HTML_CLIENTSITE_OBJECTPARAM, &unk); if(SUCCEEDED(hres)) { IBindCtx_RegisterObjectParam(bindctx, (LPOLESTR)SZ_HTML_CLIENTSITE_OBJECTPARAM, unk); IUnknown_Release(unk); } hres = CreateStreamOnHGlobal(NULL, TRUE, &stream); if(FAILED(hres)) { IBindCtx_Release(bindctx); return hres; } if(This->mon) IMoniker_Release(This->mon); This->mon = pimkName; IMoniker_AddRef(This->mon); hres = XMLView_Moniker_Create(This->mon, stream, &mon); if(FAILED(hres)) { IStream_Release(stream); IBindCtx_Release(bindctx); return hres; } hres = IUnknown_QueryInterface(This->html_doc, &IID_IPersistMoniker, (void**)&html_persist_mon); if(FAILED(hres)) { IMoniker_Release(mon); IStream_Release(stream); IBindCtx_Release(bindctx); return hres; } hres = IPersistMoniker_Load(html_persist_mon, FALSE, mon, bindctx, 0); IPersistMoniker_Release(html_persist_mon); IMoniker_Release(mon); if(FAILED(hres)) { IStream_Release(stream); IBindCtx_Release(bindctx); return hres; } hres = IBindCtx_GetObjectParam(bindctx, (LPOLESTR)BSCBHolderW, &unk); IBindCtx_Release(bindctx); if(FAILED(hres)) { IStream_Release(stream); return hres; } hres = IUnknown_QueryInterface(unk, &IID_IBindStatusCallback, (void**)&bsc_html); IUnknown_Release(unk); if(FAILED(hres)) { IStream_Release(stream); return hres; } hres = XMLView_BindStatusCallback_Create(bsc_html, This->mon, stream, &bsc); IStream_Release(stream); if(FAILED(hres)) { IBindStatusCallback_OnStopBinding(bsc_html, hres, NULL); IBindStatusCallback_Release(bsc_html); return hres; } hres = RegisterBindStatusCallback(pibc, bsc, NULL, 0); IBindStatusCallback_Release(bsc); if(FAILED(hres)) { IBindStatusCallback_OnStopBinding(bsc_html, hres, NULL); IBindStatusCallback_Release(bsc_html); return hres; } hres = IMoniker_BindToStorage(pimkName, pibc, NULL, &IID_IStream, (void**)&stream); if(FAILED(hres)) { IBindStatusCallback_OnStopBinding(bsc_html, hres, NULL); IBindStatusCallback_Release(bsc_html); return hres; } if(stream) IStream_Release(stream); IBindStatusCallback_Release(bsc_html); return S_OK; }
static ULONG WINAPI XMLView_OleObject_Release(IOleObject *iface) { XMLView *This = impl_from_IOleObject(iface); return IPersistMoniker_Release(&This->IPersistMoniker_iface); }
static ULONG WINAPI XMLView_PersistHistory_Release(IPersistHistory *iface) { XMLView *This = impl_from_IPersistHistory(iface); return IPersistMoniker_Release(&This->IPersistMoniker_iface); }
static void test_Load(void) { static const WCHAR xmlview_xmlW[] = {'/','x','m','l','/','x','m','l','v','i','e','w','.','x','m','l',0}; static const WCHAR res[] = {'r','e','s',':','/','/',0}; WCHAR buf[1024]; IPersistMoniker *pers_mon; IConnectionPointContainer *cpc; IConnectionPoint *cp; IMoniker *mon; IBindCtx *bctx; IHTMLElement *elem; HRESULT hres; MSG msg; BSTR source; lstrcpyW(buf, res); GetModuleFileNameW(NULL, buf+lstrlenW(buf), (sizeof(buf)-sizeof(res))/sizeof(WCHAR)); lstrcatW(buf, xmlview_xmlW); if(!pCreateURLMoniker) { win_skip("CreateURLMoniker not available\n"); return; } hres = CoCreateInstance(&CLSID_XMLView, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, &IID_IPersistMoniker, (void**)&pers_mon); if(FAILED(hres)) { win_skip("Failed to create XMLView instance\n"); return; } ok(hres == S_OK, "CoCreateInstance returned %x, expected S_OK\n", hres); hres = IPersistMoniker_QueryInterface(pers_mon, &IID_IHTMLDocument2, (void**)&html_doc); ok(hres == S_OK, "QueryInterface(HTMLDocument2) returned %x, expected S_OK\n", hres); hres = IPersistMoniker_QueryInterface(pers_mon, &IID_IConnectionPointContainer, (void**)&cpc); ok(hres == S_OK, "QueryInterface(IConnectionPointContainer) returned %x, expected S_OK\n", hres); hres = IConnectionPointContainer_FindConnectionPoint(cpc, &IID_IDispatch, &cp); ok(hres == S_OK, "FindConnectionPoint returned %x, expected S_OK\n", hres); hres = IConnectionPoint_Advise(cp, (IUnknown*)&HTMLEvents, NULL); ok(hres == S_OK, "Advise returned %x, expected S_OK\n", hres); IConnectionPoint_Release(cp); IConnectionPointContainer_Release(cpc); hres = CreateBindCtx(0, &bctx); ok(hres == S_OK, "CreateBindCtx returned %x, expected S_OK\n", hres); hres = pCreateURLMoniker(NULL, buf, &mon); ok(hres == S_OK, "CreateUrlMoniker returned %x, expected S_OK\n", hres); loaded = FALSE; hres = IPersistMoniker_Load(pers_mon, TRUE, mon, bctx, 0); ok(hres == S_OK, "Load returned %x, expected S_OK\n", hres); IBindCtx_Release(bctx); IMoniker_Release(mon); while(!loaded && GetMessageA(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessageA(&msg); } hres = IHTMLDocument2_get_body(html_doc, &elem); ok(hres == S_OK, "get_body returned %x, expected S_OK\n", hres); hres = IHTMLElement_get_outerHTML(elem, &source); ok(hres == S_OK, "get_outerHTML returned %x, expected S_OK\n", hres); ok(!html_src_compare(source, xmlview_html), "Incorrect HTML source: %s\n", wine_dbgstr_w(source)); IHTMLElement_Release(elem); SysFreeString(source); IHTMLDocument2_Release(html_doc); html_doc = NULL; IPersistMoniker_Release(pers_mon); }