diff --git a/layout/html/forms/src/nsFormFrame.cpp b/layout/html/forms/src/nsFormFrame.cpp
index 45eb8f44080..302828e7542 100644
--- a/layout/html/forms/src/nsFormFrame.cpp
+++ b/layout/html/forms/src/nsFormFrame.cpp
@@ -15,6 +15,9 @@
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
+
+
+
#define NS_IMPL_IDS
#include "nsICharsetConverterManager.h"
#undef NS_IMPL_IDS
@@ -49,6 +52,8 @@
#include "nsIURL.h"
#include "nsIHTMLDocument.h"
+#include "nsIFormProcessor.h"
+
#ifdef NECKO
#include "nsIIOService.h"
#include "nsIURL.h"
@@ -91,6 +96,8 @@ static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID);
#include "nsEscape.h"
#include "nsIMIMEService.h"
+
+
#define SPECIFY_CHARSET_IN_CONTENT_TYPE
static NS_DEFINE_CID(kCharsetConverterManagerCID, NS_ICHARSETCONVERTERMANAGER_CID);
@@ -109,6 +116,8 @@ static NS_DEFINE_IID(kIDOMNSHTMLFormElementIID, NS_IDOMNSHTMLFORMELEMENT_IID);
static NS_DEFINE_IID(kIContentIID, NS_ICONTENT_IID);
static NS_DEFINE_IID(kIFrameIID, NS_IFRAME_IID);
static NS_DEFINE_IID(kIHTMLDocumentIID, NS_IHTMLDOCUMENT_IID);
+static NS_DEFINE_IID(kIDOMHTMLElementIID, NS_IDOMHTMLELEMENT_IID);
+static NS_DEFINE_IID(kFormProcessorCID, NS_IFORMPROCESSOR_CID);
NS_IMETHODIMP
nsFormFrame::QueryInterface(REFNSIID aIID, void** aInstancePtr)
@@ -407,6 +416,33 @@ void DebugPrint(char* aLabel, nsString aString)
delete [] out;
}
+
+
+// Give the form process observer a chance to modify the value passed for form submission
+nsresult
+nsFormFrame::ProcessValue(nsIFormProcessor& aFormProcessor, nsIFormControlFrame* aFrameControl, const nsString& aName, nsString& aValue)
+{
+ nsresult res = NS_OK;
+
+ nsIFrame *frame = nsnull;
+ res = aFrameControl->QueryInterface(kIFrameIID, (void **)&frame);
+ if (NS_SUCCEEDED(res) && (frame)) {
+ nsCOMPtr content;
+ nsresult rv = frame->GetContent(getter_AddRefs(content));
+ if (NS_SUCCEEDED(rv) && content) {
+ nsCOMPtr formElement;
+ res = content->QueryInterface(kIDOMHTMLElementIID, getter_AddRefs(formElement));
+ if (NS_SUCCEEDED(res) && formElement) {
+ res = aFormProcessor.ProcessValue(formElement, aName, aValue);
+ NS_ASSERTION(NS_SUCCEEDED(res), "unable Notify form process observer");
+ }
+ }
+ }
+
+ return res;
+}
+
+
// submission
NS_IMETHODIMP
@@ -416,6 +452,11 @@ nsFormFrame::OnSubmit(nsIPresContext* aPresContext, nsIFrame* aFrame)
return NS_FORM_NOTOK;
}
+ // Get a service to process the value part of the form data
+ // If one doesn't exist, that fine. It's not required.
+ nsresult result = NS_OK;
+ NS_WITH_SERVICE(nsIFormProcessor, formProcessor, kFormProcessorCID, &result)
+
nsString data; // this could be more efficient, by allocating a larger buffer
PRInt32 method, enctype;
@@ -437,7 +478,7 @@ nsFormFrame::OnSubmit(nsIPresContext* aPresContext, nsIFrame* aFrame)
}
// Notify observers that the form is being submitted.
- nsresult result = NS_OK;
+ result = NS_OK;
NS_WITH_SERVICE(nsIObserverService, service, NS_OBSERVERSERVICE_PROGID, &result);
if (NS_FAILED(result)) return result;
@@ -461,10 +502,10 @@ nsFormFrame::OnSubmit(nsIPresContext* aPresContext, nsIFrame* aFrame)
nsIFileSpec* multipartDataFile = nsnull;
if (isURLEncoded) {
- result = ProcessAsURLEncoded(isPost, data, fcFrame);
+ result = ProcessAsURLEncoded(formProcessor, isPost, data, fcFrame);
}
else {
- result = ProcessAsMultipart(multipartDataFile, fcFrame);
+ result = ProcessAsMultipart(formProcessor, multipartDataFile, fcFrame);
}
// Don't bother submitting form if we failed to generate a valid submission
@@ -683,7 +724,7 @@ NS_IMETHODIMP nsFormFrame::GetEncoder(nsIUnicodeEncoder** encoder)
}
#define CRLF "\015\012"
-nsresult nsFormFrame::ProcessAsURLEncoded(PRBool isPost, nsString& aData, nsIFormControlFrame* aFrame)
+nsresult nsFormFrame::ProcessAsURLEncoded(nsIFormProcessor* aFormProcessor, PRBool isPost, nsString& aData, nsIFormControlFrame* aFrame)
{
nsresult rv = NS_OK;
nsString buf;
@@ -722,7 +763,12 @@ nsresult nsFormFrame::ProcessAsURLEncoded(PRBool isPost, nsString& aData, nsIFor
buf += *convName;
delete convName;
buf += "=";
- nsString* convValue = URLEncode(values[valueX], encoder);
+ nsAutoString newValue;
+ newValue = values[valueX];
+ if (aFormProcessor) {
+ ProcessValue(*aFormProcessor, child, names[valueX], newValue);
+ }
+ nsString* convValue = URLEncode(newValue, encoder);
buf += *convValue;
delete convValue;
}
@@ -815,7 +861,7 @@ nsFormFrame::GetContentType(char* aPathName, char** aContentType)
#define MULTIPART "multipart/form-data"
#define SEP "--"
-nsresult nsFormFrame::ProcessAsMultipart(nsIFileSpec*& aMultipartDataFile, nsIFormControlFrame* aFrame)
+nsresult nsFormFrame::ProcessAsMultipart(nsIFormProcessor* aFormProcessor,nsIFileSpec*& aMultipartDataFile, nsIFormControlFrame* aFrame)
{
char buffer[BUFSIZE];
PRInt32 numChildren = mFormControls.Count();
@@ -872,17 +918,22 @@ nsresult nsFormFrame::ProcessAsMultipart(nsIFileSpec*& aMultipartDataFile, nsIFo
char* name = nsnull;
char* value = nsnull;
+ nsString valueStr = values[valueX];
+ if (aFormProcessor) {
+ ProcessValue(*aFormProcessor, child, names[valueX], valueStr);
+ }
+
if(encoder) {
name = UnicodeToNewBytes(names[valueX].GetUnicode(), names[valueX].Length(), encoder);
- value = UnicodeToNewBytes(values[valueX].GetUnicode(), values[valueX].Length(), encoder);
+ value = UnicodeToNewBytes(valueStr.GetUnicode(), valueStr.Length(), encoder);
}
if(nsnull == name)
name = names[valueX].ToNewCString();
if(nsnull == value)
- value = values[valueX].ToNewCString();
+ value = valueStr.ToNewCString();
- if ((0 == names[valueX].Length()) || (0 == values[valueX].Length())) {
+ if ((0 == names[valueX].Length()) || (0 == valueStr.Length())) {
continue;
}
@@ -897,8 +948,8 @@ nsresult nsFormFrame::ProcessAsMultipart(nsIFileSpec*& aMultipartDataFile, nsIFo
if (NS_FORM_INPUT_FILE == type) {
contentLen += PL_strlen(FILENAME);
const char* fileNameStart = GetFileNameWithinPath(value);
- contentLen += PL_strlen(fileNameStart);
- }
+ contentLen += PL_strlen(fileNameStart);
+ }
// End Content-Disp Line (quote plus CRLF)
contentLen += 1 + crlfLen; // ending name quote plus CRLF
diff --git a/layout/html/forms/src/nsFormFrame.h b/layout/html/forms/src/nsFormFrame.h
index be91abcaf13..325e19d30c4 100644
--- a/layout/html/forms/src/nsFormFrame.h
+++ b/layout/html/forms/src/nsFormFrame.h
@@ -22,6 +22,7 @@
#include "nsBlockFrame.h"
#include "nsVoidArray.h"
#include "nsIFileSpec.h"
+#include "nsIFormProcessor.h"
class nsString;
class nsIContent;
@@ -79,8 +80,10 @@ protected:
NS_IMETHOD_(nsrefcnt) AddRef(void);
NS_IMETHOD_(nsrefcnt) Release(void);
void RemoveRadioGroups();
- nsresult ProcessAsURLEncoded(PRBool aIsPost, nsString& aData, nsIFormControlFrame* aFrame);
- nsresult ProcessAsMultipart(nsIFileSpec*& aMultipartDataFile, nsIFormControlFrame* aFrame);
+
+ nsresult ProcessValue(nsIFormProcessor& aFormProcessor, nsIFormControlFrame* aFrameControl, const nsString& aName, nsString& aNewValue);
+ nsresult ProcessAsURLEncoded(nsIFormProcessor* aFormProcessor, PRBool aIsPost, nsString& aData, nsIFormControlFrame* aFrame);
+ nsresult ProcessAsMultipart(nsIFormProcessor* aFormProcessor, nsIFileSpec*& aMultipartDataFile, nsIFormControlFrame* aFrame);
static const char* GetFileNameWithinPath(char* aPathName);
nsresult GetContentType(char* aPathName, char** aContentType);