LiveNodeLists should have non-null ContainerNode as root
authorantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 3 Nov 2013 21:32:00 +0000 (21:32 +0000)
committerantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 3 Nov 2013 21:32:00 +0000 (21:32 +0000)
https://bugs.webkit.org/show_bug.cgi?id=123709

Reviewed by Andreas Kling.

After moving ChildNodeList off from LiveNodeList the root is now always at least a ContainerNode.

* dom/ContainerNode.cpp:
(WebCore::ContainerNode::getElementsByTagName):
(WebCore::ContainerNode::getElementsByTagNameNS):
(WebCore::ContainerNode::getElementsByName):
(WebCore::ContainerNode::getElementsByClassName):
(WebCore::ContainerNode::radioNodeList):

    Also these move from Node to ContainerNode to make tighter typing work.

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

29 files changed:
Source/WebCore/ChangeLog
Source/WebCore/dom/ClassNodeList.cpp
Source/WebCore/dom/ClassNodeList.h
Source/WebCore/dom/ContainerNode.cpp
Source/WebCore/dom/ContainerNode.h
Source/WebCore/dom/LiveNodeList.cpp
Source/WebCore/dom/LiveNodeList.h
Source/WebCore/dom/NameNodeList.cpp
Source/WebCore/dom/NameNodeList.h
Source/WebCore/dom/Node.cpp
Source/WebCore/dom/Node.h
Source/WebCore/dom/NodeRareData.h
Source/WebCore/dom/TagNodeList.cpp
Source/WebCore/dom/TagNodeList.h
Source/WebCore/html/HTMLAllCollection.cpp
Source/WebCore/html/HTMLAllCollection.h
Source/WebCore/html/HTMLCollection.cpp
Source/WebCore/html/HTMLCollection.h
Source/WebCore/html/HTMLFormControlsCollection.cpp
Source/WebCore/html/HTMLFormControlsCollection.h
Source/WebCore/html/HTMLNameCollection.cpp
Source/WebCore/html/HTMLNameCollection.h
Source/WebCore/html/HTMLOptionsCollection.cpp
Source/WebCore/html/HTMLOptionsCollection.h
Source/WebCore/html/LabelsNodeList.cpp
Source/WebCore/html/LabelsNodeList.h
Source/WebCore/html/MediaDocument.cpp
Source/WebCore/html/RadioNodeList.cpp
Source/WebCore/html/RadioNodeList.h

index 4d5a462..0377e3c 100644 (file)
@@ -1,5 +1,23 @@
 2013-11-03  Antti Koivisto  <antti@apple.com>
 
+        LiveNodeLists should have non-null ContainerNode as root
+        https://bugs.webkit.org/show_bug.cgi?id=123709
+
+        Reviewed by Andreas Kling.
+
+        After moving ChildNodeList off from LiveNodeList the root is now always at least a ContainerNode.
+
+        * dom/ContainerNode.cpp:
+        (WebCore::ContainerNode::getElementsByTagName):
+        (WebCore::ContainerNode::getElementsByTagNameNS):
+        (WebCore::ContainerNode::getElementsByName):
+        (WebCore::ContainerNode::getElementsByClassName):
+        (WebCore::ContainerNode::radioNodeList):
+        
+            Also these move from Node to ContainerNode to make tighter typing work.
+
+2013-11-03  Antti Koivisto  <antti@apple.com>
+
         Switch createContextualFragment to element iterator
         https://bugs.webkit.org/show_bug.cgi?id=123704
 
