void HTMLFormElement::submitImplicitly(Event* event, bool fromImplicitSubmissionTrigger) { unsigned submissionTriggerCount = 0; for (unsigned i = 0; i < m_associatedElements.size(); ++i) { FormAssociatedElement* formAssociatedElement = m_associatedElements[i]; if (!formAssociatedElement->isFormControlElement()) continue; HTMLFormControlElement* formElement = static_cast<HTMLFormControlElement*>(formAssociatedElement); if (formElement->isSuccessfulSubmitButton()) { if (formElement->renderer()) { formElement->dispatchSimulatedClick(event); return; } } else if (formElement->canTriggerImplicitSubmission()) ++submissionTriggerCount; } if (!submissionTriggerCount) return; // Older iOS apps using WebViews expect the behavior of auto submitting multi-input forms. Settings* settings = document().settings(); if (fromImplicitSubmissionTrigger && (submissionTriggerCount == 1 || (settings && settings->allowMultiElementImplicitSubmission()))) prepareForSubmission(event); }
void HTMLFormElement::submitImplicitly(Event* event, bool fromImplicitSubmissionTrigger) { int submissionTriggerCount = 0; bool seenDefaultButton = false; for (unsigned i = 0; i < m_associatedElements.size(); ++i) { FormAssociatedElement* formAssociatedElement = m_associatedElements[i]; if (!formAssociatedElement->isFormControlElement()) continue; HTMLFormControlElement* control = toHTMLFormControlElement(formAssociatedElement); if (!seenDefaultButton && control->canBeSuccessfulSubmitButton()) { if (fromImplicitSubmissionTrigger) seenDefaultButton = true; if (control->isSuccessfulSubmitButton()) { if (control->renderer()) { control->dispatchSimulatedClick(event); return; } } else if (fromImplicitSubmissionTrigger) { // Default (submit) button is not activated; no implicit submission. return; } } else if (control->canTriggerImplicitSubmission()) { ++submissionTriggerCount; } } if (fromImplicitSubmissionTrigger && submissionTriggerCount == 1) prepareForSubmission(event); }
HTMLFormControlElement* HTMLFormElement::defaultButton() const { for (unsigned i = 0; i < m_associatedElements.size(); ++i) { HTMLFormControlElement* control = m_associatedElements[i]; if (control->isSuccessfulSubmitButton()) return control; } return 0; }
void HTMLFormElement::submit(Event* event, bool activateSubmitButton, bool lockHistory, FormSubmissionTrigger formSubmissionTrigger) { FrameView* view = document()->view(); Frame* frame = document()->frame(); if (!view || !frame) return; if (m_insubmit) { m_doingsubmit = true; return; } m_insubmit = true; HTMLFormControlElement* firstSuccessfulSubmitButton = 0; bool needButtonActivation = activateSubmitButton; // do we need to activate a submit button? Vector<pair<String, String> > formValues; for (unsigned i = 0; i < m_associatedElements.size(); ++i) { HTMLFormControlElement* control = m_associatedElements[i]; if (control->hasLocalName(inputTag)) { HTMLInputElement* input = static_cast<HTMLInputElement*>(control); if (input->isTextField()) { formValues.append(pair<String, String>(input->name(), input->value())); if (input->isSearchField()) input->addSearchResult(); } } if (needButtonActivation) { if (control->isActivatedSubmit()) needButtonActivation = false; else if (firstSuccessfulSubmitButton == 0 && control->isSuccessfulSubmitButton()) firstSuccessfulSubmitButton = control; } } RefPtr<FormState> formState = FormState::create(this, formValues, frame, formSubmissionTrigger); if (needButtonActivation && firstSuccessfulSubmitButton) firstSuccessfulSubmitButton->setActivatedSubmit(true); if (m_url.isEmpty()) m_url = document()->url().string(); RefPtr<FormData> data = prepareFormData(); String boundary = m_formDataBuilder.isMultiPartForm() ? data->boundary().data() : String(); const char* method = m_formDataBuilder.isPostMethod() ? "POST" : "GET"; frame->loader()->submitForm(method, m_url, data.release(), m_target, m_formDataBuilder.encodingType(), boundary, lockHistory, event, formState.release()); if (needButtonActivation && firstSuccessfulSubmitButton) firstSuccessfulSubmitButton->setActivatedSubmit(false); m_doingsubmit = m_insubmit = false; }
HTMLFormControlElement* HTMLFormElement::defaultButton() const { for (unsigned i = 0; i < m_associatedElements.size(); ++i) { if (!m_associatedElements[i]->isFormControlElement()) continue; HTMLFormControlElement* control = static_cast<HTMLFormControlElement*>(m_associatedElements[i]); if (control->isSuccessfulSubmitButton()) return control; } return 0; }
HTMLFormControlElement* HTMLFormElement::defaultButton() const { const FormAssociatedElement::List& elements = associatedElements(); for (unsigned i = 0; i < elements.size(); ++i) { if (!elements[i]->isFormControlElement()) continue; HTMLFormControlElement* control = toHTMLFormControlElement(elements[i]); if (control->isSuccessfulSubmitButton()) return control; } return 0; }
void HTMLFormElement::submit(Event* event, bool activateSubmitButton, bool processingUserGesture) { FrameView* view = document().view(); LocalFrame* frame = document().frame(); if (!view || !frame || !frame->page()) return; if (m_isSubmittingOrInUserJSSubmitEvent) { m_shouldSubmit = true; return; } m_isSubmittingOrInUserJSSubmitEvent = true; m_wasUserSubmitted = processingUserGesture; RefPtrWillBeRawPtr<HTMLFormControlElement> firstSuccessfulSubmitButton = nullptr; bool needButtonActivation = activateSubmitButton; // do we need to activate a submit button? const FormAssociatedElement::List& elements = associatedElements(); for (unsigned i = 0; i < elements.size(); ++i) { FormAssociatedElement* associatedElement = elements[i]; if (!associatedElement->isFormControlElement()) continue; if (needButtonActivation) { HTMLFormControlElement* control = toHTMLFormControlElement(associatedElement); if (control->isActivatedSubmit()) needButtonActivation = false; else if (firstSuccessfulSubmitButton == 0 && control->isSuccessfulSubmitButton()) firstSuccessfulSubmitButton = control; } } if (needButtonActivation && firstSuccessfulSubmitButton) firstSuccessfulSubmitButton->setActivatedSubmit(true); RefPtrWillBeRawPtr<FormSubmission> formSubmission = FormSubmission::create(this, m_attributes, event); EventQueueScope scopeForDialogClose; // Delay dispatching 'close' to dialog until done submitting. if (formSubmission->method() == FormSubmission::DialogMethod) submitDialog(formSubmission.release()); else scheduleFormSubmission(formSubmission.release()); if (needButtonActivation && firstSuccessfulSubmitButton) firstSuccessfulSubmitButton->setActivatedSubmit(false); m_shouldSubmit = false; m_isSubmittingOrInUserJSSubmitEvent = false; }
void HTMLFormElement::submitImplicitly(Event* event, bool fromImplicitSubmissionTrigger) { int submissionTriggerCount = 0; for (unsigned i = 0; i < m_associatedElements.size(); ++i) { HTMLFormControlElement* formElement = m_associatedElements[i]; if (formElement->isSuccessfulSubmitButton()) { if (formElement->renderer()) { formElement->dispatchSimulatedClick(event); return; } } else if (formElement->canTriggerImplicitSubmission()) ++submissionTriggerCount; } if (fromImplicitSubmissionTrigger && submissionTriggerCount == 1) prepareSubmit(event); }
void HTMLFormElement::submit(Event* event, bool activateSubmitButton, bool processingUserGesture, FormSubmissionTrigger formSubmissionTrigger) { FrameView* view = document()->view(); Frame* frame = document()->frame(); if (!view || !frame) return; if (m_isSubmittingOrPreparingForSubmission) { m_shouldSubmit = true; return; } m_isSubmittingOrPreparingForSubmission = true; m_wasUserSubmitted = processingUserGesture; HTMLFormControlElement* firstSuccessfulSubmitButton = 0; bool needButtonActivation = activateSubmitButton; // do we need to activate a submit button? for (unsigned i = 0; i < m_associatedElements.size(); ++i) { FormAssociatedElement* associatedElement = m_associatedElements[i]; if (!associatedElement->isFormControlElement()) continue; if (needButtonActivation) { HTMLFormControlElement* control = static_cast<HTMLFormControlElement*>(associatedElement); if (control->isActivatedSubmit()) needButtonActivation = false; else if (firstSuccessfulSubmitButton == 0 && control->isSuccessfulSubmitButton()) firstSuccessfulSubmitButton = control; } } if (needButtonActivation && firstSuccessfulSubmitButton) firstSuccessfulSubmitButton->setActivatedSubmit(true); bool lockHistory = !processingUserGesture; frame->loader()->submitForm(FormSubmission::create(this, m_attributes, event, lockHistory, formSubmissionTrigger)); if (needButtonActivation && firstSuccessfulSubmitButton) firstSuccessfulSubmitButton->setActivatedSubmit(false); m_shouldSubmit = false; m_isSubmittingOrPreparingForSubmission = false; }
void HTMLFormElement::submit(Event* event, bool activateSubmitButton, bool lockHistory, bool lockBackForwardList) { FrameView* view = document()->view(); Frame* frame = document()->frame(); if (!view || !frame) return; if (m_insubmit) { m_doingsubmit = true; return; } m_insubmit = true; HTMLFormControlElement* firstSuccessfulSubmitButton = 0; bool needButtonActivation = activateSubmitButton; // do we need to activate a submit button? Vector<pair<String, String> > formValues; for (unsigned i = 0; i < formElements.size(); ++i) { HTMLFormControlElement* control = formElements[i]; if (control->hasLocalName(inputTag)) { HTMLInputElement* input = static_cast<HTMLInputElement*>(control); if (input->isTextField()) { formValues.append(pair<String, String>(input->name(), input->value())); if (input->isSearchField()) input->addSearchResult(); } } if (needButtonActivation) { if (control->isActivatedSubmit()) needButtonActivation = false; else if (firstSuccessfulSubmitButton == 0 && control->isSuccessfulSubmitButton()) firstSuccessfulSubmitButton = control; } } RefPtr<FormState> formState = FormState::create(this, formValues, frame); if (needButtonActivation && firstSuccessfulSubmitButton) firstSuccessfulSubmitButton->setActivatedSubmit(true); if (m_url.isEmpty()) m_url = document()->url().string(); if (m_formDataBuilder.isPostMethod()) { if (m_formDataBuilder.isMultiPartForm() && isMailtoForm()) { setEnctype("application/x-www-form-urlencoded"); ASSERT(!m_formDataBuilder.isMultiPartForm()); } if (!m_formDataBuilder.isMultiPartForm()) { RefPtr<FormData> data = createFormData(CString()); if (isMailtoForm()) { // 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.release(), m_target, m_formDataBuilder.encodingType(), String(), lockHistory, lockBackForwardList, event, formState.release()); } else { Vector<char> boundary = m_formDataBuilder.generateUniqueBoundaryString(); frame->loader()->submitForm("POST", m_url, createFormData(boundary.data()), m_target, m_formDataBuilder.encodingType(), boundary.data(), lockHistory, lockBackForwardList, event, formState.release()); } } else { m_formDataBuilder.setIsMultiPartForm(false); frame->loader()->submitForm("GET", m_url, createFormData(CString()), m_target, String(), String(), lockHistory, lockBackForwardList, event, formState.release()); } if (needButtonActivation && firstSuccessfulSubmitButton) firstSuccessfulSubmitButton->setActivatedSubmit(false); m_doingsubmit = m_insubmit = false; }
void HTMLFormElement::submit(Event* event, bool activateSubmitButton, bool lockHistory, bool lockBackForwardList) { FrameView* view = document()->view(); Frame* frame = document()->frame(); if (!view || !frame) return; if (m_insubmit) { m_doingsubmit = true; return; } m_insubmit = true; HTMLFormControlElement* firstSuccessfulSubmitButton = 0; bool needButtonActivation = activateSubmitButton; // do we need to activate a submit button? frame->loader()->clearRecordedFormValues(); frame->loader()->setFormAboutToBeSubmitted(this); for (unsigned i = 0; i < formElements.size(); ++i) { HTMLFormControlElement* control = formElements[i]; if (control->hasLocalName(inputTag)) { HTMLInputElement* input = static_cast<HTMLInputElement*>(control); if (input->isTextField()) { frame->loader()->recordFormValue(input->name(), input->value()); if (input->isSearchField()) input->addSearchResult(); } } if (needButtonActivation) { if (control->isActivatedSubmit()) needButtonActivation = false; else if (firstSuccessfulSubmitButton == 0 && control->isSuccessfulSubmitButton()) firstSuccessfulSubmitButton = control; } } if (needButtonActivation && firstSuccessfulSubmitButton) firstSuccessfulSubmitButton->setActivatedSubmit(true); if (m_url.isEmpty()) m_url = document()->url().string(); if (m_formDataBuilder.isPostMethod()) { if (m_formDataBuilder.isMultiPartForm() && isMailtoForm()) { setEnctype("application/x-www-form-urlencoded"); ASSERT(!m_formDataBuilder.isMultiPartForm()); } 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()); } frame->loader()->submitForm("POST", m_url, data, 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); } } else { m_formDataBuilder.setIsMultiPartForm(false); frame->loader()->submitForm("GET", m_url, createFormData(CString()), m_target, String(), String(), event, lockHistory, lockBackForwardList); } if (needButtonActivation && firstSuccessfulSubmitButton) firstSuccessfulSubmitButton->setActivatedSubmit(false); m_doingsubmit = m_insubmit = false; }