Commit 7c85ed6a authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

mshtml: Fixed binding event scripts to window objects.

parent a0ec86b7
...@@ -1529,11 +1529,12 @@ HRESULT detach_event(event_target_t *event_target, HTMLDocument *doc, BSTR name, ...@@ -1529,11 +1529,12 @@ HRESULT detach_event(event_target_t *event_target, HTMLDocument *doc, BSTR name,
return S_OK; return S_OK;
} }
void bind_node_event(HTMLDocumentNode *doc, event_target_t **event_target, HTMLDOMNode *node, const WCHAR *event, IDispatch *disp) void bind_target_event(HTMLDocumentNode *doc, event_target_t **event_target, DispatchEx *dispex,
const WCHAR *event, IDispatch *disp)
{ {
eventid_t eid; eventid_t eid;
TRACE("(%p %p %p %s %p)\n", doc, event_target, node, debugstr_w(event), disp); TRACE("(%p %p %p %s %p)\n", doc, event_target, dispex, debugstr_w(event), disp);
eid = attr_to_eid(event); eid = attr_to_eid(event);
if(eid == EVENTID_LAST) { if(eid == EVENTID_LAST) {
...@@ -1541,7 +1542,7 @@ void bind_node_event(HTMLDocumentNode *doc, event_target_t **event_target, HTMLD ...@@ -1541,7 +1542,7 @@ void bind_node_event(HTMLDocumentNode *doc, event_target_t **event_target, HTMLD
return; return;
} }
set_event_handler_disp(&node->dispex, event_target, doc, eid, disp); set_event_handler_disp(dispex, event_target, doc, eid, disp);
} }
void update_cp_events(HTMLInnerWindow *window, event_target_t **event_target_ptr, cp_static_data_t *cp) void update_cp_events(HTMLInnerWindow *window, event_target_t **event_target_ptr, cp_static_data_t *cp)
......
...@@ -64,7 +64,7 @@ void update_cp_events(HTMLInnerWindow*,event_target_t**,cp_static_data_t*) DECLS ...@@ -64,7 +64,7 @@ void update_cp_events(HTMLInnerWindow*,event_target_t**,cp_static_data_t*) DECLS
HRESULT doc_init_events(HTMLDocumentNode*) DECLSPEC_HIDDEN; HRESULT doc_init_events(HTMLDocumentNode*) DECLSPEC_HIDDEN;
void detach_events(HTMLDocumentNode *doc) DECLSPEC_HIDDEN; void detach_events(HTMLDocumentNode *doc) DECLSPEC_HIDDEN;
HRESULT create_event_obj(IHTMLEventObj**) DECLSPEC_HIDDEN; HRESULT create_event_obj(IHTMLEventObj**) DECLSPEC_HIDDEN;
void bind_node_event(HTMLDocumentNode*,event_target_t**,HTMLDOMNode*,const WCHAR*,IDispatch*) DECLSPEC_HIDDEN; void bind_target_event(HTMLDocumentNode*,event_target_t**,DispatchEx*,const WCHAR*,IDispatch*) DECLSPEC_HIDDEN;
void init_nsevents(HTMLDocumentNode*) DECLSPEC_HIDDEN; void init_nsevents(HTMLDocumentNode*) DECLSPEC_HIDDEN;
void release_nsevents(HTMLDocumentNode*) DECLSPEC_HIDDEN; void release_nsevents(HTMLDocumentNode*) DECLSPEC_HIDDEN;
......
...@@ -1314,9 +1314,9 @@ IDispatch *get_script_disp(ScriptHost *script_host) ...@@ -1314,9 +1314,9 @@ IDispatch *get_script_disp(ScriptHost *script_host)
return disp; return disp;
} }
static event_target_t **find_event_target(HTMLDocumentNode *doc, HTMLScriptElement *script_elem, HTMLDOMNode **ret_target_node) static event_target_t **find_event_target(HTMLDocumentNode *doc, HTMLScriptElement *script_elem, DispatchEx **ret_target_dispex)
{ {
HTMLDOMNode *target_node = NULL; DispatchEx *target_dispex = NULL;
event_target_t **target = NULL; event_target_t **target = NULL;
const PRUnichar *target_id; const PRUnichar *target_id;
nsAString target_id_str; nsAString target_id_str;
...@@ -1336,22 +1336,26 @@ static event_target_t **find_event_target(HTMLDocumentNode *doc, HTMLScriptEleme ...@@ -1336,22 +1336,26 @@ static event_target_t **find_event_target(HTMLDocumentNode *doc, HTMLScriptEleme
FIXME("Empty for attribute\n"); FIXME("Empty for attribute\n");
}else if(!strcmpW(target_id, documentW)) { }else if(!strcmpW(target_id, documentW)) {
target = &doc->node.event_target; target = &doc->node.event_target;
target_node = &doc->node; target_dispex = &doc->node.dispex;
IHTMLDOMNode_AddRef(&target_node->IHTMLDOMNode_iface); htmldoc_addref(&doc->basedoc);
}else if(!strcmpW(target_id, windowW)) { }else if(!strcmpW(target_id, windowW)) {
if(doc->window) {
target_dispex = &doc->window->dispex;
IDispatchEx_AddRef(&target_dispex->IDispatchEx_iface);
target = &doc->body_event_target; target = &doc->body_event_target;
}
}else { }else {
HTMLElement *target_elem; HTMLElement *target_elem;
hres = get_doc_elem_by_id(doc, target_id, &target_elem); hres = get_doc_elem_by_id(doc, target_id, &target_elem);
if(SUCCEEDED(hres) && target_elem) { if(SUCCEEDED(hres) && target_elem) {
target_node = &target_elem->node; target_dispex = &target_elem->node.dispex;
target = &target_elem->node.event_target; target = &target_elem->node.event_target;
} }
} }
nsAString_Finish(&target_id_str); nsAString_Finish(&target_id_str);
*ret_target_node = target_node; *ret_target_dispex = target_dispex;
return target; return target;
} }
...@@ -1449,7 +1453,7 @@ void bind_event_scripts(HTMLDocumentNode *doc) ...@@ -1449,7 +1453,7 @@ void bind_event_scripts(HTMLDocumentNode *doc)
HTMLScriptElement *script_elem; HTMLScriptElement *script_elem;
event_target_t **event_target; event_target_t **event_target;
nsIDOMNodeList *node_list; nsIDOMNodeList *node_list;
HTMLDOMNode *target_node; DispatchEx *target_dispex;
nsIDOMNode *script_node; nsIDOMNode *script_node;
nsAString selector_str; nsAString selector_str;
IDispatch *event_disp; IDispatch *event_disp;
...@@ -1496,10 +1500,10 @@ void bind_event_scripts(HTMLDocumentNode *doc) ...@@ -1496,10 +1500,10 @@ void bind_event_scripts(HTMLDocumentNode *doc)
event_disp = parse_event_elem(doc, script_elem, &event); event_disp = parse_event_elem(doc, script_elem, &event);
if(event_disp) { if(event_disp) {
event_target = find_event_target(doc, script_elem, &target_node); event_target = find_event_target(doc, script_elem, &target_dispex);
if(event_target) { if(event_target) {
if(target_node) if(target_dispex)
hres = IHTMLDOMNode_QueryInterface(&target_node->IHTMLDOMNode_iface, &IID_HTMLPluginContainer, hres = IDispatchEx_QueryInterface(&target_dispex->IDispatchEx_iface, &IID_HTMLPluginContainer,
(void**)&plugin_container); (void**)&plugin_container);
else else
hres = E_NOINTERFACE; hres = E_NOINTERFACE;
...@@ -1507,10 +1511,10 @@ void bind_event_scripts(HTMLDocumentNode *doc) ...@@ -1507,10 +1511,10 @@ void bind_event_scripts(HTMLDocumentNode *doc)
if(SUCCEEDED(hres)) if(SUCCEEDED(hres))
bind_activex_event(doc, plugin_container, event, event_disp); bind_activex_event(doc, plugin_container, event, event_disp);
else else
bind_node_event(doc, event_target, target_node, event, event_disp); bind_target_event(doc, event_target, target_dispex, event, event_disp);
if(target_node) { if(target_dispex) {
IHTMLDOMNode_Release(&target_node->IHTMLDOMNode_iface); IDispatchEx_Release(&target_dispex->IDispatchEx_iface);
if(plugin_container) if(plugin_container)
node_release(&plugin_container->element.node); node_release(&plugin_container->element.node);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment