void nsXBLPrototypeHandler::GetEventType(nsAString& aEvent) { nsCOMPtr<nsIContent> handlerElement = GetHandlerElement(); if (!handlerElement) { aEvent.Truncate(); return; } handlerElement->GetAttr(kNameSpaceID_None, nsGkAtoms::event, aEvent); if (aEvent.IsEmpty() && (mType & NS_HANDLER_TYPE_XUL)) // If no type is specified for a XUL <key> element, let's assume that we're "keypress". aEvent.AssignLiteral("keypress"); }
nsresult nsXBLPrototypeHandler::DispatchXULKeyCommand(nsIDOMEvent* aEvent) { nsCOMPtr<nsIContent> handlerElement = GetHandlerElement(); NS_ENSURE_STATE(handlerElement); if (handlerElement->AttrValueIs(kNameSpaceID_None, nsGkAtoms::disabled, nsGkAtoms::_true, eCaseMatters)) { // Don't dispatch command events for disabled keys. return NS_OK; } aEvent->PreventDefault(); nsEventStatus status = nsEventStatus_eIgnore; nsXULCommandEvent event(PR_TRUE, NS_XUL_COMMAND, nsnull); // Copy the modifiers from the key event. nsCOMPtr<nsIDOMKeyEvent> keyEvent = do_QueryInterface(aEvent); if (!keyEvent) { NS_ERROR("Trying to execute a key handler for a non-key event!"); return NS_ERROR_FAILURE; } keyEvent->GetAltKey(&event.isAlt); keyEvent->GetCtrlKey(&event.isControl); keyEvent->GetShiftKey(&event.isShift); keyEvent->GetMetaKey(&event.isMeta); nsPresContext *pc = nsnull; nsIDocument *doc = handlerElement->GetCurrentDoc(); if (doc) { nsIPresShell *shell = doc->GetPrimaryShell(); if (shell) { pc = shell->GetPresContext(); } } nsEventDispatcher::Dispatch(handlerElement, pc, &event, nsnull, &status); return NS_OK; }
nsresult nsXBLPrototypeHandler::DispatchXULKeyCommand(nsIDOMEvent* aEvent) { nsCOMPtr<nsIContent> handlerElement = GetHandlerElement(); NS_ENSURE_STATE(handlerElement); if (handlerElement->AttrValueIs(kNameSpaceID_None, nsGkAtoms::disabled, nsGkAtoms::_true, eCaseMatters)) { // Don't dispatch command events for disabled keys. return NS_OK; } aEvent->PreventDefault(); // Copy the modifiers from the key event. nsCOMPtr<nsIDOMKeyEvent> keyEvent = do_QueryInterface(aEvent); if (!keyEvent) { NS_ERROR("Trying to execute a key handler for a non-key event!"); return NS_ERROR_FAILURE; } PRBool isAlt = PR_FALSE; PRBool isControl = PR_FALSE; PRBool isShift = PR_FALSE; PRBool isMeta = PR_FALSE; keyEvent->GetAltKey(&isAlt); keyEvent->GetCtrlKey(&isControl); keyEvent->GetShiftKey(&isShift); keyEvent->GetMetaKey(&isMeta); nsContentUtils::DispatchXULCommand(handlerElement, PR_TRUE, nsnull, nsnull, isControl, isAlt, isShift, isMeta); return NS_OK; }