From a2d6b2fcc9c576aa0d882c19ffccd1ca99ad2fd7 Mon Sep 17 00:00:00 2001 From: "alexsavulov%netscape.com" Date: Tue, 3 Dec 2002 23:06:34 +0000 Subject: [PATCH] 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 --- .../html/content/src/nsHTMLFormElement.cpp | 54 ++++++++++++++----- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/mozilla/content/html/content/src/nsHTMLFormElement.cpp b/mozilla/content/html/content/src/nsHTMLFormElement.cpp index 8c8c7d5dc61..25f3f96239f 100644 --- a/mozilla/content/html/content/src/nsHTMLFormElement.cpp +++ b/mozilla/content/html/content/src/nsHTMLFormElement.cpp @@ -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 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; }