Changeset 112515 in webkit


Ignore:
Timestamp:
Mar 29, 2012 3:14:32 AM (12 years ago)
Author:
zeno.albisser@nokia.com
Message:

Fieldset disabled attribute does not work.
https://bugs.webkit.org/show_bug.cgi?id=58837

Source/WebCore:

Make HTMLFormControlElements inherit the disabled state
from HTMLFieldSetElement ancestors. Subordinates of the
first HTMLLegendElement in a fieldset will never be disabled.

Patch by Zeno Albisser <zeno@webkit.org>

Test: fast/forms/fieldset-disabled.html

Reviewed by Kent Tamura.

  • html/HTMLFieldSetElement.cpp:

(WebCore::HTMLFieldSetElement::disabledAttributeChanged):
(WebCore):
(WebCore::HTMLFieldSetElement::legend):

  • html/HTMLFieldSetElement.h:

(HTMLFieldSetElement):

  • html/HTMLFieldSetElement.idl:
  • html/HTMLFormControlElement.cpp:

(WebCore::HTMLFormControlElement::HTMLFormControlElement):
(WebCore::HTMLFormControlElement::updateFieldSetAndLegendAncestor):
(WebCore):
(WebCore::HTMLFormControlElement::parseAttribute):
(WebCore::HTMLFormControlElement::disabledAttributeChanged):
(WebCore::HTMLFormControlElement::removedFromTree):
(WebCore::HTMLFormControlElement::disabled):

  • html/HTMLFormControlElement.h:

(WebCore):
(HTMLFormControlElement):

LayoutTests:

Add a test case for fieldset disabled attribute.

Reviewed by Kent Tamura.

  • fast/forms/fieldset/fieldset-disabled-expected.txt: Added.
  • fast/forms/fieldset/fieldset-disabled.html: Added.
