HTMLOptionsCollection is always rooted at a HTMLSelectElement.
authorakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 4 Nov 2013 06:54:12 +0000 (06:54 +0000)
committerakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 4 Nov 2013 06:54:12 +0000 (06:54 +0000)
<https://webkit.org/b/123719>

Tighten up HTMLOptionsCollection by making the constructor take
a HTMLSelectElement& and adding a HTMLSelectElement& getter instead
of casting all over the place. Removed now-pointless assertions.

Reviewed by Sam Weinig.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@158557 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSHTMLOptionsCollectionCustom.cpp
Source/WebCore/dom/Element.cpp
Source/WebCore/dom/NodeRareData.h
Source/WebCore/html/HTMLOptionsCollection.cpp
Source/WebCore/html/HTMLOptionsCollection.h
Source/WebCore/html/HTMLSelectElement.h

index b0f9155..22736cd 100644 (file)
@@ -1,5 +1,16 @@
 2013-11-03  Andreas Kling  <akling@apple.com>
 
+        HTMLOptionsCollection is always rooted at a HTMLSelectElement.
+        <https://webkit.org/b/123719>
+
+        Tighten up HTMLOptionsCollection by making the constructor take
+        a HTMLSelectElement& and adding a HTMLSelectElement& getter instead
+        of casting all over the place. Removed now-pointless assertions.
+
+        Reviewed by Sam Weinig.
+
+2013-11-03  Andreas Kling  <akling@apple.com>
+
         RenderTextFragment: Tighten first-letter logic.
         <https://webkit.org/b/123714>
 
index 4c926b1..74a5867 100644 (file)
@@ -57,8 +57,7 @@ void JSHTMLOptionsCollection::setLength(ExecState* exec, JSValue value)
 
 void JSHTMLOptionsCollection::indexSetter(ExecState* exec, unsigned index, JSValue value)
 {
-    HTMLSelectElement& base = toHTMLSelectElement(impl().ownerNode());
-    selectIndexSetter(&base, exec, index, value);
+    selectIndexSetter(&impl().selectElement(), exec, index, value);
 }
 
 JSValue JSHTMLOptionsCollection::add(ExecState* exec)
index e15a4a3..240b5b7 100644 (file)
@@ -61,6 +61,7 @@
 #include "HTMLNames.h"
 #include "HTMLOptionsCollection.h"
 #include "HTMLParserIdioms.h"
+#include "HTMLSelectElement.h"
 #include "HTMLTableRowsCollection.h"
 #include "InsertionPoint.h"
 #include "InspectorInstrumentation.h"
@@ -2968,8 +2969,7 @@ PassRefPtr<HTMLCollection> Element::ensureCachedHTMLCollection(CollectionType ty
         ASSERT(hasTagName(tableTag));
         return ensureRareData().ensureNodeLists().addCacheWithAtomicName<HTMLTableRowsCollection>(*this, type);
     } else if (type == SelectOptions) {
-        ASSERT(hasTagName(selectTag));
-        return ensureRareData().ensureNodeLists().addCacheWithAtomicName<HTMLOptionsCollection>(*this, type);
+        return ensureRareData().ensureNodeLists().addCacheWithAtomicName<HTMLOptionsCollection>(toHTMLSelectElement(*this), type);
     } else if (type == FormControls) {
         ASSERT(hasTagName(formTag) || hasTagName(fieldsetTag));
         return ensureRareData().ensureNodeLists().addCacheWithAtomicName<HTMLFormControlsCollection>(*this, type);
index 2982479..4cc54bb 100644 (file)
@@ -118,14 +118,14 @@ public:
     }
 
     // FIXME: This function should be renamed since it doesn't have an atomic name.
-    template<typename T>
-    PassRefPtr<T> addCacheWithAtomicName(ContainerNode& node, CollectionType collectionType)
+    template<typename T, typename ContainerType>
+    PassRefPtr<T> addCacheWithAtomicName(ContainerType& container, CollectionType collectionType)
     {
         NodeListAtomicNameCacheMap::AddResult result = m_atomicNameCaches.add(namedNodeListKey(collectionType, starAtom), nullptr);
         if (!result.isNewEntry)
             return static_cast<T*>(result.iterator->value);
 
-        RefPtr<T> list = T::create(node, collectionType);
+        RefPtr<T> list = T::create(container, collectionType);
         result.iterator->value = list.get();
         return list.release();
     }
