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;
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; } } } elseif (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 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;
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(); }