NS_IMETHODIMP nsSpatialNavigation::KeyDown(nsIDOMEvent* aEvent) { nsCOMPtr<nsIPrefBranch> prefBranch = do_GetService(NS_PREFSERVICE_CONTRACTID); PRBool enabled; prefBranch->GetBoolPref("snav.enabled", &enabled); if (!enabled) // this doesn't work. wtf? if (!mService->mEnabled) return NS_OK;
nsCOMPtr<nsIDOMNSUIEvent> uiEvent(do_QueryInterface(aEvent)); if (uiEvent) { // If a web page wants to use the keys mapped to our // move, they have to use evt.preventDefault() after // they get the key
PRBool preventDefault; uiEvent->GetPreventDefault(&preventDefault); if (preventDefault) return NS_OK; }
PRInt32 formControlType = -1; // check to see if we are in a text field. // based on nsTypeAheadFind. //nsEvent should be renamed. nsCOMPtr<nsIDOMNSEvent> nsEvent = do_QueryInterface(aEvent); if (!nsEvent) return NS_ERROR_FAILURE; nsCOMPtr<nsIDOMEventTarget> domEventTarget; nsEvent->GetOriginalTarget(getter_AddRefs(domEventTarget)); nsCOMPtr<nsIContent> targetContent = do_QueryInterface(domEventTarget);
if (targetContent->IsNodeOfType(nsINode::eXUL)) return NS_OK; if (targetContent->IsNodeOfType(nsINode::eHTML_FORM_CONTROL)) { nsCOMPtr<nsIFormControl> formControl(do_QueryInterface(targetContent)); formControlType = formControl->GetType(); if (mService->mIgnoreTextFields) { if (formControlType == NS_FORM_TEXTAREA || formControlType == NS_FORM_INPUT_TEXT || formControlType == NS_FORM_INPUT_PASSWORD || formControlType == NS_FORM_INPUT_FILE) { return NS_OK; } } } else if (mService->mIgnoreTextFields && targetContent->IsNodeOfType(nsINode::eHTML)) { // Test for isindex, a deprecated kind of text field. We're using a string // compare because <isindex> is not considered a form control, so it does // not support nsIFormControl or eHTML_FORM_CONTROL, and it's not worth // having a table of atoms just for it. if (isContentOfType(targetContent, "isindex")) return NS_OK; } … if (formControlType == NS_FORM_INPUT_TEXT || formControlType == NS_FORM_INPUT_PASSWORD) { PRInt32 selectionStart, textLength; nsCOMPtr<nsIDOMNSHTMLInputElement> input = do_QueryInterface(targetContent); if (input) { input->GetSelectionStart (&selectionStart); input->GetTextLength (&textLength); } else { nsCOMPtr<nsIDOMNSHTMLTextAreaElement> textArea = do_QueryInterface(targetContent); if (textArea) { textArea->GetSelectionStart (&selectionStart); textArea->GetTextLength (&textLength); } } if (textLength != 0 && selectionStart != 0) return NS_OK; }
// We're using this key, no one else should aEvent->StopPropagation(); aEvent->PreventDefault(); return Left(); } if (keyCode == mService->mKeyCodeRight) { // ************************************************************************************ // NS_FORM_TEXTAREA cases:
// ************************************************************************************ // NS_FORM_INPUT_TEXT | NS_FORM_INPUT_PASSWORD | NS_FORM_INPUT_FILE cases
if (formControlType == NS_FORM_INPUT_TEXT || formControlType == NS_FORM_INPUT_PASSWORD) { PRInt32 selectionEnd, textLength; nsCOMPtr<nsIDOMNSHTMLInputElement> input = do_QueryInterface(targetContent); if (input) { input->GetSelectionEnd (&selectionEnd); input->GetTextLength (&textLength); } else { nsCOMPtr<nsIDOMNSHTMLTextAreaElement> textArea = do_QueryInterface(targetContent); if (textArea) { textArea->GetSelectionEnd (&selectionEnd); textArea->GetTextLength (&textLength); } } // going down.
if (textLength != selectionEnd) return NS_OK; } aEvent->StopPropagation(); aEvent->PreventDefault(); return Right(); } if (keyCode == mService->mKeyCodeUp) {
// If we are going up or down, in a select, lets not // navigate. // // FIX: What we really want to do is determine if we are // at the start or the end fo the form element, and // based on the selected position we decide to nav. or // not.
// ************************************************************************************ // NS_FORM_SELECT cases: // * if it is a select form of 'size' attr != than '1' then we do as above.
// * if it is a select form of 'size' attr == than '1', snav can take care of it. // if (formControlType == NS_FORM_SELECT) // return NS_OK;
aEvent->StopPropagation(); aEvent->PreventDefault(); return Up(); } if (keyCode == mService->mKeyCodeDown) { // If we are going up or down, in a select, lets not // navigate. // // FIX: What we really want to do is determine if we are // at the start or the end fo the form element, and // based on the selected position we decide to nav. or // not.
// ************************************************************************************ // NS_FORM_SELECT cases: // * if it is a select form of 'size' attr != than '1' then we do as above.
// * if it is a select form of 'size' attr == than '1', snav can take care of it. // if (formControlType == NS_FORM_SELECT) // return NS_OK;
aEvent->StopPropagation(); // We're using this key, no one else should aEvent->PreventDefault(); return Down(); } return NS_OK; }
|