WebPasswordFormData.cpp [plain text]
#include "config.h"
#include "WebPasswordFormData.h"
#include "Document.h"
#include "DocumentLoader.h"
#include "Frame.h"
#include "FrameLoader.h"
#include "HTMLFormElement.h"
#include "HTMLInputElement.h"
#include "HTMLNames.h"
#include "KURL.h"
#include "DOMUtilitiesPrivate.h"
#include "WebPasswordFormUtils.h"
using namespace WebCore;
namespace WebKit {
namespace {
bool locateSpecificPasswords(PasswordFormFields* fields,
HTMLInputElement** password,
HTMLInputElement** oldPassword)
{
ASSERT(fields);
ASSERT(password);
ASSERT(oldPassword);
switch (fields->passwords.size()) {
case 1:
*password = fields->passwords[0];
break;
case 2:
if (fields->passwords[0]->value() == fields->passwords[1]->value())
*password = fields->passwords[0];
else {
*oldPassword = fields->passwords[0];
*password = fields->passwords[1];
}
break;
case 3:
if (fields->passwords[0]->value() == fields->passwords[1]->value()
&& fields->passwords[0]->value() == fields->passwords[2]->value()) {
*password = fields->passwords[0];
} else if (fields->passwords[0]->value() == fields->passwords[1]->value()) {
*oldPassword = fields->passwords[0];
*password = fields->passwords[2];
} else if (fields->passwords[1]->value() == fields->passwords[2]->value()) {
*oldPassword = fields->passwords[0];
*password = fields->passwords[1];
} else {
return false;
}
break;
default:
return false;
}
return true;
}
KURL stripURL(const KURL& url)
{
KURL strippedURL = url;
strippedURL.setUser(String());
strippedURL.setPass(String());
strippedURL.setQuery(String());
strippedURL.setFragmentIdentifier(String());
return strippedURL;
}
void assemblePasswordFormResult(const KURL& fullOrigin,
const KURL& fullAction,
HTMLFormControlElement* submit,
HTMLInputElement* userName,
HTMLInputElement* oldPassword,
HTMLInputElement* password,
WebPasswordFormData* result)
{
result->action = stripURL(fullAction);
result->origin = stripURL(fullOrigin);
KURL signonRealmURL = stripURL(fullOrigin);
signonRealmURL.setPath("");
result->signonRealm = signonRealmURL;
if (submit)
result->submitElement = submit->name();
if (userName) {
result->userNameElement = userName->name();
result->userNameValue = userName->value();
}
if (password) {
result->passwordElement = password->name();
result->passwordValue = password->value();
}
if (oldPassword) {
result->oldPasswordElement = oldPassword->name();
result->oldPasswordValue = oldPassword->value();
}
}
}
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);
KURL fullOrigin(ParsedURLString, form->document()->documentURI());
String action = form->action();
if (action.isNull())
action = ""; KURL fullAction = frame->loader()->completeURL(action);
if (!fullAction.isValid())
return;
HTMLInputElement* password = 0;
HTMLInputElement* oldPassword = 0;
if (!locateSpecificPasswords(&fields, &password, &oldPassword))
return;
assemblePasswordFormResult(fullOrigin, fullAction,
fields.submit, fields.userName,
oldPassword, password, this);
}
}