static void handle_arrow_key(HTMLDocumentNode *doc, nsIDOMEvent *event, nsIDOMKeyEvent *key_event, const char * const cmds[4]) { int i=0; cpp_bool b; nsIDOMKeyEvent_GetCtrlKey(key_event, &b); if(b) i |= 1; nsIDOMKeyEvent_GetShiftKey(key_event, &b); if(b) i |= 2; if(cmds[i]) do_ns_editor_command(doc->browser, cmds[i]); nsIDOMEvent_PreventDefault(event); }
static void handle_arrow_key(HTMLDocument *This, nsIDOMEvent *event, nsIDOMKeyEvent *key_event, const char * const cmds[4]) { int i=0; cpp_bool b; nsIDOMKeyEvent_GetCtrlKey(key_event, &b); if(b) i |= 1; nsIDOMKeyEvent_GetShiftKey(key_event, &b); if(b) i |= 2; if(cmds[i]) do_ns_editor_command(This->doc_obj->nscontainer, cmds[i]); nsIDOMEvent_PreventDefault(event); }
static void fire_event_obj(HTMLDocumentNode *doc, eventid_t eid, HTMLEventObj *event_obj, nsIDOMNode *target, IDispatch *script_this) { IHTMLEventObj *prev_event; nsIDOMNode *parent, *nsnode; BOOL prevent_default = FALSE; HTMLInnerWindow *window; HTMLDOMNode *node; UINT16 node_type; nsresult nsres; HRESULT hres; TRACE("(%p) %s\n", doc, debugstr_w(event_info[eid].name)); window = doc->window; if(!window) { WARN("NULL window\n"); return; } htmldoc_addref(&doc->basedoc); prev_event = window->event; window->event = event_obj ? &event_obj->IHTMLEventObj_iface : NULL; nsIDOMNode_GetNodeType(target, &node_type); nsnode = target; nsIDOMNode_AddRef(nsnode); switch(node_type) { case ELEMENT_NODE: do { hres = get_node(doc, nsnode, FALSE, &node); if(SUCCEEDED(hres) && node) { call_event_handlers(doc, event_obj, *get_node_event_target(node), node->cp_container, eid, script_this ? script_this : (IDispatch*)&node->IHTMLDOMNode_iface); node_release(node); } if(!(event_info[eid].flags & EVENT_BUBBLE) || (event_obj && event_obj->cancel_bubble)) break; nsIDOMNode_GetParentNode(nsnode, &parent); nsIDOMNode_Release(nsnode); nsnode = parent; if(!nsnode) break; nsIDOMNode_GetNodeType(nsnode, &node_type); }while(node_type == ELEMENT_NODE); if(!(event_info[eid].flags & EVENT_BUBBLE) || (event_obj && event_obj->cancel_bubble)) 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) { hres = get_node(doc, (nsIDOMNode*)nsbody, FALSE, &node); if(SUCCEEDED(hres) && node) { call_event_handlers(doc, event_obj, *get_node_event_target(node), node->cp_container, eid, script_this ? script_this : (IDispatch*)&node->IHTMLDOMNode_iface); node_release(node); } nsIDOMHTMLElement_Release(nsbody); }else { ERR("Could not get body: %08x\n", nsres); } } call_event_handlers(doc, event_obj, doc->node.event_target, &doc->basedoc.cp_container, eid, script_this ? script_this : (IDispatch*)&doc->basedoc.IHTMLDocument2_iface); break; default: FIXME("unimplemented node type %d\n", node_type); } if(nsnode) nsIDOMNode_Release(nsnode); if(event_obj && event_obj->prevent_default) prevent_default = TRUE; window->event = prev_event; if(!prevent_default && (event_info[eid].flags & EVENT_HASDEFAULTHANDLERS)) { nsIDOMNode_AddRef(target); nsnode = target; do { hres = get_node(doc, nsnode, TRUE, &node); if(FAILED(hres)) break; if(node) { if(node->vtbl->handle_event) hres = node->vtbl->handle_event(node, eid, event_obj ? event_obj->nsevent : NULL, &prevent_default); node_release(node); if(FAILED(hres) || prevent_default || (event_obj && event_obj->cancel_bubble)) 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 && event_obj && event_obj->nsevent) { TRACE("calling PreventDefault\n"); nsIDOMEvent_PreventDefault(event_obj->nsevent); } htmldoc_release(&doc->basedoc); }
void fire_event(HTMLDocumentNode *doc, eventid_t eid, BOOL set_event, nsIDOMNode *target, nsIDOMEvent *nsevent) { 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)); prev_event = doc->basedoc.window->event; if(set_event) { hres = get_node(doc, target, TRUE, &node); if(FAILED(hres)) return; event_obj = create_event(node, eid, nsevent); doc->basedoc.window->event = &event_obj->IHTMLEventObj_iface; }else { doc->basedoc.window->event = NULL; } nsIDOMNode_GetNodeType(target, &node_type); nsnode = target; nsIDOMNode_AddRef(nsnode); switch(node_type) { case ELEMENT_NODE: do { hres = get_node(doc, nsnode, FALSE, &node); if(SUCCEEDED(hres) && node) call_event_handlers(doc, event_obj, *get_node_event_target(node), node->cp_container, eid, (IDispatch*)&node->IHTMLDOMNode_iface); if(!(event_info[eid].flags & EVENT_BUBBLE)) break; nsIDOMNode_GetParentNode(nsnode, &parent); nsIDOMNode_Release(nsnode); nsnode = parent; if(!nsnode) break; nsIDOMNode_GetNodeType(nsnode, &node_type); }while(node_type == ELEMENT_NODE); if(!(event_info[eid].flags & EVENT_BUBBLE)) 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) { hres = get_node(doc, (nsIDOMNode*)nsbody, FALSE, &node); if(SUCCEEDED(hres) && node) call_event_handlers(doc, event_obj, *get_node_event_target(node), node->cp_container, eid, (IDispatch*)&node->IHTMLDOMNode_iface); nsIDOMHTMLElement_Release(nsbody); }else { ERR("Could not get body: %08x\n", nsres); } } call_event_handlers(doc, event_obj, doc->node.event_target, &doc->basedoc.cp_container, eid, (IDispatch*)&doc->basedoc.IHTMLDocument2_iface); break; default: FIXME("unimplemented node type %d\n", node_type); } if(nsnode) nsIDOMNode_Release(nsnode); if(event_obj && event_obj->prevent_default) prevent_default = TRUE; doc->basedoc.window->event = prev_event; if(event_obj) IHTMLEventObj_Release(&event_obj->IHTMLEventObj_iface); if(!prevent_default && (event_info[eid].flags & EVENT_HASDEFAULTHANDLERS)) { 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, nsevent, &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); } }