Changeset 61152 in webkit


Ignore:
Timestamp:
Jun 14, 2010 2:51:28 PM (14 years ago)
Author:
Dimitri Glazkov
Message:

2010-06-14 Dimitri Glazkov <Dimitri Glazkov>

Reviewed by Darin Adler.

Refactor form submission code in HTMLFormElement to add clarity.
https://bugs.webkit.org/show_bug.cgi?id=39430

Covered by existing tests in fast/forms/mailto.

  • html/HTMLFormElement.cpp: (WebCore::appendMailtoPostFormDataToURL): Renamed from transferMailtoPostFormDataToUrl,

removed clearing out of the FormData and moved it to a new place (next to the call site).

(WebCore::HTMLFormElement::prepareFormData): Renamed from createFormData, moved the logic of

prepareing FormData here, including the use of appendMailtoPostFormDataToURL.

(WebCore::HTMLFormElement::submit): Consolidated multiple invocations of submitForm().

  • html/HTMLFormElement.h: Renamed createFormData to prepareFormData.
Location:
trunk/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r61151 r61152  
     12010-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
    1182010-06-14  Chris Fleizach  <cfleizach@apple.com>
    219
  • trunk/WebCore/html/HTMLFormElement.cpp

    r61059 r61152  
    201201}
    202202
    203 PassRefPtr<FormData> HTMLFormElement::createFormData()
    204 {
     203static 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
     224PassRefPtr<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
    205235    RefPtr<DOMFormData> domFormData = DOMFormData::create(dataEncoding().encodingForFormSubmission());
    206236    for (unsigned i = 0; i < m_associatedElements.size(); ++i) {
     
    210240    }
    211241
    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    }
    213257
    214258    result->setIdentifier(generateFormDataIdentifier());
    215     return result;
     259    return result.release();
    216260}
    217261
     
    305349}
    306350
    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 
    329351void HTMLFormElement::submit(Frame* javaScriptActiveFrame)
    330352{
     
    380402        m_url = document()->url().string();
    381403
    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());
    405408
    406409    if (needButtonActivation && firstSuccessfulSubmitButton)
  • trunk/WebCore/html/HTMLFormElement.h

    r60418 r61152  
    138138    bool isMailtoForm() const;
    139139    TextEncoding dataEncoding() const;
    140     PassRefPtr<FormData> createFormData();
     140    PassRefPtr<FormData> prepareFormData();
    141141    unsigned formElementIndex(HTMLFormControlElement*);
    142142    // Returns true if the submission should be proceeded.
Note: See TracChangeset for help on using the changeset viewer.