Jacek Caban : mshtml: Added possibility for node implementations to add default event handlers.
Alexandre Julliard
julliard at winehq.org
Tue Aug 2 14:18:26 CDT 2011
Module: wine
Branch: master
Commit: 6d7667894e7ad4f4020a90a5d66a228d981cd827
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6d7667894e7ad4f4020a90a5d66a228d981cd827
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Aug 2 11:07:56 2011 +0200
mshtml: Added possibility for node implementations to add default event handlers.
---
dlls/mshtml/htmlevent.c | 42 ++++++++++++++++++++++++++++++++++++------
dlls/mshtml/htmlform.c | 1 +
dlls/mshtml/htmlframe.c | 1 +
dlls/mshtml/htmliframe.c | 1 +
dlls/mshtml/htmlimg.c | 1 +
dlls/mshtml/htmlinput.c | 1 +
dlls/mshtml/htmlobject.c | 1 +
dlls/mshtml/htmlscript.c | 1 +
dlls/mshtml/htmlselect.c | 1 +
dlls/mshtml/htmltextarea.c | 1 +
dlls/mshtml/mshtml_private.h | 1 +
11 files changed, 46 insertions(+), 6 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index 49349b0..85e2b4b 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -980,8 +980,10 @@ void fire_event(HTMLDocumentNode *doc, eventid_t eid, BOOL set_event, nsIDOMNode
HTMLEventObj *event_obj = NULL;
IHTMLEventObj *prev_event;
nsIDOMNode *parent, *nsnode;
+ BOOL prevent_default = FALSE;
HTMLDOMNode *node;
PRUint16 node_type;
+ nsresult nsres;
HRESULT hres;
TRACE("(%p) %s\n", doc, debugstr_w(event_info[eid].name));
@@ -1053,14 +1055,42 @@ void fire_event(HTMLDocumentNode *doc, eventid_t eid, BOOL set_event, nsIDOMNode
if(nsnode)
nsIDOMNode_Release(nsnode);
+ if(event_obj && event_obj->prevent_default)
+ prevent_default = TRUE;
doc->basedoc.window->event = prev_event;
-
- if(event_obj) {
- if(event_obj->prevent_default && nsevent) {
- TRACE("calling PreventDefault\n");
- nsIDOMEvent_PreventDefault(nsevent);
- }
+ if(event_obj)
IHTMLEventObj_Release(&event_obj->IHTMLEventObj_iface);
+
+ if(!prevent_default) {
+ nsIDOMNode_AddRef(target);
+ nsnode = target;
+
+ do {
+ hres = get_node(doc, nsnode, TRUE, &node);
+ if(FAILED(hres))
+ break;
+
+ if(node && node->vtbl->handle_event) {
+ hres = node->vtbl->handle_event(node, eid, &prevent_default);
+ if(FAILED(hres) || prevent_default)
+ break;
+ }
+
+ nsres = nsIDOMNode_GetParentNode(nsnode, &parent);
+ if(NS_FAILED(nsres))
+ break;
+
+ nsIDOMNode_Release(nsnode);
+ nsnode = parent;
+ } while(nsnode);
+
+ if(nsnode)
+ nsIDOMNode_Release(nsnode);
+ }
+
+ if(prevent_default && nsevent) {
+ TRACE("calling PreventDefault\n");
+ nsIDOMEvent_PreventDefault(nsevent);
}
}
diff --git a/dlls/mshtml/htmlform.c b/dlls/mshtml/htmlform.c
index ac6d39c..ae84ac3 100644
--- a/dlls/mshtml/htmlform.c
+++ b/dlls/mshtml/htmlform.c
@@ -639,6 +639,7 @@ static const NodeImplVtbl HTMLFormElementImplVtbl = {
NULL,
NULL,
NULL,
+ NULL,
HTMLFormElement_get_dispid,
HTMLFormElement_invoke
};
diff --git a/dlls/mshtml/htmlframe.c b/dlls/mshtml/htmlframe.c
index 7c0cfb1..3b4126b 100644
--- a/dlls/mshtml/htmlframe.c
+++ b/dlls/mshtml/htmlframe.c
@@ -274,6 +274,7 @@ static const NodeImplVtbl HTMLFrameElementImplVtbl = {
NULL,
NULL,
NULL,
+ NULL,
HTMLFrameElement_get_document,
HTMLFrameElement_get_readystate,
HTMLFrameElement_get_dispid,
diff --git a/dlls/mshtml/htmliframe.c b/dlls/mshtml/htmliframe.c
index 7aba570..8a29346 100644
--- a/dlls/mshtml/htmliframe.c
+++ b/dlls/mshtml/htmliframe.c
@@ -252,6 +252,7 @@ static const NodeImplVtbl HTMLIFrameImplVtbl = {
NULL,
NULL,
NULL,
+ NULL,
HTMLIFrame_get_document,
HTMLIFrame_get_readystate,
HTMLIFrame_get_dispid,
diff --git a/dlls/mshtml/htmlimg.c b/dlls/mshtml/htmlimg.c
index 1fb0e83..2f72484 100644
--- a/dlls/mshtml/htmlimg.c
+++ b/dlls/mshtml/htmlimg.c
@@ -663,6 +663,7 @@ static const NodeImplVtbl HTMLImgElementImplVtbl = {
NULL,
NULL,
NULL,
+ NULL,
HTMLImgElement_get_readystate
};
diff --git a/dlls/mshtml/htmlinput.c b/dlls/mshtml/htmlinput.c
index 2428120..9d19761 100644
--- a/dlls/mshtml/htmlinput.c
+++ b/dlls/mshtml/htmlinput.c
@@ -1187,6 +1187,7 @@ static const NodeImplVtbl HTMLInputElementImplVtbl = {
HTMLElement_clone,
NULL,
HTMLInputElementImpl_fire_event,
+ NULL,
HTMLInputElementImpl_put_disabled,
HTMLInputElementImpl_get_disabled,
};
diff --git a/dlls/mshtml/htmlobject.c b/dlls/mshtml/htmlobject.c
index dce6c8c..50e04a9 100644
--- a/dlls/mshtml/htmlobject.c
+++ b/dlls/mshtml/htmlobject.c
@@ -475,6 +475,7 @@ static const NodeImplVtbl HTMLObjectElementImplVtbl = {
NULL,
NULL,
NULL,
+ NULL,
HTMLObjectElement_get_readystate,
HTMLObjectElement_get_dispid,
HTMLObjectElement_invoke
diff --git a/dlls/mshtml/htmlscript.c b/dlls/mshtml/htmlscript.c
index 7b4cbc9..ca0524f 100644
--- a/dlls/mshtml/htmlscript.c
+++ b/dlls/mshtml/htmlscript.c
@@ -335,6 +335,7 @@ static const NodeImplVtbl HTMLScriptElementImplVtbl = {
NULL,
NULL,
NULL,
+ NULL,
HTMLScriptElement_get_readystate
};
diff --git a/dlls/mshtml/htmlselect.c b/dlls/mshtml/htmlselect.c
index 3208bbc..6d2e393 100644
--- a/dlls/mshtml/htmlselect.c
+++ b/dlls/mshtml/htmlselect.c
@@ -617,6 +617,7 @@ static const NodeImplVtbl HTMLSelectElementImplVtbl = {
HTMLElement_clone,
NULL,
NULL,
+ NULL,
HTMLSelectElementImpl_put_disabled,
HTMLSelectElementImpl_get_disabled,
NULL,
diff --git a/dlls/mshtml/htmltextarea.c b/dlls/mshtml/htmltextarea.c
index 3b7651d..ae2fd6a 100644
--- a/dlls/mshtml/htmltextarea.c
+++ b/dlls/mshtml/htmltextarea.c
@@ -449,6 +449,7 @@ static const NodeImplVtbl HTMLTextAreaElementImplVtbl = {
HTMLElement_clone,
NULL,
NULL,
+ NULL,
HTMLTextAreaElementImpl_put_disabled,
HTMLTextAreaElementImpl_get_disabled
};
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index c3d648d..1a07552 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -499,6 +499,7 @@ typedef struct {
HRESULT (*clone)(HTMLDOMNode*,nsIDOMNode*,HTMLDOMNode**);
event_target_t **(*get_event_target)(HTMLDOMNode*);
HRESULT (*fire_event)(HTMLDOMNode*,DWORD,BOOL*);
+ HRESULT (*handle_event)(HTMLDOMNode*,DWORD,BOOL*);
HRESULT (*put_disabled)(HTMLDOMNode*,VARIANT_BOOL);
HRESULT (*get_disabled)(HTMLDOMNode*,VARIANT_BOOL*);
HRESULT (*get_document)(HTMLDOMNode*,IDispatch**);
More information about the wine-cvs
mailing list