index 6a2f356..1e7cdd4 100644 (file)
 
 namespace WebCore {
 
-HTMLOptionsCollection::HTMLOptionsCollection(ContainerNode& select)
+HTMLOptionsCollection::HTMLOptionsCollection(HTMLSelectElement& select)
     : HTMLCollection(select, SelectOptions, DoesNotOverrideItemAfter)
 {
-    ASSERT(isHTMLSelectElement(select));
 }
 
-PassRefPtr<HTMLOptionsCollection> HTMLOptionsCollection::create(ContainerNode& select, CollectionType)
+PassRef<HTMLOptionsCollection> HTMLOptionsCollection::create(HTMLSelectElement& select, CollectionType)
 {
-    return adoptRef(new HTMLOptionsCollection(select));
+    return adoptRef(*new HTMLOptionsCollection(select));
 }
 
 void HTMLOptionsCollection::add(PassRefPtr<HTMLOptionElement> element, ExceptionCode& ec)
@@ -58,39 +57,38 @@ void HTMLOptionsCollection::add(PassRefPtr<HTMLOptionElement> element, int index
     }
 
     ec = 0;
-    HTMLSelectElement& select = toHTMLSelectElement(ownerNode());
 
     if (index == -1 || unsigned(index) >= length())
-        select.add(newOption, 0, ec);
+        selectElement().add(newOption, 0, ec);
     else
-        select.add(newOption, toHTMLOptionElement(item(index)), ec);
+        selectElement().add(newOption, toHTMLOptionElement(item(index)), ec);
 
     ASSERT(!ec);
 }
 
 void HTMLOptionsCollection::remove(int index)
 {
-    toHTMLSelectElement(ownerNode()).removeByIndex(index);
+    selectElement().removeByIndex(index);
 }
 
 void HTMLOptionsCollection::remove(HTMLOptionElement* option)
 {
-    toHTMLSelectElement(ownerNode()).remove(option);
+    selectElement().remove(option);
 }
 
 int HTMLOptionsCollection::selectedIndex() const
 {
-    return toHTMLSelectElement(ownerNode()).selectedIndex();
+    return selectElement().selectedIndex();
 }
 
 void HTMLOptionsCollection::setSelectedIndex(int index)
 {
-    toHTMLSelectElement(ownerNode()).setSelectedIndex(index);
+    selectElement().setSelectedIndex(index);
 }
 
 void HTMLOptionsCollection::setLength(unsigned length, ExceptionCode& ec)
 {
-    toHTMLSelectElement(ownerNode()).setLength(length, ec);
+    selectElement().setLength(length, ec);
 }
 
 } //namespace
index 380ff0a..f0b344d 100644 (file)
 #define HTMLOptionsCollection_h
 
 #include "HTMLCollection.h"
+#include "HTMLSelectElement.h"
 
 namespace WebCore {
 
 class HTMLOptionElement;
-class HTMLSelectElement;
 
 typedef int ExceptionCode;
 
-class HTMLOptionsCollection : public HTMLCollection {
+class HTMLOptionsCollection FINAL : public HTMLCollection {
 public:
-    static PassRefPtr<HTMLOptionsCollection> create(ContainerNode&, CollectionType);
+    static PassRef<HTMLOptionsCollection> create(HTMLSelectElement&, CollectionType);
+
+    HTMLSelectElement& selectElement() { return toHTMLSelectElement(ownerNode()); }
+    const HTMLSelectElement& selectElement() const { return toHTMLSelectElement(ownerNode()); }
 
     void add(PassRefPtr<HTMLOptionElement>, ExceptionCode&);
     void add(PassRefPtr<HTMLOptionElement>, int index, ExceptionCode&);
@@ -48,7 +51,7 @@ public:
     void setLength(unsigned, ExceptionCode&);
 
 private:
-    explicit HTMLOptionsCollection(ContainerNode&);
+    explicit HTMLOptionsCollection(HTMLSelectElement&);
 };
 
 } //namespace
index a1644b5..c02d1eb 100644 (file)
 
 #include "Event.h"
 #include "HTMLFormControlElementWithState.h"
-#include "HTMLOptionsCollection.h"
 #include "TypeAhead.h"
 #include <wtf/Vector.h>
 
 namespace WebCore {
 
 class HTMLOptionElement;
+class HTMLOptionsCollection;
 
 class HTMLSelectElement : public HTMLFormControlElementWithState, public TypeAheadDataSource {
 public: