WebPasswordFormData::WebPasswordFormData(const WebFormElement& webForm) { RefPtr<HTMLFormElement> form = webForm.operator PassRefPtr<HTMLFormElement>(); Frame* frame = form->document()->frame(); if (!frame) return; PasswordFormFields fields; findPasswordFormFields(form.get(), &fields); // Get the document URL KURL fullOrigin(ParsedURLString, form->document()->documentURI()); // Calculate the canonical action URL String action = form->action(); if (action.isNull()) action = ""; // missing 'action' attribute implies current URL KURL fullAction = frame->loader()->completeURL(action); if (!fullAction.isValid()) return; // Determine the types of the password fields HTMLInputElement* password = 0; HTMLInputElement* oldPassword = 0; if (!locateSpecificPasswords(&fields, &password, &oldPassword)) return; assemblePasswordFormResult(fullOrigin, fullAction, fields.submit, fields.userName, oldPassword, password, this); }
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; }
WebPasswordFormData::WebPasswordFormData(const WebFormElement& webForm) { RefPtr<HTMLFormElement> form = webForm.operator PassRefPtr<HTMLFormElement>(); PasswordFormFields fields; findPasswordFormFields(form.get(), &fields); // Get the document URL KURL fullOrigin = form->document().url(); // Calculate the canonical action URL String action = form->action(); if (action.isNull()) action = ""; // missing 'action' attribute implies current URL KURL fullAction = form->document().completeURL(action); if (!fullAction.isValid()) return; // Determine the types of the password fields HTMLInputElement* password = 0; HTMLInputElement* oldPassword = 0; if (!locateSpecificPasswords(&fields, &password, &oldPassword)) return; #if defined(S_FP_SIGNUP_POPUP_FIX) this->isSignUpPage = false; if(fields.passwords.size() > 1) { if ((fields.passwords[0]->value() == fields.passwords[1]->value()) && !fields.passwords[0]->value().isEmpty()) this->isSignUpPage = true; } #endif assemblePasswordFormResult(fullOrigin, fullAction, fields.submit, fields.userName, fields.alternateUserNames, oldPassword, password, this); }