HTMLButtonElement.cpp [plain text]
#include "config.h"
#include "HTMLButtonElement.h"
#include "Attribute.h"
#include "EventNames.h"
#include "FormDataList.h"
#include "HTMLFormElement.h"
#include "HTMLNames.h"
#include "KeyboardEvent.h"
#include "RenderButton.h"
#include "ScriptEventListener.h"
#include <wtf/StdLibExtras.h>
namespace WebCore {
using namespace HTMLNames;
inline HTMLButtonElement::HTMLButtonElement(const QualifiedName& tagName, Document* document, HTMLFormElement* form)
: HTMLFormControlElement(tagName, document, form)
, m_type(SUBMIT)
, m_isActivatedSubmit(false)
{
ASSERT(hasTagName(buttonTag));
}
PassRefPtr<HTMLButtonElement> HTMLButtonElement::create(const QualifiedName& tagName, Document* document, HTMLFormElement* form)
{
return adoptRef(new HTMLButtonElement(tagName, document, form));
}
RenderObject* HTMLButtonElement::createRenderer(RenderArena* arena, RenderStyle*)
{
return new (arena) RenderButton(this);
}
const AtomicString& HTMLButtonElement::formControlType() const
{
switch (m_type) {
case SUBMIT: {
DEFINE_STATIC_LOCAL(const AtomicString, submit, ("submit"));
return submit;
}
case BUTTON: {
DEFINE_STATIC_LOCAL(const AtomicString, button, ("button"));
return button;
}
case RESET: {
DEFINE_STATIC_LOCAL(const AtomicString, reset, ("reset"));
return reset;
}
}
ASSERT_NOT_REACHED();
return emptyAtom;
}
void HTMLButtonElement::parseMappedAttribute(Attribute* attr)
{
if (attr->name() == typeAttr) {
if (equalIgnoringCase(attr->value(), "reset"))
m_type = RESET;
else if (equalIgnoringCase(attr->value(), "button"))
m_type = BUTTON;
else
m_type = SUBMIT;
setNeedsWillValidateCheck();
} else if (attr->name() == alignAttr) {
} else
HTMLFormControlElement::parseMappedAttribute(attr);
}
void HTMLButtonElement::defaultEventHandler(Event* event)
{
if (event->type() == eventNames().DOMActivateEvent && !disabled()) {
if (form() && m_type == SUBMIT) {
m_isActivatedSubmit = true;
form()->prepareForSubmission(event);
m_isActivatedSubmit = false; }
if (form() && m_type == RESET)
form()->reset();
}
if (event->isKeyboardEvent()) {
if (event->type() == eventNames().keydownEvent && static_cast<KeyboardEvent*>(event)->keyIdentifier() == "U+0020") {
setActive(true, true);
return;
}
if (event->type() == eventNames().keypressEvent) {
switch (static_cast<KeyboardEvent*>(event)->charCode()) {
case '\r':
dispatchSimulatedClick(event);
event->setDefaultHandled();
return;
case ' ':
event->setDefaultHandled();
return;
}
}
if (event->type() == eventNames().keyupEvent && static_cast<KeyboardEvent*>(event)->keyIdentifier() == "U+0020") {
if (active())
dispatchSimulatedClick(event);
event->setDefaultHandled();
return;
}
}
HTMLFormControlElement::defaultEventHandler(event);
}
bool HTMLButtonElement::isSuccessfulSubmitButton() const
{
return m_type == SUBMIT && !disabled();
}
bool HTMLButtonElement::isActivatedSubmit() const
{
return m_isActivatedSubmit;
}
void HTMLButtonElement::setActivatedSubmit(bool flag)
{
m_isActivatedSubmit = flag;
}
bool HTMLButtonElement::appendFormData(FormDataList& formData, bool)
{
if (m_type != SUBMIT || name().isEmpty() || !m_isActivatedSubmit)
return false;
formData.appendData(name(), value());
return true;
}
void HTMLButtonElement::accessKeyAction(bool sendToAnyElement)
{
focus();
dispatchSimulatedClick(0, sendToAnyElement);
}
bool HTMLButtonElement::isURLAttribute(Attribute* attr) const
{
return attr->name() == formactionAttr;
}
String HTMLButtonElement::value() const
{
return getAttribute(valueAttr);
}
bool HTMLButtonElement::recalcWillValidate() const
{
return m_type == SUBMIT && HTMLFormControlElement::recalcWillValidate();
}
}