Changeset 61152 in webkit
- Timestamp:
- Jun 14, 2010 2:51:28 PM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r61151 r61152 1 2010-06-14 Dimitri Glazkov <dglazkov@chromium.org> 2 3 Reviewed by Darin Adler. 4 5 Refactor form submission code in HTMLFormElement to add clarity. 6 https://bugs.webkit.org/show_bug.cgi?id=39430 7 8 Covered by existing tests in fast/forms/mailto. 9 10 * html/HTMLFormElement.cpp: 11 (WebCore::appendMailtoPostFormDataToURL): Renamed from transferMailtoPostFormDataToUrl, 12 removed clearing out of the FormData and moved it to a new place (next to the call site). 13 (WebCore::HTMLFormElement::prepareFormData): Renamed from createFormData, moved the logic of 14 prepareing FormData here, including the use of appendMailtoPostFormDataToURL. 15 (WebCore::HTMLFormElement::submit): Consolidated multiple invocations of submitForm(). 16 * html/HTMLFormElement.h: Renamed createFormData to prepareFormData. 17 1 18 2010-06-14 Chris Fleizach <cfleizach@apple.com> 2 19 -
trunk/WebCore/html/HTMLFormElement.cpp
r61059 r61152 201 201 } 202 202 203 PassRefPtr<FormData> HTMLFormElement::createFormData() 204 { 203 static void appendMailtoPostFormDataToURL(KURL& url, const FormData& data, const String& encodingType) 204 { 205 String body = data.flattenToString(); 206 207 if (equalIgnoringCase(encodingType, "text/plain")) { 208 // Convention seems to be to decode, and s/&/\r\n/. Also, spaces are encoded as %20. 209 body = decodeURLEscapeSequences(body.replace('&', "\r\n").replace('+', ' ') + "\r\n"); 210 } 211 212 Vector<char> bodyData; 213 bodyData.append("body=", 5); 214 FormDataBuilder::encodeStringAsFormData(bodyData, body.utf8()); 215 body = String(bodyData.data(), bodyData.size()).replace('+', "%20"); 216 217 String query = url.query(); 218 if (!query.isEmpty()) 219 query.append('&'); 220 query.append(body); 221 url.setQuery(query); 222 } 223 224 PassRefPtr<FormData> HTMLFormElement::prepareFormData() 225 { 226 if (m_formDataBuilder.isPostMethod()) { 227 if (m_formDataBuilder.isMultiPartForm() && isMailtoForm()) { 228 // FIXME: This may fire a DOM Mutation Event. Do we really want this here? 229 setEnctype("application/x-www-form-urlencoded"); 230 ASSERT(!m_formDataBuilder.isMultiPartForm()); 231 } 232 } else 233 m_formDataBuilder.setIsMultiPartForm(false); 234 205 235 RefPtr<DOMFormData> domFormData = DOMFormData::create(dataEncoding().encodingForFormSubmission()); 206 236 for (unsigned i = 0; i < m_associatedElements.size(); ++i) { … … 210 240 } 211 241 212 RefPtr<FormData> result = (m_formDataBuilder.isMultiPartForm()) ? FormData::createMultiPart(domFormData->items(), domFormData->encoding(), document()) : FormData::create(domFormData->items(), domFormData->encoding()); 242 RefPtr<FormData> result; 243 244 if (m_formDataBuilder.isMultiPartForm()) 245 result = FormData::createMultiPart(domFormData->items(), domFormData->encoding(), document()); 246 else { 247 result = FormData::FormData::create(domFormData->items(), domFormData->encoding()); 248 if (m_formDataBuilder.isPostMethod() && isMailtoForm()) { 249 // Convert the form data into a string that we put into the URL. 250 KURL url = document()->completeURL(m_url); 251 appendMailtoPostFormDataToURL(url, *result, m_formDataBuilder.encodingType()); 252 m_url = url.string(); 253 254 result = FormData::create(); 255 } 256 } 213 257 214 258 result->setIdentifier(generateFormDataIdentifier()); 215 return result ;259 return result.release(); 216 260 } 217 261 … … 305 349 } 306 350 307 static void transferMailtoPostFormDataToURL(RefPtr<FormData>& data, KURL& url, const String& encodingType)308 {309 String body = data->flattenToString();310 data = FormData::create();311 312 if (equalIgnoringCase(encodingType, "text/plain")) {313 // Convention seems to be to decode, and s/&/\r\n/. Also, spaces are encoded as %20.314 body = decodeURLEscapeSequences(body.replace('&', "\r\n").replace('+', ' ') + "\r\n");315 }316 317 Vector<char> bodyData;318 bodyData.append("body=", 5);319 FormDataBuilder::encodeStringAsFormData(bodyData, body.utf8());320 body = String(bodyData.data(), bodyData.size()).replace('+', "%20");321 322 String query = url.query();323 if (!query.isEmpty())324 query.append('&');325 query.append(body);326 url.setQuery(query);327 }328 329 351 void HTMLFormElement::submit(Frame* javaScriptActiveFrame) 330 352 { … … 380 402 m_url = document()->url().string(); 381 403 382 if (m_formDataBuilder.isPostMethod()) { 383 if (m_formDataBuilder.isMultiPartForm() && isMailtoForm()) { 384 setEnctype("application/x-www-form-urlencoded"); 385 ASSERT(!m_formDataBuilder.isMultiPartForm()); 386 } 387 388 RefPtr<FormData> data = createFormData(); 389 if (!m_formDataBuilder.isMultiPartForm()) { 390 391 if (isMailtoForm()) { 392 // Convert the form data into a string that we put into the URL. 393 KURL url = document()->completeURL(m_url); 394 transferMailtoPostFormDataToURL(data, url, m_formDataBuilder.encodingType()); 395 m_url = url.string(); 396 } 397 398 frame->loader()->submitForm("POST", m_url, data.release(), m_target, m_formDataBuilder.encodingType(), String(), lockHistory, event, formState.release()); 399 } else 400 frame->loader()->submitForm("POST", m_url, data.get(), m_target, m_formDataBuilder.encodingType(), data->boundary().data(), lockHistory, event, formState.release()); 401 } else { 402 m_formDataBuilder.setIsMultiPartForm(false); 403 frame->loader()->submitForm("GET", m_url, createFormData(), m_target, String(), String(), lockHistory, event, formState.release()); 404 } 404 RefPtr<FormData> data = prepareFormData(); 405 String boundary = m_formDataBuilder.isMultiPartForm() ? data->boundary().data() : String(); 406 const char* method = m_formDataBuilder.isPostMethod() ? "POST" : "GET"; 407 frame->loader()->submitForm(method, m_url, data.release(), m_target, m_formDataBuilder.encodingType(), boundary, lockHistory, event, formState.release()); 405 408 406 409 if (needButtonActivation && firstSuccessfulSubmitButton) -
trunk/WebCore/html/HTMLFormElement.h
r60418 r61152 138 138 bool isMailtoForm() const; 139 139 TextEncoding dataEncoding() const; 140 PassRefPtr<FormData> createFormData();140 PassRefPtr<FormData> prepareFormData(); 141 141 unsigned formElementIndex(HTMLFormControlElement*); 142 142 // Returns true if the submission should be proceeded.
Note: See TracChangeset
for help on using the changeset viewer.