index f549830..2d3f0a8 100644 (file)
@@ -36,7 +36,7 @@
 
 namespace WebCore {
 
-ClassNodeList::ClassNodeList(Node& rootNode, const String& classNames)
+ClassNodeList::ClassNodeList(ContainerNode& rootNode, const String& classNames)
     : LiveNodeList(rootNode, ClassNodeListType, InvalidateOnClassAttrChange)
     , m_classNames(classNames, document().inQuirksMode())
     , m_originalClassNames(classNames)
index 87764eb..c8d99bc 100644 (file)
@@ -39,7 +39,7 @@ namespace WebCore {
 
 class ClassNodeList : public LiveNodeList {
 public:
-    static PassRefPtr<ClassNodeList> create(Node& rootNode, const String& classNames)
+    static PassRefPtr<ClassNodeList> create(ContainerNode& rootNode, const String& classNames)
     {
         return adoptRef(new ClassNodeList(rootNode, classNames));
     }
@@ -49,7 +49,7 @@ public:
     bool nodeMatchesInlined(Element*) const;
 
 private:
-    ClassNodeList(Node& rootNode, const String& classNames);
+    ClassNodeList(ContainerNode& rootNode, const String& classNames);
 
     virtual bool nodeMatches(Element*) const;
 
index 3244d82..a0c1fc8 100644 (file)
@@ -27,6 +27,7 @@
 #include "ChildListMutationScope.h"
 #include "Chrome.h"
 #include "ChromeClient.h"
+#include "ClassNodeList.h"
 #include "ContainerNodeAlgorithms.h"
 #include "Editor.h"
 #include "ElementTraversal.h"
 #include "InspectorInstrumentation.h"
 #include "JSLazyEventListener.h"
 #include "JSNode.h"
+#include "LabelsNodeList.h"
+#include "LiveNodeList.h"
 #include "LoaderStrategy.h"
 #include "MemoryCache.h"
 #include "MutationEvent.h"
+#include "NameNodeList.h"
+#include "NodeRareData.h"
 #include "NodeRenderStyle.h"
 #include "NodeTraversal.h"
 #include "Page.h"
 #include "PlatformStrategies.h"
+#include "RadioNodeList.h"
 #include "RenderBox.h"
 #include "RenderTheme.h"
 #include "RenderWidget.h"
 #include "ResourceLoadScheduler.h"
 #include "RootInlineBox.h"
 #include "SelectorQuery.h"
+#include "TagNodeList.h"
 #include "TemplateContentDocumentFragment.h"
 #include "Text.h"
 #include <wtf/CurrentTime.h>
@@ -1127,4 +1134,41 @@ RefPtr<NodeList> ContainerNode::querySelectorAll(const AtomicString& selectors,
     return selectorQuery->queryAll(*this);
 }
 
+PassRefPtr<NodeList> ContainerNode::getElementsByTagName(const AtomicString& localName)
+{
+    if (localName.isNull())
+        return 0;
+
+    if (document().isHTMLDocument())
+        return ensureRareData().ensureNodeLists().addCacheWithAtomicName<HTMLTagNodeList>(*this, HTMLTagNodeListType, localName);
+    return ensureRareData().ensureNodeLists().addCacheWithAtomicName<TagNodeList>(*this, TagNodeListType, localName);
+}
+
+PassRefPtr<NodeList> ContainerNode::getElementsByTagNameNS(const AtomicString& namespaceURI, const AtomicString& localName)
+{
+    if (localName.isNull())
+        return 0;
+
+    if (namespaceURI == starAtom)
+        return getElementsByTagName(localName);
+
+    return ensureRareData().ensureNodeLists().addCacheWithQualifiedName(*this, namespaceURI.isEmpty() ? nullAtom : namespaceURI, localName);
+}
+
+PassRefPtr<NodeList> ContainerNode::getElementsByName(const String& elementName)
+{
+    return ensureRareData().ensureNodeLists().addCacheWithAtomicName<NameNodeList>(*this, NameNodeListType, elementName);
+}
+
+PassRefPtr<NodeList> ContainerNode::getElementsByClassName(const String& classNames)
+{
+    return ensureRareData().ensureNodeLists().addCacheWithName<ClassNodeList>(*this, ClassNodeListType, classNames);
+}
+
+PassRefPtr<RadioNodeList> ContainerNode::radioNodeList(const AtomicString& name)
+{
+    ASSERT(hasTagName(HTMLNames::formTag) || hasTagName(HTMLNames::fieldsetTag));
+    return ensureRareData().ensureNodeLists().addCacheWithAtomicName<RadioNodeList>(*this, RadioNodeListType, name);
+}
+
 } // namespace WebCore
index ebf537d..fa1b697 100644 (file)
@@ -132,6 +132,12 @@ public:
     Element* querySelector(const AtomicString& selectors, ExceptionCode&);
     RefPtr<NodeList> querySelectorAll(const AtomicString& selectors, ExceptionCode&);
 
+    PassRefPtr<NodeList> getElementsByTagName(const AtomicString&);
+    PassRefPtr<NodeList> getElementsByTagNameNS(const AtomicString& namespaceURI, const AtomicString& localName);
+    PassRefPtr<NodeList> getElementsByName(const String& elementName);
+    PassRefPtr<NodeList> getElementsByClassName(const String& classNames);
+    PassRefPtr<RadioNodeList> radioNodeList(const AtomicString&);
+
 protected:
     explicit ContainerNode(Document*, ConstructionType = CreateContainer);
 
index f9fe484..8e55200 100644 (file)
@@ -29,7 +29,7 @@
 
 namespace WebCore {
 
-Node& LiveNodeListBase::rootNode() const
+ContainerNode& LiveNodeListBase::rootNode() const
 {
     if (isRootedAtDocument() && ownerNode().inDocument())
         return ownerNode().document();
@@ -37,14 +37,6 @@ Node& LiveNodeListBase::rootNode() const
     return ownerNode();
 }
 
-ContainerNode* LiveNodeListBase::rootContainerNode() const
-{
-    Node& rootNode = this->rootNode();
-    if (!rootNode.isContainerNode())
-        return 0;
-    return &toContainerNode(rootNode);
-}
-
 void LiveNodeListBase::invalidateCache() const
 {
     m_cachedItem = 0;
index 3601ed2..9197a27 100644 (file)
@@ -48,7 +48,7 @@ public:
         DoesNotOverrideItemAfter,
     };
 
-    LiveNodeListBase(Node& ownerNode, NodeListRootType rootType, NodeListInvalidationType invalidationType,
+    LiveNodeListBase(ContainerNode& ownerNode, NodeListRootType rootType, NodeListInvalidationType invalidationType,
         bool shouldOnlyIncludeDirectChildren, CollectionType collectionType, ItemAfterOverrideType itemAfterOverrideType)
         : m_ownerNode(ownerNode)
         , m_cachedItem(0)
@@ -83,7 +83,7 @@ public:
     ALWAYS_INLINE bool isRootedAtDocument() const { return m_rootType == NodeListIsRootedAtDocument || m_rootType == NodeListIsRootedAtDocumentIfOwnerHasItemrefAttr; }
     ALWAYS_INLINE NodeListInvalidationType invalidationType() const { return static_cast<NodeListInvalidationType>(m_invalidationType); }
     ALWAYS_INLINE CollectionType type() const { return static_cast<CollectionType>(m_collectionType); }
-    Node& ownerNode() const { return const_cast<Node&>(m_ownerNode.get()); }
+    ContainerNode& ownerNode() const { return const_cast<ContainerNode&>(m_ownerNode.get()); }
     ALWAYS_INLINE void invalidateCache(const QualifiedName* attrName) const
     {
         if (!attrName || shouldInvalidateTypeOnAttributeChange(invalidationType(), *attrName))
@@ -98,8 +98,7 @@ public:
 
 protected:
     Document& document() const { return m_ownerNode->document(); }
-    Node& rootNode() const;
-    ContainerNode* rootContainerNode() const;
+    ContainerNode& rootNode() const;
     bool overridesItemAfter() const { return m_overridesItemAfter; }
 
     ALWAYS_INLINE bool isItemCacheValid() const { return m_isItemCacheValid; }
@@ -141,7 +140,7 @@ private:
     Node* iterateForPreviousNode(Node* current) const;
     Node* itemBefore(Node* previousItem) const;
 
-    Ref<Node> m_ownerNode;
+    Ref<ContainerNode> m_ownerNode;
     mutable Node* m_cachedItem;
     mutable unsigned m_cachedLength;
     mutable unsigned m_cachedItemOffset;
@@ -184,7 +183,7 @@ ALWAYS_INLINE bool LiveNodeListBase::shouldInvalidateTypeOnAttributeChange(NodeL
 
 class LiveNodeList : public LiveNodeListBase {
 public:
-    LiveNodeList(Node& ownerNode, CollectionType collectionType, NodeListInvalidationType invalidationType, NodeListRootType rootType = NodeListIsRootedAtNode)
+    LiveNodeList(ContainerNode& ownerNode, CollectionType collectionType, NodeListInvalidationType invalidationType, NodeListRootType rootType = NodeListIsRootedAtNode)
         : LiveNodeListBase(ownerNode, rootType, invalidationType, /*shouldOnlyIncludeDirectChildren*/ false, collectionType, DoesNotOverrideItemAfter)
     { }
 
index c67c2a9..4f6e712 100644 (file)
@@ -32,7 +32,7 @@ namespace WebCore {
 
 using namespace HTMLNames;
 
-NameNodeList::NameNodeList(Node& rootNode, const AtomicString& name)
+NameNodeList::NameNodeList(ContainerNode& rootNode, const AtomicString& name)
     : LiveNodeList(rootNode, NameNodeListType, InvalidateOnNameAttrChange)
     , m_name(name)
 {
index c1ce289..9b71cf9 100644 (file)
@@ -33,7 +33,7 @@ namespace WebCore {
 // NodeList which lists all Nodes in a Element with a given "name" attribute
 class NameNodeList : public LiveNodeList {
 public:
-    static PassRefPtr<NameNodeList> create(Node& rootNode, CollectionType type, const AtomicString& name)
+    static PassRefPtr<NameNodeList> create(ContainerNode& rootNode, CollectionType type, const AtomicString& name)
     {
         ASSERT_UNUSED(type, type == NameNodeListType);
         return adoptRef(new NameNodeList(rootNode, name));
@@ -42,7 +42,7 @@ public:
     virtual ~NameNodeList();
 
 private:
-    NameNodeList(Node& rootNode, const AtomicString& name);
+    NameNodeList(ContainerNode& rootNode, const AtomicString& name);
 
     virtual bool nodeMatches(Element*) const;
 
index ffac827..877fa5a 100644 (file)
@@ -39,7 +39,6 @@
 #include "CSSStyleRule.h"
 #include "CSSStyleSheet.h"
 #include "ChildNodeList.h"
-#include "ClassNodeList.h"
 #include "ContainerNodeAlgorithms.h"
 #include "ContextMenuController.h"
 #include "DOMImplementation.h"
 #include "InsertionPoint.h"
 #include "InspectorCounters.h"
 #include "KeyboardEvent.h"
-#include "LabelsNodeList.h"
-#include "LiveNodeList.h"
 #include "Logging.h"
 #include "MouseEvent.h"
 #include "MutationEvent.h"
-#include "NameNodeList.h"
 #include "NamedNodeMap.h"
 #include "NodeRareData.h"
 #include "NodeTraversal.h"
@@ -83,7 +79,6 @@
 #include "PlatformWheelEvent.h"
 #include "ProcessingInstruction.h"
 #include "ProgressEvent.h"
-#include "RadioNodeList.h"
 #include "RegisteredEventListener.h"
 #include "RenderBlock.h"
 #include "RenderBox.h"
@@ -94,7 +89,6 @@
 #include "ShadowRoot.h"
 #include "StorageEvent.h"
 #include "StyleResolver.h"
-#include "TagNodeList.h"
 #include "TemplateContentDocumentFragment.h"
 #include "Text.h"
 #include "TextEvent.h"
@@ -1055,43 +1049,6 @@ Element* Node::rootEditableElement() const
 
 // FIXME: End of obviously misplaced HTML editing functions.  Try to move these out of Node.
 
-PassRefPtr<NodeList> Node::getElementsByTagName(const AtomicString& localName)
-{
-    if (localName.isNull())
-        return 0;
-
-    if (document().isHTMLDocument())
-        return ensureRareData().ensureNodeLists().addCacheWithAtomicName<HTMLTagNodeList>(*this, HTMLTagNodeListType, localName);
-    return ensureRareData().ensureNodeLists().addCacheWithAtomicName<TagNodeList>(*this, TagNodeListType, localName);
-}
-
-PassRefPtr<NodeList> Node::getElementsByTagNameNS(const AtomicString& namespaceURI, const AtomicString& localName)
-{
-    if (localName.isNull())
-        return 0;
-
-    if (namespaceURI == starAtom)
-        return getElementsByTagName(localName);
-
-    return ensureRareData().ensureNodeLists().addCacheWithQualifiedName(*this, namespaceURI.isEmpty() ? nullAtom : namespaceURI, localName);
-}
-
-PassRefPtr<NodeList> Node::getElementsByName(const String& elementName)
-{
-    return ensureRareData().ensureNodeLists().addCacheWithAtomicName<NameNodeList>(*this, NameNodeListType, elementName);
-}
-
-PassRefPtr<NodeList> Node::getElementsByClassName(const String& classNames)
-{
-    return ensureRareData().ensureNodeLists().addCacheWithName<ClassNodeList>(*this, ClassNodeListType, classNames);
-}
-
-PassRefPtr<RadioNodeList> Node::radioNodeList(const AtomicString& name)
-{
-    ASSERT(hasTagName(formTag) || hasTagName(fieldsetTag));
-    return ensureRareData().ensureNodeLists().addCacheWithAtomicName<RadioNodeList>(*this, RadioNodeListType, name);
-}
-
 Document* Node::ownerDocument() const
 {
     Document* document = &this->document();
index d9504e9..a7770d5 100644 (file)
@@ -499,12 +499,6 @@ public:
     NodeListsNodeData* nodeLists();
     void clearNodeLists();
 
-    PassRefPtr<NodeList> getElementsByTagName(const AtomicString&);
-    PassRefPtr<NodeList> getElementsByTagNameNS(const AtomicString& namespaceURI, const AtomicString& localName);
-    PassRefPtr<NodeList> getElementsByName(const String& elementName);
-    PassRefPtr<NodeList> getElementsByClassName(const String& classNames);
-    PassRefPtr<RadioNodeList> radioNodeList(const AtomicString&);
-
     virtual bool willRespondToMouseMoveEvents();
     virtual bool willRespondToMouseClickEvents();
     virtual bool willRespondToTouchEvents();
index 9d8ff61..2982479 100644 (file)
@@ -106,7 +106,7 @@ public:
     typedef HashMap<QualifiedName, TagNodeList*> TagNodeListCacheNS;
 
     template<typename T>
-    PassRefPtr<T> addCacheWithAtomicName(Node& node, CollectionType collectionType, const AtomicString& name)
+    PassRefPtr<T> addCacheWithAtomicName(ContainerNode& node, CollectionType collectionType, const AtomicString& name)
     {
         NodeListAtomicNameCacheMap::AddResult result = m_atomicNameCaches.add(namedNodeListKey(collectionType, name), nullptr);
         if (!result.isNewEntry)
@@ -119,7 +119,7 @@ public:
 
     // FIXME: This function should be renamed since it doesn't have an atomic name.
     template<typename T>
-    PassRefPtr<T> addCacheWithAtomicName(Node& node, CollectionType collectionType)
+    PassRefPtr<T> addCacheWithAtomicName(ContainerNode& node, CollectionType collectionType)
     {
         NodeListAtomicNameCacheMap::AddResult result = m_atomicNameCaches.add(namedNodeListKey(collectionType, starAtom), nullptr);
         if (!result.isNewEntry)
@@ -137,7 +137,7 @@ public:
     }
 
     template<typename T>
-    PassRefPtr<T> addCacheWithName(Node& node, CollectionType collectionType, const String& name)
+    PassRefPtr<T> addCacheWithName(ContainerNode& node, CollectionType collectionType, const String& name)
     {
         NodeListNameCacheMap::AddResult result = m_nameCaches.add(namedNodeListKey(collectionType, name), nullptr);
         if (!result.isNewEntry)
@@ -148,7 +148,7 @@ public:
         return list.release();
     }
 
-    PassRefPtr<TagNodeList> addCacheWithQualifiedName(Node& node, const AtomicString& namespaceURI, const AtomicString& localName)
+    PassRefPtr<TagNodeList> addCacheWithQualifiedName(ContainerNode& node, const AtomicString& namespaceURI, const AtomicString& localName)
     {
         QualifiedName name(nullAtom, localName, namespaceURI);
         TagNodeListCacheNS::AddResult result = m_tagNodeListCacheNS.add(name, nullptr);
index eacd0c9..6f88699 100644 (file)
@@ -30,7 +30,7 @@
 
 namespace WebCore {
 
-TagNodeList::TagNodeList(Node& rootNode, CollectionType type, const AtomicString& namespaceURI, const AtomicString& localName)
+TagNodeList::TagNodeList(ContainerNode& rootNode, CollectionType type, const AtomicString& namespaceURI, const AtomicString& localName)
     : LiveNodeList(rootNode, type, DoNotInvalidateOnAttributeChanges)
     , m_namespaceURI(namespaceURI)
     , m_localName(localName)
@@ -55,7 +55,7 @@ bool TagNodeList::nodeMatches(Element* testNode) const
     return m_namespaceURI == starAtom || m_namespaceURI == testNode->namespaceURI();
 }
 
-HTMLTagNodeList::HTMLTagNodeList(Node& rootNode, const AtomicString& localName)
+HTMLTagNodeList::HTMLTagNodeList(ContainerNode& rootNode, const AtomicString& localName)
     : TagNodeList(rootNode, HTMLTagNodeListType, starAtom, localName)
     , m_loweredLocalName(localName.lower())
 {
index 89189e3..2a724d5 100644 (file)
@@ -33,13 +33,13 @@ namespace WebCore {
 // NodeList that limits to a particular tag.
 class TagNodeList : public LiveNodeList {
 public:
-    static PassRefPtr<TagNodeList> create(Node& rootNode, const AtomicString& namespaceURI, const AtomicString& localName)
+    static PassRefPtr<TagNodeList> create(ContainerNode& rootNode, const AtomicString& namespaceURI, const AtomicString& localName)
     {
         ASSERT(namespaceURI != starAtom);
         return adoptRef(new TagNodeList(rootNode, TagNodeListType, namespaceURI, localName));
     }
 
-    static PassRefPtr<TagNodeList> create(Node& rootNode, CollectionType type, const AtomicString& localName)
+    static PassRefPtr<TagNodeList> create(ContainerNode& rootNode, CollectionType type, const AtomicString& localName)
     {
         ASSERT_UNUSED(type, type == TagNodeListType);
         return adoptRef(new TagNodeList(rootNode, TagNodeListType, starAtom, localName));
@@ -48,7 +48,7 @@ public:
     virtual ~TagNodeList();
 
 protected:
-    TagNodeList(Node& rootNode, CollectionType, const AtomicString& namespaceURI, const AtomicString& localName);
+    TagNodeList(ContainerNode& rootNode, CollectionType, const AtomicString& namespaceURI, const AtomicString& localName);
 
     virtual bool nodeMatches(Element*) const OVERRIDE;
 
@@ -58,7 +58,7 @@ protected:
 
 class HTMLTagNodeList : public TagNodeList {
 public:
-    static PassRefPtr<HTMLTagNodeList> create(Node& rootNode, CollectionType type, const AtomicString& localName)
+    static PassRefPtr<HTMLTagNodeList> create(ContainerNode& rootNode, CollectionType type, const AtomicString& localName)
     {
         ASSERT_UNUSED(type, type == HTMLTagNodeListType);
         return adoptRef(new HTMLTagNodeList(rootNode, localName));
@@ -67,7 +67,7 @@ public:
     bool nodeMatchesInlined(Element*) const;
 
 private:
-    HTMLTagNodeList(Node& rootNode, const AtomicString& localName);
+    HTMLTagNodeList(ContainerNode& rootNode, const AtomicString& localName);
 
     virtual bool nodeMatches(Element*) const OVERRIDE;
 
index d7b5a3f..14105bf 100644 (file)
 
 namespace WebCore {
 
-PassRefPtr<HTMLAllCollection> HTMLAllCollection::create(Node& node, CollectionType type)
+PassRefPtr<HTMLAllCollection> HTMLAllCollection::create(ContainerNode& node, CollectionType type)
 {
     return adoptRef(new HTMLAllCollection(node, type));
 }
 
-HTMLAllCollection::HTMLAllCollection(Node& node, CollectionType type)
+HTMLAllCollection::HTMLAllCollection(ContainerNode& node, CollectionType type)
     : HTMLCollection(node, type, DoesNotOverrideItemAfter)
 {
 }
index 8989e74..b5a86c7 100644 (file)
@@ -32,13 +32,13 @@ namespace WebCore {
 
 class HTMLAllCollection : public HTMLCollection {
 public:
-    static PassRefPtr<HTMLAllCollection> create(Node&, CollectionType);
+    static PassRefPtr<HTMLAllCollection> create(ContainerNode&, CollectionType);
     virtual ~HTMLAllCollection();
 
     Node* namedItemWithIndex(const AtomicString& name, unsigned index) const;
 
 private:
-    HTMLAllCollection(Node&, CollectionType);
+    HTMLAllCollection(ContainerNode&, CollectionType);
 };
 
 } // namespace WebCore
index 4db56a7..f93bb34 100644 (file)
@@ -155,13 +155,13 @@ static NodeListInvalidationType invalidationTypeExcludingIdAndNameAttributes(Col
     return DoNotInvalidateOnAttributeChanges;
 }
 
-HTMLCollection::HTMLCollection(Node& ownerNode, CollectionType type, ItemAfterOverrideType itemAfterOverrideType)
+HTMLCollection::HTMLCollection(ContainerNode& ownerNode, CollectionType type, ItemAfterOverrideType itemAfterOverrideType)
     : LiveNodeListBase(ownerNode, rootTypeFromCollectionType(type), invalidationTypeExcludingIdAndNameAttributes(type),
         WebCore::shouldOnlyIncludeDirectChildren(type), type, itemAfterOverrideType)
 {
 }
 
-PassRefPtr<HTMLCollection> HTMLCollection::create(Node& base, CollectionType type)
+PassRefPtr<HTMLCollection> HTMLCollection::create(ContainerNode& base, CollectionType type)
 {
     return adoptRef(new HTMLCollection(base, type, DoesNotOverrideItemAfter));
 }
@@ -390,12 +390,7 @@ Node* LiveNodeListBase::item(unsigned offset) const
     if (isLengthCacheValid() && cachedLength() <= offset)
         return 0;
 
-    ContainerNode* root = rootContainerNode();
-    if (!root) {
-        // FIMXE: In someTextNode.childNodes case the root is Text. We shouldn't even make a LiveNodeList for that.
-        setLengthCache(0);
-        return 0;
-    }
+    ContainerNode& root = rootNode();
 
     if (isLengthCacheValid() && !overridesItemAfter() && isLastItemCloserThanLastOrCachedItem(offset)) {
         Node* lastItem = itemBefore(0);
@@ -405,9 +400,9 @@ Node* LiveNodeListBase::item(unsigned offset) const
         unsigned offsetInArray = 0;
         Node* firstItem;
         if (isNodeList(type()))
-            firstItem = traverseLiveNodeListFirstElement(root);
+            firstItem = traverseLiveNodeListFirstElement(&root);
         else
-            firstItem = static_cast<const HTMLCollection*>(this)->traverseFirstElement(offsetInArray, root);
+            firstItem = static_cast<const HTMLCollection*>(this)->traverseFirstElement(offsetInArray, &root);
 
         if (!firstItem) {
             setLengthCache(0);
@@ -420,7 +415,7 @@ Node* LiveNodeListBase::item(unsigned offset) const
     if (cachedItemOffset() == offset)
         return cachedItem();
 
-    return itemBeforeOrAfterCachedItem(offset, root);
+    return itemBeforeOrAfterCachedItem(offset, &root);
 }
 
 inline Node* LiveNodeListBase::itemBeforeOrAfterCachedItem(unsigned offset, ContainerNode* root) const
@@ -543,12 +538,12 @@ Node* HTMLCollection::namedItem(const AtomicString& name) const
     // object with a matching name attribute, but only on those elements
     // that are allowed a name attribute.
 
-    ContainerNode* root = rootContainerNode();
-    if (name.isEmpty() || !root)
+    if (name.isEmpty())
         return 0;
 
-    if (!overridesItemAfter() && root->isInTreeScope()) {
-        TreeScope& treeScope = root->treeScope();
+    ContainerNode& root = rootNode();
+    if (!overridesItemAfter() && root.isInTreeScope()) {
+        TreeScope& treeScope = root.treeScope();
         Element* candidate = 0;
         if (treeScope.hasElementWithId(*name.impl())) {
             if (!treeScope.containsMultipleElementsWithId(name))
@@ -564,7 +559,7 @@ Node* HTMLCollection::namedItem(const AtomicString& name) const
 
         if (candidate
             && isMatchingElement(this, candidate)
-            && (shouldOnlyIncludeDirectChildren() ? candidate->parentNode() == root : candidate->isDescendantOf(root)))
+            && (shouldOnlyIncludeDirectChildren() ? candidate->parentNode() == &root : candidate->isDescendantOf(&root)))
             return candidate;
     }
 
@@ -589,12 +584,10 @@ void HTMLCollection::updateNameCache() const
     if (hasNameCache())
         return;
 
-    ContainerNode* root = rootContainerNode();
-    if (!root)
-        return;
+    ContainerNode& root = rootNode();
 
     unsigned arrayOffset = 0;
-    for (Element* element = traverseFirstElement(arrayOffset, root); element; element = traverseNextElement(arrayOffset, element, root)) {
+    for (Element* element = traverseFirstElement(arrayOffset, &root); element; element = traverseNextElement(arrayOffset, element, &root)) {
         const AtomicString& idAttrVal = element->getIdAttribute();
         if (!idAttrVal.isEmpty())
             appendIdCache(idAttrVal, element);
index 76029d9..58ced65 100644 (file)
@@ -34,7 +34,7 @@ namespace WebCore {
 
 class HTMLCollection : public LiveNodeListBase {
 public:
-    static PassRefPtr<HTMLCollection> create(Node& base, CollectionType);
+    static PassRefPtr<HTMLCollection> create(ContainerNode& base, CollectionType);
     virtual ~HTMLCollection();
 
     // DOM API
@@ -67,7 +67,7 @@ public:
     Element* traverseForwardToOffset(unsigned offset, Element* currentElement, unsigned& currentOffset, unsigned& offsetInArray, ContainerNode* root) const;
 
 protected:
-    HTMLCollection(Node& base, CollectionType, ItemAfterOverrideType);
+    HTMLCollection(ContainerNode& base, CollectionType, ItemAfterOverrideType);
 
     virtual void updateNameCache() const;
 
index 166f611..ebb9006 100644 (file)
@@ -36,13 +36,13 @@ using namespace HTMLNames;
 // Since the collections are to be "live", we have to do the
 // calculation every time if anything has changed.
 
-HTMLFormControlsCollection::HTMLFormControlsCollection(Node& ownerNode)
+HTMLFormControlsCollection::HTMLFormControlsCollection(ContainerNode& ownerNode)
     : HTMLCollection(ownerNode, FormControls, OverridesItemAfter)
 {
     ASSERT(isHTMLFormElement(ownerNode) || isHTMLFieldSetElement(ownerNode));
 }
 
-PassRefPtr<HTMLFormControlsCollection> HTMLFormControlsCollection::create(Node& ownerNode, CollectionType)
+PassRefPtr<HTMLFormControlsCollection> HTMLFormControlsCollection::create(ContainerNode& ownerNode, CollectionType)
 {
     return adoptRef(new HTMLFormControlsCollection(ownerNode));
 }
index 7742047..e4372ee 100644 (file)
@@ -37,14 +37,14 @@ class QualifiedName;
 
 class HTMLFormControlsCollection : public HTMLCollection {
 public:
-    static PassRefPtr<HTMLFormControlsCollection> create(Node&, CollectionType);
+    static PassRefPtr<HTMLFormControlsCollection> create(ContainerNode&, CollectionType);
 
     virtual ~HTMLFormControlsCollection();
 
     virtual Node* namedItem(const AtomicString& name) const;
 
 private:
-    explicit HTMLFormControlsCollection(Node&);
+    explicit HTMLFormControlsCollection(ContainerNode&);
 
     virtual void updateNameCache() const;
 
index 4ed01c2..52d9a61 100644 (file)
@@ -36,7 +36,7 @@ namespace WebCore {
 
 using namespace HTMLNames;
 
-HTMLNameCollection::HTMLNameCollection(Node& document, CollectionType type, const AtomicString& name)
+HTMLNameCollection::HTMLNameCollection(ContainerNode& document, CollectionType type, const AtomicString& name)
     : HTMLCollection(document, type, DoesNotOverrideItemAfter)
     , m_name(name)
 {
index e17e581..570f69a 100644 (file)
@@ -36,14 +36,14 @@ public:
     ~HTMLNameCollection();
 
 protected:
-    HTMLNameCollection(Node&, CollectionType, const AtomicString& name);
+    HTMLNameCollection(ContainerNode&, CollectionType, const AtomicString& name);
 
     AtomicString m_name;
 };
 
 class WindowNameCollection : public HTMLNameCollection {
 public:
-    static PassRefPtr<WindowNameCollection> create(Node& document, CollectionType type, const AtomicString& name)
+    static PassRefPtr<WindowNameCollection> create(ContainerNode& document, CollectionType type, const AtomicString& name)
     {
         return adoptRef(new WindowNameCollection(document, type, name));
     }
@@ -55,7 +55,7 @@ public:
     static bool nodeMatches(Element*, const AtomicStringImpl*);
 
 private:
-    WindowNameCollection(Node& document, CollectionType type, const AtomicString& name)
+    WindowNameCollection(ContainerNode& document, CollectionType type, const AtomicString& name)
         : HTMLNameCollection(document, type, name)
     {
         ASSERT(type == WindowNamedItems);
@@ -64,7 +64,7 @@ private:
 
 class DocumentNameCollection : public HTMLNameCollection {
 public:
-    static PassRefPtr<DocumentNameCollection> create(Node& document, CollectionType type, const AtomicString& name)
+    static PassRefPtr<DocumentNameCollection> create(ContainerNode& document, CollectionType type, const AtomicString& name)
     {
         return adoptRef(new DocumentNameCollection(document, type, name));
     }
@@ -76,7 +76,7 @@ public:
     static bool nodeMatches(Element*, const AtomicStringImpl*);
 
 private:
-    DocumentNameCollection(Node& document, CollectionType type, const AtomicString& name)
+    DocumentNameCollection(ContainerNode& document, CollectionType type, const AtomicString& name)
         : HTMLNameCollection(document, type, name)
     {
         ASSERT(type == DocumentNamedItems);
index 01b2210..6a2f356 100644 (file)
 
 namespace WebCore {
 
-HTMLOptionsCollection::HTMLOptionsCollection(Node& select)
+HTMLOptionsCollection::HTMLOptionsCollection(ContainerNode& select)
     : HTMLCollection(select, SelectOptions, DoesNotOverrideItemAfter)
 {
     ASSERT(isHTMLSelectElement(select));
 }
 
-PassRefPtr<HTMLOptionsCollection> HTMLOptionsCollection::create(Node& select, CollectionType)
+PassRefPtr<HTMLOptionsCollection> HTMLOptionsCollection::create(ContainerNode& select, CollectionType)
 {
     return adoptRef(new HTMLOptionsCollection(select));
 }
index e04ecc2..380ff0a 100644 (file)
@@ -35,7 +35,7 @@ typedef int ExceptionCode;
 
 class HTMLOptionsCollection : public HTMLCollection {
 public:
-    static PassRefPtr<HTMLOptionsCollection> create(Node&, CollectionType);
+    static PassRefPtr<HTMLOptionsCollection> create(ContainerNode&, CollectionType);
 
     void add(PassRefPtr<HTMLOptionElement>, ExceptionCode&);
     void add(PassRefPtr<HTMLOptionElement>, int index, ExceptionCode&);
@@ -48,7 +48,7 @@ public:
     void setLength(unsigned, ExceptionCode&);
 
 private:
-    explicit HTMLOptionsCollection(Node&);
+    explicit HTMLOptionsCollection(ContainerNode&);
 };
 
 } //namespace
index f4bf6ca..517f756 100644 (file)
@@ -33,7 +33,7 @@ namespace WebCore {
 
 using namespace HTMLNames;
 
-LabelsNodeList::LabelsNodeList(Node& forNode)
+LabelsNodeList::LabelsNodeList(ContainerNode& forNode)
     : LiveNodeList(forNode, LabelsNodeListType, InvalidateOnForAttrChange, NodeListIsRootedAtDocument)
 {
 }
index e4f875f..4c7b545 100644 (file)
@@ -32,7 +32,7 @@ namespace WebCore {
 
 class LabelsNodeList : public LiveNodeList {
 public:
-    static PassRefPtr<LabelsNodeList> create(Node& forNode, CollectionType type, const AtomicString&)
+    static PassRefPtr<LabelsNodeList> create(ContainerNode& forNode, CollectionType type, const AtomicString&)
     {
         ASSERT_UNUSED(type, type == LabelsNodeListType);
         return adoptRef(new LabelsNodeList(forNode));
@@ -40,7 +40,7 @@ public:
     ~LabelsNodeList();
 
 protected:
-    explicit LabelsNodeList(Node& forNode);
+    explicit LabelsNodeList(ContainerNode& forNode);
 
     virtual bool nodeMatches(Element*) const;
 };
index 4c2c372..eb5f5c5 100644 (file)
@@ -136,14 +136,12 @@ PassRefPtr<DocumentParser> MediaDocument::createParser()
     return MediaDocumentParser::create(*this);
 }
 
-static inline HTMLVideoElement* descendentVideoElement(Node* node)
+static inline HTMLVideoElement* descendentVideoElement(ContainerNode& node)
 {
-    ASSERT(node);
+    if (isHTMLVideoElement(node))
+        return toHTMLVideoElement(&node);
 
-    if (node->hasTagName(videoTag))
-        return toHTMLVideoElement(node);
-
-    RefPtr<NodeList> nodeList = node->getElementsByTagNameNS(videoTag.namespaceURI(), videoTag.localName());
+    RefPtr<NodeList> nodeList = node.getElementsByTagNameNS(videoTag.namespaceURI(), videoTag.localName());
    
     if (nodeList.get()->length() > 0)
         return toHTMLVideoElement(nodeList.get()->item(0));
@@ -181,8 +179,11 @@ void MediaDocument::defaultEventHandler(Event* event)
         }
     }
 
+    if (!targetNode->isContainerNode())
+        return;
+    ContainerNode& targetContainer = toContainerNode(*targetNode);
     if (event->type() == eventNames().keydownEvent && event->isKeyboardEvent()) {
-        HTMLVideoElement* video = descendentVideoElement(targetNode);
+        HTMLVideoElement* video = descendentVideoElement(targetContainer);
         if (!video)
             return;
 
@@ -218,7 +219,7 @@ void MediaDocument::replaceMediaElementTimerFired(Timer<MediaDocument>*)
     htmlBody->setAttribute(marginwidthAttr, "0");
     htmlBody->setAttribute(marginheightAttr, "0");
 
-    if (HTMLVideoElement* videoElement = descendentVideoElement(htmlBody)) {
+    if (HTMLVideoElement* videoElement = descendentVideoElement(*htmlBody)) {
         RefPtr<Element> element = Document::createElement(embedTag, false);
         HTMLEmbedElement* embedElement = static_cast<HTMLEmbedElement*>(element.get());
 
index 1249702..d0f819a 100644 (file)
@@ -37,7 +37,7 @@ namespace WebCore {
 
 using namespace HTMLNames;
 
-RadioNodeList::RadioNodeList(Node& rootNode, const AtomicString& name)
+RadioNodeList::RadioNodeList(ContainerNode& rootNode, const AtomicString& name)
     : LiveNodeList(rootNode, RadioNodeListType, InvalidateForFormControls, isHTMLFormElement(rootNode) ? NodeListIsRootedAtDocument : NodeListIsRootedAtNode)
     , m_name(name)
 {
index 92eddac..36647c9 100644 (file)
@@ -34,7 +34,7 @@ namespace WebCore {
 
 class RadioNodeList : public LiveNodeList {
 public:
-    static PassRefPtr<RadioNodeList> create(Node& rootNode, CollectionType type, const AtomicString& name)
+    static PassRefPtr<RadioNodeList> create(ContainerNode& rootNode, CollectionType type, const AtomicString& name)
     {
         ASSERT_UNUSED(type, type == RadioNodeListType);
         return adoptRef(new RadioNodeList(rootNode, name));
@@ -49,7 +49,7 @@ protected:
     virtual bool nodeMatches(Element*) const;
 
 private:
-    RadioNodeList(Node&, const AtomicString& name);
+    RadioNodeList(ContainerNode&, const AtomicString& name);
     bool checkElementMatchesRadioNodeListFilter(Element*) const;
 
     AtomicString m_name;