diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index eadb90b777e..352b7572437 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -795,24 +795,46 @@ static HRESULT WINAPI HTMLDocument_get_URL(IHTMLDocument2 *iface, BSTR *p) static HRESULT WINAPI HTMLDocument_put_domain(IHTMLDocument2 *iface, BSTR v) { HTMLDocument *This = impl_from_IHTMLDocument2(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(v)); - return E_NOTIMPL; + nsAString nsstr; + nsresult nsres; + + TRACE("(%p)->(%s)\n", This, debugstr_w(v)); + + nsAString_InitDepend(&nsstr, v); + nsres = nsIDOMHTMLDocument_SetDomain(This->doc_node->nsdoc, &nsstr); + nsAString_Finish(&nsstr); + if(NS_FAILED(nsres)) { + ERR("SetDomain failed: %08x\n", nsres); + return E_INVALIDARG; + } + + return S_OK; } static HRESULT WINAPI HTMLDocument_get_domain(IHTMLDocument2 *iface, BSTR *p) { HTMLDocument *This = impl_from_IHTMLDocument2(iface); - HRESULT hres; + nsAString nsstr; + nsresult nsres; TRACE("(%p)->(%p)\n", This, p); - if(!This->window || !This->window->uri) { - FIXME("No current URI\n"); - return E_FAIL; + nsAString_Init(&nsstr, NULL); + nsres = nsIDOMHTMLDocument_GetDomain(This->doc_node->nsdoc, &nsstr); + if(NS_SUCCEEDED(nsres) && This->window && This->window->uri) { + const PRUnichar *str; + HRESULT hres; + + nsAString_GetData(&nsstr, &str); + if(!*str) { + TRACE("Gecko returned emptry string, fallback to loaded URL.\n"); + nsAString_Finish(&nsstr); + hres = IUri_GetHost(This->window->uri, p); + return FAILED(hres) ? hres : S_OK; + } } - hres = IUri_GetHost(This->window->uri, p); - return FAILED(hres) ? hres : S_OK; + return return_nsstr(nsres, &nsstr, p); } static HRESULT WINAPI HTMLDocument_put_cookie(IHTMLDocument2 *iface, BSTR v) diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c index 5079dc9da92..90d5b419ae2 100644 --- a/dlls/mshtml/tests/htmldoc.c +++ b/dlls/mshtml/tests/htmldoc.c @@ -971,6 +971,7 @@ static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, D case 1014: CHECK_EXPECT2(OnChanged_1014); return S_OK; + case 1029: case 1030: case 3000022: case 3000023: @@ -7681,6 +7682,37 @@ static void test_cookies(IHTMLDocument2 *doc) SysFreeString(str2); } +static void test_doc_domain(IHTMLDocument2 *doc) +{ + BSTR str; + HRESULT hres; + + hres = IHTMLDocument2_get_domain(doc, &str); + ok(hres == S_OK, "get_domain failed: %08x\n", hres); + ok(!strcmp_wa(str, "test.winehq.org"), "domain = %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + + str = a2bstr("winehq.org"); + hres = IHTMLDocument2_put_domain(doc, str); + ok(hres == S_OK, "put_domain failed: %08x\n", hres); + SysFreeString(str); + + hres = IHTMLDocument2_get_domain(doc, &str); + ok(hres == S_OK, "get_domain failed: %08x\n", hres); + ok(!strcmp_wa(str, "winehq.org"), "domain = %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + + str = a2bstr("winehq.com"); + hres = IHTMLDocument2_put_domain(doc, str); + ok(hres == E_INVALIDARG, "put_domain failed: %08x, expected E_INVALIDARG\n", hres); + SysFreeString(str); + + hres = IHTMLDocument2_get_domain(doc, &str); + ok(hres == S_OK, "get_domain failed: %08x\n", hres); + ok(!strcmp_wa(str, "winehq.org"), "domain = %s\n", wine_dbgstr_w(str)); + SysFreeString(str); +} + static void test_HTMLDocument_http(BOOL with_wbapp) { IMoniker *http_mon; @@ -7718,6 +7750,7 @@ static void test_HTMLDocument_http(BOOL with_wbapp) test_GetCurMoniker((IUnknown*)doc, http_mon, NULL, FALSE); test_travellog(doc); test_binding_ui((IUnknown*)doc); + test_doc_domain(doc); nav_url = nav_serv_url = "http://test.winehq.org/tests/winehq_snapshot/"; /* for valid prev nav_url */ if(support_wbapp) {