PRBool nsSoftKeyBoard::ShouldOpenKeyboardFor(nsIDOMEvent* aEvent) { nsCOMPtr<nsIDOMEventTarget> target; nsCOMPtr<nsIDOMNSEvent> nsevent(do_QueryInterface(aEvent)); nsevent->GetOriginalTarget(getter_AddRefs(target)); nsCOMPtr<nsIContent> targetContent = do_QueryInterface(target); if (targetContent && targetContent->IsNodeOfType(nsINode::eHTML_FORM_CONTROL)) { nsCOMPtr<nsIFormControl> formControl(do_QueryInterface(targetContent)); if (formControl) { PRInt32 controlType = formControl->GetType(); if (controlType == NS_FORM_TEXTAREA || controlType == NS_FORM_INPUT_TEXT || controlType == NS_FORM_INPUT_PASSWORD || controlType == NS_FORM_INPUT_FILE) { return PR_TRUE; } } } return PR_FALSE; }
NS_IMETHODIMP nsAccessProxy::HandleEvent(nsIDOMEvent* aEvent) { nsresult rv; //////// Get Type of Event into a string called eventName /////// nsAutoString eventNameStr; rv=aEvent->GetType(eventNameStr); if (NS_FAILED(rv)) return rv; // Print event name and styles debugging messages #ifdef NS_DEBUG_ACCESS_BUILTIN printf("\n==== %s event occurred ====\n",NS_ConvertUTF16toUTF8(eventNameStr).get()); #endif ////////// Get Target Node - place in document where event was fired //////////// nsCOMPtr<nsIDOMEventTarget> targetNode; nsCOMPtr<nsIDOMNSEvent> nsevent(do_QueryInterface(aEvent)); if (nsevent) { rv = nsevent->GetOriginalTarget(getter_AddRefs(targetNode)); if (NS_FAILED(rv)) return rv; } if (!targetNode) return NS_ERROR_NULL_POINTER; nsCOMPtr<nsIDOMNode> domNode = do_QueryInterface(targetNode); if (!domNode) return NS_OK; // get the Document and PresShell nsCOMPtr<nsIDOMDocument> domDoc; nsIPresShell *presShell = nsnull; nsCOMPtr<nsIDocument> doc; domNode->GetOwnerDocument(getter_AddRefs(domDoc)); if (domDoc) { doc = do_QueryInterface(domDoc); if (doc) { presShell = doc->GetPrimaryShell(); } } //return NS_OK; /* if (presShell && eventNameStr.EqualsLiteral("click")) { nsCOMPtr<nsISelection> domSelection; presShell->FrameSelection()->GetSelection(nsISelectionController::SELECTION_NORMAL, getter_AddRefs(domSelection)); if (!domSelection) return NS_OK; nsCOMPtr<nsIDOMNode> focusDomNode; domSelection->GetAnchorNode(getter_AddRefs(focusDomNode)); if (focusDomNode) domNode=focusDomNode; // first, tell the caret which selection to use nsCOMPtr<nsICaret> caret; presShell->GetCaret(getter_AddRefs(caret)); if (!caret) return NS_OK; caret->SetCaretDOMSelection(domSelection); // tell the pres shell to enable the caret, rather than settings its visibility directly. // this way the presShell's idea of caret visibility is maintained. nsCOMPtr<nsISelectionController> selCon = do_QueryInterface(presShell); if (!selCon) return NS_ERROR_NO_INTERFACE; selCon->SetCaretEnabled(PR_TRUE); caret->SetCaretVisible(PR_TRUE); } */ return NS_OK; }
nsresult nsXULPopupListener::PreLaunchPopup(nsIDOMEvent* aMouseEvent) { PRUint16 button; nsCOMPtr<nsIDOMMouseEvent> mouseEvent; mouseEvent = do_QueryInterface(aMouseEvent); if (!mouseEvent) { //non-ui event passed in. bad things. return NS_OK; } // check if someone has attempted to prevent this action. nsCOMPtr<nsIDOMNSUIEvent> nsUIEvent; nsUIEvent = do_QueryInterface(mouseEvent); if (!nsUIEvent) { return NS_OK; } // Get the node that was clicked on. nsCOMPtr<nsIDOMEventTarget> target; mouseEvent->GetTarget(getter_AddRefs(target)); nsCOMPtr<nsIDOMNode> targetNode = do_QueryInterface(target); if (!targetNode && mIsContext) { // Not a DOM node, see if it's the DOM window (bug 380818). nsCOMPtr<nsIDOMWindow> domWin = do_QueryInterface(target); if (!domWin) { return NS_ERROR_DOM_WRONG_TYPE_ERR; } // Try to use the root node as target node. nsCOMPtr<nsIDOMDocument> domDoc; domWin->GetDocument(getter_AddRefs(domDoc)); nsCOMPtr<nsIDocument> doc = do_QueryInterface(domDoc); if (doc) targetNode = do_QueryInterface(doc->GetRootElement()); if (!targetNode) { return NS_ERROR_FAILURE; } } PRBool preventDefault; nsUIEvent->GetPreventDefault(&preventDefault); if (preventDefault && targetNode && mIsContext) { // Someone called preventDefault on a context menu. // Let's make sure they are allowed to do so. PRBool eventEnabled = nsContentUtils::GetBoolPref("dom.event.contextmenu.enabled", PR_TRUE); if (!eventEnabled) { // If the target node is for plug-in, we should not open XUL context // menu on windowless plug-ins. nsCOMPtr<nsIObjectLoadingContent> olc = do_QueryInterface(targetNode); PRUint32 type; if (olc && NS_SUCCEEDED(olc->GetDisplayedType(&type)) && type == nsIObjectLoadingContent::TYPE_PLUGIN) { return NS_OK; } // The user wants his contextmenus. Let's make sure that this is a website // and not chrome since there could be places in chrome which don't want // contextmenus. nsCOMPtr<nsINode> node = do_QueryInterface(targetNode); if (node) { nsCOMPtr<nsIPrincipal> system; nsContentUtils::GetSecurityManager()-> GetSystemPrincipal(getter_AddRefs(system)); if (node->NodePrincipal() != system) { // This isn't chrome. Cancel the preventDefault() and // let the event go forth. preventDefault = PR_FALSE; } } } } if (preventDefault) { // someone called preventDefault. bail. return NS_OK; } // prevent popups on menu and menuitems as they handle their own popups // This was added for bug 96920. // If a menu item child was clicked on that leads to a popup needing // to show, we know (guaranteed) that we're dealing with a menu or // submenu of an already-showing popup. We don't need to do anything at all. nsCOMPtr<nsIContent> targetContent = do_QueryInterface(target); if (!mIsContext) { nsIAtom *tag = targetContent ? targetContent->Tag() : nsnull; if (tag == nsGkAtoms::menu || tag == nsGkAtoms::menuitem) return NS_OK; } nsCOMPtr<nsIDOMNSEvent> nsevent(do_QueryInterface(aMouseEvent)); if (mIsContext) { #ifndef NS_CONTEXT_MENU_IS_MOUSEUP // If the context menu launches on mousedown, // we have to fire focus on the content we clicked on FireFocusOnTargetContent(targetNode); #endif } else { // Only open popups when the left mouse button is down. mouseEvent->GetButton(&button); if (button != 0) return NS_OK; } // Open the popup and cancel the default handling of the event. LaunchPopup(aMouseEvent, targetContent); aMouseEvent->StopPropagation(); aMouseEvent->PreventDefault(); return NS_OK; }
NS_IMETHODIMP nsSoftKeyBoard::HandleEvent(nsIDOMEvent* aEvent) { if (!aEvent) return NS_OK; nsCOMPtr<nsIDOMNSEvent> nsevent(do_QueryInterface(aEvent)); nsCOMPtr<nsIDOMEventTarget> target; nsevent->GetOriginalTarget(getter_AddRefs(target)); nsCOMPtr<nsIContent> targetContent = do_QueryInterface(target); if (!targetContent || !targetContent->IsNodeOfType(nsINode::eHTML_FORM_CONTROL)) return NS_OK; nsCOMPtr<nsIFormControl> formControl(do_QueryInterface(targetContent)); if (!formControl) return NS_OK; PRInt32 controlType = formControl->GetType(); if (controlType != NS_FORM_TEXTAREA && controlType != NS_FORM_INPUT_TEXT && controlType != NS_FORM_INPUT_PASSWORD && controlType != NS_FORM_INPUT_FILE) { return NS_OK; } nsAutoString eventType; aEvent->GetType(eventType); if (eventType.EqualsLiteral("keypress")) { PRUint32 keyCode; nsCOMPtr<nsIDOMKeyEvent> keyEvent(do_QueryInterface(aEvent)); if (!keyEvent) return NS_OK; if (NS_FAILED(keyEvent->GetKeyCode(&keyCode))) return NS_OK; if (keyCode == nsIDOMKeyEvent::DOM_VK_RETURN && controlType != NS_FORM_TEXTAREA) { nsSoftKeyBoardService::CloseSIP(); } #ifdef WINCE if (IsSmartphone()) { PRUint32 charCode; keyEvent->GetCharCode(&charCode); #if 0 char buffer[2]; sprintf(buffer, "%d = %d", keyCode, charCode); MessageBox(0, buffer, buffer, 0); #endif /* value determined by inspection */ if (keyCode == 120) { // We're using this key, no one else should aEvent->StopPropagation(); aEvent->PreventDefault(); if (mTimer) mTimer->Cancel(); keybd_event(VK_SPACE, 0, 0, 0); keybd_event(VK_SPACE, 0, KEYEVENTF_KEYUP, 0); return NS_OK; } /* value determined by inspection */ if (keyCode == 119) { // We're using this key, no one else should aEvent->StopPropagation(); aEvent->PreventDefault(); if (mTimer) mTimer->Cancel(); mUsage++; if (mUsage>eUpperCase) mUsage=eNumbers; return NS_OK; } if (mUsage == eNumbers) return NS_OK; if ( charCode > nsIDOMKeyEvent::DOM_VK_0 && charCode <= nsIDOMKeyEvent::DOM_VK_9) // [0-9) { // We're using this key, no one else should aEvent->StopPropagation(); aEvent->PreventDefault(); if (mTimer) mTimer->Cancel(); if (mCurrentDigit != charCode) { mCurrentDigit = charCode; mCurrentDigitCount = 1; } else { mCurrentDigitCount++; } mTimer = do_CreateInstance("@mozilla.org/timer;1"); if (!mTimer) return NS_OK; BYTE key = GetKeyPress(mCurrentDigit, mCurrentDigitCount); if (mUsage == eUpperCase) key = _toupper(key); PRUint32 closure = key; mTimer->InitWithFuncCallback(SoftKeyboardTimerCB, (void*)closure, 700, nsITimer::TYPE_ONE_SHOT); return NS_OK; } else { mCurrentDigit = 0; mCurrentDigitCount = 0; } } #endif return NS_OK; } if (eventType.EqualsLiteral("click")) { nsSoftKeyBoardService::OpenSIP(); return NS_OK; } PRBool popupConditions = PR_FALSE; nsCOMPtr<nsPIDOMWindow> privateWindow = do_QueryInterface(mTopWindow); if (!privateWindow) return NS_OK; nsIDOMWindowInternal *rootWindow = privateWindow->GetPrivateRoot(); if (!rootWindow) return NS_OK; nsCOMPtr<nsIDOMWindow> windowContent; rootWindow->GetContent(getter_AddRefs(windowContent)); privateWindow = do_QueryInterface(windowContent); if (privateWindow) popupConditions = privateWindow->IsLoadingOrRunningTimeout(); if (eventType.EqualsLiteral("focus")) { // if (popupConditions == PR_FALSE) nsSoftKeyBoardService::OpenSIP(); } else nsSoftKeyBoardService::CloseSIP(); return NS_OK; }