HTMLGenericFormElement.cpp [plain text]
#include "config.h"
#include "HTMLGenericFormElement.h"
#include "Event.h"
#include "EventNames.h"
#include "Frame.h"
#include "HTMLFormElement.h"
#include "RenderTheme.h"
#include "RenderWidget.h"
#include "HTMLNames.h"
namespace WebCore {
using namespace EventNames;
using namespace HTMLNames;
HTMLGenericFormElement::HTMLGenericFormElement(const QualifiedName& tagName, Document* doc, HTMLFormElement* f)
: HTMLElement(tagName, doc)
, m_form(f)
, m_disabled(false)
, m_readOnly(false)
, m_valueMatchesRenderer(false)
, m_autocorrect(HTMLTextEntryAssistanceUnspecified)
, m_autocapitalize(HTMLTextEntryAssistanceUnspecified)
{
if (!m_form)
m_form = getForm();
if (m_form)
m_form->registerFormElement(this);
}
HTMLGenericFormElement::~HTMLGenericFormElement()
{
if (m_form)
m_form->removeFormElement(this);
}
void HTMLGenericFormElement::parseMappedAttribute(MappedAttribute *attr)
{
if (attr->name() == nameAttr) {
} else if (attr->name() == disabledAttr) {
bool oldDisabled = m_disabled;
m_disabled = !attr->isNull();
if (oldDisabled != m_disabled) {
setChanged();
if (renderer() && renderer()->style()->hasAppearance())
theme()->stateChanged(renderer(), EnabledState);
}
} else if (attr->name() == readonlyAttr) {
bool oldReadOnly = m_readOnly;
m_readOnly = !attr->isNull();
if (oldReadOnly != m_readOnly) {
setChanged();
if (renderer() && renderer()->style()->hasAppearance())
theme()->stateChanged(renderer(), ReadOnlyState);
}
} else if (attr->name() == autocorrectAttr)
m_autocorrect = equalIgnoringCase(attr->value(), "off") ? HTMLTextEntryAssistanceOff : HTMLTextEntryAssistanceOn;
else if (attr->name() == autocapitalizeAttr) {
m_autocapitalize = equalIgnoringCase(attr->value(), "off") ? HTMLTextEntryAssistanceOff : HTMLTextEntryAssistanceOn;
} else
HTMLElement::parseMappedAttribute(attr);
}
void HTMLGenericFormElement::attach()
{
assert(!attached());
HTMLElement::attach();
if (renderer()) {
renderer()->updateFromElement();
if (document()->focusNode() == this && renderer()->isWidget() &&
static_cast<RenderWidget*>(renderer())->widget())
static_cast<RenderWidget*>(renderer())->widget()->setFocus();
}
}
void HTMLGenericFormElement::insertedIntoTree(bool deep)
{
if (!m_form) {
m_form = getForm();
if (m_form)
m_form->registerFormElement(this);
else
if (isRadioButton() && !name().isEmpty() && isChecked())
document()->radioButtonChecked((HTMLInputElement*)this, m_form);
}
HTMLElement::insertedIntoTree(deep);
}
static inline Node* findRoot(Node* n)
{
Node* root = n;
for (; n; n = n->parentNode())
root = n;
return root;
}
void HTMLGenericFormElement::removedFromTree(bool deep)
{
if (m_form && !m_form->preserveAcrossRemove() && findRoot(this) != findRoot(m_form)) {
m_form->removeFormElement(this);
m_form = 0;
}
HTMLElement::removedFromTree(deep);
}
HTMLFormElement* HTMLGenericFormElement::getForm() const
{
for (Node* p = parentNode(); p; p = p->parentNode())
if (p->hasTagName(formTag))
return static_cast<HTMLFormElement*>(p);
return 0;
}
const AtomicString& HTMLGenericFormElement::name() const
{
const AtomicString& n = getAttribute(nameAttr);
return n.isNull() ? emptyAtom : n;
}
void HTMLGenericFormElement::setName(const AtomicString &value)
{
setAttribute(nameAttr, value);
}
void HTMLGenericFormElement::onSelect()
{
dispatchHTMLEvent(selectEvent,true,false);
}
void HTMLGenericFormElement::onChange()
{
dispatchHTMLEvent(changeEvent,true,false);
}
bool HTMLGenericFormElement::disabled() const
{
return m_disabled;
}
void HTMLGenericFormElement::setDisabled(bool b)
{
setAttribute(disabledAttr, b ? "" : 0);
}
void HTMLGenericFormElement::setReadOnly(bool b)
{
setAttribute(readonlyAttr, b ? "" : 0);
}
void HTMLGenericFormElement::recalcStyle( StyleChange ch )
{
HTMLElement::recalcStyle( ch );
if (renderer() )
renderer()->updateFromElement();
}
bool HTMLGenericFormElement::isFocusable() const
{
if (disabled() || !renderer() ||
(renderer()->style() && renderer()->style()->visibility() != VISIBLE) ||
renderer()->width() == 0 || renderer()->height() == 0)
return false;
return true;
}
bool HTMLGenericFormElement::isKeyboardFocusable() const
{
if (isFocusable()) {
if (renderer()->isWidget()) {
return static_cast<RenderWidget*>(renderer())->widget() &&
(static_cast<RenderWidget*>(renderer())->widget()->focusPolicy() & Widget::TabFocus);
}
if (document()->frame())
return document()->frame()->tabsToAllControls();
}
return false;
}
bool HTMLGenericFormElement::isMouseFocusable() const
{
if (isFocusable()) {
if (renderer()->isWidget()) {
return static_cast<RenderWidget*>(renderer())->widget() &&
(static_cast<RenderWidget*>(renderer())->widget()->focusPolicy() & Widget::ClickFocus);
}
return false;
}
return false;
}
String HTMLGenericFormElement::stateValue() const
{
ASSERT_NOT_REACHED();
return String();
}
void HTMLGenericFormElement::restoreState(const String&)
{
ASSERT_NOT_REACHED();
}
void HTMLGenericFormElement::closeRenderer()
{
Document* doc = document();
if (doc->hasStateForNewFormElements()) {
String state;
if (doc->takeStateForFormElement(name().impl(), type().impl(), state))
restoreState(state);
}
}
int HTMLGenericFormElement::tabIndex() const
{
return getAttribute(tabindexAttr).toInt();
}
void HTMLGenericFormElement::setTabIndex(int value)
{
setAttribute(tabindexAttr, String::number(value));
}
void HTMLGenericFormElement::dispatchFocusEvent()
{
document()->frame()->formElementDidFocus(this);
HTMLElement::dispatchFocusEvent();
}
void HTMLGenericFormElement::dispatchBlurEvent()
{
document()->frame()->formElementDidBlur(this);
HTMLElement::dispatchBlurEvent();
}
HTMLTextEntryAssistance HTMLGenericFormElement::autocorrect()
{
return m_autocorrect;
}
HTMLTextEntryAssistance HTMLGenericFormElement::autocapitalize()
{
return m_autocapitalize;
}
}