Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
June 2022
- 68 participants
- 3274 messages
[PATCH v2 1/2] jscript: Only remove one reference to each entry when clearing the Map or Set.
by Gabriel Ivăncescu
Checking for list_empty doesn't stop until all entries have been removed,
no matter their ref count.
Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com>
---
v2: Also fix it for Set...
dlls/jscript/set.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/dlls/jscript/set.c b/dlls/jscript/set.c
index d1ea663..0ef014b 100644
--- a/dlls/jscript/set.c
+++ b/dlls/jscript/set.c
@@ -223,6 +223,7 @@ static HRESULT iterate_map(MapInstance *map, script_ctx_t *ctx, unsigned argc, j
static HRESULT Map_clear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
+ struct jsval_map_entry *entry, *entry2;
MapInstance *map;
HRESULT hres;
@@ -232,10 +233,8 @@ static HRESULT Map_clear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned
TRACE("%p\n", map);
- while(!list_empty(&map->entries)) {
- struct jsval_map_entry *entry = LIST_ENTRY(list_head(&map->entries), struct jsval_map_entry, list_entry);
+ LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &map->entries, struct jsval_map_entry, list_entry)
delete_map_entry(map, entry);
- }
if(r) *r = jsval_undefined();
return S_OK;
@@ -443,6 +442,7 @@ static HRESULT Set_add(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned ar
static HRESULT Set_clear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
+ struct jsval_map_entry *entry, *entry2;
MapInstance *set;
HRESULT hres;
@@ -452,10 +452,8 @@ static HRESULT Set_clear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned
TRACE("%p\n", set);
- while(!list_empty(&set->entries)) {
- struct jsval_map_entry *entry = LIST_ENTRY(list_head(&set->entries), struct jsval_map_entry, list_entry);
+ LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &set->entries, struct jsval_map_entry, list_entry)
delete_map_entry(set, entry);
- }
if(r) *r = jsval_undefined();
return S_OK;
--
2.34.1
June 6, 2022
[PATCH 2/2] jscript: Fix iterating through the map while entries are removed.
by Gabriel Ivăncescu
The current entry as well as the next entry may both be removed while
iterating. Since we release the entry after the callback, obtaining the
"next" entry would be using possibly freed memory. A safe iteration is
required, but we need to obtain the next entry after the callback, not at
the start of the loop, since it can be removed during it.
Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com>
---
This is a pre-existing problem. See for example 64-bit Debian VM results
here: https://testbot.winehq.org/JobDetails.pl?Key=116313#k2202
dlls/jscript/set.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/dlls/jscript/set.c b/dlls/jscript/set.c
index 951c5ba..3173a55 100644
--- a/dlls/jscript/set.c
+++ b/dlls/jscript/set.c
@@ -183,7 +183,7 @@ static HRESULT set_map_entry(MapInstance *map, jsval_t key, jsval_t value, jsval
static HRESULT iterate_map(MapInstance *map, script_ctx_t *ctx, unsigned argc, jsval_t *argv, jsval_t *r)
{
- struct jsval_map_entry *entry;
+ struct jsval_map_entry *entry, *entry2;
IDispatch *context_obj = NULL;
HRESULT hres;
@@ -200,7 +200,7 @@ static HRESULT iterate_map(MapInstance *map, script_ctx_t *ctx, unsigned argc, j
context_obj = get_object(argv[1]);
}
- LIST_FOR_EACH_ENTRY(entry, &map->entries, struct jsval_map_entry, list_entry) {
+ LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &map->entries, struct jsval_map_entry, list_entry) {
jsval_t args[3], v;
if(entry->deleted)
continue;
@@ -210,6 +210,9 @@ static HRESULT iterate_map(MapInstance *map, script_ctx_t *ctx, unsigned argc, j
grab_map_entry(entry);
hres = disp_call_value(ctx, get_object(argv[0]), context_obj,
DISPATCH_METHOD, ARRAY_SIZE(args), args, &v);
+
+ /* The callback may have possibly removed the next entry, so grab it here */
+ entry2 = LIST_ENTRY(entry->list_entry.next, struct jsval_map_entry, list_entry);
release_map_entry(entry);
if(FAILED(hres))
return hres;
--
2.34.1
June 6, 2022
[PATCH 1/2] jscript: Only remove one reference to each entry when clearing the Map.
by Gabriel Ivăncescu
Checking for list_empty doesn't stop until all entries have been removed,
no matter their ref count.
Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com>
---
dlls/jscript/set.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/dlls/jscript/set.c b/dlls/jscript/set.c
index d1ea663..951c5ba 100644
--- a/dlls/jscript/set.c
+++ b/dlls/jscript/set.c
@@ -223,6 +223,7 @@ static HRESULT iterate_map(MapInstance *map, script_ctx_t *ctx, unsigned argc, j
static HRESULT Map_clear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
+ struct jsval_map_entry *entry, *entry2;
MapInstance *map;
HRESULT hres;
@@ -232,10 +233,8 @@ static HRESULT Map_clear(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned
TRACE("%p\n", map);
- while(!list_empty(&map->entries)) {
- struct jsval_map_entry *entry = LIST_ENTRY(list_head(&map->entries), struct jsval_map_entry, list_entry);
+ LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &map->entries, struct jsval_map_entry, list_entry)
delete_map_entry(map, entry);
- }
if(r) *r = jsval_undefined();
return S_OK;
--
2.34.1
June 6, 2022
[PATCH 8/8] mshtml: Implement overrideMimeType for XMLHttpRequest.
by Gabriel Ivăncescu
Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com>
---
dlls/mshtml/tests/xhr.js | 14 +++++++++++-
dlls/mshtml/xmlhttprequest.c | 43 ++++++++++++++++++++++++++++--------
2 files changed, 47 insertions(+), 10 deletions(-)
diff --git a/dlls/mshtml/tests/xhr.js b/dlls/mshtml/tests/xhr.js
index 303c4ad..3ae86e6 100644
--- a/dlls/mshtml/tests/xhr.js
+++ b/dlls/mshtml/tests/xhr.js
@@ -71,7 +71,7 @@ function test_xhr() {
}
function test_content_types() {
- var xhr = new XMLHttpRequest(), types, i = 0;
+ var xhr = new XMLHttpRequest(), types, i = 0, override = false;
var v = document.documentMode;
var types = [
@@ -97,6 +97,18 @@ function test_content_types() {
else
ok(xhr.responseXML === null, "unexpected non-null responseXML for " + types[i]);
+ if(("overrideMimeType" in xhr) && !override) {
+ override = true;
+ xhr = new XMLHttpRequest();
+ xhr.onload = onload;
+ xhr.open("POST", "echo.php", true);
+ xhr.setRequestHeader("X-Test", "True");
+ xhr.overrideMimeType(types[i]);
+ xhr.send(xml);
+ return;
+ }
+ override = false;
+
if(++i >= types.length) {
if(types === xml_types) {
next_test();
diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c
index 0fadc10..ee1549a 100644
--- a/dlls/mshtml/xmlhttprequest.c
+++ b/dlls/mshtml/xmlhttprequest.c
@@ -121,6 +121,7 @@ struct HTMLXMLHttpRequest {
LONG ref;
nsIXMLHttpRequest *nsxhr;
XMLHttpReqEventListener *event_listener;
+ char *type_override;
};
static void detach_xhr_event_listener(XMLHttpReqEventListener *event_listener)
@@ -283,6 +284,7 @@ static ULONG WINAPI HTMLXMLHttpRequest_Release(IHTMLXMLHttpRequest *iface)
release_event_target(&This->event_target);
release_dispex(&This->event_target.dispex);
nsIXMLHttpRequest_Release(This->nsxhr);
+ heap_free(This->type_override);
heap_free(This);
}
@@ -380,16 +382,20 @@ static HRESULT WINAPI HTMLXMLHttpRequest_get_responseXML(IHTMLXMLHttpRequest *if
const char *type;
nsresult nsres;
- nsACString_InitDepend(&header, "Content-Type");
nsACString_InitDepend(&nscstr, NULL);
- nsres = nsIXMLHttpRequest_GetResponseHeader(This->nsxhr, &header, &nscstr);
- nsACString_Finish(&header);
- if(NS_FAILED(nsres))
- type = NULL;
+ if(This->type_override)
+ type = This->type_override;
else {
- nsACString_GetData(&nscstr, &type);
- if(!type[0])
+ nsACString_InitDepend(&header, "Content-Type");
+ nsres = nsIXMLHttpRequest_GetResponseHeader(This->nsxhr, &header, &nscstr);
+ nsACString_Finish(&header);
+ if(NS_FAILED(nsres))
type = NULL;
+ else {
+ nsACString_GetData(&nscstr, &type);
+ if(!type[0])
+ type = NULL;
+ }
}
if(type && stricmp(type, "text/xml") && stricmp(type, "application/xml")) {
size_t len = strlen(type);
@@ -993,10 +999,29 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_get_withCredentials(IWineXMLHtt
static HRESULT WINAPI HTMLXMLHttpRequest_private_overrideMimeType(IWineXMLHttpRequestPrivate *iface, BSTR mimeType)
{
HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface);
+ WCHAR *lowercase = NULL;
+ char *type = NULL;
+ nsAString nsstr;
- FIXME("(%p)->(%s)\n", This, debugstr_w(mimeType));
+ TRACE("(%p)->(%s)\n", This, debugstr_w(mimeType));
- return E_NOTIMPL;
+ if(mimeType) {
+ if(!(lowercase = heap_strdupW(mimeType)))
+ return E_OUTOFMEMORY;
+ _wcslwr(lowercase);
+ if(!(type = heap_strdupWtoA(lowercase))) {
+ heap_free(lowercase);
+ return E_OUTOFMEMORY;
+ }
+ }
+ heap_free(This->type_override);
+ This->type_override = type;
+
+ nsAString_InitDepend(&nsstr, lowercase);
+ nsIXMLHttpRequest_SlowOverrideMimeType(This->nsxhr, &nsstr);
+ nsAString_Finish(&nsstr);
+ heap_free(lowercase);
+ return S_OK;
}
static HRESULT WINAPI HTMLXMLHttpRequest_private_put_onerror(IWineXMLHttpRequestPrivate *iface, VARIANT v)
--
2.34.1
June 6, 2022
[PATCH 7/8] mshtml: Check for valid XML Content-Type for responseXML in IE10+ modes.
by Gabriel Ivăncescu
For some reason, Gecko returns an XML document here, but native follows
the spec.
Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com>
---
dlls/mshtml/tests/script.c | 10 ++++++-
dlls/mshtml/tests/xhr.js | 57 ++++++++++++++++++++++++++++++++++--
dlls/mshtml/xmlhttprequest.c | 29 ++++++++++++++++++
3 files changed, 93 insertions(+), 3 deletions(-)
diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c
index e368824..efd161d 100644
--- a/dlls/mshtml/tests/script.c
+++ b/dlls/mshtml/tests/script.c
@@ -3043,6 +3043,7 @@ typedef struct {
IInternetProtocolSink *sink;
BINDINFO bind_info;
+ BSTR content_type;
IStream *stream;
char *data;
ULONG size;
@@ -3068,6 +3069,7 @@ static void report_data(ProtocolHandler *This)
IServiceProvider *service_provider;
IHttpNegotiate *http_negotiate;
WCHAR *addl_headers = NULL;
+ WCHAR headers_buf[128];
BSTR headers, url;
HRESULT hres;
@@ -3091,7 +3093,10 @@ static void report_data(ProtocolHandler *This)
CoTaskMemFree(addl_headers);
- headers = SysAllocString(L"HTTP/1.1 200 OK\r\n\r\n");
+ if(This->content_type)
+ swprintf(headers_buf, ARRAY_SIZE(headers_buf), L"HTTP/1.1 200 OK\r\nContent-Type: %s\r\n", This->content_type);
+
+ headers = SysAllocString(This->content_type ? headers_buf : L"HTTP/1.1 200 OK\r\n\r\n");
hres = IHttpNegotiate_OnResponse(http_negotiate, 200, headers, NULL, NULL);
ok(hres == S_OK, "OnResponse failed: %08lx\n", hres);
SysFreeString(headers);
@@ -3250,6 +3255,7 @@ static ULONG WINAPI Protocol_Release(IInternetProtocolEx *iface)
if(This->uri)
IUri_Release(This->uri);
ReleaseBindInfo(&This->bind_info);
+ SysFreeString(This->content_type);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -3424,6 +3430,8 @@ static HRESULT WINAPI ProtocolEx_StartEx(IInternetProtocolEx *iface, IUri *uri,
if(SUCCEEDED(hres)) {
if(!lstrcmpW(query, L"?delay"))
This->delay = 1000;
+ else if(!wcsncmp(query, L"?content-type=", sizeof("?content-type=")-1))
+ This->content_type = SysAllocString(query + sizeof("?content-type=")-1);
SysFreeString(query);
}
diff --git a/dlls/mshtml/tests/xhr.js b/dlls/mshtml/tests/xhr.js
index c450384..303c4ad 100644
--- a/dlls/mshtml/tests/xhr.js
+++ b/dlls/mshtml/tests/xhr.js
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+var xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<a name=\"test\">wine</a>";
+
function test_xhr() {
var xhr = new XMLHttpRequest();
var complete_cnt = 0, loadstart = false;
@@ -24,7 +26,9 @@ function test_xhr() {
if(xhr.readyState != 4)
return;
- ok(xhr.responseText === "Testing...", "unexpected responseText " + xhr.responseText);
+ ok(xhr.responseText === xml, "unexpected responseText " + xhr.responseText);
+ ok(xhr.responseXML !== null, "unexpected null responseXML");
+
if(complete_cnt++ && !("onloadend" in xhr))
next_test();
}
@@ -63,7 +67,55 @@ function test_xhr() {
ok(xhr.withCredentials === true, "withCredentials = " + xhr.withCredentials);
xhr.withCredentials = false;
}
- xhr.send("Testing...");
+ xhr.send(xml);
+}
+
+function test_content_types() {
+ var xhr = new XMLHttpRequest(), types, i = 0;
+ var v = document.documentMode;
+
+ var types = [
+ "",
+ "text/plain",
+ "text/html",
+ "wine/xml",
+ "xml"
+ ];
+ var xml_types = [
+ "text/xmL",
+ "apPliCation/xml",
+ "image/SvG+xml",
+ "Wine/Test+xml",
+ "++Xml",
+ "+xMl"
+ ];
+
+ function onload() {
+ ok(xhr.responseText === xml, "unexpected responseText " + xhr.responseText);
+ if(v < 10 || types === xml_types)
+ ok(xhr.responseXML !== null, "unexpected null responseXML for " + types[i]);
+ else
+ ok(xhr.responseXML === null, "unexpected non-null responseXML for " + types[i]);
+
+ if(++i >= types.length) {
+ if(types === xml_types) {
+ next_test();
+ return;
+ }
+ types = xml_types;
+ i = 0;
+ }
+ xhr = new XMLHttpRequest();
+ xhr.onload = onload;
+ xhr.open("POST", "echo.php?content-type=" + types[i], true);
+ xhr.setRequestHeader("X-Test", "True");
+ xhr.send(xml);
+ }
+
+ xhr.onload = onload;
+ xhr.open("POST", "echo.php?content-type=" + types[i], true);
+ xhr.setRequestHeader("X-Test", "True");
+ xhr.send(xml);
}
function test_abort() {
@@ -118,6 +170,7 @@ function test_timeout() {
var tests = [
test_xhr,
+ test_content_types,
test_abort,
test_timeout
];
diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c
index 8fa91e9..0fadc10 100644
--- a/dlls/mshtml/xmlhttprequest.c
+++ b/dlls/mshtml/xmlhttprequest.c
@@ -374,6 +374,35 @@ static HRESULT WINAPI HTMLXMLHttpRequest_get_responseXML(IHTMLXMLHttpRequest *if
TRACE("(%p)->(%p)\n", This, p);
+ if(dispex_compat_mode(&This->event_target.dispex) >= COMPAT_MODE_IE10) {
+ nsACString header, nscstr;
+ BOOL non_xml = FALSE;
+ const char *type;
+ nsresult nsres;
+
+ nsACString_InitDepend(&header, "Content-Type");
+ nsACString_InitDepend(&nscstr, NULL);
+ nsres = nsIXMLHttpRequest_GetResponseHeader(This->nsxhr, &header, &nscstr);
+ nsACString_Finish(&header);
+ if(NS_FAILED(nsres))
+ type = NULL;
+ else {
+ nsACString_GetData(&nscstr, &type);
+ if(!type[0])
+ type = NULL;
+ }
+ if(type && stricmp(type, "text/xml") && stricmp(type, "application/xml")) {
+ size_t len = strlen(type);
+ non_xml = len < 4 || stricmp(type + len - 4, "+xml");
+ }
+ nsACString_Finish(&nscstr);
+
+ if(non_xml) {
+ *p = NULL;
+ return S_OK;
+ }
+ }
+
hres = CoCreateInstance(&CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&xmldoc);
if(FAILED(hres)) {
ERR("CoCreateInstance failed: %08lx\n", hres);
--
2.34.1
June 6, 2022
[PATCH 6/8] mshtml: Implement withCredentials for XMLHttpRequest.
by Gabriel Ivăncescu
Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com>
---
dlls/mshtml/tests/xhr.js | 6 ++++++
dlls/mshtml/xmlhttprequest.c | 14 ++++++++++----
2 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/dlls/mshtml/tests/xhr.js b/dlls/mshtml/tests/xhr.js
index 0f11b78..c450384 100644
--- a/dlls/mshtml/tests/xhr.js
+++ b/dlls/mshtml/tests/xhr.js
@@ -57,6 +57,12 @@ function test_xhr() {
xhr.open("POST", "echo.php", true);
xhr.setRequestHeader("X-Test", "True");
+ if("withCredentials" in xhr) {
+ ok(xhr.withCredentials === false, "default withCredentials = " + xhr.withCredentials);
+ xhr.withCredentials = true;
+ ok(xhr.withCredentials === true, "withCredentials = " + xhr.withCredentials);
+ xhr.withCredentials = false;
+ }
xhr.send("Testing...");
}
diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c
index d12a98d..8fa91e9 100644
--- a/dlls/mshtml/xmlhttprequest.c
+++ b/dlls/mshtml/xmlhttprequest.c
@@ -941,18 +941,24 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_put_withCredentials(IWineXMLHtt
{
HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface);
- FIXME("(%p)->(%x)\n", This, v);
+ TRACE("(%p)->(%x)\n", This, v);
- return E_NOTIMPL;
+ return map_nsresult(nsIXMLHttpRequest_SetWithCredentials(This->nsxhr, !!v));
}
static HRESULT WINAPI HTMLXMLHttpRequest_private_get_withCredentials(IWineXMLHttpRequestPrivate *iface, VARIANT_BOOL *p)
{
HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface);
+ nsresult nsres;
+ cpp_bool b;
- FIXME("(%p)->(%p)\n", This, p);
+ TRACE("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ nsres = nsIXMLHttpRequest_GetWithCredentials(This->nsxhr, &b);
+ if(NS_FAILED(nsres))
+ return map_nsresult(nsres);
+ *p = b ? VARIANT_TRUE : VARIANT_FALSE;
+ return S_OK;
}
static HRESULT WINAPI HTMLXMLHttpRequest_private_overrideMimeType(IWineXMLHttpRequestPrivate *iface, BSTR mimeType)
--
2.34.1
June 6, 2022
[PATCH 5/8] mshtml: Implement onloadend for XMLHttpRequest.
by Gabriel Ivăncescu
Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com>
---
dlls/mshtml/htmlevent.c | 2 ++
dlls/mshtml/htmlevent.h | 1 +
dlls/mshtml/tests/xhr.js | 12 ++++++++++--
dlls/mshtml/xmlhttprequest.c | 9 +++++----
4 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index a718ad4..0f6525a 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -157,6 +157,8 @@ static const event_info_t event_info[] = {
EVENT_DEFAULTLISTENER | EVENT_BUBBLES | EVENT_CANCELABLE},
{L"load", EVENT_TYPE_UIEVENT, DISPID_EVMETH_ONLOAD,
EVENT_BIND_TO_TARGET},
+ {L"loadend", EVENT_TYPE_PROGRESS, DISPID_EVPROP_LOADEND,
+ EVENT_BIND_TO_TARGET},
{L"loadstart", EVENT_TYPE_PROGRESS, DISPID_EVPROP_LOADSTART,
EVENT_BIND_TO_TARGET},
{L"message", EVENT_TYPE_MESSAGE, DISPID_EVMETH_ONMESSAGE,
diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h
index 6af8119..615387c 100644
--- a/dlls/mshtml/htmlevent.h
+++ b/dlls/mshtml/htmlevent.h
@@ -41,6 +41,7 @@ typedef enum {
EVENTID_KEYPRESS,
EVENTID_KEYUP,
EVENTID_LOAD,
+ EVENTID_LOADEND,
EVENTID_LOADSTART,
EVENTID_MESSAGE,
EVENTID_MOUSEDOWN,
diff --git a/dlls/mshtml/tests/xhr.js b/dlls/mshtml/tests/xhr.js
index d706897..0f11b78 100644
--- a/dlls/mshtml/tests/xhr.js
+++ b/dlls/mshtml/tests/xhr.js
@@ -25,7 +25,7 @@ function test_xhr() {
return;
ok(xhr.responseText === "Testing...", "unexpected responseText " + xhr.responseText);
- if(complete_cnt++)
+ if(complete_cnt++ && !("onloadend" in xhr))
next_test();
}
xhr.ontimeout = function() { ok(false, "ontimeout called"); }
@@ -33,7 +33,7 @@ function test_xhr() {
ok(xhr.statusText === "OK", "statusText = " + xhr.statusText);
if("onloadstart" in xhr)
ok(loadstart, "onloadstart not fired");
- if(complete_cnt++)
+ if(complete_cnt++ && !("onloadend" in xhr))
next_test();
};
ok(xhr.onload === onload_func, "xhr.onload != onload_func");
@@ -45,6 +45,14 @@ function test_xhr() {
ok(props[i] in e, props[i] + " not available in loadstart");
loadstart = true;
};
+ xhr.onloadend = function(e) {
+ ok(complete_cnt == 2, "onloadend not fired after onload and onreadystatechange");
+ ok(loadstart, "onloadstart not fired before onloadend");
+ var props = [ "initProgressEvent", "lengthComputable", "loaded", "total" ];
+ for(var i = 0; i < props.length; i++)
+ ok(props[i] in e, props[i] + " not available in loadstart");
+ next_test();
+ };
}
xhr.open("POST", "echo.php", true);
diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c
index b783d04..d12a98d 100644
--- a/dlls/mshtml/xmlhttprequest.c
+++ b/dlls/mshtml/xmlhttprequest.c
@@ -98,6 +98,7 @@ static const eventid_t events[] = {
EVENTID_READYSTATECHANGE,
EVENTID_LOAD,
EVENTID_LOADSTART,
+ EVENTID_LOADEND,
EVENTID_PROGRESS,
EVENTID_ABORT,
EVENTID_ERROR,
@@ -1039,18 +1040,18 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_put_onloadend(IWineXMLHttpReque
{
HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface);
- FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
+ TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
- return E_NOTIMPL;
+ return set_event_handler(&This->event_target, EVENTID_LOADEND, &v);
}
static HRESULT WINAPI HTMLXMLHttpRequest_private_get_onloadend(IWineXMLHttpRequestPrivate *iface, VARIANT *p)
{
HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface);
- FIXME("(%p)->(%p)\n", This, p);
+ TRACE("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ return get_event_handler(&This->event_target, EVENTID_LOADEND, p);
}
static const IWineXMLHttpRequestPrivateVtbl WineXMLHttpRequestPrivateVtbl = {
--
2.34.1
June 6, 2022
[PATCH 4/8] mshtml: Implement onloadstart for XMLHttpRequest.
by Gabriel Ivăncescu
Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com>
---
dlls/mshtml/htmlevent.c | 2 ++
dlls/mshtml/htmlevent.h | 1 +
dlls/mshtml/tests/xhr.js | 13 ++++++++++++-
dlls/mshtml/xmlhttprequest.c | 9 +++++----
4 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index cf0de22..a718ad4 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -157,6 +157,8 @@ static const event_info_t event_info[] = {
EVENT_DEFAULTLISTENER | EVENT_BUBBLES | EVENT_CANCELABLE},
{L"load", EVENT_TYPE_UIEVENT, DISPID_EVMETH_ONLOAD,
EVENT_BIND_TO_TARGET},
+ {L"loadstart", EVENT_TYPE_PROGRESS, DISPID_EVPROP_LOADSTART,
+ EVENT_BIND_TO_TARGET},
{L"message", EVENT_TYPE_MESSAGE, DISPID_EVMETH_ONMESSAGE,
0},
{L"mousedown", EVENT_TYPE_MOUSE, DISPID_EVMETH_ONMOUSEDOWN,
diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h
index 3f399da..6af8119 100644
--- a/dlls/mshtml/htmlevent.h
+++ b/dlls/mshtml/htmlevent.h
@@ -41,6 +41,7 @@ typedef enum {
EVENTID_KEYPRESS,
EVENTID_KEYUP,
EVENTID_LOAD,
+ EVENTID_LOADSTART,
EVENTID_MESSAGE,
EVENTID_MOUSEDOWN,
EVENTID_MOUSEMOVE,
diff --git a/dlls/mshtml/tests/xhr.js b/dlls/mshtml/tests/xhr.js
index dd86331..d706897 100644
--- a/dlls/mshtml/tests/xhr.js
+++ b/dlls/mshtml/tests/xhr.js
@@ -18,7 +18,7 @@
function test_xhr() {
var xhr = new XMLHttpRequest();
- var complete_cnt = 0;
+ var complete_cnt = 0, loadstart = false;
xhr.onreadystatechange = function() {
if(xhr.readyState != 4)
@@ -31,10 +31,21 @@ function test_xhr() {
xhr.ontimeout = function() { ok(false, "ontimeout called"); }
var onload_func = xhr.onload = function() {
ok(xhr.statusText === "OK", "statusText = " + xhr.statusText);
+ if("onloadstart" in xhr)
+ ok(loadstart, "onloadstart not fired");
if(complete_cnt++)
next_test();
};
ok(xhr.onload === onload_func, "xhr.onload != onload_func");
+ if("onloadstart" in xhr) {
+ xhr.onloadstart = function(e) {
+ ok(complete_cnt == 0, "onloadstart fired after onload");
+ var props = [ "initProgressEvent", "lengthComputable", "loaded", "total" ];
+ for(var i = 0; i < props.length; i++)
+ ok(props[i] in e, props[i] + " not available in loadstart");
+ loadstart = true;
+ };
+ }
xhr.open("POST", "echo.php", true);
xhr.setRequestHeader("X-Test", "True");
diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c
index b5973c3..b783d04 100644
--- a/dlls/mshtml/xmlhttprequest.c
+++ b/dlls/mshtml/xmlhttprequest.c
@@ -97,6 +97,7 @@ static HRESULT return_nscstr(nsresult nsres, nsACString *nscstr, BSTR *p)
static const eventid_t events[] = {
EVENTID_READYSTATECHANGE,
EVENTID_LOAD,
+ EVENTID_LOADSTART,
EVENTID_PROGRESS,
EVENTID_ABORT,
EVENTID_ERROR,
@@ -1020,18 +1021,18 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_put_onloadstart(IWineXMLHttpReq
{
HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface);
- FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
+ TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
- return E_NOTIMPL;
+ return set_event_handler(&This->event_target, EVENTID_LOADSTART, &v);
}
static HRESULT WINAPI HTMLXMLHttpRequest_private_get_onloadstart(IWineXMLHttpRequestPrivate *iface, VARIANT *p)
{
HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface);
- FIXME("(%p)->(%p)\n", This, p);
+ TRACE("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ return get_event_handler(&This->event_target, EVENTID_LOADSTART, p);
}
static HRESULT WINAPI HTMLXMLHttpRequest_private_put_onloadend(IWineXMLHttpRequestPrivate *iface, VARIANT v)
--
2.34.1
June 6, 2022
[PATCH 3/8] mshtml: Implement onprogress for XMLHttpRequest.
by Gabriel Ivăncescu
Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com>
---
I tried to add tests but they seem unreliable, in that sometimes it doesn't
fire at all.
dlls/mshtml/htmlevent.c | 2 ++
dlls/mshtml/htmlevent.h | 1 +
dlls/mshtml/xmlhttprequest.c | 9 +++++----
3 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index 49392bf..cf0de22 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -175,6 +175,8 @@ static const event_info_t event_info[] = {
EVENT_FIXME},
{L"paste", EVENT_TYPE_CLIPBOARD, DISPID_EVMETH_ONPASTE,
EVENT_FIXME | EVENT_BUBBLES | EVENT_CANCELABLE},
+ {L"progress", EVENT_TYPE_PROGRESS, DISPID_EVPROP_PROGRESS,
+ EVENT_BIND_TO_TARGET},
{L"readystatechange", EVENT_TYPE_EVENT, DISPID_EVMETH_ONREADYSTATECHANGE,
0},
{L"resize", EVENT_TYPE_UIEVENT, DISPID_EVMETH_ONRESIZE,
diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h
index 58dbc43..3f399da 100644
--- a/dlls/mshtml/htmlevent.h
+++ b/dlls/mshtml/htmlevent.h
@@ -50,6 +50,7 @@ typedef enum {
EVENTID_MOUSEWHEEL,
EVENTID_MSTHUMBNAILCLICK,
EVENTID_PASTE,
+ EVENTID_PROGRESS,
EVENTID_READYSTATECHANGE,
EVENTID_RESIZE,
EVENTID_SCROLL,
diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c
index 54e84cf..b5973c3 100644
--- a/dlls/mshtml/xmlhttprequest.c
+++ b/dlls/mshtml/xmlhttprequest.c
@@ -97,6 +97,7 @@ static HRESULT return_nscstr(nsresult nsres, nsACString *nscstr, BSTR *p)
static const eventid_t events[] = {
EVENTID_READYSTATECHANGE,
EVENTID_LOAD,
+ EVENTID_PROGRESS,
EVENTID_ABORT,
EVENTID_ERROR,
EVENTID_TIMEOUT,
@@ -1001,18 +1002,18 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_put_onprogress(IWineXMLHttpRequ
{
HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface);
- FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
+ TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
- return E_NOTIMPL;
+ return set_event_handler(&This->event_target, EVENTID_PROGRESS, &v);
}
static HRESULT WINAPI HTMLXMLHttpRequest_private_get_onprogress(IWineXMLHttpRequestPrivate *iface, VARIANT *p)
{
HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface);
- FIXME("(%p)->(%p)\n", This, p);
+ TRACE("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ return get_event_handler(&This->event_target, EVENTID_PROGRESS, p);
}
static HRESULT WINAPI HTMLXMLHttpRequest_private_put_onloadstart(IWineXMLHttpRequestPrivate *iface, VARIANT v)
--
2.34.1
June 6, 2022
[PATCH 2/8] mshtml: Implement onabort for XMLHttpRequest.
by Gabriel Ivăncescu
Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com>
---
dlls/mshtml/tests/script.c | 2 ++
dlls/mshtml/tests/xhr.js | 20 ++++++++++++++++++++
dlls/mshtml/xmlhttprequest.c | 9 +++++----
3 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c
index 401e130..e368824 100644
--- a/dlls/mshtml/tests/script.c
+++ b/dlls/mshtml/tests/script.c
@@ -3079,6 +3079,8 @@ static void report_data(ProtocolHandler *This)
hres = IServiceProvider_QueryService(service_provider, &IID_IHttpNegotiate, &IID_IHttpNegotiate, (void**)&http_negotiate);
IServiceProvider_Release(service_provider);
+ if(This->delay && hres == E_FAIL) /* aborted too quickly */
+ return;
ok(hres == S_OK, "Could not get IHttpNegotiate interface: %08lx\n", hres);
hres = IUri_GetDisplayUri(This->uri, &url);
diff --git a/dlls/mshtml/tests/xhr.js b/dlls/mshtml/tests/xhr.js
index 6228f73..dd86331 100644
--- a/dlls/mshtml/tests/xhr.js
+++ b/dlls/mshtml/tests/xhr.js
@@ -41,6 +41,25 @@ function test_xhr() {
xhr.send("Testing...");
}
+function test_abort() {
+ var xhr = new XMLHttpRequest();
+ if(!("onabort" in xhr)) { next_test(); return; }
+
+ xhr.onreadystatechange = function() {
+ if(xhr.readyState != 4)
+ return;
+ todo_wine_if(v < 10).
+ ok(v >= 10, "onreadystatechange called");
+ }
+ xhr.onload = function() { ok(false, "onload called"); }
+ xhr.onabort = function(e) { next_test(); }
+
+ xhr.open("POST", "echo.php?delay", true);
+ xhr.setRequestHeader("X-Test", "True");
+ xhr.send("Abort Test");
+ xhr.abort();
+}
+
function test_timeout() {
var xhr = new XMLHttpRequest();
var v = document.documentMode;
@@ -74,5 +93,6 @@ function test_timeout() {
var tests = [
test_xhr,
+ test_abort,
test_timeout
];
diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c
index 12356f1..54e84cf 100644
--- a/dlls/mshtml/xmlhttprequest.c
+++ b/dlls/mshtml/xmlhttprequest.c
@@ -97,6 +97,7 @@ static HRESULT return_nscstr(nsresult nsres, nsACString *nscstr, BSTR *p)
static const eventid_t events[] = {
EVENTID_READYSTATECHANGE,
EVENTID_LOAD,
+ EVENTID_ABORT,
EVENTID_ERROR,
EVENTID_TIMEOUT,
};
@@ -982,18 +983,18 @@ static HRESULT WINAPI HTMLXMLHttpRequest_private_put_onabort(IWineXMLHttpRequest
{
HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface);
- FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
+ TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
- return E_NOTIMPL;
+ return set_event_handler(&This->event_target, EVENTID_ABORT, &v);
}
static HRESULT WINAPI HTMLXMLHttpRequest_private_get_onabort(IWineXMLHttpRequestPrivate *iface, VARIANT *p)
{
HTMLXMLHttpRequest *This = impl_from_IWineXMLHttpRequestPrivate(iface);
- FIXME("(%p)->(%p)\n", This, p);
+ TRACE("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ return get_event_handler(&This->event_target, EVENTID_ABORT, p);
}
static HRESULT WINAPI HTMLXMLHttpRequest_private_put_onprogress(IWineXMLHttpRequestPrivate *iface, VARIANT v)
--
2.34.1
June 6, 2022