Location:
trunk
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r112514 r112515  
     12012-03-29  Zeno Albisser  <zeno@webkit.org>
     2
     3        Fieldset disabled attribute does not work.
     4        https://bugs.webkit.org/show_bug.cgi?id=58837
     5
     6        Add a test case for fieldset disabled attribute.
     7
     8        Reviewed by Kent Tamura.
     9
     10        * fast/forms/fieldset/fieldset-disabled-expected.txt: Added.
     11        * fast/forms/fieldset/fieldset-disabled.html: Added.
     12
    1132012-03-29  Csaba Osztrogonác  <ossy@webkit.org>
    214
  • trunk/Source/WebCore/ChangeLog

    r112513 r112515  
     12012-03-29  Zeno Albisser  <zeno@webkit.org>
     2
     3        Fieldset disabled attribute does not work.
     4        https://bugs.webkit.org/show_bug.cgi?id=58837
     5
     6        Make HTMLFormControlElements inherit the disabled state
     7        from HTMLFieldSetElement ancestors. Subordinates of the
     8        first HTMLLegendElement in a fieldset will never be disabled.
     9
     10        Patch by Zeno Albisser <zeno@webkit.org>
     11
     12        Test: fast/forms/fieldset-disabled.html
     13
     14        Reviewed by Kent Tamura.
     15
     16        * html/HTMLFieldSetElement.cpp:
     17        (WebCore::HTMLFieldSetElement::disabledAttributeChanged):
     18        (WebCore):
     19        (WebCore::HTMLFieldSetElement::legend):
     20        * html/HTMLFieldSetElement.h:
     21        (HTMLFieldSetElement):
     22        * html/HTMLFieldSetElement.idl:
     23        * html/HTMLFormControlElement.cpp:
     24        (WebCore::HTMLFormControlElement::HTMLFormControlElement):
     25        (WebCore::HTMLFormControlElement::updateFieldSetAndLegendAncestor):
     26        (WebCore):
     27        (WebCore::HTMLFormControlElement::parseAttribute):
     28        (WebCore::HTMLFormControlElement::disabledAttributeChanged):
     29        (WebCore::HTMLFormControlElement::removedFromTree):
     30        (WebCore::HTMLFormControlElement::disabled):
     31        * html/HTMLFormControlElement.h:
     32        (WebCore):
     33        (HTMLFormControlElement):
     34
    1352012-03-29  Tommy Widenflycht  <tommyw@google.com>
    236
  • trunk/Source/WebCore/html/HTMLFieldSetElement.cpp

    r65986 r112515  
    2525#include "config.h"
    2626#include "HTMLFieldSetElement.h"
     27#include "HTMLLegendElement.h"
    2728
    2829#include "HTMLNames.h"
     
    4546}
    4647
     48void HTMLFieldSetElement::disabledAttributeChanged()
     49{
     50    // This element must be updated before the style of nodes in its subtree gets recalculated.
     51    HTMLFormControlElement::disabledAttributeChanged();
     52
     53    for (Node* currentNode = this; currentNode; currentNode = currentNode->traverseNextNode(this)) {
     54        HTMLElement* element = toHTMLElement(currentNode);
     55        if (element && element->isFormControlElement())
     56            static_cast<HTMLFormControlElement*>(element)->setNeedsStyleRecalc();
     57    }
     58}
     59
    4760bool HTMLFieldSetElement::supportsFocus() const
    4861{
     
    6174}
    6275
     76HTMLLegendElement* HTMLFieldSetElement::legend() const
     77{
     78    for (Element* node = firstElementChild(); node; node = node->nextElementSibling()) {
     79        if (node->hasTagName(legendTag))
     80            return static_cast<HTMLLegendElement*>(node);
     81    }
     82    return 0;
     83}
     84
    6385} // namespace
  • trunk/Source/WebCore/html/HTMLFieldSetElement.h

    r72835 r112515  
    3232public:
    3333    static PassRefPtr<HTMLFieldSetElement> create(const QualifiedName&, Document*, HTMLFormElement*);
     34    HTMLLegendElement* legend() const;
     35
     36protected:
     37    virtual void disabledAttributeChanged() OVERRIDE;
    3438
    3539private:
  • trunk/Source/WebCore/html/HTMLFieldSetElement.idl

    r109846 r112515  
    2121
    2222    interface HTMLFieldSetElement : HTMLElement {
     23        attribute [Reflect] boolean disabled;
    2324        readonly attribute HTMLFormElement form;
    2425        attribute [Reflect] DOMString name;
  • trunk/Source/WebCore/html/HTMLFormControlElement.cpp

    r112389 r112515  
    3131#include "EventNames.h"
    3232#include "Frame.h"
     33#include "HTMLFieldSetElement.h"
    3334#include "HTMLFormElement.h"
    3435#include "HTMLInputElement.h"
     36#include "HTMLLegendElement.h"
    3537#include "RenderBox.h"
    3638#include "RenderTheme.h"
     
    4749HTMLFormControlElement::HTMLFormControlElement(const QualifiedName& tagName, Document* document, HTMLFormElement* form)
    4850    : LabelableElement(tagName, document)
     51    , m_fieldSetAncestor(0)
     52    , m_legendAncestor(0)
     53    , m_fieldSetAncestorValid(false)
    4954    , m_disabled(false)
    5055    , m_readOnly(false)
     
    96101}
    97102
     103void HTMLFormControlElement::updateFieldSetAndLegendAncestor() const
     104{
     105    m_fieldSetAncestor = 0;
     106    m_legendAncestor = 0;
     107    for (ContainerNode* ancestor = parentNode(); ancestor; ancestor = ancestor->parentNode()) {
     108        if (!m_legendAncestor && ancestor->hasTagName(legendTag))
     109            m_legendAncestor = static_cast<HTMLLegendElement*>(ancestor);
     110        if (ancestor->hasTagName(fieldsetTag)) {
     111            m_fieldSetAncestor = static_cast<HTMLFieldSetElement*>(ancestor);
     112            break;
     113        }
     114    }
     115    m_fieldSetAncestorValid = true;
     116}
     117
    98118void HTMLFormControlElement::parseAttribute(Attribute* attr)
    99119{
     
    103123        bool oldDisabled = m_disabled;
    104124        m_disabled = !attr->isNull();
    105         if (oldDisabled != m_disabled) {
    106             setNeedsStyleRecalc();
    107             if (renderer() && renderer()->style()->hasAppearance())
    108                 renderer()->theme()->stateChanged(renderer(), EnabledState);
    109         }
     125        if (oldDisabled != m_disabled)
     126            disabledAttributeChanged();
    110127    } else if (attr->name() == readonlyAttr) {
    111128        bool oldReadOnly = m_readOnly;
     
    126143}
    127144
     145void HTMLFormControlElement::disabledAttributeChanged()
     146{
     147    setNeedsStyleRecalc();
     148    if (renderer() && renderer()->style()->hasAppearance())
     149        renderer()->theme()->stateChanged(renderer(), EnabledState);
     150}
     151
    128152void HTMLFormControlElement::requiredAttributeChanged()
    129153{
     
    206230void HTMLFormControlElement::removedFromTree(bool deep)
    207231{
     232    m_fieldSetAncestorValid = false;
    208233    FormAssociatedElement::removedFromTree();
    209234    HTMLElement::removedFromTree(deep);
     
    253278    setChangedSinceLastFormControlChangeEvent(true);
    254279    HTMLElement::dispatchInputEvent();
     280}
     281
     282bool HTMLFormControlElement::disabled() const
     283{
     284    if (m_disabled)
     285        return true;
     286
     287    if (!m_fieldSetAncestorValid)
     288        updateFieldSetAndLegendAncestor();
     289
     290    // Form controls in the first legend element inside a fieldset are not affected by fieldset.disabled.
     291    if (m_fieldSetAncestor && m_fieldSetAncestor->disabled())
     292        return !(m_legendAncestor && m_legendAncestor == m_fieldSetAncestor->legend());
     293    return false;
    255294}
    256295
  • trunk/Source/WebCore/html/HTMLFormControlElement.h

    r112389 r112515  
    3131
    3232class FormDataList;
     33class HTMLFieldSetElement;
    3334class HTMLFormElement;
     35class HTMLLegendElement;
    3436class ValidationMessage;
    3537class ValidityState;
     
    5052    bool formNoValidate() const;
    5153
     54    void updateFieldSetAndLegendAncestor() const;
     55
    5256    virtual void reset() { }
    5357
     
    6165    virtual void dispatchFormControlInputEvent();
    6266
    63     virtual bool disabled() const { return m_disabled; }
     67    virtual bool disabled() const;
    6468    void setDisabled(bool);
    6569
     
    115119    virtual void parseAttribute(Attribute*) OVERRIDE;
    116120    virtual void requiredAttributeChanged();
     121    virtual void disabledAttributeChanged();
    117122    virtual void attach();
    118123    virtual void insertedIntoTree(bool deep);
     
    148153    String visibleValidationMessage() const;
    149154
     155    mutable HTMLFieldSetElement* m_fieldSetAncestor;
     156    mutable HTMLLegendElement* m_legendAncestor;
    150157    OwnPtr<ValidationMessage> m_validationMessage;
     158    mutable bool m_fieldSetAncestorValid : 1;
    151159    bool m_disabled : 1;
    152160    bool m_readOnly : 1;
Note: See TracChangeset for help on using the changeset viewer.