Zhenbo Li : mshtml: Add IHTMLXMLHttpRequest:open() method implementation.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Jul 1 09:06:23 CDT 2015
Module: wine
Branch: master
Commit: d6b92300afd6bf9ce32ac314008cbee2e423836f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d6b92300afd6bf9ce32ac314008cbee2e423836f
Author: Zhenbo Li <litimetal at 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)
More information about the wine-cvs
mailing list