bool CredentialTransformData::findPasswordFormFields(HTMLFormElement* form) { ASSERT(form); int firstPasswordIndex = 0; // First, find the password fields and activated submit button. const Vector<FormAssociatedElement*>& formElements = form->associatedElements(); Vector<HTMLInputElement*> passwords; for (size_t i = 0; i < formElements.size(); i++) { if (!formElements[i]->isFormControlElement()) continue; HTMLFormControlElement* formElement = static_cast<HTMLFormControlElement*>(formElements[i]); if (!formElement->hasLocalName(HTMLNames::inputTag)) continue; HTMLInputElement* inputElement = formElement->toInputElement(); if (!inputElement->isEnabledFormControl()) continue; if ((passwords.size() < maxPasswords) && inputElement->isPasswordField() && inputElement->shouldAutocomplete()) { if (passwords.isEmpty()) firstPasswordIndex = i; passwords.append(inputElement); } } if (!passwords.isEmpty()) { // Then, search backwards for the username field. for (int i = firstPasswordIndex - 1; i >= 0; i--) { if (!formElements[i]->isFormControlElement()) continue; HTMLFormControlElement* formElement = static_cast<HTMLFormControlElement*>(formElements[i]); if (!formElement->hasLocalName(HTMLNames::inputTag)) continue; HTMLInputElement* inputElement = formElement->toInputElement(); if (!inputElement->isEnabledFormControl()) continue; // Various input types such as text, url, email can be a username field. if ((inputElement->isTextField() && !inputElement->isPasswordField()) && (inputElement->shouldAutocomplete())) { m_userNameElement = inputElement; break; } } } if (!m_userNameElement) return false; if (!locateSpecificPasswords(passwords, &(m_passwordElement))) return false; return true; }
void findPasswordFormFields(HTMLFormElement* form, PasswordFormFields* fields) { ASSERT(form); ASSERT(fields); int firstPasswordIndex = 0; // First, find the password fields and activated submit button const Vector<HTMLFormControlElement*>& formElements = form->associatedElements(); for (size_t i = 0; i < formElements.size(); i++) { HTMLFormControlElement* formElement = formElements[i]; if (formElement->isActivatedSubmit()) fields->submit = formElement; if (!formElement->hasLocalName(HTMLNames::inputTag)) continue; HTMLInputElement* inputElement = toHTMLInputElement(formElement); if (!inputElement->isEnabledFormControl()) continue; if ((fields->passwords.size() < maxPasswords) && inputElement->isPasswordField() && inputElement->autoComplete()) { if (fields->passwords.isEmpty()) firstPasswordIndex = i; fields->passwords.append(inputElement); } } if (!fields->passwords.isEmpty()) { // Then, search backwards for the username field for (int i = firstPasswordIndex - 1; i >= 0; i--) { HTMLFormControlElement* formElement = formElements[i]; if (!formElement->hasLocalName(HTMLNames::inputTag)) continue; HTMLInputElement* inputElement = toHTMLInputElement(formElement); if (!inputElement->isEnabledFormControl()) continue; // Various input types such as text, url, email can be a username field. if ((inputElement->isTextField() && !inputElement->isPasswordField()) && (inputElement->autoComplete())) { fields->userName = inputElement; break; } } } }
void WebFormElement::getFormControlElements(WebVector<WebFormControlElement>& result) const { const HTMLFormElement* form = constUnwrap<HTMLFormElement>(); Vector<RefPtr<HTMLFormControlElement> > tempVector; // FIXME: We should move the for-loop condition into a variable instead of // re-evaluating size each time. Also, consider refactoring this code so that // we don't call form->associatedElements() multiple times. for (size_t i = 0; i < form->associatedElements().size(); i++) { if (!form->associatedElements()[i]->isFormControlElement()) continue; HTMLFormControlElement* element = static_cast<HTMLFormControlElement*>(form->associatedElements()[i]); if (element->hasLocalName(HTMLNames::inputTag) || element->hasLocalName(HTMLNames::selectTag)) tempVector.append(element); } result.assign(tempVector); }
PassRefPtr<FormSubmission> FormSubmission::create(HTMLFormElement* form, const Attributes& attributes, PassRefPtr<Event> event, bool lockHistory, FormSubmissionTrigger trigger) { ASSERT(form); Document* document = form->document(); KURL actionURL = document->completeURL(attributes.action().isEmpty() ? document->url().string() : attributes.action()); bool isMailtoForm = actionURL.protocolIs("mailto"); bool isMultiPartForm = false; String encodingType = attributes.encodingType(); if (attributes.method() == PostMethod) { isMultiPartForm = attributes.isMultiPartForm(); if (isMultiPartForm && isMailtoForm) { encodingType = "application/x-www-form-urlencoded"; isMultiPartForm = false; } } TextEncoding dataEncoding = isMailtoForm ? UTF8Encoding() : FormDataBuilder::encodingFromAcceptCharset(attributes.acceptCharset(), document); RefPtr<DOMFormData> domFormData = DOMFormData::create(dataEncoding.encodingForFormSubmission()); Vector<pair<String, String> > formValues; for (unsigned i = 0; i < form->associatedElements().size(); ++i) { HTMLFormControlElement* control = form->associatedElements()[i]; if (!control->disabled()) control->appendFormData(*domFormData, isMultiPartForm); 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(); } } } RefPtr<FormData> formData; String boundary; if (isMultiPartForm) { formData = FormData::createMultiPart(*(static_cast<FormDataList*>(domFormData.get())), domFormData->encoding(), document); boundary = formData->boundary().data(); } else { formData = FormData::create(*(static_cast<FormDataList*>(domFormData.get())), domFormData->encoding()); if (attributes.method() == PostMethod && isMailtoForm) { // Convert the form data into a string that we put into the URL. appendMailtoPostFormDataToURL(actionURL, *formData, encodingType); formData = FormData::create(); } } formData->setIdentifier(generateFormDataIdentifier()); String targetOrBaseTarget = attributes.target().isEmpty() ? document->baseTarget() : attributes.target(); RefPtr<FormState> formState = FormState::create(form, formValues, document->frame(), trigger); return adoptRef(new FormSubmission(attributes.method(), actionURL, targetOrBaseTarget, encodingType, formState.release(), formData.release(), boundary, lockHistory, event)); }
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; }
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; }