diff --git a/dlls/mshtml/tests/xmlhttprequest.c b/dlls/mshtml/tests/xmlhttprequest.c index 5d11ec000a8..a16dad1e6bc 100644 --- a/dlls/mshtml/tests/xmlhttprequest.c +++ b/dlls/mshtml/tests/xmlhttprequest.c @@ -524,6 +524,19 @@ static void test_illegal_xml(IXMLDOMDocument *xmldom) ok(last == NULL, "last != NULL\n"); } +#define set_request_header(a,b,c) _set_request_header(__LINE__,a,b,c) +static void _set_request_header(unsigned line, IHTMLXMLHttpRequest *xhr, const char *header_a, const char *value_a) +{ + BSTR header = a2bstr(header_a), value = a2bstr(value_a); + HRESULT hres; + + hres = IHTMLXMLHttpRequest_setRequestHeader(xhr, header, value); + ok_(__FILE__,line)(hres == S_OK, "setRequestHeader failed: %08x\n", hres); + + SysFreeString(header); + SysFreeString(value); +} + static void test_responseXML(const char *expect_text) { IDispatch *disp; @@ -673,6 +686,8 @@ static void test_sync_xhr(IHTMLDocument2 *doc, const char *xml_url, const char * ok(hres == S_OK, "get_readyState failed: %08x\n", hres); ok(val == 1, "Expect OPENED, got %d\n", val); + set_request_header(xhr, "x-wine-test", "sync-test"); + SET_EXPECT(xmlhttprequest_onreadystatechange_opened); SET_EXPECT(xmlhttprequest_onreadystatechange_headers_received); SET_EXPECT(xmlhttprequest_onreadystatechange_loading); @@ -835,6 +850,8 @@ static void test_async_xhr(IHTMLDocument2 *doc, const char *xml_url, const char ok(hres == S_OK, "get_readyState failed: %08x\n", hres); ok(val == 1, "Expect OPENED, got %d\n", val); + set_request_header(xhr, "x-wine-test", "async-test"); + SET_EXPECT(xmlhttprequest_onreadystatechange_opened); SET_EXPECT(xmlhttprequest_onreadystatechange_headers_received); SET_EXPECT(xmlhttprequest_onreadystatechange_loading); diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c index ba6dc0506be..d55570cb0be 100644 --- a/dlls/mshtml/xmlhttprequest.c +++ b/dlls/mshtml/xmlhttprequest.c @@ -613,8 +613,35 @@ static HRESULT WINAPI HTMLXMLHttpRequest_getResponseHeader(IHTMLXMLHttpRequest * static HRESULT WINAPI HTMLXMLHttpRequest_setRequestHeader(IHTMLXMLHttpRequest *iface, BSTR bstrHeader, BSTR bstrValue) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); - FIXME("(%p)->(%s %s)\n", This, debugstr_w(bstrHeader), debugstr_w(bstrValue)); - return E_NOTIMPL; + char *header_u, *value_u; + nsACString header, value; + nsresult nsres; + + TRACE("(%p)->(%s %s)\n", This, debugstr_w(bstrHeader), debugstr_w(bstrValue)); + + header_u = heap_strdupWtoU(bstrHeader); + if(bstrHeader && !header_u) + return E_OUTOFMEMORY; + + value_u = heap_strdupWtoU(bstrValue); + if(bstrValue && !value_u) { + heap_free(header_u); + return E_OUTOFMEMORY; + } + + nsACString_InitDepend(&header, header_u); + nsACString_InitDepend(&value, value_u); + nsres = nsIXMLHttpRequest_SetRequestHeader(This->nsxhr, &header, &value); + nsACString_Finish(&header); + nsACString_Finish(&value); + heap_free(header_u); + heap_free(value_u); + if(NS_FAILED(nsres)) { + ERR("SetRequestHeader failed: %08x\n", nsres); + return E_FAIL; + } + + return S_OK; } static const IHTMLXMLHttpRequestVtbl HTMLXMLHttpRequestVtbl = {