void check_event_attr(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem) { const PRUnichar *attr_value; nsAString attr_value_str; IDispatch *disp; HTMLDOMNode *node; int i; nsresult nsres; HRESULT hres; for(i=0; i < EVENTID_LAST; i++) { nsres = get_elem_attr_value(nselem, event_info[i].attr_name, &attr_value_str, &attr_value); if(NS_SUCCEEDED(nsres)) { if(!*attr_value) continue; TRACE("%p.%s = %s\n", nselem, debugstr_w(event_info[i].attr_name), debugstr_w(attr_value)); disp = script_parse_event(doc->window, attr_value); if(disp) { hres = get_node(doc, (nsIDOMNode*)nselem, TRUE, &node); if(SUCCEEDED(hres)) { set_event_handler_disp(get_node_event_target(node), node->doc, i, disp); node_release(node); } IDispatch_Release(disp); } nsAString_Finish(&attr_value_str); } } }
void bind_node_event(HTMLDocumentNode *doc, event_target_t **event_target, HTMLDOMNode *node, const WCHAR *event, IDispatch *disp) { eventid_t eid; TRACE("(%p %p %p %s %p)\n", doc, event_target, node, debugstr_w(event), disp); eid = attr_to_eid(event); if(eid == EVENTID_LAST) { WARN("Unsupported event %s\n", debugstr_w(event)); return; } set_event_handler_disp(event_target, doc, eid, disp); }
void bind_elem_event(HTMLDocumentNode *doc, HTMLElement *elem, const WCHAR *event, IDispatch *disp) { eventid_t eid; TRACE("(%p %p %s %p)\n", doc, elem, debugstr_w(event), disp); eid = attr_to_eid(event); if(eid == EVENTID_LAST) { WARN("Unsupported event %s\n", debugstr_w(event)); return; } set_event_handler_disp(&elem->node.event_target, elem->node.nsnode, doc, eid, disp); }
HRESULT set_event_handler(event_target_t **event_target, nsIDOMNode *nsnode, HTMLDocumentNode *doc, eventid_t eid, VARIANT *var) { switch(V_VT(var)) { case VT_NULL: return remove_event_handler(event_target, eid); case VT_DISPATCH: return set_event_handler_disp(event_target, nsnode, doc, eid, V_DISPATCH(var)); default: FIXME("not supported vt=%d\n", V_VT(var)); case VT_EMPTY: return E_NOTIMPL; } return S_OK; }
HRESULT set_event_handler(event_target_t **event_target, HTMLDocumentNode *doc, eventid_t eid, VARIANT *var) { switch(V_VT(var)) { case VT_NULL: return remove_event_handler(event_target, eid); case VT_DISPATCH: return set_event_handler_disp(event_target, doc, eid, V_DISPATCH(var)); default: FIXME("not handler %s\n", debugstr_variant(var)); /* fall through */ case VT_EMPTY: return E_NOTIMPL; } return S_OK; }
HRESULT set_event_handler(EventTarget *event_target, eventid_t eid, VARIANT *var) { switch(V_VT(var)) { case VT_NULL: remove_event_handler(event_target, eid); return S_OK; case VT_DISPATCH: return set_event_handler_disp(event_target, eid, V_DISPATCH(var)); case VT_BSTR: { VARIANT *v; HRESULT hres; /* * Setting event handler to string is a rare case and we don't want to * complicate nor increase memory of event_target_t for that. Instead, * we store the value in DispatchEx, which can already handle custom * properties. */ remove_event_handler(event_target, eid); hres = dispex_get_dprop_ref(&event_target->dispex, event_info[eid].attr_name, TRUE, &v); if(FAILED(hres)) return hres; V_BSTR(v) = SysAllocString(V_BSTR(var)); if(!V_BSTR(v)) return E_OUTOFMEMORY; V_VT(v) = VT_BSTR; return S_OK; } default: FIXME("not handler %s\n", debugstr_variant(var)); /* fall through */ case VT_EMPTY: return E_NOTIMPL; } return S_OK; }