Jacek Caban : mshtml: Don't store dispatch mode in DOMEvent object.
Alexandre Julliard
julliard at winehq.org
Mon Dec 4 14:58:21 CST 2017
Module: wine
Branch: master
Commit: 986f701cd4c09329786177cd7d493403889f1450
URL: http://source.winehq.org/git/wine.git/?a=commit;h=986f701cd4c09329786177cd7d493403889f1450
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Dec 4 18:01:43 2017 +0100
mshtml: Don't store dispatch mode in DOMEvent object.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mshtml/htmlevent.c | 33 +++++++++++++++++++++------------
dlls/mshtml/htmlevent.h | 1 -
2 files changed, 21 insertions(+), 13 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index 3d68555..aed6111 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -54,6 +54,11 @@ typedef struct {
WCHAR type[1];
} listener_container_t;
+typedef enum {
+ DISPATCH_BOTH,
+ DISPATCH_LEGACY
+} dispatch_mode_t;
+
static const WCHAR abortW[] = {'a','b','o','r','t',0};
static const WCHAR beforeactivateW[] = {'b','e','f','o','r','e','a','c','t','i','v','a','t','e',0};
static const WCHAR beforeunloadW[] = {'b','e','f','o','r','e','u','n','l','o','a','d',0};
@@ -1362,7 +1367,7 @@ static BOOL is_cp_event(cp_static_data_t *data, DISPID dispid)
return FALSE;
}
-static void call_event_handlers(EventTarget *event_target, DOMEvent *event)
+static void call_event_handlers(EventTarget *event_target, DOMEvent *event, dispatch_mode_t dispatch_mode)
{
const listener_container_t *container = get_listener_container(event_target, event->type, FALSE);
const BOOL use_quirks = use_event_quirks(event_target);
@@ -1421,13 +1426,13 @@ static void call_event_handlers(EventTarget *event_target, DOMEvent *event)
continue;
break;
case LISTENER_TYPE_CAPTURE:
- if(event->phase == DEP_BUBBLING_PHASE || event->in_fire_event)
+ if(event->phase == DEP_BUBBLING_PHASE || dispatch_mode == DISPATCH_LEGACY)
continue;
break;
case LISTENER_TYPE_BUBBLE:
- if(event->in_fire_event)
+ if(event->phase == DEP_CAPTURING_PHASE || dispatch_mode == DISPATCH_LEGACY)
continue;
- /* fallthrough */
+ break;
case LISTENER_TYPE_ATTACHED:
if(event->phase == DEP_CAPTURING_PHASE)
continue;
@@ -1463,7 +1468,7 @@ static void call_event_handlers(EventTarget *event_target, DOMEvent *event)
V_VT(args) = VT_DISPATCH;
V_DISPATCH(args) = (IDispatch*)&event_target->dispex.IDispatchEx_iface;
V_VT(args+1) = VT_DISPATCH;
- V_DISPATCH(args+1) = event->in_fire_event
+ V_DISPATCH(args+1) = dispatch_mode == DISPATCH_LEGACY
? (IDispatch*)event->event_obj : (IDispatch*)&event->IDOMEvent_iface;
V_VT(&v) = VT_EMPTY;
@@ -1565,7 +1570,8 @@ static void call_event_handlers(EventTarget *event_target, DOMEvent *event)
event->current_target = NULL;
}
-void dispatch_event(EventTarget *event_target, DOMEvent *event)
+static void dispatch_event_object(EventTarget *event_target, DOMEvent *event,
+ dispatch_mode_t dispatch_mode)
{
EventTarget *target_chain_buf[8], **target_chain = target_chain_buf;
unsigned chain_cnt, chain_buf_size, i;
@@ -1635,17 +1641,17 @@ void dispatch_event(EventTarget *event_target, DOMEvent *event)
event->phase = DEP_CAPTURING_PHASE;
i = chain_cnt-1;
while(!event->stop_propagation && i)
- call_event_handlers(target_chain[i--], event);
+ call_event_handlers(target_chain[i--], event, dispatch_mode);
if(!event->stop_propagation) {
event->phase = DEP_AT_TARGET;
- call_event_handlers(target_chain[0], event);
+ call_event_handlers(target_chain[0], event, dispatch_mode);
}
if(event->bubbles) {
event->phase = DEP_BUBBLING_PHASE;
for(i = 1; !event->stop_propagation && i < chain_cnt; i++)
- call_event_handlers(target_chain[i], event);
+ call_event_handlers(target_chain[i], event, dispatch_mode);
}
if(target_vtbl && target_vtbl->set_current_event) {
@@ -1680,6 +1686,11 @@ void dispatch_event(EventTarget *event_target, DOMEvent *event)
heap_free(target_chain);
}
+void dispatch_event(EventTarget *event_target, DOMEvent *event)
+{
+ dispatch_event_object(event_target, event, DISPATCH_BOTH);
+}
+
HRESULT fire_event(HTMLDOMNode *node, const WCHAR *event_name, VARIANT *event_var, VARIANT_BOOL *cancelled)
{
HTMLEventObj *event_obj = NULL;
@@ -1727,9 +1738,7 @@ HRESULT fire_event(HTMLDOMNode *node, const WCHAR *event_name, VARIANT *event_va
if(SUCCEEDED(hres)) {
event_obj->event->event_obj = &event_obj->IHTMLEventObj_iface;
- event_obj->event->in_fire_event++;
- dispatch_event(&node->event_target, event_obj->event);
- event_obj->event->in_fire_event--;
+ dispatch_event_object(&node->event_target, event_obj->event, DISPATCH_LEGACY);
event_obj->event->event_obj = NULL;
}
diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h
index f99c893..3775e44 100644
--- a/dlls/mshtml/htmlevent.h
+++ b/dlls/mshtml/htmlevent.h
@@ -75,7 +75,6 @@ typedef struct {
IHTMLEventObj *event_obj;
BOOL no_event_obj;
- unsigned in_fire_event;
} DOMEvent;
void check_event_attr(HTMLDocumentNode*,nsIDOMHTMLElement*) DECLSPEC_HIDDEN;
More information about the wine-cvs
mailing list