diff --git a/mozilla/content/html/content/public/nsIFormSubmitObserver.h b/mozilla/content/html/content/public/nsIFormSubmitObserver.h index 97a4d1130d2..b1b99e321ce 100644 --- a/mozilla/content/html/content/public/nsIFormSubmitObserver.h +++ b/mozilla/content/html/content/public/nsIFormSubmitObserver.h @@ -57,6 +57,8 @@ class nsIURI; { 0xa6cf9106, 0x15b3, 0x11d2, {0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32} } #define NS_FORMSUBMIT_SUBJECT "formsubmit" +// used when actionURL is not needed and accuracy of form data is more important +#define NS_EARLYFORMSUBMIT_SUBJECT "earlyformsubmit" #define NS_FIRST_FORMSUBMIT_CATEGORY "firstformsubmit" #define NS_PASSWORDMANAGER_CATEGORY "passwordmanager" diff --git a/mozilla/content/html/content/src/nsHTMLFormElement.cpp b/mozilla/content/html/content/src/nsHTMLFormElement.cpp index 787d80d4f4d..977b91bdd35 100644 --- a/mozilla/content/html/content/src/nsHTMLFormElement.cpp +++ b/mozilla/content/html/content/src/nsHTMLFormElement.cpp @@ -291,7 +291,8 @@ protected: * @param aCancelSubmit out param where submit observers can specify that the * submit should be cancelled. */ - nsresult NotifySubmitObservers(nsIURI* aActionURL, PRBool* aCancelSubmit); + nsresult NotifySubmitObservers(nsIURI* aActionURL, PRBool* aCancelSubmit, + PRBool aEarlyNotify); /** * Just like GetElementCount(), but doesn't flush @@ -571,7 +572,11 @@ nsHTMLFormElement::SetAttr(PRInt32 aNameSpaceID, nsIAtom* aName, // the second argument is not playing a role at all. FlushPendingSubmission(); } + // Don't forget we've notified the password manager already if the + // page sets the action/target in the during submit. (bug 343182) + PRBool notifiedObservers = mNotifiedObservers; ForgetCurrentSubmission(); + mNotifiedObservers = notifiedObservers; } return nsGenericHTMLElement::SetAttr(aNameSpaceID, aName, aPrefix, aValue, aNotify); @@ -960,7 +965,7 @@ nsHTMLFormElement::SubmitSubmission(nsIFormSubmission* aFormSubmission) if (mNotifiedObservers) { cancelSubmit = mNotifiedObserversResult; } else { - rv = NotifySubmitObservers(actionURI, &cancelSubmit); + rv = NotifySubmitObservers(actionURI, &cancelSubmit, PR_TRUE); NS_ENSURE_SUBMIT_SUCCESS(rv); } @@ -969,6 +974,15 @@ nsHTMLFormElement::SubmitSubmission(nsIFormSubmission* aFormSubmission) return NS_OK; } + cancelSubmit = PR_FALSE; + rv = NotifySubmitObservers(actionURI, &cancelSubmit, PR_FALSE); + NS_ENSURE_SUBMIT_SUCCESS(rv); + + if (cancelSubmit) { + mIsSubmitting = PR_FALSE; + return NS_OK; + } + // // Submit // @@ -1010,7 +1024,8 @@ nsHTMLFormElement::SubmitSubmission(nsIFormSubmission* aFormSubmission) nsresult nsHTMLFormElement::NotifySubmitObservers(nsIURI* aActionURL, - PRBool* aCancelSubmit) + PRBool* aCancelSubmit, + PRBool aEarlyNotify) { // If this is the first form, bring alive the first form submit // category observers @@ -1028,7 +1043,9 @@ nsHTMLFormElement::NotifySubmitObservers(nsIURI* aActionURL, NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr theEnum; - rv = service->EnumerateObservers(NS_FORMSUBMIT_SUBJECT, + rv = service->EnumerateObservers(aEarlyNotify ? + NS_EARLYFORMSUBMIT_SUBJECT : + NS_FORMSUBMIT_SUBJECT, getter_AddRefs(theEnum)); NS_ENSURE_SUCCESS(rv, rv); @@ -1323,7 +1340,7 @@ nsHTMLFormElement::OnSubmitClickBegin() // Notify observers of submit // PRBool cancelSubmit = PR_FALSE; - rv = NotifySubmitObservers(actionURI, &cancelSubmit); + rv = NotifySubmitObservers(actionURI, &cancelSubmit, PR_TRUE); if (NS_SUCCEEDED(rv)) { mNotifiedObservers = PR_TRUE; mNotifiedObserversResult = cancelSubmit; diff --git a/mozilla/extensions/wallet/src/nsWalletService.cpp b/mozilla/extensions/wallet/src/nsWalletService.cpp index 4958a1d4de8..401c32f2e0e 100644 --- a/mozilla/extensions/wallet/src/nsWalletService.cpp +++ b/mozilla/extensions/wallet/src/nsWalletService.cpp @@ -299,7 +299,7 @@ nsresult nsWalletlibService::Init() do_GetService("@mozilla.org/observer-service;1", &rv); if (NS_SUCCEEDED(rv) && svc) { // Register as an observer of form submission - svc->AddObserver(this, NS_FORMSUBMIT_SUBJECT, PR_TRUE); + svc->AddObserver(this, NS_EARLYFORMSUBMIT_SUBJECT, PR_TRUE); // Register as an observer of profile changes svc->AddObserver(this, "profile-before-change", PR_TRUE); // Register as an observer for login diff --git a/mozilla/toolkit/components/passwordmgr/base/nsPasswordManager.cpp b/mozilla/toolkit/components/passwordmgr/base/nsPasswordManager.cpp index ee8db881681..adac6666d16 100644 --- a/mozilla/toolkit/components/passwordmgr/base/nsPasswordManager.cpp +++ b/mozilla/toolkit/components/passwordmgr/base/nsPasswordManager.cpp @@ -278,7 +278,7 @@ nsPasswordManager::Init() nsCOMPtr obsService = do_GetService("@mozilla.org/observer-service;1"); NS_ASSERTION(obsService, "No observer service"); - obsService->AddObserver(this, NS_FORMSUBMIT_SUBJECT, PR_TRUE); + obsService->AddObserver(this, NS_EARLYFORMSUBMIT_SUBJECT, PR_TRUE); nsCOMPtr progress = do_GetService(NS_DOCUMENTLOADER_SERVICE_CONTRACTID); NS_ASSERTION(progress, "No web progress service"); diff --git a/mozilla/toolkit/components/satchel/src/nsFormHistory.cpp b/mozilla/toolkit/components/satchel/src/nsFormHistory.cpp index ccdd7477427..c641dc70dd0 100644 --- a/mozilla/toolkit/components/satchel/src/nsFormHistory.cpp +++ b/mozilla/toolkit/components/satchel/src/nsFormHistory.cpp @@ -115,7 +115,7 @@ nsFormHistory::Init() { nsCOMPtr service = do_GetService("@mozilla.org/observer-service;1"); if (service) - service->AddObserver(this, NS_FORMSUBMIT_SUBJECT, PR_TRUE); + service->AddObserver(this, NS_EARLYFORMSUBMIT_SUBJECT, PR_TRUE); return NS_OK; } diff --git a/mozilla/toolkit/components/satchel/src/nsStorageFormHistory.cpp b/mozilla/toolkit/components/satchel/src/nsStorageFormHistory.cpp index b171d23f826..cd5ba539ccf 100644 --- a/mozilla/toolkit/components/satchel/src/nsStorageFormHistory.cpp +++ b/mozilla/toolkit/components/satchel/src/nsStorageFormHistory.cpp @@ -180,7 +180,7 @@ nsFormHistory::Init() nsCOMPtr service = do_GetService("@mozilla.org/observer-service;1"); if (service) - service->AddObserver(this, NS_FORMSUBMIT_SUBJECT, PR_TRUE); + service->AddObserver(this, NS_EARLYFORMSUBMIT_SUBJECT, PR_TRUE); return NS_OK; }