Jacek Caban : mshtml: Store event id in DOMEvent.

Alexandre Julliard julliard at winehq.org
Thu Oct 19 14:31:35 CDT 2017


Module: wine
Branch: master
Commit: af3376a6ae86ebdb383db97c4e795d0dd887396f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=af3376a6ae86ebdb383db97c4e795d0dd887396f

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Oct 19 17:02:30 2017 +0200

mshtml: Store event id in DOMEvent.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mshtml/htmlevent.c | 47 +++++++++++++++++++++++++++++++++++++++--------
 dlls/mshtml/htmlevent.h |  1 +
 2 files changed, 40 insertions(+), 8 deletions(-)

diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index 9e6bed5..ffb07ef 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -1058,19 +1058,44 @@ static dispex_static_data_t DOMEvent_dispex = {
     DOMEvent_iface_tids
 };
 
-static HRESULT create_event_from_nsevent(nsIDOMEvent *nsevent, DOMEvent **ret_event)
+static DOMEvent *alloc_event(nsIDOMEvent *nsevent)
 {
     DOMEvent *event;
 
     event = heap_alloc_zero(sizeof(*event));
     if(!event)
-        return E_OUTOFMEMORY;
+        return NULL;
 
     init_dispex(&event->dispex, (IUnknown*)&event->IDOMEvent_iface, &DOMEvent_dispex);
     event->IDOMEvent_iface.lpVtbl = &DOMEventVtbl;
     event->ref = 1;
-
     nsIDOMEvent_AddRef(event->nsevent = nsevent);
+    event->event_id = EVENTID_LAST;
+    return event;
+}
+
+static HRESULT create_event_from_nsevent(nsIDOMEvent *nsevent, DOMEvent **ret_event)
+{
+    DOMEvent *event;
+    nsAString nsstr;
+    nsresult nsres;
+
+    event = alloc_event(nsevent);
+    if(!event)
+        return E_OUTOFMEMORY;
+
+    nsAString_Init(&nsstr, NULL);
+    nsres = nsIDOMEvent_GetType(event->nsevent, &nsstr);
+    if(NS_SUCCEEDED(nsres)) {
+        const WCHAR *type;
+        nsAString_GetData(&nsstr, &type);
+        event->event_id = str_to_eid(type);
+        if(event->event_id == EVENTID_LAST)
+            FIXME("unknown event type %s\n", debugstr_w(type));
+    }else {
+        ERR("GetType failed: %08x\n", nsres);
+    }
+    nsAString_Finish(&nsstr);
 
     *ret_event = event;
     return S_OK;
@@ -1082,7 +1107,6 @@ HRESULT create_document_event_str(HTMLDocumentNode *doc, const WCHAR *type, IDOM
     DOMEvent *event;
     nsAString nsstr;
     nsresult nsres;
-    HRESULT hres;
 
     nsAString_InitDepend(&nsstr, type);
     nsres = nsIDOMHTMLDocument_CreateEvent(doc->nsdoc, &nsstr, &nsevent);
@@ -1092,10 +1116,10 @@ HRESULT create_document_event_str(HTMLDocumentNode *doc, const WCHAR *type, IDOM
         return E_FAIL;
     }
 
-    hres = create_event_from_nsevent(nsevent, &event);
+    event = alloc_event(nsevent);
     nsIDOMEvent_Release(nsevent);
-    if(FAILED(hres))
-        return hres;
+    if(!event)
+        return E_OUTOFMEMORY;
 
     *ret_event = &event->IDOMEvent_iface;
     return S_OK;
@@ -1104,6 +1128,7 @@ HRESULT create_document_event_str(HTMLDocumentNode *doc, const WCHAR *type, IDOM
 static HRESULT create_document_event(HTMLDocumentNode *doc, eventid_t event_id, DOMEvent **ret_event)
 {
     nsIDOMEvent *nsevent;
+    DOMEvent *event;
     nsAString nsstr;
     nsresult nsres;
 
@@ -1115,7 +1140,13 @@ static HRESULT create_document_event(HTMLDocumentNode *doc, eventid_t event_id,
         return E_FAIL;
     }
 
-    return create_event_from_nsevent(nsevent, ret_event);
+    event = alloc_event(nsevent);
+    if(!event)
+        return E_OUTOFMEMORY;
+
+    event->event_id = event_id;
+    *ret_event = event;
+    return S_OK;
 }
 
 static handler_vector_t *get_handler_vector(EventTarget *event_target, eventid_t eid, BOOL alloc)
diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h
index daf4368..9dfd5e7 100644
--- a/dlls/mshtml/htmlevent.h
+++ b/dlls/mshtml/htmlevent.h
@@ -62,6 +62,7 @@ typedef struct {
     LONG ref;
 
     nsIDOMEvent *nsevent;
+    eventid_t event_id;
 } DOMEvent;
 
 eventid_t str_to_eid(LPCWSTR) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list