From e79e4098195676fa1ea7ae59efa49fb875f26075 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 8 Sep 2009 22:32:08 +0200 Subject: [PATCH] mshtml: Fire beforeunload event on body element. --- dlls/mshtml/htmlevent.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 3ba45da427e..c18104b6554 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -98,9 +98,10 @@ typedef struct { #define EVENT_DEFAULTLISTENER 0x0001 #define EVENT_BUBBLE 0x0002 +#define EVENT_FORWARDBODY 0x0004 static const event_info_t event_info[] = { - {beforeunloadW, onbeforeunloadW, EVENT_DEFAULTLISTENER}, + {beforeunloadW, onbeforeunloadW, EVENT_DEFAULTLISTENER|EVENT_FORWARDBODY}, {blurW, onblurW, EVENT_DEFAULTLISTENER}, {changeW, onchangeW, EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, {clickW, onclickW, EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, @@ -771,6 +772,21 @@ void fire_event(HTMLDocument *doc, eventid_t eid, nsIDOMNode *target, nsIDOMEven break; case DOCUMENT_NODE: + if(event_info[eid].flags & EVENT_FORWARDBODY) { + nsIDOMHTMLElement *nsbody; + nsresult nsres; + + nsres = nsIDOMHTMLDocument_GetBody(doc->nsdoc, &nsbody); + if(NS_SUCCEEDED(nsres) && nsbody) { + node = get_node(doc, (nsIDOMNode*)nsbody, FALSE); + if(node) + call_event_handlers(doc, event_obj, *get_node_event_target(node), eid, (IDispatch*)HTMLDOMNODE(node)); + nsIDOMHTMLElement_Release(nsbody); + }else { + ERR("Could not get body: %08x\n", nsres); + } + } + call_event_handlers(doc, event_obj, doc->event_target, eid, (IDispatch*)HTMLDOC(doc)); break;