зеркало из https://github.com/mozilla/gecko-dev.git
Bug 33203: Form submit observer changes for psm-glue; r=dougt
This commit is contained in:
Родитель
6e35bbbcb2
Коммит
9b52ac7328
|
@ -30,8 +30,10 @@
|
|||
#ifndef nsIFormSubmitObserver_h__
|
||||
#define nsIFormSubmitObserver_h__
|
||||
|
||||
#include "nsISupports.h"
|
||||
#include "nsIObserver.h"
|
||||
#include "prtypes.h"
|
||||
#include "nsIDOMWindow.h"
|
||||
#include "nsIURI.h"
|
||||
|
||||
class nsString;
|
||||
|
||||
|
@ -41,15 +43,19 @@ class nsString;
|
|||
|
||||
#define NS_FORMSUBMIT_SUBJECT "formsubmit"
|
||||
|
||||
class nsIFormSubmitObserver : public nsISupports {
|
||||
class nsIFormSubmitObserver : public nsIObserver {
|
||||
public:
|
||||
NS_DEFINE_STATIC_IID_ACCESSOR(NS_IFORMSUBMITOBSERVER_IID)
|
||||
|
||||
/*
|
||||
* Subject calls the observer when the form is submitted
|
||||
* @param formNode- the dom node corresonding to this form.
|
||||
* @param window- the window that the form submit occured in.
|
||||
* NOTE: This is not necessarily the same window the form submit result
|
||||
* will be loaded in (form could have target attribute set)
|
||||
* @param actionURL- URL to which the form will be submitted.
|
||||
*/
|
||||
NS_IMETHOD Notify(nsIContent* formNode) = 0;
|
||||
NS_IMETHOD Notify(nsIContent* formNode, nsIDOMWindow* window, nsIURI* actionURL) = 0;
|
||||
|
||||
|
||||
};
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include "nsIDOMHTMLInputElement.h"
|
||||
#include "nsIFormControl.h"
|
||||
#include "nsIDocShell.h"
|
||||
#include "nsIDOMWindow.h"
|
||||
|
||||
static NS_DEFINE_IID(kDocLoaderServiceCID, NS_DOCUMENTLOADER_SERVICE_CID);
|
||||
|
||||
|
@ -62,9 +63,8 @@ nsWalletlibService::~nsWalletlibService()
|
|||
NS_IF_RELEASE(gKeyedStreamGenerator);
|
||||
}
|
||||
|
||||
NS_IMPL_THREADSAFE_ISUPPORTS6(nsWalletlibService,
|
||||
NS_IMPL_THREADSAFE_ISUPPORTS5(nsWalletlibService,
|
||||
nsIWalletService,
|
||||
nsIObserver,
|
||||
nsIFormSubmitObserver,
|
||||
nsIDocumentLoaderObserver,
|
||||
nsIPasswordSink,
|
||||
|
@ -176,7 +176,7 @@ NS_IMETHODIMP nsWalletlibService::Observe(nsISupports*, const PRUnichar*, const
|
|||
}
|
||||
|
||||
#define CRLF "\015\012"
|
||||
NS_IMETHODIMP nsWalletlibService::Notify(nsIContent* formNode)
|
||||
NS_IMETHODIMP nsWalletlibService::Notify(nsIContent* formNode, nsIDOMWindow* window, nsIURI* actionURL)
|
||||
{
|
||||
if (!formNode) {
|
||||
return NS_ERROR_FAILURE;
|
||||
|
|
|
@ -29,9 +29,10 @@
|
|||
#include "nsIDocumentLoaderObserver.h"
|
||||
#include "nsWeakReference.h"
|
||||
#include "nsIPasswordSink.h"
|
||||
#include "nsIDOMWindow.h"
|
||||
#include "nsIURI.h"
|
||||
|
||||
class nsWalletlibService : public nsIWalletService,
|
||||
public nsIObserver,
|
||||
public nsIFormSubmitObserver,
|
||||
public nsIDocumentLoaderObserver,
|
||||
public nsIPasswordSink,
|
||||
|
@ -75,7 +76,7 @@ public:
|
|||
|
||||
// nsIObserver
|
||||
NS_DECL_NSIOBSERVER
|
||||
NS_IMETHOD Notify(nsIContent* formNode);
|
||||
NS_IMETHOD Notify(nsIContent* formNode, nsIDOMWindow* window, nsIURI* actionURL);
|
||||
|
||||
// nsIDocumentLoaderObserver
|
||||
NS_DECL_NSIDOCUMENTLOADEROBSERVER
|
||||
|
|
|
@ -30,8 +30,10 @@
|
|||
#ifndef nsIFormSubmitObserver_h__
|
||||
#define nsIFormSubmitObserver_h__
|
||||
|
||||
#include "nsISupports.h"
|
||||
#include "nsIObserver.h"
|
||||
#include "prtypes.h"
|
||||
#include "nsIDOMWindow.h"
|
||||
#include "nsIURI.h"
|
||||
|
||||
class nsString;
|
||||
|
||||
|
@ -41,15 +43,19 @@ class nsString;
|
|||
|
||||
#define NS_FORMSUBMIT_SUBJECT "formsubmit"
|
||||
|
||||
class nsIFormSubmitObserver : public nsISupports {
|
||||
class nsIFormSubmitObserver : public nsIObserver {
|
||||
public:
|
||||
NS_DEFINE_STATIC_IID_ACCESSOR(NS_IFORMSUBMITOBSERVER_IID)
|
||||
|
||||
/*
|
||||
* Subject calls the observer when the form is submitted
|
||||
* @param formNode- the dom node corresonding to this form.
|
||||
* @param window- the window that the form submit occured in.
|
||||
* NOTE: This is not necessarily the same window the form submit result
|
||||
* will be loaded in (form could have target attribute set)
|
||||
* @param actionURL- URL to which the form will be submitted.
|
||||
*/
|
||||
NS_IMETHOD Notify(nsIContent* formNode) = 0;
|
||||
NS_IMETHOD Notify(nsIContent* formNode, nsIDOMWindow* window, nsIURI* actionURL) = 0;
|
||||
|
||||
|
||||
};
|
||||
|
|
|
@ -109,6 +109,8 @@ static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID);
|
|||
// Security
|
||||
#include "nsIScriptSecurityManager.h"
|
||||
|
||||
#include "nsIDOMWindow.h"
|
||||
|
||||
static NS_DEFINE_CID(kCharsetConverterManagerCID, NS_ICHARSETCONVERTERMANAGER_CID);
|
||||
static NS_DEFINE_CID(kPlatformCharsetCID, NS_PLATFORMCHARSET_CID);
|
||||
static NS_DEFINE_CID(kMIMEServiceCID, NS_MIMESERVICE_CID);
|
||||
|
@ -691,29 +693,6 @@ nsFormFrame::OnSubmit(nsIPresContext* aPresContext, nsIFrame* aFrame)
|
|||
aFrame->QueryInterface(kIFormControlFrameIID, (void**)&fcFrame);
|
||||
}
|
||||
|
||||
// Notify observers that the form is being submitted.
|
||||
result = NS_OK;
|
||||
NS_WITH_SERVICE(nsIObserverService, service, NS_OBSERVERSERVICE_PROGID, &result);
|
||||
if (NS_FAILED(result)) return result;
|
||||
|
||||
nsString theTopic; theTopic.AssignWithConversion(NS_FORMSUBMIT_SUBJECT);
|
||||
nsIEnumerator* theEnum;
|
||||
result = service->EnumerateObserverList(theTopic.GetUnicode(), &theEnum);
|
||||
if (NS_SUCCEEDED(result) && theEnum){
|
||||
nsCOMPtr<nsISupports> inst;
|
||||
|
||||
for (theEnum->First(); theEnum->IsDone() != NS_OK; theEnum->Next()) {
|
||||
result = theEnum->CurrentItem(getter_AddRefs(inst));
|
||||
if (NS_SUCCEEDED(result) && inst) {
|
||||
nsCOMPtr<nsIFormSubmitObserver> formSubmitObserver = do_QueryInterface(inst, &result);
|
||||
if (NS_SUCCEEDED(result) && formSubmitObserver) {
|
||||
formSubmitObserver->Notify(mContent);
|
||||
}
|
||||
}
|
||||
}
|
||||
NS_RELEASE(theEnum);
|
||||
}
|
||||
|
||||
nsIFileSpec* multipartDataFile = nsnull;
|
||||
if (isURLEncoded) {
|
||||
result = ProcessAsURLEncoded(formProcessor, isPost, data, fcFrame);
|
||||
|
@ -734,13 +713,16 @@ nsFormFrame::OnSubmit(nsIPresContext* aPresContext, nsIFrame* aFrame)
|
|||
nsAutoString href;
|
||||
GetAction(&href);
|
||||
|
||||
// Get the document.
|
||||
// We'll need it now to form the URL we're submitting to.
|
||||
// We'll also need it later to get the DOM window when notifying form submit observers (bug 33203)
|
||||
nsCOMPtr<nsIDocument> document;
|
||||
mContent->GetDocument(*getter_AddRefs(document));
|
||||
if (!document) return NS_OK; // No doc means don't submit, see Bug 28988
|
||||
|
||||
// Resolve url to an absolute url
|
||||
nsCOMPtr<nsIURI> docURL;
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
mContent->GetDocument(*getter_AddRefs(doc));
|
||||
if (!doc) return NS_OK; // No doc means don't submit, see Bug 28988
|
||||
|
||||
doc->GetBaseURL(*getter_AddRefs(docURL));
|
||||
document->GetBaseURL(*getter_AddRefs(docURL));
|
||||
NS_ASSERTION(docURL, "No Base URL found in Form Submit!\n");
|
||||
|
||||
// If an action is not specified and we are inside
|
||||
|
@ -752,7 +734,7 @@ nsFormFrame::OnSubmit(nsIPresContext* aPresContext, nsIFrame* aFrame)
|
|||
|
||||
if (href.IsEmpty()) {
|
||||
nsCOMPtr<nsIHTMLDocument> htmlDoc;
|
||||
if (PR_FALSE == NS_SUCCEEDED(doc->QueryInterface(kIHTMLDocumentIID,
|
||||
if (PR_FALSE == NS_SUCCEEDED(document->QueryInterface(kIHTMLDocumentIID,
|
||||
getter_AddRefs(htmlDoc)))) {
|
||||
// Must be a XML, XUL or other non-HTML document type
|
||||
// so do nothing.
|
||||
|
@ -761,12 +743,11 @@ nsFormFrame::OnSubmit(nsIPresContext* aPresContext, nsIFrame* aFrame)
|
|||
|
||||
// Necko's MakeAbsoluteURI doesn't reuse the baseURL's rel path if it is
|
||||
// passed a zero length rel path.
|
||||
char* relPath = nsnull;
|
||||
docURL->GetSpec(&relPath);
|
||||
nsXPIDLCString relPath;
|
||||
docURL->GetSpec(getter_Copies(relPath));
|
||||
NS_ASSERTION(relPath, "Rel path couldn't be formed in form submit!\n");
|
||||
if (relPath) {
|
||||
href.AppendWithConversion(relPath);
|
||||
nsCRT::free(relPath);
|
||||
|
||||
// If re-using the same URL, chop off old query string (bug 25330)
|
||||
PRInt32 queryStart = href.FindChar('?');
|
||||
|
@ -834,6 +815,40 @@ nsFormFrame::OnSubmit(nsIPresContext* aPresContext, nsIFrame* aFrame)
|
|||
result = NS_MakeAbsoluteURI(absURLSpec, href, docURL);
|
||||
if (NS_FAILED(result)) return result;
|
||||
|
||||
// Notify observers that the form is being submitted.
|
||||
result = NS_OK;
|
||||
NS_WITH_SERVICE(nsIObserverService, service, NS_OBSERVERSERVICE_PROGID, &result);
|
||||
if (NS_FAILED(result)) return result;
|
||||
|
||||
nsString theTopic; theTopic.AssignWithConversion(NS_FORMSUBMIT_SUBJECT);
|
||||
nsIEnumerator* theEnum;
|
||||
result = service->EnumerateObserverList(theTopic.GetUnicode(), &theEnum);
|
||||
if (NS_SUCCEEDED(result) && theEnum){
|
||||
nsCOMPtr<nsISupports> inst;
|
||||
nsresult submitStatus = NS_OK;
|
||||
|
||||
nsCOMPtr<nsIScriptGlobalObject> globalObject;
|
||||
document->GetScriptGlobalObject(getter_AddRefs(globalObject));
|
||||
nsCOMPtr<nsIDOMWindow> window = do_QueryInterface(globalObject);
|
||||
|
||||
for (theEnum->First(); theEnum->IsDone() != NS_OK; theEnum->Next()) {
|
||||
result = theEnum->CurrentItem(getter_AddRefs(inst));
|
||||
if (NS_SUCCEEDED(result) && inst) {
|
||||
nsCOMPtr<nsIFormSubmitObserver> formSubmitObserver = do_QueryInterface(inst, &result);
|
||||
if (NS_SUCCEEDED(result) && formSubmitObserver) {
|
||||
nsresult notifyStatus = formSubmitObserver->Notify(mContent, window, actionURL);
|
||||
if (NS_FAILED(notifyStatus)) {
|
||||
submitStatus = notifyStatus;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
NS_RELEASE(theEnum);
|
||||
if (NS_FAILED(submitStatus)) {
|
||||
return submitStatus;
|
||||
}
|
||||
}
|
||||
|
||||
// Now pass on absolute url to the click handler
|
||||
nsIInputStream* postDataStream = nsnull;
|
||||
if (isPost) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче