nsresult nsXBLWindowKeyHandler::WalkHandlers(nsIDOMKeyEvent* aKeyEvent, nsIAtom* aEventType) { nsCOMPtr<nsIDOMNSUIEvent> evt = do_QueryInterface(aKeyEvent); PRBool prevent; evt->GetPreventDefault(&prevent); if (prevent) return NS_OK; nsCOMPtr<nsIDOMNSEvent> domNSEvent = do_QueryInterface(aKeyEvent); PRBool trustedEvent = PR_FALSE; if (domNSEvent) { //Don't process the event if it was not dispatched from a trusted source domNSEvent->GetIsTrusted(&trustedEvent); } if (!trustedEvent) return NS_OK; PRBool isEditor; nsresult rv = EnsureHandlers(&isEditor); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIDOMElement> el = GetElement(); if (!el) { if (mUserHandler) { WalkHandlersInternal(aKeyEvent, aEventType, mUserHandler); evt->GetPreventDefault(&prevent); if (prevent) return NS_OK; // Handled by the user bindings. Our work here is done. } } WalkHandlersInternal(aKeyEvent, aEventType, mHandler); nsINativeKeyBindings *nativeBindings; if (isEditor && (nativeBindings = GetEditorKeyBindings())) { nsNativeKeyEvent nativeEvent; // get the DOM window we're attached to nsCOMPtr<nsIControllers> controllers; nsCOMPtr<nsPIWindowRoot> root = do_QueryInterface(mTarget); if (root) { nsCOMPtr<nsIFocusController> fc; root->GetFocusController(getter_AddRefs(fc)); if (fc) { fc->GetControllers(getter_AddRefs(controllers)); } } PRBool handled; if (aEventType == nsGkAtoms::keypress) { nsContentUtils::DOMEventToNativeKeyEvent(aKeyEvent, &nativeEvent, PR_TRUE); handled = sNativeEditorBindings->KeyPress(nativeEvent, DoCommandCallback, controllers); } else if (aEventType == nsGkAtoms::keyup) { nsContentUtils::DOMEventToNativeKeyEvent(aKeyEvent, &nativeEvent, PR_FALSE); handled = sNativeEditorBindings->KeyUp(nativeEvent, DoCommandCallback, controllers); } else { nsContentUtils::DOMEventToNativeKeyEvent(aKeyEvent, &nativeEvent, PR_FALSE); handled = sNativeEditorBindings->KeyDown(nativeEvent, DoCommandCallback, controllers); } if (handled) aKeyEvent->PreventDefault(); } return NS_OK; }
nsresult nsXBLWindowKeyHandler::WalkHandlers(nsIDOMKeyEvent* aKeyEvent, nsIAtom* aEventType) { nsCOMPtr<nsIDOMNSUIEvent> evt = do_QueryInterface(aKeyEvent); PRBool prevent; evt->GetPreventDefault(&prevent); if (prevent) return NS_OK; nsCOMPtr<nsIDOMNSEvent> domNSEvent = do_QueryInterface(aKeyEvent); PRBool trustedEvent = PR_FALSE; if (domNSEvent) { //Don't process the event if it was not dispatched from a trusted source domNSEvent->GetIsTrusted(&trustedEvent); } if (!trustedEvent) return NS_OK; PRBool isEditor; nsresult rv = EnsureHandlers(&isEditor); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIDOMElement> el = GetElement(); if (!el) { if (mUserHandler) { WalkHandlersInternal(aKeyEvent, aEventType, mUserHandler); evt->GetPreventDefault(&prevent); if (prevent) return NS_OK; // Handled by the user bindings. Our work here is done. } } nsCOMPtr<nsIContent> content = do_QueryInterface(el); // skip keysets that are disabled if (content && content->AttrValueIs(kNameSpaceID_None, nsGkAtoms::disabled, nsGkAtoms::_true, eCaseMatters)) { return NS_OK; } WalkHandlersInternal(aKeyEvent, aEventType, mHandler); if (isEditor && GetEditorKeyBindings()) { nsNativeKeyEvent nativeEvent; // get the DOM window we're attached to nsCOMPtr<nsIControllers> controllers; nsCOMPtr<nsPIWindowRoot> root = do_QueryInterface(mTarget); if (root) { root->GetControllers(getter_AddRefs(controllers)); } PRBool handled = PR_FALSE; if (aEventType == nsGkAtoms::keypress) { if (nsContentUtils::DOMEventToNativeKeyEvent(aKeyEvent, &nativeEvent, PR_TRUE)) handled = sNativeEditorBindings->KeyPress(nativeEvent, DoCommandCallback, controllers); } else if (aEventType == nsGkAtoms::keyup) { if (nsContentUtils::DOMEventToNativeKeyEvent(aKeyEvent, &nativeEvent, PR_FALSE)) handled = sNativeEditorBindings->KeyUp(nativeEvent, DoCommandCallback, controllers); } else { NS_ASSERTION(aEventType == nsGkAtoms::keydown, "unknown key event type"); if (nsContentUtils::DOMEventToNativeKeyEvent(aKeyEvent, &nativeEvent, PR_FALSE)) handled = sNativeEditorBindings->KeyDown(nativeEvent, DoCommandCallback, controllers); } if (handled) aKeyEvent->PreventDefault(); } return NS_OK; }