Fix for bug 147878 - defer submission until onSubmit returns so we can

chose to submit name/value or the triggering element if the return is true.
r= jkeiser sr= jst


git-svn-id: svn://10.0.0.236/trunk@134731 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
alexsavulov%netscape.com 2002-12-03 23:06:34 +00:00
parent 2528bfde89
commit a2d6b2fcc9

View File

@ -120,7 +120,7 @@ public:
mGeneratingSubmit(PR_FALSE),
mGeneratingReset(PR_FALSE),
mIsSubmitting(PR_FALSE),
mInSubmitClick(PR_FALSE),
mDeferSubmission(PR_FALSE),
mPendingSubmission(nsnull),
mSubmittingRequest(nsnull) { }
@ -298,7 +298,7 @@ protected:
/** Whether we are submitting currently */
PRPackedBool mIsSubmitting;
/** Whether the submission was triggered by an Image or Submit*/
PRPackedBool mInSubmitClick;
PRPackedBool mDeferSubmission;
/** The pending submission object */
nsCOMPtr<nsIFormSubmission> mPendingSubmission;
@ -741,6 +741,11 @@ nsHTMLFormElement::HandleDOMEvent(nsIPresContext* aPresContext,
return NS_OK;
}
mGeneratingSubmit = PR_TRUE;
// let the form know that it needs to defer the submission,
// that means that if there are scripted submissions, the
// latest one will be deferred until after the exit point of the handler.
mDeferSubmission = PR_TRUE;
}
else if (aEvent->message == NS_FORM_RESET) {
if (mGeneratingReset) {
@ -749,23 +754,44 @@ nsHTMLFormElement::HandleDOMEvent(nsIPresContext* aPresContext,
mGeneratingReset = PR_TRUE;
}
nsresult rv = nsGenericHTMLContainerElement::HandleDOMEvent(aPresContext,
aEvent,
aDOMEvent,
aFlags,
aEventStatus);
aEventStatus);
if (mDeferSubmission) {
// let the form know not to defer subsequent submissions
mDeferSubmission = PR_FALSE;
}
if (NS_SUCCEEDED(rv) && (*aEventStatus == nsEventStatus_eIgnore) &&
if (NS_SUCCEEDED(rv) &&
!(aFlags & NS_EVENT_FLAG_CAPTURE) &&
!(aFlags & NS_EVENT_FLAG_SYSTEM_EVENT)) {
switch (aEvent->message) {
case NS_FORM_RESET:
case NS_FORM_SUBMIT:
{
rv = DoSubmitOrReset(aPresContext, aEvent, aEvent->message);
if (*aEventStatus == nsEventStatus_eIgnore) {
switch (aEvent->message) {
case NS_FORM_RESET:
case NS_FORM_SUBMIT:
{
if (mPendingSubmission) {
// 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
ForgetPendingSubmission();
}
rv = DoSubmitOrReset(aPresContext, aEvent, aEvent->message);
}
break;
}
break;
} else {
// 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 immediatelly.
FlushPendingSubmission();
}
}
@ -850,8 +876,8 @@ nsHTMLFormElement::DoSubmit(nsIPresContext* aPresContext, nsEvent* aEvent)
//
BuildSubmission(aPresContext, submission, aEvent);
if(mInSubmitClick) {
// we are in the onclick event handler so we have to
if(mDeferSubmission) {
// we are in an event handler, JS submitted so we have to
// defer this submission. let's remember it and return
// without submitting
mPendingSubmission = submission;
@ -1310,14 +1336,14 @@ nsHTMLFormElement::ResolveName(const nsAString& aName,
NS_IMETHODIMP
nsHTMLFormElement::OnSubmitClickBegin()
{
mInSubmitClick = PR_TRUE;
mDeferSubmission = PR_TRUE;
return NS_OK;
}
NS_IMETHODIMP
nsHTMLFormElement::OnSubmitClickEnd()
{
mInSubmitClick = PR_FALSE;
mDeferSubmission = PR_FALSE;
return NS_OK;
}