Jacek Caban : mshtml: Add IDOMMessageEvent stub implementation.

Alexandre Julliard julliard at winehq.org
Tue Mar 1 15:45:33 CST 2022


Module: wine
Branch: master
Commit: 223704aaedc2e6da59e1397338725f062205ead8
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=223704aaedc2e6da59e1397338725f062205ead8

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Mar  1 20:10:20 2022 +0100

mshtml: Add IDOMMessageEvent stub implementation.

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

---

 dlls/mshtml/htmlevent.c      | 145 +++++++++++++++++++++++++++++++++++++++++++
 dlls/mshtml/mshtml_private.h |   2 +
 include/mshtml.idl           |  32 ++++++++++
 3 files changed, 179 insertions(+)

diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index a44c1189b93..abf357a66ad 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -2147,6 +2147,128 @@ static void DOMCustomEvent_destroy(DOMEvent *event)
     VariantClear(&custom_event->detail);
 }
 
+typedef struct {
+    DOMEvent event;
+    IDOMMessageEvent IDOMMessageEvent_iface;
+} DOMMessageEvent;
+
+static inline DOMMessageEvent *impl_from_IDOMMessageEvent(IDOMMessageEvent *iface)
+{
+    return CONTAINING_RECORD(iface, DOMMessageEvent, IDOMMessageEvent_iface);
+}
+
+static HRESULT WINAPI DOMMessageEvent_QueryInterface(IDOMMessageEvent *iface, REFIID riid, void **ppv)
+{
+    DOMMessageEvent *This = impl_from_IDOMMessageEvent(iface);
+    return IDOMEvent_QueryInterface(&This->event.IDOMEvent_iface, riid, ppv);
+}
+
+static ULONG WINAPI DOMMessageEvent_AddRef(IDOMMessageEvent *iface)
+{
+    DOMMessageEvent *This = impl_from_IDOMMessageEvent(iface);
+    return IDOMEvent_AddRef(&This->event.IDOMEvent_iface);
+}
+
+static ULONG WINAPI DOMMessageEvent_Release(IDOMMessageEvent *iface)
+{
+    DOMMessageEvent *This = impl_from_IDOMMessageEvent(iface);
+    return IDOMEvent_Release(&This->event.IDOMEvent_iface);
+}
+
+static HRESULT WINAPI DOMMessageEvent_GetTypeInfoCount(IDOMMessageEvent *iface, UINT *pctinfo)
+{
+    DOMMessageEvent *This = impl_from_IDOMMessageEvent(iface);
+    return IDispatchEx_GetTypeInfoCount(&This->event.dispex.IDispatchEx_iface, pctinfo);
+}
+
+static HRESULT WINAPI DOMMessageEvent_GetTypeInfo(IDOMMessageEvent *iface, UINT iTInfo,
+                                                   LCID lcid, ITypeInfo **ppTInfo)
+{
+    DOMMessageEvent *This = impl_from_IDOMMessageEvent(iface);
+    return IDispatchEx_GetTypeInfo(&This->event.dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
+}
+
+static HRESULT WINAPI DOMMessageEvent_GetIDsOfNames(IDOMMessageEvent *iface, REFIID riid,
+        LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
+{
+    DOMMessageEvent *This = impl_from_IDOMMessageEvent(iface);
+    return IDispatchEx_GetIDsOfNames(&This->event.dispex.IDispatchEx_iface, riid, rgszNames, cNames,
+            lcid, rgDispId);
+}
+
+static HRESULT WINAPI DOMMessageEvent_Invoke(IDOMMessageEvent *iface, DISPID dispIdMember,
+        REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+    DOMMessageEvent *This = impl_from_IDOMMessageEvent(iface);
+    return IDispatchEx_Invoke(&This->event.dispex.IDispatchEx_iface, dispIdMember, riid, lcid,
+            wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+}
+
+static HRESULT WINAPI DOMMessageEvent_get_data(IDOMMessageEvent *iface, BSTR *p)
+{
+    DOMMessageEvent *This = impl_from_IDOMMessageEvent(iface);
+
+    FIXME("(%p)->(%p)\n", This, p);
+
+    *p = NULL;
+    return S_OK;
+}
+
+static HRESULT WINAPI DOMMessageEvent_get_origin(IDOMMessageEvent *iface, BSTR *p)
+{
+    DOMMessageEvent *This = impl_from_IDOMMessageEvent(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DOMMessageEvent_get_source(IDOMMessageEvent *iface, IHTMLWindow2 **p)
+{
+    DOMMessageEvent *This = impl_from_IDOMMessageEvent(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DOMMessageEvent_initMessageEvent(IDOMMessageEvent *iface, BSTR type, VARIANT_BOOL can_bubble,
+                                                       VARIANT_BOOL cancelable, BSTR data, BSTR origin,
+                                                       BSTR last_event_id, IHTMLWindow2 *source)
+{
+    DOMMessageEvent *This = impl_from_IDOMMessageEvent(iface);
+    FIXME("(%p)->(%s %x %x %s %s %s %p)\n", This, debugstr_w(type), can_bubble, cancelable,
+          debugstr_w(data), debugstr_w(origin), debugstr_w(last_event_id), source);
+    return E_NOTIMPL;
+}
+
+static const IDOMMessageEventVtbl DOMMessageEventVtbl = {
+    DOMMessageEvent_QueryInterface,
+    DOMMessageEvent_AddRef,
+    DOMMessageEvent_Release,
+    DOMMessageEvent_GetTypeInfoCount,
+    DOMMessageEvent_GetTypeInfo,
+    DOMMessageEvent_GetIDsOfNames,
+    DOMMessageEvent_Invoke,
+    DOMMessageEvent_get_data,
+    DOMMessageEvent_get_origin,
+    DOMMessageEvent_get_source,
+    DOMMessageEvent_initMessageEvent
+};
+
+static DOMMessageEvent *DOMMessageEvent_from_DOMEvent(DOMEvent *event)
+{
+    return CONTAINING_RECORD(event, DOMMessageEvent, event);
+}
+
+static void *DOMMessageEvent_query_interface(DOMEvent *event, REFIID riid)
+{
+    DOMMessageEvent *message_event = DOMMessageEvent_from_DOMEvent(event);
+    if(IsEqualGUID(&IID_IDOMMessageEvent, riid))
+        return &message_event->IDOMMessageEvent_iface;
+    return NULL;
+}
+
+static void DOMMessageEvent_destroy(DOMEvent *event)
+{
+}
 
 static const tid_t DOMEvent_iface_tids[] = {
     IDOMEvent_tid,
@@ -2214,6 +2336,19 @@ static dispex_static_data_t DOMCustomEvent_dispex = {
     DOMCustomEvent_iface_tids
 };
 
+static const tid_t DOMMessageEvent_iface_tids[] = {
+    IDOMEvent_tid,
+    IDOMMessageEvent_tid,
+    0
+};
+
+dispex_static_data_t DOMMessageEvent_dispex = {
+    L"MessageEvent",
+    NULL,
+    DispDOMMessageEvent_tid,
+    DOMMessageEvent_iface_tids
+};
+
 static BOOL check_event_iface(nsIDOMEvent *event, REFIID riid)
 {
     nsISupports *iface;
@@ -2243,6 +2378,16 @@ static DOMEvent *alloc_event(nsIDOMEvent *nsevent, compat_mode_t compat_mode, ev
         custom_event->event.destroy = DOMCustomEvent_destroy;
         event = &custom_event->event;
         dispex_data = &DOMCustomEvent_dispex;
+    }else if(event_id == EVENTID_MESSAGE) {
+        DOMMessageEvent *message_event = heap_alloc_zero(sizeof(*message_event));
+        if(!message_event)
+            return NULL;
+
+        message_event->IDOMMessageEvent_iface.lpVtbl = &DOMMessageEventVtbl;
+        message_event->event.query_interface = DOMMessageEvent_query_interface;
+        message_event->event.destroy = DOMMessageEvent_destroy;
+        event = &message_event->event;
+        dispex_data = &DOMMessageEvent_dispex;
     }else {
         event = heap_alloc_zero(sizeof(*event));
         if(!event)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 7ce97e01053..a94f1be1969 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -87,6 +87,7 @@ typedef struct EventTarget EventTarget;
     XDIID(DispDOMCustomEvent) \
     XDIID(DispDOMEvent) \
     XDIID(DispDOMKeyboardEvent) \
+    XDIID(DispDOMMessageEvent) \
     XDIID(DispDOMMouseEvent) \
     XDIID(DispDOMUIEvent) \
     XDIID(DispHTMLAnchorElement) \
@@ -147,6 +148,7 @@ typedef struct EventTarget EventTarget;
     XIID(IDOMCustomEvent) \
     XIID(IDOMEvent) \
     XIID(IDOMKeyboardEvent) \
+    XIID(IDOMMessageEvent) \
     XIID(IDOMMouseEvent) \
     XIID(IDOMUIEvent) \
     XIID(IDocumentEvent) \
diff --git a/include/mshtml.idl b/include/mshtml.idl
index ef496b840ea..162a9691fb6 100644
--- a/include/mshtml.idl
+++ b/include/mshtml.idl
@@ -28462,6 +28462,38 @@ interface IDOMMessageEvent : IDispatch
             [in] IHTMLWindow2 *source);
 }
 
+/*****************************************************************************
+ *    DispDOMMessageEvent dispinterface
+ */
+[
+    hidden,
+    uuid(30590092-98b5-11cf-bb82-00aa00bdce0b)
+]
+dispinterface DispDOMMessageEvent
+{
+properties:
+methods:
+    WINE_IDOMEVENT_DISPINTERFACE_DECL;
+
+    [propget, id(DISPID_IDOMMESSAGEEVENT_DATA)]
+    BSTR data();
+
+    [propget, id(DISPID_IDOMMESSAGEEVENT_ORIGIN)]
+    BSTR origin();
+
+    [propget, id(DISPID_IDOMMESSAGEEVENT_SOURCE)]
+    IHTMLWindow2 *source();
+
+    [id(DISPID_IDOMMESSAGEEVENT_INITMESSAGEEVENT)]
+    void initMessageEvent(
+            [in] BSTR eventType,
+            [in] VARIANT_BOOL canBubble,
+            [in] VARIANT_BOOL cancelable,
+            [in] BSTR data,
+            [in] BSTR origin,
+            [in] BSTR lastEventId,
+            [in] IHTMLWindow2 *source);
+}
 
 /*****************************************************************************
  *    IHTMLNamespaceCollection interface




More information about the wine-cvs mailing list