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