Changeset 118720 in webkit


Ignore:
Timestamp:
May 28, 2012 8:57:17 PM (12 years ago)
Author:
commit-queue@webkit.org
Message:

[Forms] HTMLFieldSetElement.idl doesn't have elements attribute.
https://bugs.webkit.org/show_bug.cgi?id=80110

Patch by Rakesh KN <rakesh.kn@motorola.com> on 2012-05-28
Reviewed by Kent Tamura.

Source/WebCore:

Implemented elements attribute for HTMLFieldSetElement. This is spec'ed at
http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#dom-fieldset-elements

Tests: fast/forms/fieldset/fieldset-elements.html

fast/forms/fieldset/fieldset-form-collection-radionode-list.html

  • dom/Node.cpp:

(WebCore::Node::radioNodeList):
Extended ASSERT to assert if not HTMLFieldSetElement or HTMLFormElement.

  • html/HTMLFieldSetElement.cpp:

(WebCore::HTMLFieldSetElement::elements):
Elements attribute implementation.
(WebCore::HTMLFieldSetElement::refreshElementsIfNeeded):
Update the formcontrol elements collections if dom tree got modified.
(WebCore::HTMLFieldSetElement::associatedElements):
FormControl elements collection accessor.
(WebCore::HTMLFieldSetElement::length):
Number of elements in the fieldset group.

  • html/HTMLFieldSetElement.h:

Added elements collection member and form control collection members.

  • html/HTMLFieldSetElement.idl:

Added elements attribute.

  • html/HTMLFormCollection.cpp:

(WebCore::HTMLFormCollection::formControlElements):
Added support for HTMLFieldSetElement, based on base element type gets its associated elements.
(WebCore::HTMLFormCollection::numberOfFormControlElements): Ditto
(WebCore::HTMLFormCollection::getNamedFormItem): Process image elements only for form element.
(WebCore::HTMLFormCollection::updateNameCache): Ditto

  • html/RadioNodeList.cpp:

(WebCore::RadioNodeList::RadioNodeList):
DynamicSubTree root element is decided based on the type whether base element is form or fieldset element.
Renamed m_formElement to m_baseElement.
(WebCore::RadioNodeList::~RadioNodeList):
Renamed m_formElement to m_baseElement.
(WebCore::RadioNodeList::checkElementMatchesRadioNodeListFilter):
Form element specific changes moved under form element check.

  • html/RadioNodeList.h:

(WebCore::RadioNodeList::create):
(RadioNodeList):
Renamed m_formElement to m_baseElement.

LayoutTests:

  • fast/forms/fieldset/fieldset-elements-expected.txt: Added.
  • fast/forms/fieldset/fieldset-elements.html: Added.
  • fast/forms/fieldset/fieldset-form-collection-radionode-list-expected.txt: Added.
  • fast/forms/fieldset/fieldset-form-collection-radionode-list.html: Added.
