[PATCH 5/6] mshtml: Use an event mask and list in XMLHttpReqEventListener.

Gabriel Ivăncescu gabrielopcode at gmail.com
Mon May 23 10:22:10 CDT 2022


Instead of hardcoding each event, since there will be plenty more.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
 dlls/mshtml/xmlhttprequest.c | 47 +++++++++++++++++++-----------------
 1 file changed, 25 insertions(+), 22 deletions(-)

diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c
index b9f6f1f..baef36e 100644
--- a/dlls/mshtml/xmlhttprequest.c
+++ b/dlls/mshtml/xmlhttprequest.c
@@ -94,12 +94,23 @@ static HRESULT return_nscstr(nsresult nsres, nsACString *nscstr, BSTR *p)
     return S_OK;
 }
 
+#define EVENTS_LIST \
+    X(readystatechange) \
+    X(load)
+
+#undef X
+#define X(event) EVENT_##event,
+enum { EVENTS_LIST };
+#undef X
+#define X(event) L"" #event,
+static const WCHAR *events[] = { EVENTS_LIST };
+#undef X
+
 typedef struct {
     nsIDOMEventListener nsIDOMEventListener_iface;
     LONG ref;
     HTMLXMLHttpRequest *xhr;
-    BOOL readystatechange_event;
-    BOOL load_event;
+    DWORD events_mask;
 } XMLHttpReqEventListener;
 
 struct HTMLXMLHttpRequest {
@@ -115,21 +126,17 @@ struct HTMLXMLHttpRequest {
 static void detach_xhr_event_listener(XMLHttpReqEventListener *event_listener)
 {
     nsIDOMEventTarget *event_target;
+    DWORD events_mask, i;
     nsAString str;
     nsresult nsres;
 
     nsres = nsIXMLHttpRequest_QueryInterface(event_listener->xhr->nsxhr, &IID_nsIDOMEventTarget, (void**)&event_target);
     assert(nsres == NS_OK);
 
-    if(event_listener->readystatechange_event) {
-        nsAString_InitDepend(&str, L"onreadystatechange");
-        nsres = nsIDOMEventTarget_RemoveEventListener(event_target, &str, &event_listener->nsIDOMEventListener_iface, FALSE);
-        nsAString_Finish(&str);
-        assert(nsres == NS_OK);
-    }
-
-    if(event_listener->load_event) {
-        nsAString_InitDepend(&str, L"load");
+    for(events_mask = event_listener->events_mask, i = 0; events_mask; events_mask >>= 1, i++) {
+        if(!(events_mask & 1))
+            continue;
+        nsAString_InitDepend(&str, events[i]);
         nsres = nsIDOMEventTarget_RemoveEventListener(event_target, &str, &event_listener->nsIDOMEventListener_iface, FALSE);
         nsAString_Finish(&str);
         assert(nsres == NS_OK);
@@ -941,18 +948,18 @@ static void HTMLXMLHttpRequest_bind_event(DispatchEx *dispex, eventid_t eid)
 {
     HTMLXMLHttpRequest *This = impl_from_DispatchEx(dispex);
     nsIDOMEventTarget *nstarget;
-    const WCHAR *type_name;
     nsAString type_str;
     nsresult nsres;
+    DWORD event;
 
     TRACE("(%p)\n", This);
 
     switch(eid) {
     case EVENTID_READYSTATECHANGE:
-        type_name = L"readystatechange";
+        event = EVENT_readystatechange;
         break;
     case EVENTID_LOAD:
-        type_name = L"load";
+        event = EVENT_load;
         break;
     default:
         return;
@@ -966,25 +973,21 @@ static void HTMLXMLHttpRequest_bind_event(DispatchEx *dispex, eventid_t eid)
         This->event_listener->nsIDOMEventListener_iface.lpVtbl = &XMLHttpReqEventListenerVtbl;
         This->event_listener->ref = 1;
         This->event_listener->xhr = This;
-        This->event_listener->readystatechange_event = FALSE;
-        This->event_listener->load_event = FALSE;
+        This->event_listener->events_mask = 0;
     }
 
     nsres = nsIXMLHttpRequest_QueryInterface(This->nsxhr, &IID_nsIDOMEventTarget, (void**)&nstarget);
     assert(nsres == NS_OK);
 
-    nsAString_InitDepend(&type_str, type_name);
+    nsAString_InitDepend(&type_str, events[event]);
     nsres = nsIDOMEventTarget_AddEventListener(nstarget, &type_str, &This->event_listener->nsIDOMEventListener_iface, FALSE, TRUE, 2);
     nsAString_Finish(&type_str);
     if(NS_FAILED(nsres))
-        ERR("AddEventListener(%s) failed: %08lx\n", debugstr_w(type_name), nsres);
+        ERR("AddEventListener(%s) failed: %08lx\n", debugstr_w(events[event]), nsres);
 
     nsIDOMEventTarget_Release(nstarget);
 
-    if(eid == EVENTID_READYSTATECHANGE)
-        This->event_listener->readystatechange_event = TRUE;
-    else
-        This->event_listener->load_event = TRUE;
+    This->event_listener->events_mask |= 1 << event;
 }
 
 static void HTMLXMLHttpRequest_init_dispex_info(dispex_data_t *info, compat_mode_t compat_mode)
-- 
2.34.1




More information about the wine-devel mailing list