diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 4e8f0634c7b..7637c293a02 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -815,15 +815,52 @@ static HRESULT WINAPI HTMLDocument_open(IHTMLDocument2 *iface, BSTR url, VARIANT VARIANT features, VARIANT replace, IDispatch **pomWindowResult) { HTMLDocument *This = HTMLDOC_THIS(iface); - FIXME("(%p)->(%s %p)\n", This, debugstr_w(url), pomWindowResult); - return E_NOTIMPL; + nsresult nsres; + + static const WCHAR text_htmlW[] = {'t','e','x','t','/','h','t','m','l',0}; + + TRACE("(%p)->(%s %s %s %s %p)\n", This, debugstr_w(url), debugstr_variant(&name), + debugstr_variant(&features), debugstr_variant(&replace), pomWindowResult); + + if(!This->nsdoc) { + ERR("!nsdoc\n"); + return E_NOTIMPL; + } + + if(!url || strcmpW(url, text_htmlW) || V_VT(&name) != VT_ERROR + || V_VT(&features) != VT_ERROR || V_VT(&replace) != VT_ERROR) + FIXME("unsupported args\n"); + + nsres = nsIDOMHTMLDocument_Open(This->nsdoc); + if(NS_FAILED(nsres)) { + ERR("Open failed: %08x\n", nsres); + return E_FAIL; + } + + *pomWindowResult = (IDispatch*)HTMLWINDOW2(This->window); + IHTMLWindow2_AddRef(HTMLWINDOW2(This->window)); + return S_OK; } static HRESULT WINAPI HTMLDocument_close(IHTMLDocument2 *iface) { HTMLDocument *This = HTMLDOC_THIS(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; + nsresult nsres; + + TRACE("(%p)\n", This); + + if(!This->nsdoc) { + ERR("!nsdoc\n"); + return E_NOTIMPL; + } + + nsres = nsIDOMHTMLDocument_Close(This->nsdoc); + if(NS_FAILED(nsres)) { + ERR("Close failed: %08x\n", nsres); + return E_FAIL; + } + + return S_OK; } static HRESULT WINAPI HTMLDocument_clear(IHTMLDocument2 *iface) diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 2f91a1c2b8a..87d372d355b 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -387,6 +387,21 @@ static BSTR a2bstr(const char *str) return ret; } +static BOOL iface_cmp(IUnknown *iface1, IUnknown *iface2) +{ + IUnknown *unk1, *unk2; + + if(iface1 == iface2) + return TRUE; + + IUnknown_QueryInterface(iface1, &IID_IUnknown, (void**)&unk1); + IUnknown_Release(unk1); + IUnknown_QueryInterface(iface1, &IID_IUnknown, (void**)&unk2); + IUnknown_Release(unk2); + + return unk1 == unk2; +} + static IHTMLDocument2 *create_document(void) { IHTMLDocument2 *doc; @@ -2630,13 +2645,48 @@ static void test_table_elem(IHTMLElement *elem) IHTMLTable_Release(table); } +static void doc_write(IHTMLDocument2 *doc, const char *text) +{ + SAFEARRAYBOUND dim; + SAFEARRAY *sa; + VARIANT *var; + BSTR str; + HRESULT hres; + + dim.lLbound = 0; + dim.cElements = 1; + sa = SafeArrayCreate(VT_VARIANT, 1, &dim); + SafeArrayAccessData(sa, (void**)&var); + V_VT(var) = VT_BSTR; + V_BSTR(var) = str = a2bstr(text); + SafeArrayUnaccessData(sa); + + hres = IHTMLDocument2_write(doc, sa); + ok(hres == S_OK, "write failed: %08x\n", hres); + + SysFreeString(str); + SafeArrayDestroy(sa); +} + static void test_iframe_elem(IHTMLElement *elem) { + IHTMLElementCollection *col; IHTMLDocument2 *content_doc; IHTMLWindow2 *content_window; IHTMLFrameBase2 *base2; + IDispatch *disp; + VARIANT errv; + BSTR str; HRESULT hres; + static const elem_type_t all_types[] = { + ET_HTML, + ET_HEAD, + ET_TITLE, + ET_BODY, + ET_BR + }; + hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLFrameBase2, (void**)&base2); ok(hres == S_OK, "Could not get IHTMFrameBase2 iface: %08x\n", hres); @@ -2652,6 +2702,26 @@ static void test_iframe_elem(IHTMLElement *elem) ok(hres == S_OK, "get_document failed: %08x\n", hres); ok(content_doc != NULL, "content_doc = NULL\n"); + str = a2bstr("text/html"); + V_VT(&errv) = VT_ERROR; + disp = NULL; + hres = IHTMLDocument2_open(content_doc, str, errv, errv, errv, &disp); + SysFreeString(str); + ok(hres == S_OK, "open failed: %08x\n", hres); + ok(disp != NULL, "disp == NULL\n"); + ok(iface_cmp((IUnknown*)disp, (IUnknown*)content_window), "disp != content_window\n"); + IDispatch_Release(disp); + + doc_write(content_doc, "test
"); + + hres = IHTMLDocument2_get_all(content_doc, &col); + ok(hres == S_OK, "get_all failed: %08x\n", hres); + test_elem_collection((IUnknown*)col, all_types, sizeof(all_types)/sizeof(all_types[0])); + IHTMLElementCollection_Release(col); + + hres = IHTMLDocument2_close(content_doc); + ok(hres == S_OK, "close failed: %08x\n", hres); + IHTMLDocument2_Release(content_doc); }