rv = formControls->HasMoreElements(&hasMoreElements); NS_ENSURE_SUCCESS(rv, rv);
nsHTMLInputElement::HandleDOMEvent(nsIPresContext* aPresContext,                                   nsEvent* aEvent,                                   nsIDOMEvent** aDOMEvent,                                   PRUint32 aFlags,                                   nsEventStatus* aEventStatus){  NS_ENSURE_ARG_POINTER(aEventStatus);  if ((aEvent->message == NS_FOCUS_CONTENT       && GET_BOOLBIT(mBitField, BF_SKIP_FOCUS_EVENT))      || (aEvent->message == NS_BLUR_CONTENT          && GET_BOOLBIT(mBitField, BF_SKIP_FOCUS_EVENT))) {    return NS_OK;  }  // Do not process any DOM events if the element is disabled  PRBool disabled;  nsresult rv = GetDisabled(&disabled);  NS_ENSURE_SUCCESS(rv, rv);  if (disabled) {    return NS_OK;  }    {    // For some reason or another we also need to check if the style shows us    // as disabled.    nsIFormControlFrame* formControlFrame = GetFormControlFrame(PR_FALSE);    if (formControlFrame) {      nsIFrame* formFrame = nsnull;      CallQueryInterface(formControlFrame, &formFrame);      if (formFrame) {        const nsStyleUserInterface* uiStyle;        formFrame->GetStyleData(eStyleStruct_UserInterface,                                (const nsStyleStruct *&)uiStyle);        if (uiStyle->mUserInput == NS_STYLE_USER_INPUT_NONE ||            uiStyle->mUserInput == NS_STYLE_USER_INPUT_DISABLED) {          return NS_OK;        }      }    }  }  // If we're a file input we have anonymous content underneath  // that we need to hide.  We need to set the event target now  // to ourselves and the original target to the previous target.  nsCOMPtr<nsIDOMEventTarget> oldTarget;  if (mType == NS_FORM_INPUT_FILE || mType == NS_FORM_INPUT_TEXT ) {    // If the event is starting here that's fine.  If it's not    // init'ing here it started beneath us and needs modification.    // XXX This happens twice (unnecessarily) since there is both a capture    // and a bubble stage.    if (!(NS_EVENT_FLAG_INIT & aFlags)) {      // Create the DOM event.      if (!*aDOMEvent) {        // We haven't made a DOMEvent yet.  Force making one now.        nsCOMPtr<nsIEventListenerManager> listenerManager;        rv = GetListenerManager(getter_AddRefs(listenerManager));        NS_ENSURE_SUCCESS(rv, rv);        nsAutoString empty;        rv = listenerManager->CreateEvent(aPresContext, aEvent, empty,                                          aDOMEvent);        NS_ENSURE_SUCCESS(rv, rv);      }      // See if there is an original target already.  If not, set it to the      // current event target.      nsCOMPtr<nsIDOMEventTarget> originalTarget;      nsCOMPtr<nsIDOMNSEvent> nsevent(do_QueryInterface(*aDOMEvent));      if (nsevent) {        nsevent->GetOriginalTarget(getter_AddRefs(originalTarget));      }      nsCOMPtr<nsIPrivateDOMEvent> privateEvent(do_QueryInterface(*aDOMEvent));      NS_ENSURE_TRUE(privateEvent, NS_ERROR_FAILURE);      (*aDOMEvent)->GetTarget(getter_AddRefs(oldTarget));      if (!originalTarget) {        privateEvent->SetOriginalTarget(oldTarget);      }      // Set the target to us now.      nsCOMPtr<nsIDOMEventTarget>        target(do_QueryInterface((nsIDOMHTMLInputElement*)this));      privateEvent->SetTarget(target);    }  }  //  // Web pages expect the value of a radio button or checkbox to be set  // *before* onclick fires, and they expect that if they set the value  // explicitly during onclick it will not be toggled or any such nonsense.  // In order to support that (bug 57137 and 58460 are examples) we toggle  // the checked attribute *first*, and then do nothing *after* the onclick  // handler unless the user returns false (in which case we reset it back  // to its original value).  //  // This is a compatibility hack.  //  PRBool originalCheckedValue = PR_FALSE;  PRBool checkWasSet         = PR_FALSE;  nsCOMPtr<nsIDOMHTMLInputElement> selectedRadioButton;  if (!(aFlags & NS_EVENT_FLAG_CAPTURE) &&      !(aFlags & NS_EVENT_FLAG_SYSTEM_EVENT) &&      aEvent->message == NS_MOUSE_LEFT_CLICK) {    switch(mType) {      case NS_FORM_INPUT_CHECKBOX:        {          GetChecked(&originalCheckedValue);          SetChecked(!originalCheckedValue);          checkWasSet = PR_TRUE;        }        break;      case NS_FORM_INPUT_RADIO:        {          nsCOMPtr<nsIRadioGroupContainer> container = GetRadioGroupContainer();          if (container) {            nsAutoString name;            if (GetNameIfExists(name)) {              container->GetCurrentRadioButton(name,                                               getter_AddRefs(selectedRadioButton));            }          }          GetChecked(&originalCheckedValue);          if (!originalCheckedValue) {            SetChecked(PR_TRUE);            checkWasSet = PR_TRUE;          }        }        break;      case NS_FORM_INPUT_SUBMIT:      case NS_FORM_INPUT_IMAGE:        if(mForm) {          // tell the form that we are about to enter a click handler.          // that means that if there are scripted submissions, the          // latest one will be deferred until after the exit point of the handler.           mForm->OnSubmitClickBegin();        }        break;      default:        break;    } //switch  }  // If NS_EVENT_FLAG_NO_CONTENT_DISPATCH is set we will not allow content to handle  // this event.  But to allow middle mouse button paste to work we must allow   // middle clicks to go to text fields anyway.  PRBool noContentDispatch = aEvent->flags & NS_EVENT_FLAG_NO_CONTENT_DISPATCH;  if ((mType == NS_FORM_INPUT_TEXT || mType == NS_FORM_INPUT_PASSWORD) &&      aEvent->message == NS_MOUSE_MIDDLE_CLICK) {    aEvent->flags &= ~NS_EVENT_FLAG_NO_CONTENT_DISPATCH;  }  // We must cache type because mType may change during JS event (bug 2369)  //  PRInt32 oldType = mType;  // Try script event handlers first if its not a focus/blur event  //we dont want the doc to get these  rv = nsGenericHTMLLeafFormElement::HandleDOMEvent(aPresContext,                                                    aEvent,                                                    aDOMEvent,                                                    aFlags,                                                    aEventStatus);  if (!(aFlags & NS_EVENT_FLAG_CAPTURE) && !(aFlags & NS_EVENT_FLAG_SYSTEM_EVENT) &&      aEvent->message == NS_MOUSE_LEFT_CLICK) {    switch(oldType) {      case NS_FORM_INPUT_SUBMIT:      case NS_FORM_INPUT_IMAGE:        if(mForm) {          // tell the form that we are about to exit a click handler          // so the form knows not to defer subsequent submissions          // the pending ones that were created during the handler          // will be flushed or forgoten.          mForm->OnSubmitClickEnd();        }        break;    } //switch  }  // Reset the flag for other content besides this text field  aEvent->flags |= noContentDispatch ? NS_EVENT_FLAG_NO_CONTENT_DISPATCH : NS_EVENT_FLAG_NONE;  // now check to see if the event was "cancelled"  if (checkWasSet) {    if (*aEventStatus == nsEventStatus_eConsumeNoDefault) {      // if it was cancelled and a radio button, then set the old      // selected btn to TRUE. if it is a checkbox then set it to its      // original value      if (selectedRadioButton) {        selectedRadioButton->SetChecked(PR_TRUE);        // If this one is no longer a radio button we must reset it back to        // false to cancel the action.  See how the web of hack grows?        if (mType != NS_FORM_INPUT_RADIO) {          SetChecked(PR_FALSE);        }      } else if (oldType == NS_FORM_INPUT_CHECKBOX) {        SetChecked(originalCheckedValue);      }    } else {      FireOnChange();#ifdef ACCESSIBILITY      // Fire an event to notify accessibility      if (mType == NS_FORM_INPUT_CHECKBOX) {        FireEventForAccessibility(aPresContext,                                  NS_LITERAL_STRING("CheckboxStateChange"));      } else {        FireEventForAccessibility(aPresContext,                                  NS_LITERAL_STRING("RadioStateChange"));      }#endif    }  }  // Finish the special file control processing...  if (oldTarget) {    // If the event is starting here that's fine.  If it's not    // init'ing here it started beneath us and needs modification.    if (!(NS_EVENT_FLAG_INIT & aFlags)) {      if (!*aDOMEvent) {        return NS_ERROR_FAILURE;      }      nsCOMPtr<nsIPrivateDOMEvent> privateEvent =        do_QueryInterface(*aDOMEvent);      if (!privateEvent) {        return NS_ERROR_FAILURE;      }      // This will reset the target to its original value      privateEvent->SetTarget(oldTarget);    }  }  if (NS_SUCCEEDED(rv) &&       !(aFlags & NS_EVENT_FLAG_CAPTURE) &&      !(aFlags & NS_EVENT_FLAG_SYSTEM_EVENT)) {    if (nsEventStatus_eIgnore == *aEventStatus) {      switch (aEvent->message) {        case NS_FOCUS_CONTENT:        {          // If this is a file control, check to see if focus has bubbled          // up from its child textfield or child button.  If that's the case,           // don't focus this parent file control -- leave focus on the child.          if (mType != NS_FORM_INPUT_FILE || !(aFlags & NS_EVENT_FLAG_BUBBLE)) {            nsIFormControlFrame* formControlFrame = GetFormControlFrame(PR_FALSE);            if (formControlFrame) {              SET_BOOLBIT(mBitField, BF_SKIP_FOCUS_EVENT, PR_TRUE);              formControlFrame->SetFocus(PR_TRUE, PR_TRUE);              SET_BOOLBIT(mBitField, BF_SKIP_FOCUS_EVENT, PR_FALSE);            }            return NS_OK;          }        }                                                                                 break; // NS_FOCUS_CONTENT        case NS_KEY_PRESS:        case NS_KEY_UP:        {          // For backwards compat, trigger checks/radios/buttons with          // space or enter (bug 25300)          nsKeyEvent * keyEvent = (nsKeyEvent *)aEvent;          if ((aEvent->message == NS_KEY_PRESS &&               keyEvent->keyCode == NS_VK_RETURN) ||              (aEvent->message == NS_KEY_UP &&               keyEvent->keyCode == NS_VK_SPACE)) {            switch(mType) {              case NS_FORM_INPUT_CHECKBOX:              case NS_FORM_INPUT_RADIO:              {                // Checkbox and Radio try to submit on Enter press                if (keyEvent->keyCode != NS_VK_SPACE) {                  // Generate a submit event targeted at the form content                  nsCOMPtr<nsIContent> form(do_QueryInterface(mForm));                  if (form) {                    nsCOMPtr<nsIPresShell> shell;                    aPresContext->GetShell(getter_AddRefs(shell));                    if (shell) {                      nsCOMPtr<nsIContent> formControl = this; // kungFuDeathGrip                      nsFormEvent event;                      event.eventStructType = NS_FORM_EVENT;                      event.message         = NS_FORM_SUBMIT;                      event.originator      = formControl;                      nsEventStatus status  = nsEventStatus_eIgnore;                      shell->HandleDOMEventWithTarget(form, &event, &status);                    }                  }                  break;  // If we are submitting, do not send click event                }                // else fall through and treat Space like click...              }              case NS_FORM_INPUT_BUTTON:              case NS_FORM_INPUT_RESET:              case NS_FORM_INPUT_SUBMIT:              case NS_FORM_INPUT_IMAGE: // Bug 34418              {                nsEventStatus status = nsEventStatus_eIgnore;                nsMouseEvent event;                event.eventStructType = NS_MOUSE_EVENT;                event.message = NS_MOUSE_LEFT_CLICK;                event.isShift = PR_FALSE;                event.isControl = PR_FALSE;                event.isAlt = PR_FALSE;                event.isMeta = PR_FALSE;                event.clickCount = 0;                event.widget = nsnull;                rv = HandleDOMEvent(aPresContext, &event, nsnull,                                    NS_EVENT_FLAG_INIT, &status);              } // case            } // switch          }          /*           * If this is input type=text, and the user hit enter, fire onChange           * and submit the form (if we are in one)           *           * Bug 99920, bug 109463 and bug 147850:           * (a) if there is a submit control in the form, click the first           *     submit control in the form.           * (b) if there is just one text control in the form, submit by           *     sending a submit event directly to the form           * (c) if there is more than one text input and no submit buttons, do           *     not submit, period.           */          if (aEvent->message == NS_KEY_PRESS &&              (keyEvent->keyCode == NS_VK_RETURN ||               keyEvent->keyCode == NS_VK_ENTER) &&              (mType == NS_FORM_INPUT_TEXT ||               mType == NS_FORM_INPUT_PASSWORD)) {            if (mForm) {              nsIFrame* primaryFrame = GetPrimaryFrame(PR_FALSE);              if (primaryFrame) {                nsITextControlFrame* textFrame = nsnull;                CallQueryInterface(primaryFrame, &textFrame);                // Fire onChange (if necessary)                if (textFrame) {                  textFrame->CheckFireOnChange();                }              }              // Find the first submit control in elements[]              // and also check how many text controls we have in the form              nsCOMPtr<nsIContent> submitControl;              PRInt32 numTextControlsFound = 0;              nsCOMPtr<nsISimpleEnumerator> formControls;              mForm->GetControlEnumerator(getter_AddRefs(formControls));              nsCOMPtr<nsISupports> currentControlSupports;              nsCOMPtr<nsIFormControl> currentControl;              PRBool hasMoreElements;              while (NS_SUCCEEDED(formControls->HasMoreElements(&hasMoreElements)) &&                     hasMoreElements) {                formControls->GetNext(getter_AddRefs(currentControlSupports));                currentControl = do_QueryInterface(currentControlSupports);                if (currentControl) {                  PRInt32 type;                  currentControl->GetType(&type);                  if (!submitControl &&                      (type == NS_FORM_INPUT_SUBMIT ||                       type == NS_FORM_BUTTON_SUBMIT ||                       type == NS_FORM_INPUT_IMAGE)) {                    submitControl = do_QueryInterface(currentControl);                    // We know as soon as we find a submit control that it no                    // longer matters how many text controls there are--we are                    // going to fire the onClick handler.                    break;                  } else if (type == NS_FORM_INPUT_TEXT ||                             type == NS_FORM_INPUT_PASSWORD) {                    numTextControlsFound++;                  }                }              }                          nsCOMPtr<nsIPresShell> shell;              aPresContext->GetShell(getter_AddRefs(shell));              if (shell) {                if (submitControl) {                 // Fire the button's onclick handler and let the button handle                 // submitting the form.                  nsGUIEvent event;                  event.eventStructType = NS_MOUSE_EVENT;                  event.message = NS_MOUSE_LEFT_CLICK;                  event.widget = nsnull;                  nsEventStatus status = nsEventStatus_eIgnore;                  shell->HandleDOMEventWithTarget(submitControl, &event, &status);                } else if (numTextControlsFound == 1) {                  // If there's only one text control, just submit the form                  nsCOMPtr<nsIContent> form = do_QueryInterface(mForm);                  nsFormEvent event;                  event.eventStructType = NS_FORM_EVENT;                  event.message         = NS_FORM_SUBMIT;                  event.originator      = nsnull;                  nsEventStatus status  = nsEventStatus_eIgnore;                  shell->HandleDOMEventWithTarget(form, &event, &status);                }              }            }          }        } break; // NS_KEY_PRESS || NS_KEY_UP        // cancel all of these events for buttons        case NS_MOUSE_MIDDLE_BUTTON_DOWN:        case NS_MOUSE_MIDDLE_BUTTON_UP:        case NS_MOUSE_MIDDLE_DOUBLECLICK:        case NS_MOUSE_RIGHT_DOUBLECLICK:        case NS_MOUSE_RIGHT_BUTTON_DOWN:        case NS_MOUSE_RIGHT_BUTTON_UP:        {          if (mType == NS_FORM_INPUT_BUTTON ||               mType == NS_FORM_INPUT_RESET ||               mType == NS_FORM_INPUT_SUBMIT ) {            nsCOMPtr<nsIDOMNSEvent> nsevent;            if (aDOMEvent) {              nsevent = do_QueryInterface(*aDOMEvent);            }            if (nsevent) {              nsevent->PreventBubble();            } else {              rv = NS_ERROR_FAILURE;            }          }          break;        }        case NS_MOUSE_LEFT_CLICK:        {          if (mForm && (oldType == NS_FORM_INPUT_SUBMIT ||                        oldType == NS_FORM_INPUT_IMAGE)) {            if (mType == NS_FORM_INPUT_SUBMIT || mType == NS_FORM_INPUT_IMAGE) {              // tell the form to forget a possible pending submission.              // the reason is that the script returned true (the event was              // ignored) so if there is a stored submission, it will miss              // the name/value of the submitting element, thus we need              // to forget it and the form element will build a new one              mForm->ForgetPendingSubmission();            } else {              // If the type has changed to a non-submit type, then we want to              // flush the stored submission if there is one (as if the submit()              // was allowed to succeed)              mForm->FlushPendingSubmission();            }          }          switch(mType) {            case NS_FORM_INPUT_RESET:            case NS_FORM_INPUT_SUBMIT:            case NS_FORM_INPUT_IMAGE:              {                if (mForm) {                  nsFormEvent event;                  event.eventStructType = NS_FORM_EVENT;                  event.message         = (mType == NS_FORM_INPUT_RESET) ? NS_FORM_RESET : NS_FORM_SUBMIT;                  event.originator      = this;                  nsEventStatus status  = nsEventStatus_eIgnore;                  nsCOMPtr<nsIPresShell> presShell;                  aPresContext->GetShell(getter_AddRefs(presShell));                  // If |nsIPresShell::Destroy| has been called due to                  // handling the event (base class HandleDOMEvent, above),                  // the pres context will return a null pres shell.  See                  // bug 125624.                  if (presShell) {                    nsCOMPtr<nsIContent> form(do_QueryInterface(mForm));                    presShell->HandleDOMEventWithTarget(form, &event, &status);                  }                }              }              break;            default:              break;          } //switch         } break;// NS_MOUSE_LEFT_CLICK      } //switch    } else {      if (aEvent->message == NS_MOUSE_LEFT_CLICK &&          (oldType == NS_FORM_INPUT_SUBMIT || oldType == NS_FORM_INPUT_IMAGE) &&          mForm) {        // tell the form to flush a possible pending submission.        // the reason is that the script returned false (the event was        // not ignored) so if there is a stored submission, it needs to        // be submitted immediately.        mForm->FlushPendingSubmission();      }    } //if  } // if  return rv;}