Location:
trunk
Files:
4 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r118717 r118720  
     12012-05-28  Rakesh KN  <rakesh.kn@motorola.com>
     2
     3        [Forms] HTMLFieldSetElement.idl doesn't have elements attribute.
     4        https://bugs.webkit.org/show_bug.cgi?id=80110
     5
     6        Reviewed by Kent Tamura.
     7
     8        * fast/forms/fieldset/fieldset-elements-expected.txt: Added.
     9        * fast/forms/fieldset/fieldset-elements.html: Added.
     10        * fast/forms/fieldset/fieldset-form-collection-radionode-list-expected.txt: Added.
     11        * fast/forms/fieldset/fieldset-form-collection-radionode-list.html: Added.
     12
    1132012-05-28  David Barton  <dbarton@mathscribe.com>
    214
  • trunk/Source/WebCore/ChangeLog

    r118719 r118720  
     12012-05-28  Rakesh KN  <rakesh.kn@motorola.com>
     2
     3        [Forms] HTMLFieldSetElement.idl doesn't have elements attribute.
     4        https://bugs.webkit.org/show_bug.cgi?id=80110
     5
     6        Reviewed by Kent Tamura.
     7
     8        Implemented elements attribute for HTMLFieldSetElement. This is spec'ed at
     9        http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#dom-fieldset-elements
     10
     11        Tests: fast/forms/fieldset/fieldset-elements.html
     12               fast/forms/fieldset/fieldset-form-collection-radionode-list.html
     13
     14        * dom/Node.cpp:
     15        (WebCore::Node::radioNodeList):
     16        Extended ASSERT to assert if not HTMLFieldSetElement or HTMLFormElement.
     17        * html/HTMLFieldSetElement.cpp:
     18        (WebCore::HTMLFieldSetElement::elements):
     19        Elements attribute implementation.
     20        (WebCore::HTMLFieldSetElement::refreshElementsIfNeeded):
     21        Update the formcontrol elements collections if dom tree got modified.
     22        (WebCore::HTMLFieldSetElement::associatedElements):
     23        FormControl elements collection accessor.
     24        (WebCore::HTMLFieldSetElement::length):
     25        Number of elements in the fieldset group.
     26        * html/HTMLFieldSetElement.h:
     27        Added elements collection member and form control collection members.
     28        * html/HTMLFieldSetElement.idl:
     29        Added elements attribute.
     30        * html/HTMLFormCollection.cpp:
     31        (WebCore::HTMLFormCollection::formControlElements):
     32        Added support for HTMLFieldSetElement, based on base element type gets its associated elements.
     33        (WebCore::HTMLFormCollection::numberOfFormControlElements): Ditto
     34        (WebCore::HTMLFormCollection::getNamedFormItem): Process image elements only for form element.
     35        (WebCore::HTMLFormCollection::updateNameCache): Ditto
     36        * html/RadioNodeList.cpp:
     37        (WebCore::RadioNodeList::RadioNodeList):
     38        DynamicSubTree root element is decided based on the type whether base element is form or fieldset element.
     39        Renamed m_formElement to m_baseElement.
     40        (WebCore::RadioNodeList::~RadioNodeList):
     41        Renamed m_formElement to m_baseElement.
     42        (WebCore::RadioNodeList::checkElementMatchesRadioNodeListFilter):
     43        Form element specific changes moved under form element check.
     44        * html/RadioNodeList.h:
     45        (WebCore::RadioNodeList::create):
     46        (RadioNodeList):
     47        Renamed m_formElement to m_baseElement.
     48
    1492012-05-28  Jonathan Dong  <jonathan.dong@torchmobile.com.cn>
    250
  • trunk/Source/WebCore/dom/Node.cpp

    r118442 r118720  
    29322932PassRefPtr<RadioNodeList> Node::radioNodeList(const AtomicString& name)
    29332933{
    2934     ASSERT(hasTagName(formTag));
     2934    ASSERT(hasTagName(formTag) || hasTagName(fieldsetTag));
    29352935
    29362936    NodeListsNodeData* nodeLists = ensureRareData()->ensureNodeLists(this);
  • trunk/Source/WebCore/html/HTMLFieldSetElement.cpp

    r112788 r118720  
    2525#include "config.h"
    2626#include "HTMLFieldSetElement.h"
     27
     28#include "HTMLFormCollection.h"
    2729#include "HTMLLegendElement.h"
    28 
    2930#include "HTMLNames.h"
     31#include "HTMLObjectElement.h"
    3032#include "RenderFieldset.h"
    3133#include <wtf/StdLibExtras.h>
     
    8284}
    8385
     86HTMLCollection* HTMLFieldSetElement::elements()
     87{
     88    if (!m_elementsCollection)
     89        m_elementsCollection = HTMLFormCollection::create(this);
     90    return m_elementsCollection.get();
     91}
     92
     93void HTMLFieldSetElement::refreshElementsIfNeeded() const
     94{
     95    uint64_t docVersion = document()->domTreeVersion();
     96    if (m_documentVersion == docVersion)
     97        return;
     98
     99    m_documentVersion = docVersion;
     100
     101    m_associatedElements.clear();
     102
     103    for (Node* node = firstChild(); node; node = node->traverseNextNode(this)) {
     104        if (!node->isElementNode())
     105            continue;
     106
     107        if (node->hasTagName(objectTag)) {
     108            m_associatedElements.append(static_cast<HTMLObjectElement*>(node));
     109            continue;
     110        }
     111
     112        if (!toElement(node)->isFormControlElement())
     113            continue;
     114
     115        m_associatedElements.append(static_cast<HTMLFormControlElement*>(node));
     116    }
     117}
     118
     119const Vector<FormAssociatedElement*>& HTMLFieldSetElement::associatedElements() const
     120{
     121    refreshElementsIfNeeded();
     122    return m_associatedElements;
     123}
     124
     125unsigned HTMLFieldSetElement::length() const
     126{
     127    refreshElementsIfNeeded();
     128    unsigned len = 0;
     129    for (unsigned i = 0; i < m_associatedElements.size(); ++i)
     130        if (m_associatedElements[i]->isEnumeratable())
     131            ++len;
     132    return len;
     133}
     134
    84135} // namespace
  • trunk/Source/WebCore/html/HTMLFieldSetElement.h

    r112515 r118720  
    2626
    2727#include "HTMLFormControlElement.h"
     28#include <wtf/OwnPtr.h>
    2829
    2930namespace WebCore {
     31
     32class FormAssociatedElement;
     33class HTMLCollection;
     34class HTMLFormCollection;
    3035
    3136class HTMLFieldSetElement : public HTMLFormControlElement {
     
    3338    static PassRefPtr<HTMLFieldSetElement> create(const QualifiedName&, Document*, HTMLFormElement*);
    3439    HTMLLegendElement* legend() const;
     40
     41    HTMLCollection* elements();
     42
     43    const Vector<FormAssociatedElement*>& associatedElements() const;
     44    unsigned length() const;
    3545
    3646protected:
     
    4555    virtual const AtomicString& formControlType() const;
    4656    virtual bool recalcWillValidate() const { return false; }
     57
     58    void refreshElementsIfNeeded() const;
     59
     60    OwnPtr<HTMLFormCollection> m_elementsCollection;
     61    mutable Vector<FormAssociatedElement*> m_associatedElements;
     62    // When dom tree is modified, we have to refresh the m_associatedElements array.
     63    mutable uint64_t m_documentVersion;
    4764};
    4865
  • trunk/Source/WebCore/html/HTMLFieldSetElement.idl

    r112515 r118720  
    2727        readonly attribute DOMString type;
    2828
     29        readonly attribute HTMLCollection elements;
     30
    2931        readonly attribute boolean         willValidate;
    3032        readonly attribute ValidityState   validity;
  • trunk/Source/WebCore/html/HTMLFormCollection.cpp

    r117754 r118720  
    2424#include "HTMLFormCollection.h"
    2525
     26#include "HTMLFieldSetElement.h"
    2627#include "HTMLFormControlElement.h"
    2728#include "HTMLFormElement.h"
     
    5455{
    5556    ASSERT(base());
    56     ASSERT(base()->hasTagName(formTag));
    57     return static_cast<HTMLFormElement*>(base())->associatedElements();
     57    ASSERT(base()->hasTagName(formTag) || base()->hasTagName(fieldsetTag));
     58    if (base()->hasTagName(formTag))
     59        return static_cast<HTMLFormElement*>(base())->associatedElements();
     60    return static_cast<HTMLFieldSetElement*>(base())->associatedElements();
    5861}
    5962
     
    6871{
    6972    ASSERT(base());
    70     ASSERT(base()->hasTagName(formTag));
    71     return static_cast<HTMLFormElement*>(base())->length();
     73    ASSERT(base()->hasTagName(formTag) || base()->hasTagName(fieldsetTag));
     74    if (base()->hasTagName(formTag))
     75        return static_cast<HTMLFormElement*>(base())->length();
     76    return static_cast<HTMLFieldSetElement*>(base())->length();
    7277}
    7378
     
    135140    }
    136141
     142    if (base()->hasTagName(fieldsetTag))
     143        return 0;
     144
    137145    const Vector<HTMLImageElement*>& imageElementsArray = formImageElements();
    138146    if (!foundInputElements) {
     
    196204    }
    197205
    198     const Vector<HTMLImageElement*>& imageElementsArray = formImageElements();
    199     for (unsigned i = 0; i < imageElementsArray.size(); ++i) {
    200         HTMLImageElement* element = imageElementsArray[i];
    201         const AtomicString& idAttrVal = element->getIdAttribute();
    202         const AtomicString& nameAttrVal = element->getNameAttribute();
    203         if (!idAttrVal.isEmpty() && !foundInputElements.contains(idAttrVal.impl()))
    204             append(m_cache.idCache, idAttrVal, element);
    205         if (!nameAttrVal.isEmpty() && idAttrVal != nameAttrVal && !foundInputElements.contains(nameAttrVal.impl()))
    206             append(m_cache.nameCache, nameAttrVal, element);
     206    if (base()->hasTagName(formTag)) {
     207        const Vector<HTMLImageElement*>& imageElementsArray = formImageElements();
     208        for (unsigned i = 0; i < imageElementsArray.size(); ++i) {
     209            HTMLImageElement* element = imageElementsArray[i];
     210            const AtomicString& idAttrVal = element->getIdAttribute();
     211            const AtomicString& nameAttrVal = element->getNameAttribute();
     212            if (!idAttrVal.isEmpty() && !foundInputElements.contains(idAttrVal.impl()))
     213                append(m_cache.idCache, idAttrVal, element);
     214            if (!nameAttrVal.isEmpty() && idAttrVal != nameAttrVal && !foundInputElements.contains(nameAttrVal.impl()))
     215                append(m_cache.nameCache, nameAttrVal, element);
     216        }
    207217    }
    208218
  • trunk/Source/WebCore/html/RadioNodeList.cpp

    r118495 r118720  
    3737using namespace HTMLNames;
    3838
    39 RadioNodeList::RadioNodeList(const AtomicString& name, Element* formElement)
    40     : DynamicSubtreeNodeList(formElement->document())
     39RadioNodeList::RadioNodeList(const AtomicString& name, Element* baseElement)
     40    : DynamicSubtreeNodeList(baseElement->hasTagName(formTag) ? static_cast<Node*>(baseElement->document()) : baseElement)
    4141    , m_name(name)
    42     , m_formElement(formElement)
     42    , m_baseElement(baseElement)
    4343{
    44     m_formElement->document()->registerDynamicSubtreeNodeList(this);
     44    m_baseElement->document()->registerDynamicSubtreeNodeList(this);
    4545}
    4646
    4747RadioNodeList::~RadioNodeList()
    4848{
    49     m_formElement->removeCachedRadioNodeList(this, m_name);
    50     m_formElement->document()->unregisterDynamicSubtreeNodeList(this);
     49    m_baseElement->removeCachedRadioNodeList(this, m_name);
     50    m_baseElement->document()->unregisterDynamicSubtreeNodeList(this);
    5151}
    5252
     
    8787{
    8888    ASSERT(testElement->hasTagName(objectTag) || testElement->isFormControlElement());
    89     HTMLFormElement* formElement = 0;
    90     if (testElement->hasTagName(objectTag))
    91         formElement = static_cast<HTMLObjectElement*>(testElement)->form();
    92     else
    93         formElement = static_cast<HTMLFormControlElement*>(testElement)->form();
    94     if (!formElement || formElement != m_formElement)
    95         return false;
     89    if (m_baseElement->hasTagName(formTag)) {
     90        HTMLFormElement* formElement = 0;
     91        if (testElement->hasTagName(objectTag))
     92            formElement = static_cast<HTMLObjectElement*>(testElement)->form();
     93        else
     94            formElement = static_cast<HTMLFormControlElement*>(testElement)->form();
     95        if (!formElement || formElement != m_baseElement)
     96            return false;
     97    }
    9698
    9799    return testElement->getIdAttribute() == m_name || testElement->getNameAttribute() == m_name;
  • trunk/Source/WebCore/html/RadioNodeList.h

    r118495 r118720  
    3737class RadioNodeList : public DynamicSubtreeNodeList {
    3838public:
    39     static PassRefPtr<RadioNodeList> create(const AtomicString& name, Element* formElement)
     39    static PassRefPtr<RadioNodeList> create(const AtomicString& name, Element* baseElement)
    4040    {
    41         return adoptRef(new RadioNodeList(name, formElement));
     41        return adoptRef(new RadioNodeList(name, baseElement));
    4242    }
    4343
     
    5555
    5656    AtomicString m_name;
    57     RefPtr<Element> m_formElement;
     57    RefPtr<Element> m_baseElement;
    5858};
    5959
Note: See TracChangeset for help on using the changeset viewer.