Module: wine Branch: master Commit: d6b92300afd6bf9ce32ac314008cbee2e423836f URL: http://source.winehq.org/git/wine.git/?a=commit;h=d6b92300afd6bf9ce32ac31400...
Author: Zhenbo Li litimetal@gmail.com Date: Tue Jun 30 21:51:21 2015 +0800
mshtml: Add IHTMLXMLHttpRequest:open() method implementation.
---
dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/nsembed.c | 2 +- dlls/mshtml/tests/xmlhttprequest.c | 27 +++++++----- dlls/mshtml/xmlhttprequest.c | 87 +++++++++++++++++++++++++++++++++++++- 4 files changed, 104 insertions(+), 13 deletions(-)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index ca021ba..87e4154 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -855,6 +855,7 @@ HRESULT call_set_active_object(IOleInPlaceUIWindow*,IOleInPlaceActiveObject*) DE void *nsalloc(size_t) __WINE_ALLOC_SIZE(1) DECLSPEC_HIDDEN; void nsfree(void*) DECLSPEC_HIDDEN;
+BOOL nsACString_Init(nsACString *str, const char *data) DECLSPEC_HIDDEN; void nsACString_InitDepend(nsACString*,const char*) DECLSPEC_HIDDEN; void nsACString_SetData(nsACString*,const char*) DECLSPEC_HIDDEN; UINT32 nsACString_GetData(const nsACString*,const char**) DECLSPEC_HIDDEN; diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c index 962494a..df2e130 100644 --- a/dlls/mshtml/nsembed.c +++ b/dlls/mshtml/nsembed.c @@ -795,7 +795,7 @@ void nsfree(void *mem) NS_Free(mem); }
-static BOOL nsACString_Init(nsACString *str, const char *data) +BOOL nsACString_Init(nsACString *str, const char *data) { return NS_SUCCEEDED(NS_CStringContainerInit2(str, data, PR_UINT32_MAX, 0)); } diff --git a/dlls/mshtml/tests/xmlhttprequest.c b/dlls/mshtml/tests/xmlhttprequest.c index abfba57..240f6d3 100644 --- a/dlls/mshtml/tests/xmlhttprequest.c +++ b/dlls/mshtml/tests/xmlhttprequest.c @@ -503,7 +503,7 @@ static void test_async_xhr(IHTMLDocument2 *doc, const char *xml_url)
SET_EXPECT(xmlhttprequest_onreadystatechange_opened); hres = IHTMLXMLHttpRequest_open(xhr, method, url, vbool, vempty, vempty); - todo_wine ok(hres == S_OK, "open failed: %08x\n", hres); + ok(hres == S_OK, "open failed: %08x\n", hres); todo_wine CHECK_CALLED(xmlhttprequest_onreadystatechange_opened);
SysFreeString(method); @@ -517,30 +517,37 @@ static void test_async_xhr(IHTMLDocument2 *doc, const char *xml_url)
val = 0xdeadbeef; hres = IHTMLXMLHttpRequest_get_status(xhr, &val); - ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres); - ok(val == 0, "Expect 0, got %d\n", val); + todo_wine ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres); + todo_wine ok(val == 0, "Expect 0, got %d\n", val);
hres = IHTMLXMLHttpRequest_get_statusText(xhr, &text); - ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres); - ok(text == NULL, "Expect NULL, got %p\n", text); + todo_wine ok(hres == E_FAIL, "Expect E_FAIL, got: %08x\n", hres); + todo_wine ok(text == NULL, "Expect NULL, got %p\n", text);
val = 0xdeadbeef; hres = IHTMLXMLHttpRequest_get_readyState(xhr, &val); - ok(hres == S_OK, "get_readyState failed: %08x\n", hres); - ok(val == 1, "Expect OPENED, got %d\n", val); + todo_wine ok(hres == S_OK, "get_readyState failed: %08x\n", hres); + todo_wine ok(val == 1, "Expect OPENED, got %d\n", val);
SET_EXPECT(xmlhttprequest_onreadystatechange_opened); SET_EXPECT(xmlhttprequest_onreadystatechange_headers_received); SET_EXPECT(xmlhttprequest_onreadystatechange_loading); SET_EXPECT(xmlhttprequest_onreadystatechange_done); hres = IHTMLXMLHttpRequest_send(xhr, vempty); - ok(hres == S_OK, "send failed: %08x\n", hres);
- pump_msgs(&called_xmlhttprequest_onreadystatechange_done); + todo_wine ok(hres == S_OK, "send failed: %08x\n", hres); + if(SUCCEEDED(hres)) + pump_msgs(&called_xmlhttprequest_onreadystatechange_done); todo_wine CHECK_CALLED(xmlhttprequest_onreadystatechange_opened); todo_wine CHECK_CALLED(xmlhttprequest_onreadystatechange_headers_received); todo_wine CHECK_CALLED(xmlhttprequest_onreadystatechange_loading); - CHECK_CALLED(xmlhttprequest_onreadystatechange_done); + todo_wine CHECK_CALLED(xmlhttprequest_onreadystatechange_done); + + if(FAILED(hres)) { + IHTMLXMLHttpRequest_Release(xhr); + xhr = NULL; + return; + }
val = 0xdeadbeef; hres = IHTMLXMLHttpRequest_get_status(xhr, &val); diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c index e79c2fc..3953237 100644 --- a/dlls/mshtml/xmlhttprequest.c +++ b/dlls/mshtml/xmlhttprequest.c @@ -33,6 +33,33 @@
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
+static HRESULT bstr_to_nsacstr(BSTR bstr, nsACString *str) +{ + char *cstr = heap_strdupWtoU(bstr); + if(!cstr) + return E_OUTOFMEMORY; + nsACString_Init(str, cstr); + heap_free(cstr); + return S_OK; +} + +static HRESULT variant_to_nsastr(VARIANT var, nsAString *ret) +{ + switch(V_VT(&var)) { + case VT_NULL: + case VT_ERROR: + case VT_EMPTY: + nsAString_Init(ret, NULL); + return S_OK; + case VT_BSTR: + nsAString_InitDepend(ret, V_BSTR(&var)); + return S_OK; + default: + FIXME("Unsupported VARIANT: %s\n", debugstr_variant(&var)); + return E_INVALIDARG; + } +} + /* IHTMLXMLHttpRequest */ typedef struct { EventTarget event_target; @@ -198,8 +225,64 @@ static HRESULT WINAPI HTMLXMLHttpRequest_abort(IHTMLXMLHttpRequest *iface) static HRESULT WINAPI HTMLXMLHttpRequest_open(IHTMLXMLHttpRequest *iface, BSTR bstrMethod, BSTR bstrUrl, VARIANT varAsync, VARIANT varUser, VARIANT varPassword) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); - FIXME("(%p)->(%s %s %s %s %s)\n", This, debugstr_w(bstrMethod), debugstr_w(bstrUrl), debugstr_variant(&varAsync), debugstr_variant(&varUser), debugstr_variant(&varPassword)); - return E_NOTIMPL; + nsACString method, url; + nsAString user, password; + nsresult nsres; + HRESULT hres; + + TRACE("(%p)->(%s %s %s %s %s)\n", This, debugstr_w(bstrMethod), debugstr_w(bstrUrl), debugstr_variant(&varAsync), debugstr_variant(&varUser), debugstr_variant(&varPassword)); + + if(V_VT(&varAsync) != VT_BOOL) { + FIXME("varAsync not supported: %s\n", debugstr_variant(&varAsync)); + return E_FAIL; + } + + /* Note: Starting with Gecko 30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27), + * synchronous requests on the main thread have been deprecated due to the negative + * effects to the user experience. + */ + if(!V_BOOL(&varAsync)) { + FIXME("Synchronous request is not supported yet\n"); + return E_FAIL; + } + + hres = variant_to_nsastr(varUser, &user); + if(FAILED(hres)) + return hres; + hres = variant_to_nsastr(varPassword, &password); + if(FAILED(hres)) { + nsAString_Finish(&user); + return hres; + } + + hres = bstr_to_nsacstr(bstrMethod, &method); + if(FAILED(hres)) { + nsAString_Finish(&user); + nsAString_Finish(&password); + return hres; + } + hres = bstr_to_nsacstr(bstrUrl, &url); + if(FAILED(hres)) { + nsAString_Finish(&user); + nsAString_Finish(&password); + nsACString_Finish(&method); + return hres; + } + + nsres = nsIXMLHttpRequest_Open(This->nsxhr, &method, &url, TRUE, + &user, &password, 0); + + nsACString_Finish(&method); + nsACString_Finish(&url); + nsAString_Finish(&user); + nsAString_Finish(&password); + + if(NS_FAILED(nsres)) { + ERR("nsIXMLHttpRequest_Open failed: %08x\n", nsres); + return E_FAIL; + } + + return S_OK; }
static HRESULT WINAPI HTMLXMLHttpRequest_send(IHTMLXMLHttpRequest *iface, VARIANT varBody)