NS_IMETHODIMP nsXBLEventHandler::HandleEvent(nsIDOMEvent* aEvent) { if (!mProtoHandler) return NS_ERROR_FAILURE; PRUint8 phase = mProtoHandler->GetPhase(); if (phase == NS_PHASE_TARGET) { PRUint16 eventPhase; aEvent->GetEventPhase(&eventPhase); if (eventPhase != nsIDOMEvent::AT_TARGET) return NS_OK; } if (!EventMatched(aEvent)) return NS_OK; nsCOMPtr<nsIDOMEventTarget> target; aEvent->GetCurrentTarget(getter_AddRefs(target)); mProtoHandler->ExecuteHandler(target, aEvent); return NS_OK; }
PRBool nsXBLWindowKeyHandler::WalkHandlersAndExecute(nsIDOMKeyEvent* aKeyEvent, nsIAtom* aEventType, nsXBLPrototypeHandler* aHandler, PRUint32 aCharCode, PRBool aIgnoreShiftKey) { nsresult rv; nsCOMPtr<nsIPrivateDOMEvent> privateEvent(do_QueryInterface(aKeyEvent)); // Try all of the handlers until we find one that matches the event. for (nsXBLPrototypeHandler *currHandler = aHandler; currHandler; currHandler = currHandler->GetNextHandler()) { PRBool stopped; privateEvent->IsDispatchStopped(&stopped); if (stopped) { // The event is finished, don't execute any more handlers return NS_OK; } if (!EventMatched(currHandler, aEventType, aKeyEvent, aCharCode, aIgnoreShiftKey)) continue; // try the next one // Before executing this handler, check that it's not disabled, // and that it has something to do (oncommand of the <key> or its // <command> is non-empty). nsCOMPtr<nsIContent> elt = currHandler->GetHandlerElement(); nsCOMPtr<nsIDOMElement> commandElt; // See if we're in a XUL doc. nsCOMPtr<nsIDOMElement> el = GetElement(); if (el && elt) { // We are. Obtain our command attribute. nsAutoString command; elt->GetAttr(kNameSpaceID_None, nsGkAtoms::command, command); if (!command.IsEmpty()) { // Locate the command element in question. Note that we // know "elt" is in a doc if we're dealing with it here. NS_ASSERTION(elt->IsInDoc(), "elt must be in document"); nsCOMPtr<nsIDOMDocument> domDoc( do_QueryInterface(elt->GetCurrentDoc())); if (domDoc) domDoc->GetElementById(command, getter_AddRefs(commandElt)); if (!commandElt) { NS_ERROR("A XUL <key> is observing a command that doesn't exist. Unable to execute key binding!\n"); continue; } } } if (!commandElt) { commandElt = do_QueryInterface(elt); } if (commandElt) { nsAutoString value; commandElt->GetAttribute(NS_LITERAL_STRING("disabled"), value); if (value.EqualsLiteral("true")) { continue; // this handler is disabled, try the next one } // Check that there is an oncommand handler commandElt->GetAttribute(NS_LITERAL_STRING("oncommand"), value); if (value.IsEmpty()) { continue; // nothing to do } } nsCOMPtr<nsPIDOMEventTarget> piTarget; nsCOMPtr<nsIDOMElement> element = GetElement(); if (element) { piTarget = do_QueryInterface(commandElt); } else { piTarget = mTarget; } rv = currHandler->ExecuteHandler(piTarget, aKeyEvent); if (NS_SUCCEEDED(rv)) { return PR_TRUE; } } return PR_FALSE; }