+2009-03-27 Darin Adler <darin@apple.com>
+
+ Reviewed by Sam Weinig.
+
+ Get mailto code out of FrameLoader.
+
+ * html/HTMLFormElement.cpp:
+ (WebCore::transferMailtoPostFormDataToURL): Added. Factored out the mailto
+ logic so HTMLFormElement::submit isn't full of ugly bits. This includes the
+ part of the logic that involves transformeing the URL that was previously
+ inside FrameLoader.
+ (WebCore::HTMLFormElement::submit): Call transferMailtoPostFormDataToURL and
+ also release the data for slightly less refcount churn.
+
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::submitForm): Removed all the special casing for mailto,
+ since HTMLFormElement now properly prepares both the URL and the form data.
+
2009-03-27 Dan Bernstein <mitz@apple.com>
Reviewed by Mark Rowe.
return m_doingsubmit;
}
+static void transferMailtoPostFormDataToURL(RefPtr<FormData>& data, KURL& url, const String& encodingType)
+{
+ String body = data->flattenToString();
+ data = FormData::create();
+
+ if (equalIgnoringCase(encodingType, "text/plain")) {
+ // Convention seems to be to decode, and s/&/\r\n/. Also, spaces are encoded as %20.
+ body = decodeURLEscapeSequences(body.replace('&', "\r\n").replace('+', ' ') + "\r\n");
+ }
+
+ Vector<char> bodyData;
+ bodyData.append("body=", 5);
+ FormDataBuilder::encodeStringAsFormData(bodyData, body.utf8());
+ body = String(bodyData.data(), bodyData.size()).replace('+', "%20");
+
+ String query = url.query();
+ if (!query.isEmpty())
+ query.append('&');
+ query.append(body);
+ url.setQuery(query);
+}
+
void HTMLFormElement::submit(Event* event, bool activateSubmitButton, bool lockHistory, bool lockBackForwardList)
{
FrameView* view = document()->view();
if (!m_formDataBuilder.isMultiPartForm()) {
RefPtr<FormData> data = createFormData(CString());
+
if (isMailtoForm()) {
- String body = data->flattenToString();
- if (equalIgnoringCase(m_formDataBuilder.encodingType(), "text/plain")) {
- // Convention seems to be to decode, and s/&/\r\n/. Also, spaces are encoded as %20.
- body = decodeURLEscapeSequences(body.replace('&', "\r\n").replace('+', ' ') + "\r\n");
- }
- Vector<char> bodyData;
- bodyData.append("body=", 5);
- FormDataBuilder::encodeStringAsFormData(bodyData, body.utf8());
- data = FormData::create(String(bodyData.data(), bodyData.size()).replace('+', "%20").latin1());
+ // Convert the form data into a string that we put into the URL.
+ KURL url = document()->completeURL(m_url);
+ transferMailtoPostFormDataToURL(data, url, m_formDataBuilder.encodingType());
+ m_url = url.string();
}
- frame->loader()->submitForm("POST", m_url, data, m_target, m_formDataBuilder.encodingType(), String(), event, lockHistory, lockBackForwardList);
+
+ frame->loader()->submitForm("POST", m_url, data.release(), m_target, m_formDataBuilder.encodingType(), String(), event, lockHistory, lockBackForwardList);
} else {
Vector<char> boundary = m_formDataBuilder.generateUniqueBoundaryString();
frame->loader()->submitForm("POST", m_url, createFormData(boundary.data()), m_target, m_formDataBuilder.encodingType(), boundary.data(), event, lockHistory, lockBackForwardList);
frameRequest.setFrameName(target.isEmpty() ? m_frame->document()->baseTarget() : target);
- // Handle mailto: forms
- bool isMailtoForm = equalIgnoringCase(u.protocol(), "mailto");
- if (isMailtoForm && strcmp(action, "GET") != 0) {
- // Append body= for POST mailto, replace the whole query string for GET one.
- String body = formData->flattenToString();
- String query = u.query();
- if (!query.isEmpty())
- query.append('&');
- u.setQuery(query + body);
- }
-
- if (strcmp(action, "GET") == 0) {
+ if (strcmp(action, "GET") == 0)
u.setQuery(formData->flattenToString());
- } else {
- if (!isMailtoForm)
- frameRequest.resourceRequest().setHTTPBody(formData.get());
+ else {
frameRequest.resourceRequest().setHTTPMethod("POST");
+ frameRequest.resourceRequest().setHTTPBody(formData.get());
// construct some user headers if necessary
if (contentType.isNull() || contentType == "application/x-www-form-urlencoded")