зеркало из https://github.com/mozilla/pjs.git
Call nsIFormProcessor service if it has been registered for each value submitted.
bug=17060 r=karnaze@netscape.com
This commit is contained in:
Родитель
eba9afd931
Коммит
a0fcea442f
|
@ -15,6 +15,9 @@
|
||||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||||
* Reserved.
|
* Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define NS_IMPL_IDS
|
#define NS_IMPL_IDS
|
||||||
#include "nsICharsetConverterManager.h"
|
#include "nsICharsetConverterManager.h"
|
||||||
#undef NS_IMPL_IDS
|
#undef NS_IMPL_IDS
|
||||||
|
@ -49,6 +52,8 @@
|
||||||
#include "nsIURL.h"
|
#include "nsIURL.h"
|
||||||
#include "nsIHTMLDocument.h"
|
#include "nsIHTMLDocument.h"
|
||||||
|
|
||||||
|
#include "nsIFormProcessor.h"
|
||||||
|
|
||||||
#ifdef NECKO
|
#ifdef NECKO
|
||||||
#include "nsIIOService.h"
|
#include "nsIIOService.h"
|
||||||
#include "nsIURL.h"
|
#include "nsIURL.h"
|
||||||
|
@ -91,6 +96,8 @@ static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID);
|
||||||
#include "nsEscape.h"
|
#include "nsEscape.h"
|
||||||
#include "nsIMIMEService.h"
|
#include "nsIMIMEService.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define SPECIFY_CHARSET_IN_CONTENT_TYPE
|
#define SPECIFY_CHARSET_IN_CONTENT_TYPE
|
||||||
|
|
||||||
static NS_DEFINE_CID(kCharsetConverterManagerCID, NS_ICHARSETCONVERTERMANAGER_CID);
|
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(kIContentIID, NS_ICONTENT_IID);
|
||||||
static NS_DEFINE_IID(kIFrameIID, NS_IFRAME_IID);
|
static NS_DEFINE_IID(kIFrameIID, NS_IFRAME_IID);
|
||||||
static NS_DEFINE_IID(kIHTMLDocumentIID, NS_IHTMLDOCUMENT_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
|
NS_IMETHODIMP
|
||||||
nsFormFrame::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
nsFormFrame::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
||||||
|
@ -407,6 +416,33 @@ void DebugPrint(char* aLabel, nsString aString)
|
||||||
delete [] out;
|
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<nsIContent> content;
|
||||||
|
nsresult rv = frame->GetContent(getter_AddRefs(content));
|
||||||
|
if (NS_SUCCEEDED(rv) && content) {
|
||||||
|
nsCOMPtr<nsIDOMHTMLElement> 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
|
// submission
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
@ -416,6 +452,11 @@ nsFormFrame::OnSubmit(nsIPresContext* aPresContext, nsIFrame* aFrame)
|
||||||
return NS_FORM_NOTOK;
|
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
|
nsString data; // this could be more efficient, by allocating a larger buffer
|
||||||
|
|
||||||
PRInt32 method, enctype;
|
PRInt32 method, enctype;
|
||||||
|
@ -437,7 +478,7 @@ nsFormFrame::OnSubmit(nsIPresContext* aPresContext, nsIFrame* aFrame)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Notify observers that the form is being submitted.
|
// Notify observers that the form is being submitted.
|
||||||
nsresult result = NS_OK;
|
result = NS_OK;
|
||||||
NS_WITH_SERVICE(nsIObserverService, service, NS_OBSERVERSERVICE_PROGID, &result);
|
NS_WITH_SERVICE(nsIObserverService, service, NS_OBSERVERSERVICE_PROGID, &result);
|
||||||
if (NS_FAILED(result)) return result;
|
if (NS_FAILED(result)) return result;
|
||||||
|
|
||||||
|
@ -461,10 +502,10 @@ nsFormFrame::OnSubmit(nsIPresContext* aPresContext, nsIFrame* aFrame)
|
||||||
|
|
||||||
nsIFileSpec* multipartDataFile = nsnull;
|
nsIFileSpec* multipartDataFile = nsnull;
|
||||||
if (isURLEncoded) {
|
if (isURLEncoded) {
|
||||||
result = ProcessAsURLEncoded(isPost, data, fcFrame);
|
result = ProcessAsURLEncoded(formProcessor, isPost, data, fcFrame);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
result = ProcessAsMultipart(multipartDataFile, fcFrame);
|
result = ProcessAsMultipart(formProcessor, multipartDataFile, fcFrame);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't bother submitting form if we failed to generate a valid submission
|
// 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"
|
#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;
|
nsresult rv = NS_OK;
|
||||||
nsString buf;
|
nsString buf;
|
||||||
|
@ -722,7 +763,12 @@ nsresult nsFormFrame::ProcessAsURLEncoded(PRBool isPost, nsString& aData, nsIFor
|
||||||
buf += *convName;
|
buf += *convName;
|
||||||
delete convName;
|
delete convName;
|
||||||
buf += "=";
|
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;
|
buf += *convValue;
|
||||||
delete convValue;
|
delete convValue;
|
||||||
}
|
}
|
||||||
|
@ -815,7 +861,7 @@ nsFormFrame::GetContentType(char* aPathName, char** aContentType)
|
||||||
#define MULTIPART "multipart/form-data"
|
#define MULTIPART "multipart/form-data"
|
||||||
#define SEP "--"
|
#define SEP "--"
|
||||||
|
|
||||||
nsresult nsFormFrame::ProcessAsMultipart(nsIFileSpec*& aMultipartDataFile, nsIFormControlFrame* aFrame)
|
nsresult nsFormFrame::ProcessAsMultipart(nsIFormProcessor* aFormProcessor,nsIFileSpec*& aMultipartDataFile, nsIFormControlFrame* aFrame)
|
||||||
{
|
{
|
||||||
char buffer[BUFSIZE];
|
char buffer[BUFSIZE];
|
||||||
PRInt32 numChildren = mFormControls.Count();
|
PRInt32 numChildren = mFormControls.Count();
|
||||||
|
@ -872,17 +918,22 @@ nsresult nsFormFrame::ProcessAsMultipart(nsIFileSpec*& aMultipartDataFile, nsIFo
|
||||||
char* name = nsnull;
|
char* name = nsnull;
|
||||||
char* value = nsnull;
|
char* value = nsnull;
|
||||||
|
|
||||||
|
nsString valueStr = values[valueX];
|
||||||
|
if (aFormProcessor) {
|
||||||
|
ProcessValue(*aFormProcessor, child, names[valueX], valueStr);
|
||||||
|
}
|
||||||
|
|
||||||
if(encoder) {
|
if(encoder) {
|
||||||
name = UnicodeToNewBytes(names[valueX].GetUnicode(), names[valueX].Length(), 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)
|
if(nsnull == name)
|
||||||
name = names[valueX].ToNewCString();
|
name = names[valueX].ToNewCString();
|
||||||
if(nsnull == value)
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -897,8 +948,8 @@ nsresult nsFormFrame::ProcessAsMultipart(nsIFileSpec*& aMultipartDataFile, nsIFo
|
||||||
if (NS_FORM_INPUT_FILE == type) {
|
if (NS_FORM_INPUT_FILE == type) {
|
||||||
contentLen += PL_strlen(FILENAME);
|
contentLen += PL_strlen(FILENAME);
|
||||||
const char* fileNameStart = GetFileNameWithinPath(value);
|
const char* fileNameStart = GetFileNameWithinPath(value);
|
||||||
contentLen += PL_strlen(fileNameStart);
|
contentLen += PL_strlen(fileNameStart);
|
||||||
}
|
}
|
||||||
// End Content-Disp Line (quote plus CRLF)
|
// End Content-Disp Line (quote plus CRLF)
|
||||||
contentLen += 1 + crlfLen; // ending name quote plus CRLF
|
contentLen += 1 + crlfLen; // ending name quote plus CRLF
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "nsBlockFrame.h"
|
#include "nsBlockFrame.h"
|
||||||
#include "nsVoidArray.h"
|
#include "nsVoidArray.h"
|
||||||
#include "nsIFileSpec.h"
|
#include "nsIFileSpec.h"
|
||||||
|
#include "nsIFormProcessor.h"
|
||||||
|
|
||||||
class nsString;
|
class nsString;
|
||||||
class nsIContent;
|
class nsIContent;
|
||||||
|
@ -79,8 +80,10 @@ protected:
|
||||||
NS_IMETHOD_(nsrefcnt) AddRef(void);
|
NS_IMETHOD_(nsrefcnt) AddRef(void);
|
||||||
NS_IMETHOD_(nsrefcnt) Release(void);
|
NS_IMETHOD_(nsrefcnt) Release(void);
|
||||||
void RemoveRadioGroups();
|
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);
|
static const char* GetFileNameWithinPath(char* aPathName);
|
||||||
nsresult GetContentType(char* aPathName, char** aContentType);
|
nsresult GetContentType(char* aPathName, char** aContentType);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче