+2006-11-13 Brady Eidson <beidson@apple.com>
+
+ Reviewed by Maciej
+
+ Made FormData Shared, and pass it around as such.
+
+ * WebCore.xcodeproj/project.pbxproj: Reordered some items
+ * html/HTMLFormElement.cpp:
+ (WebCore::HTMLFormElement::formData):
+ (WebCore::HTMLFormElement::submit):
+ * html/HTMLFormElement.h:
+ * loader/FrameLoader.cpp:
+ (WebCore::FormSubmission::FormSubmission):
+ (WebCore::FrameLoader::submitForm):
+ * loader/FrameLoader.h:
+ * loader/mac/FrameLoaderMac.mm:
+ (WebCore::FrameLoader::post):
+ (WebCore::FrameLoader::loadResourceSynchronously):
+ * loader/mac/SubresourceLoaderMac.mm:
+ (WebCore::SubresourceLoader::create):
+ * platform/network/FormData.h: Made FormData shared
+ * platform/network/ResourceHandle.h:
+ * platform/network/ResourceHandle.cpp:
+ (WebCore::ResourceHandle::postData):
+ * platform/network/ResourceRequest.h:
+ (WebCore::ResourceRequest::httpBody):
+ (WebCore::ResourceRequest::setHTTPBody):
+ * platform/network/mac/ResourceRequestMac.mm:
+ (WebCore::getResourceRequest):
+ (WebCore::nsURLRequest):
+
+ * platform/network/mac/FormDataStreamMac.h:
+ * platform/network/mac/FormDataStreamMac.mm:
+ (WebCore::getStreamFormDatas): Hash Streams to RefPtr<FormData>s
+ (WebCore::formCreate):
+ (WebCore::formFinalize):
+ (WebCore::setHTTPBody):
+ (WebCore::httpBodyFromStream):
+
+ * xml/xmlhttprequest.cpp:
+ (WebCore::XMLHttpRequest::send):
+
2006-11-13 Justin Garcia <justin.garcia@apple.com>
Reviewed by harrison
isa = PBXGroup;
children = (
65DADA170AFD878000CE53ED /* FormData.h */,
+ 65DAD9FA0AFD86B400CE53ED /* FormData.cpp */,
651888860AFF3BF700164720 /* ResourceError.cpp */,
651888870AFF3BF700164720 /* ResourceError.h */,
- 65DAD9FA0AFD86B400CE53ED /* FormData.cpp */,
656B84E70AEA1DAE00A095B4 /* mac */,
655A81BD0AEF67E6000975F0 /* HTTPHeaderMap.h */,
656B85370AEA1F9A00A095B4 /* ResourceHandle.h */,
0867D690FE84028FC02AAC07 /* Project object */ = {
isa = PBXProject;
buildConfigurationList = 149C284308902B11008A9EFC /* Build configuration list for PBXProject "WebCore" */;
- compatibilityVersion = "Xcode 2.4";
hasScannedForEncodings = 1;
knownRegions = (
English,
productRefGroup = 034768DFFF38A50411DB9C8B /* Products */;
projectDirPath = "";
projectRoot = "";
- shouldCheckCompatibility = 1;
targets = (
93F198A508245E59001E9ABC /* WebCore */,
DD041FBE09D9DDBE0010AF2A /* Derived Sources */,
return encoded;
}
-bool HTMLFormElement::formData(FormData& result) const
+PassRefPtr<FormData> HTMLFormElement::formData() const
{
DeprecatedCString enc_string = ""; // used for non-multipart data
encoding = Latin1Encoding();
}
+ RefPtr<FormData> result = new FormData();
+
for (unsigned i = 0; i < formElements.size(); ++i) {
HTMLGenericFormElement* current = formElements[i];
FormDataList lst(encoding);
hstr += "\r\n\r\n";
// append body
- result.appendData(hstr.data(), hstr.length());
+ result->appendData(hstr.data(), hstr.length());
const FormDataListItem& item = lst.list()[j + 1];
if (size_t dataSize = item.m_data.length())
- result.appendData(item.m_data, dataSize);
+ result->appendData(item.m_data, dataSize);
else if (!item.m_path.isEmpty())
- result.appendFile(item.m_path);
- result.appendData("\r\n", 2);
+ result->appendFile(item.m_path);
+ result->appendData("\r\n", 2);
++j;
}
if (m_multipart)
enc_string = ("--" + m_boundary.deprecatedString() + "--\r\n").ascii();
- result.appendData(enc_string.data(), enc_string.length());
- return true;
+ result->appendData(enc_string.data(), enc_string.length());
+ return result;
}
void HTMLFormElement::parseEnctype(const String& type)
if (!m_post)
m_multipart = false;
- FormData postData;
- if (formData(postData)) {
- if (m_post)
- frame->loader()->submitForm("POST", m_url, postData, m_target, enctype(), boundary(), event);
- else
- frame->loader()->submitForm("GET", m_url, postData, m_target, String(), String(), event);
- }
+ RefPtr<FormData> postData = formData();
+ if (m_post)
+ frame->loader()->submitForm("POST", m_url, postData, m_target, enctype(), boundary(), event);
+ else
+ frame->loader()->submitForm("GET", m_url, postData, m_target, String(), String(), event);
if (needButtonActivation && firstSuccessfulSubmitButton)
firstSuccessfulSubmitButton->setActivatedSubmit(false);
private:
void parseEnctype(const String&);
- bool formData(FormData&) const;
+ PassRefPtr<FormData> formData() const;
unsigned formElementIndex(HTMLGenericFormElement*);
struct FormSubmission {
const char* action;
String URL;
- FormData data;
+ RefPtr<FormData> data;
String target;
String contentType;
String boundary;
RefPtr<Event> event;
- FormSubmission(const char* a, const String& u, const FormData& d, const String& t,
+ FormSubmission(const char* a, const String& u, PassRefPtr<FormData> d, const String& t,
const String& ct, const String& b, PassRefPtr<Event> e)
: action(a)
, URL(u)
form->contentType, form->boundary, form->event.get());
}
-void FrameLoader::submitForm(const char* action, const String& url, const FormData& formData,
+void FrameLoader::submitForm(const char* action, const String& url, PassRefPtr<FormData> formData,
const String& target, const String& contentType, const String& boundary, Event* event)
{
+ ASSERT(formData.get());
+
KURL u = completeURL(url.isNull() ? "" : url);
if (!u.isValid())
return;
if (m_isRunningScript) {
if (m_deferredFormSubmission)
return;
- m_deferredFormSubmission.set(new FormSubmission(action, url, formData, target,
+ m_deferredFormSubmission.set(new FormSubmission(action, url, formData.get(), target,
contentType, boundary, event));
return;
}
DeprecatedString encodedBody;
if (equalIgnoringCase(contentType, "multipart/form-data"))
// FIXME: is this correct? I suspect not, but what site can we test this on?
- encodedBody = KURL::encode_string(formData.flattenToString().deprecatedString());
+ encodedBody = KURL::encode_string(formData.get()->flattenToString().deprecatedString());
else if (equalIgnoringCase(contentType, "text/plain")) {
// Convention seems to be to decode, and s/&/\n/
- encodedBody = formData.flattenToString().deprecatedString();
+ encodedBody = formData.get()->flattenToString().deprecatedString();
encodedBody.replace('&', '\n');
encodedBody.replace('+', ' ');
encodedBody = KURL::decode_string(encodedBody); // Decode the rest of it
encodedBody = KURL::encode_string(encodedBody); // Recode for the URL
} else
- encodedBody = KURL::encode_string(formData.flattenToString().deprecatedString());
+ encodedBody = KURL::encode_string(formData.get()->flattenToString().deprecatedString());
DeprecatedString query = u.query();
if (!query.isEmpty())
if (strcmp(action, "GET") == 0) {
if (!mailtoForm)
- u.setQuery(formData.flattenToString().deprecatedString());
+ u.setQuery(formData.get()->flattenToString().deprecatedString());
} else {
- frameRequest.resourceRequest().setHTTPBody(formData);
+ frameRequest.resourceRequest().setHTTPBody(formData.get());
frameRequest.resourceRequest().setHTTPMethod("POST");
// construct some user headers if necessary
void load(const KURL&, const String& referrer, FrameLoadType, const String& target,
Event*, Element* form, const HashMap<String, String>& formValues);
void post(const KURL&, const String& referrer, const String& target,
- const FormData&, const String& contentType,
+ PassRefPtr<FormData>, const String& contentType,
Event*, Element* form, const HashMap<String, String>& formValues);
#if PLATFORM(MAC)
void load(NSURLRequest *);
Frame* createFrame(const KURL& URL, const String& name, Element* ownerElement, const String& referrer);
Frame* loadSubframe(Element* ownerElement, const KURL& URL, const String& name, const String& referrer);
- void submitForm(const char* action, const String& URL, const FormData&, const String& target, const String& contentType, const String& boundary, Event*);
+ void submitForm(const char* action, const String& URL, PassRefPtr<FormData>, const String& target, const String& contentType, const String& boundary, Event*);
void submitFormAgain();
void submitForm(const FrameLoadRequest&, Event*);
sendRemainingDelegateMessages(identifier, response, length, error);
}
-void FrameLoader::post(const KURL& URL, const String& referrer, const String& frameName, const FormData& formData,
+void FrameLoader::post(const KURL& URL, const String& referrer, const String& frameName, PassRefPtr<FormData> formData,
const String& contentType, Event* event, Element* form, const HashMap<String, String>& formValues)
{
// When posting, use the NSURLRequestReloadIgnoringCacheData load flag.
[initialRequest setHTTPMethod:request.httpMethod()];
- if (!request.httpBody().isEmpty())
- setHTTPBody(initialRequest, request.httpBody());
+ RefPtr<FormData> formData = request.httpBody();
+ if (formData && !formData->isEmpty())
+ setHTTPBody(initialRequest, formData);
HTTPHeaderMap::const_iterator end = request.httpHeaderFields().end();
for (HTTPHeaderMap::const_iterator it = request.httpHeaderFields().begin(); it != end; ++it)
// FIXME: Because of <rdar://problem/4803505>, the method has to be set before the body.
[newRequest setHTTPMethod:request.httpMethod()];
- if (!request.httpBody().isEmpty())
- setHTTPBody(newRequest, request.httpBody());
+ RefPtr<FormData> formData = request.httpBody();
+ if (formData && !formData->isEmpty())
+ setHTTPBody(newRequest, formData);
wkSupportsMultipartXMixedReplace(newRequest);
#include "DeprecatedValueList.h"
#include "PlatformString.h"
+#include "Shared.h"
#include <wtf/Vector.h>
namespace WebCore {
String m_filename;
};
-class FormData {
+class FormData : public Shared<FormData> {
public:
FormData() { }
FormData(const void* data, size_t);
FormData(const CString&);
-
+
void appendData(const void* data, size_t);
void appendFile(const String& filename);
return d->m_request.url();
}
-const FormData& ResourceHandle::postData() const
+const PassRefPtr<FormData> ResourceHandle::postData() const
{
return d->m_request.httpBody();
}
const HTTPHeaderMap& requestHeaders() const;
const KURL& url() const;
const String& method() const;
- const FormData& postData() const;
+ const PassRefPtr<FormData> postData() const;
private:
bool start(DocLoader*);
String httpAccept() const { return httpHeaderField("Accept"); }
void setHTTPAccept(const String& httpUserAgent) { setHTTPHeaderField("Accept", httpUserAgent); }
- const FormData& httpBody() const { return m_httpBody; }
- FormData& httpBody() { return m_httpBody; }
- void setHTTPBody(const FormData& httpBody) { m_httpBody = httpBody; }
+ const PassRefPtr<FormData> httpBody() const { return m_httpBody; }
+ PassRefPtr<FormData> httpBody() { return m_httpBody; }
+ void setHTTPBody(PassRefPtr<FormData> httpBody) { m_httpBody = httpBody; }
bool allowHTTPCookies() const { return m_allowHTTPCookies; }
void setAllowHTTPCookies(bool allowHTTPCookies) { m_allowHTTPCookies = allowHTTPCookies; }
KURL m_mainDocumentURL;
String m_httpMethod;
HTTPHeaderMap m_httpHeaderFields;
- FormData m_httpBody;
+ RefPtr<FormData> m_httpBody;
bool m_allowHTTPCookies;
};
#ifndef FormDataStreamMac_h_
#define FormDataStreamMac_h_
+#include "FormData.h"
+
@class NSMutableURLRequest;
namespace WebCore {
class FormData;
- void setHTTPBody(NSMutableURLRequest *, const FormData&);
- const FormData* httpBodyFromStream(NSInputStream* stream);
+ void setHTTPBody(NSMutableURLRequest *, PassRefPtr<FormData>);
+ const PassRefPtr<FormData> httpBodyFromStream(NSInputStream* stream);
}
#endif // FormDataStreamMac_h_
namespace WebCore {
-static HashMap<CFReadStreamRef, const FormData*>* streamFormDatas = 0;
+static HashMap<CFReadStreamRef, RefPtr<FormData> >* streamFormDatas = 0;
-static HashMap<CFReadStreamRef, const FormData*>* getStreamFormDatas()
+static HashMap<CFReadStreamRef, RefPtr<FormData> >* getStreamFormDatas()
{
if (!streamFormDatas)
- streamFormDatas = new HashMap<CFReadStreamRef, const FormData*>();
+ streamFormDatas = new HashMap<CFReadStreamRef, RefPtr<FormData> >();
return streamFormDatas;
}
static void* formCreate(CFReadStreamRef stream, void* context)
{
- const FormData* formData = static_cast<const FormData*>(context);
+ RefPtr<FormData> formData = static_cast<FormData*>(context);
CFSetCallBacks runLoopAndModeCallBacks = { 0, pairRetain, pairRelease, NULL, pairEqual, pairHash };
for (size_t i = 0; i < size; ++i)
newInfo->remainingElements.append(formData->elements()[size - i - 1]);
- getStreamFormDatas()->set(stream, new FormData(*formData));
+ getStreamFormDatas()->set(stream, formData);
return newInfo;
}
{
FormStreamFields* form = static_cast<FormStreamFields*>(context);
- delete getStreamFormDatas()->get(stream);
getStreamFormDatas()->remove(stream);
closeCurrentStream(form);
}
}
-void setHTTPBody(NSMutableURLRequest *request, const FormData& formData)
+void setHTTPBody(NSMutableURLRequest *request, PassRefPtr<FormData> formData)
{
- size_t count = formData.elements().size();
+ size_t count = formData.get()->elements().size();
// Handle the common special case of one piece of form data, with no files.
if (count == 1) {
- const FormDataElement& element = formData.elements()[0];
+ const FormDataElement& element = formData.get()->elements()[0];
if (element.m_type == FormDataElement::data) {
NSData *data = [[NSData alloc] initWithBytes:element.m_data.data() length:element.m_data.size()];
[request setHTTPBody:data];
// Precompute the content length so NSURLConnection doesn't use chunked mode.
long long length = 0;
for (size_t i = 0; i < count; ++i) {
- const FormDataElement& element = formData.elements()[i];
+ const FormDataElement& element = formData.get()->elements()[i];
if (element.m_type == FormDataElement::data)
length += element.m_data.size();
else {
// Create and set the stream.
CFReadStreamRef stream = wkCreateCustomCFReadStream(formCreate, formFinalize,
formOpen, formRead, formCanRead, formClose, formSchedule, formUnschedule,
- const_cast<FormData*>(&formData));
+ formData.get());
[request setHTTPBodyStream:(NSInputStream *)stream];
CFRelease(stream);
}
-const FormData* httpBodyFromStream(NSInputStream* stream)
+const PassRefPtr<FormData> httpBodyFromStream(NSInputStream* stream)
{
- return getStreamFormDatas()->get((CFReadStreamRef)stream);
+ return PassRefPtr<FormData>(getStreamFormDatas()->get((CFReadStreamRef)stream));
}
}
request.setHTTPHeaderField(name, [headers objectForKey:name]);
if (NSData* bodyData = [nsRequest HTTPBody])
- request.setHTTPBody(FormData([bodyData bytes], [bodyData length]));
+ request.setHTTPBody(PassRefPtr<FormData>(new FormData([bodyData bytes], [bodyData length])));
else if (NSInputStream* bodyStream = [nsRequest HTTPBodyStream])
- if (const FormData* formData = httpBodyFromStream(bodyStream))
- request.setHTTPBody(*formData);
+ if (const PassRefPtr<FormData> formData = httpBodyFromStream(bodyStream))
+ request.setHTTPBody(formData);
// FIXME: what to do about arbitrary body streams?
}
for (HTTPHeaderMap::const_iterator it = request.httpHeaderFields().begin(); it != end; ++it)
[nsRequest setValue:it->second forHTTPHeaderField:it->first];
- if (!request.httpBody().isEmpty())
- setHTTPBody(nsRequest, request.httpBody());
+ RefPtr<FormData> formData = request.httpBody();
+ if (formData && !formData->isEmpty())
+ setHTTPBody(nsRequest, formData);
return [nsRequest autorelease];
}
if (!m_encoding.isValid()) // FIXME: report an error?
m_encoding = UTF8Encoding();
- request.setHTTPBody(m_encoding.encode(body.characters(), body.length()));
+ request.setHTTPBody(PassRefPtr<FormData>(new FormData(m_encoding.encode(body.characters(), body.length()))));
}
if (m_requestHeaders.size() > 0)