Changeset 118720 in webkit
- Timestamp:
- May 28, 2012 8:57:17 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r118717 r118720 1 2012-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 1 13 2012-05-28 David Barton <dbarton@mathscribe.com> 2 14 -
trunk/Source/WebCore/ChangeLog
r118719 r118720 1 2012-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 1 49 2012-05-28 Jonathan Dong <jonathan.dong@torchmobile.com.cn> 2 50 -
trunk/Source/WebCore/dom/Node.cpp
r118442 r118720 2932 2932 PassRefPtr<RadioNodeList> Node::radioNodeList(const AtomicString& name) 2933 2933 { 2934 ASSERT(hasTagName(formTag) );2934 ASSERT(hasTagName(formTag) || hasTagName(fieldsetTag)); 2935 2935 2936 2936 NodeListsNodeData* nodeLists = ensureRareData()->ensureNodeLists(this); -
trunk/Source/WebCore/html/HTMLFieldSetElement.cpp
r112788 r118720 25 25 #include "config.h" 26 26 #include "HTMLFieldSetElement.h" 27 28 #include "HTMLFormCollection.h" 27 29 #include "HTMLLegendElement.h" 28 29 30 #include "HTMLNames.h" 31 #include "HTMLObjectElement.h" 30 32 #include "RenderFieldset.h" 31 33 #include <wtf/StdLibExtras.h> … … 82 84 } 83 85 86 HTMLCollection* HTMLFieldSetElement::elements() 87 { 88 if (!m_elementsCollection) 89 m_elementsCollection = HTMLFormCollection::create(this); 90 return m_elementsCollection.get(); 91 } 92 93 void 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 119 const Vector<FormAssociatedElement*>& HTMLFieldSetElement::associatedElements() const 120 { 121 refreshElementsIfNeeded(); 122 return m_associatedElements; 123 } 124 125 unsigned 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 84 135 } // namespace -
trunk/Source/WebCore/html/HTMLFieldSetElement.h
r112515 r118720 26 26 27 27 #include "HTMLFormControlElement.h" 28 #include <wtf/OwnPtr.h> 28 29 29 30 namespace WebCore { 31 32 class FormAssociatedElement; 33 class HTMLCollection; 34 class HTMLFormCollection; 30 35 31 36 class HTMLFieldSetElement : public HTMLFormControlElement { … … 33 38 static PassRefPtr<HTMLFieldSetElement> create(const QualifiedName&, Document*, HTMLFormElement*); 34 39 HTMLLegendElement* legend() const; 40 41 HTMLCollection* elements(); 42 43 const Vector<FormAssociatedElement*>& associatedElements() const; 44 unsigned length() const; 35 45 36 46 protected: … … 45 55 virtual const AtomicString& formControlType() const; 46 56 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; 47 64 }; 48 65 -
trunk/Source/WebCore/html/HTMLFieldSetElement.idl
r112515 r118720 27 27 readonly attribute DOMString type; 28 28 29 readonly attribute HTMLCollection elements; 30 29 31 readonly attribute boolean willValidate; 30 32 readonly attribute ValidityState validity; -
trunk/Source/WebCore/html/HTMLFormCollection.cpp
r117754 r118720 24 24 #include "HTMLFormCollection.h" 25 25 26 #include "HTMLFieldSetElement.h" 26 27 #include "HTMLFormControlElement.h" 27 28 #include "HTMLFormElement.h" … … 54 55 { 55 56 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(); 58 61 } 59 62 … … 68 71 { 69 72 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(); 72 77 } 73 78 … … 135 140 } 136 141 142 if (base()->hasTagName(fieldsetTag)) 143 return 0; 144 137 145 const Vector<HTMLImageElement*>& imageElementsArray = formImageElements(); 138 146 if (!foundInputElements) { … … 196 204 } 197 205 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 } 207 217 } 208 218 -
trunk/Source/WebCore/html/RadioNodeList.cpp
r118495 r118720 37 37 using namespace HTMLNames; 38 38 39 RadioNodeList::RadioNodeList(const AtomicString& name, Element* formElement)40 : DynamicSubtreeNodeList( formElement->document())39 RadioNodeList::RadioNodeList(const AtomicString& name, Element* baseElement) 40 : DynamicSubtreeNodeList(baseElement->hasTagName(formTag) ? static_cast<Node*>(baseElement->document()) : baseElement) 41 41 , m_name(name) 42 , m_ formElement(formElement)42 , m_baseElement(baseElement) 43 43 { 44 m_ formElement->document()->registerDynamicSubtreeNodeList(this);44 m_baseElement->document()->registerDynamicSubtreeNodeList(this); 45 45 } 46 46 47 47 RadioNodeList::~RadioNodeList() 48 48 { 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); 51 51 } 52 52 … … 87 87 { 88 88 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 } 96 98 97 99 return testElement->getIdAttribute() == m_name || testElement->getNameAttribute() == m_name; -
trunk/Source/WebCore/html/RadioNodeList.h
r118495 r118720 37 37 class RadioNodeList : public DynamicSubtreeNodeList { 38 38 public: 39 static PassRefPtr<RadioNodeList> create(const AtomicString& name, Element* formElement)39 static PassRefPtr<RadioNodeList> create(const AtomicString& name, Element* baseElement) 40 40 { 41 return adoptRef(new RadioNodeList(name, formElement));41 return adoptRef(new RadioNodeList(name, baseElement)); 42 42 } 43 43 … … 55 55 56 56 AtomicString m_name; 57 RefPtr<Element> m_ formElement;57 RefPtr<Element> m_baseElement; 58 58 }; 59 59
Note: See TracChangeset
for help on using the changeset viewer.