Remove NodeListRootType flag
authorantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 28 Mar 2014 15:36:40 +0000 (15:36 +0000)
committerantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 28 Mar 2014 15:36:40 +0000 (15:36 +0000)
https://bugs.webkit.org/show_bug.cgi?id=130896

Reviewed by Anders Carlsson.

This can be handled statically (except for the RadioNodeList case) removing
a branch from NodeList traversal.

* dom/ClassNodeList.h:
* dom/Document.cpp:
(WebCore::Document::registerNodeListForInvalidation):
(WebCore::Document::unregisterNodeListForInvalidation):
(WebCore::Document::registerNodeList): Deleted.
(WebCore::Document::unregisterNodeList): Deleted.

    Mark document invalidation registered lists with a bit.
    Renamed for clarity.

* dom/Document.h:
* dom/LiveNodeList.cpp:
(WebCore::LiveNodeList::LiveNodeList):
(WebCore::LiveNodeList::rootNode):

    Base class version that invokes virtual isRootedAtDocument. It is needed to support
    LiveNodeList::namedItem.

* dom/LiveNodeList.h:
(WebCore::LiveNodeList::isRegisteredForInvalidationAtDocument):
(WebCore::LiveNodeList::setRegisteredForInvalidationAtDocument):
(WebCore::LiveNodeList::document):
(WebCore::CachedLiveNodeList<NodeListType>::CachedLiveNodeList):
(WebCore::CachedLiveNodeList<NodeListType>::~CachedLiveNodeList):
(WebCore::CachedLiveNodeList<NodeListType>::rootNode):

    Call isRootedAtDocument on the final leaf type. Except for RadioNodeList this
    resolves statically.

(WebCore::CachedLiveNodeList<NodeListType>::willValidateIndexCache):
(WebCore::CachedLiveNodeList<NodeListType>::invalidateCache):
(WebCore::LiveNodeList::isRootedAtDocument): Deleted.
(WebCore::LiveNodeList::rootType): Deleted.
(WebCore::LiveNodeList::rootNode): Deleted.
* dom/NameNodeList.h:
* dom/NodeRareData.h:
(WebCore::NodeListsNodeData::adoptDocument):
* dom/TagNodeList.h:
* html/HTMLCollection.cpp:
(WebCore::rootTypeFromCollectionType):
* html/HTMLCollection.h:
(WebCore::HTMLCollection::isRootedAtDocument):
(WebCore::HTMLCollection::rootType):

    HTMLCollections still needs the flag.

* html/LabelsNodeList.cpp:
(WebCore::LabelsNodeList::LabelsNodeList):
* html/LabelsNodeList.h:
* html/RadioNodeList.cpp:
(WebCore::RadioNodeList::RadioNodeList):
* html/RadioNodeList.h:

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

17 files changed:
Source/WebCore/ChangeLog
Source/WebCore/dom/ClassNodeList.cpp
Source/WebCore/dom/ClassNodeList.h
Source/WebCore/dom/Document.cpp
Source/WebCore/dom/Document.h
Source/WebCore/dom/LiveNodeList.cpp
Source/WebCore/dom/LiveNodeList.h
Source/WebCore/dom/NameNodeList.cpp
Source/WebCore/dom/NameNodeList.h
Source/WebCore/dom/TagNodeList.cpp
Source/WebCore/dom/TagNodeList.h
Source/WebCore/html/HTMLCollection.cpp
Source/WebCore/html/HTMLCollection.h
Source/WebCore/html/LabelsNodeList.cpp
Source/WebCore/html/LabelsNodeList.h
Source/WebCore/html/RadioNodeList.cpp
Source/WebCore/html/RadioNodeList.h

index 1b1c734..9c7500a 100644 (file)
@@ -1,3 +1,66 @@
+2014-03-28  Antti Koivisto  <antti@apple.com>
+
+        Remove NodeListRootType flag
+        https://bugs.webkit.org/show_bug.cgi?id=130896
+
+        Reviewed by Anders Carlsson.
+
+        This can be handled statically (except for the RadioNodeList case) removing
+        a branch from NodeList traversal.
+
+        * dom/ClassNodeList.h:
+        * dom/Document.cpp:
+        (WebCore::Document::registerNodeListForInvalidation):
+        (WebCore::Document::unregisterNodeListForInvalidation):
+        (WebCore::Document::registerNodeList): Deleted.
+        (WebCore::Document::unregisterNodeList): Deleted.
+        
+            Mark document invalidation registered lists with a bit.
+            Renamed for clarity.
+
+        * dom/Document.h:
+        * dom/LiveNodeList.cpp:
+        (WebCore::LiveNodeList::LiveNodeList):
+        (WebCore::LiveNodeList::rootNode):
+        
+            Base class version that invokes virtual isRootedAtDocument. It is needed to support 
+            LiveNodeList::namedItem.
+
+        * dom/LiveNodeList.h:
+        (WebCore::LiveNodeList::isRegisteredForInvalidationAtDocument):
+        (WebCore::LiveNodeList::setRegisteredForInvalidationAtDocument):
+        (WebCore::LiveNodeList::document):
+        (WebCore::CachedLiveNodeList<NodeListType>::CachedLiveNodeList):
+        (WebCore::CachedLiveNodeList<NodeListType>::~CachedLiveNodeList):
+        (WebCore::CachedLiveNodeList<NodeListType>::rootNode):
+        
+            Call isRootedAtDocument on the final leaf type. Except for RadioNodeList this
+            resolves statically.
+
+        (WebCore::CachedLiveNodeList<NodeListType>::willValidateIndexCache):
+        (WebCore::CachedLiveNodeList<NodeListType>::invalidateCache):
+        (WebCore::LiveNodeList::isRootedAtDocument): Deleted.
+        (WebCore::LiveNodeList::rootType): Deleted.
+        (WebCore::LiveNodeList::rootNode): Deleted.
+        * dom/NameNodeList.h:
+        * dom/NodeRareData.h:
+        (WebCore::NodeListsNodeData::adoptDocument):
+        * dom/TagNodeList.h:
+        * html/HTMLCollection.cpp:
+        (WebCore::rootTypeFromCollectionType):
+        * html/HTMLCollection.h:
+        (WebCore::HTMLCollection::isRootedAtDocument):
+        (WebCore::HTMLCollection::rootType):
+        
+            HTMLCollections still needs the flag.
+
+        * html/LabelsNodeList.cpp:
+        (WebCore::LabelsNodeList::LabelsNodeList):
+        * html/LabelsNodeList.h:
+        * html/RadioNodeList.cpp:
+        (WebCore::RadioNodeList::RadioNodeList):
+        * html/RadioNodeList.h:
+
 2014-03-28  Mario Sanchez Prada  <mario.prada@samsung.com>
 
         [GTK] Geoclue2 providers won't work after reloading
index 41f55f5..595b707 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2007-2008, 2014 Apple Inc. All rights reserved.
  * Copyright (C) 2007 David Smith (catfish.man@gmail.com)
  *
  * Redistribution and use in source and binary forms, with or without
index 5f18d5d..99f2cdb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2007, 2014 Apple Inc. All rights reserved.
  * Copyright (C) 2007 David Smith (catfish.man@gmail.com)
  *
  * Redistribution and use in source and binary forms, with or without
@@ -47,6 +47,7 @@ public:
     virtual ~ClassNodeList();
 
     virtual bool nodeMatches(Element*) const override;
+    virtual bool isRootedAtDocument() const override { return false; }
 
 private:
     ClassNodeList(ContainerNode& rootNode, const String& classNames);
index d882d63..15bfb89 100644 (file)
@@ -3452,24 +3452,28 @@ void Document::setCSSTarget(Element* n)
         n->didAffectSelector(AffectedSelectorTarget);
 }
 
-void Document::registerNodeList(LiveNodeList& list)
+void Document::registerNodeListForInvalidation(LiveNodeList& list)
 {
     m_nodeListAndCollectionCounts[list.invalidationType()]++;
-    if (list.isRootedAtDocument())
-        m_listsInvalidatedAtDocument.add(&list);
+    if (!list.isRootedAtDocument())
+        return;
+    ASSERT(!list.isRegisteredForInvalidationAtDocument());
+    list.setRegisteredForInvalidationAtDocument(true);
+    m_listsInvalidatedAtDocument.add(&list);
 }
 
-void Document::unregisterNodeList(LiveNodeList& list)
+void Document::unregisterNodeListForInvalidation(LiveNodeList& list)
 {
     m_nodeListAndCollectionCounts[list.invalidationType()]--;
-    if (list.isRootedAtDocument()) {
-        if (!m_listsInvalidatedAtDocument.size()) {
-            ASSERT(m_inInvalidateNodeListAndCollectionCaches);
-            return;
-        }
-        ASSERT(m_listsInvalidatedAtDocument.contains(&list));
-        m_listsInvalidatedAtDocument.remove(&list);
+    if (!list.isRegisteredForInvalidationAtDocument())
+        return;
+    if (!m_listsInvalidatedAtDocument.size()) {
+        ASSERT(m_inInvalidateNodeListAndCollectionCaches);
+        return;
     }
+    ASSERT(m_listsInvalidatedAtDocument.contains(&list));
+    m_listsInvalidatedAtDocument.remove(&list);
+    list.setRegisteredForInvalidationAtDocument(false);
 }
 
 void Document::registerCollection(HTMLCollection& collection)
index 0eaa7bf..18a5378 100644 (file)
@@ -761,8 +761,8 @@ public:
     void styleRecalcTimerFired(Timer<Document>&);
     void optimizedStyleSheetUpdateTimerFired(Timer<Document>&);
 
-    void registerNodeList(LiveNodeList&);
-    void unregisterNodeList(LiveNodeList&);
+    void registerNodeListForInvalidation(LiveNodeList&);
+    void unregisterNodeListForInvalidation(LiveNodeList&);
     void registerCollection(HTMLCollection&);
     void unregisterCollection(HTMLCollection&);
     void collectionCachedIdNameMap(const HTMLCollection&);
index 07ee900..a8dc02b 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2006, 2007, 2008, 2010, 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2006-2008, 2010, 2013-2014 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
 
 namespace WebCore {
 
-LiveNodeList::LiveNodeList(ContainerNode& ownerNode, NodeListInvalidationType invalidationType, NodeListRootType rootType)
+LiveNodeList::LiveNodeList(ContainerNode& ownerNode, NodeListInvalidationType invalidationType)
     : m_ownerNode(ownerNode)
-    , m_rootType(rootType)
     , m_invalidationType(invalidationType)
+    , m_isRegisteredForInvalidationAtDocument(false)
 {
-    ASSERT(m_rootType == static_cast<unsigned>(rootType));
     ASSERT(m_invalidationType == static_cast<unsigned>(invalidationType));
 }
 
@@ -44,6 +43,13 @@ LiveNodeList::~LiveNodeList()
 {
 }
 
+ContainerNode& LiveNodeList::rootNode() const
+{
+    if (isRootedAtDocument() && ownerNode().inDocument())
+        return ownerNode().document();
+
+    return ownerNode();
+}
 
 Node* LiveNodeList::namedItem(const AtomicString& elementId) const
 {
index 8db4155..c292b50 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2006, 2007, 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2006-2007, 2013-2014 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -37,22 +37,18 @@ namespace WebCore {
 
 class Element;
 
-enum NodeListRootType {
-    NodeListIsRootedAtNode,
-    NodeListIsRootedAtDocument
-};
-
 static bool shouldInvalidateTypeOnAttributeChange(NodeListInvalidationType, const QualifiedName&);
 
 class LiveNodeList : public NodeList {
 public:
-    LiveNodeList(ContainerNode& ownerNode, NodeListInvalidationType, NodeListRootType);
+    LiveNodeList(ContainerNode& ownerNode, NodeListInvalidationType);
+    virtual ~LiveNodeList();
+
     virtual Node* namedItem(const AtomicString&) const override final;
-    virtual bool nodeMatches(Element*) const = 0;
 
-    virtual ~LiveNodeList();
+    virtual bool nodeMatches(Element*) const = 0;
+    virtual bool isRootedAtDocument() const = 0;
 
-    ALWAYS_INLINE bool isRootedAtDocument() const { return m_rootType == NodeListIsRootedAtDocument; }
     ALWAYS_INLINE NodeListInvalidationType invalidationType() const { return static_cast<NodeListInvalidationType>(m_invalidationType); }
     ContainerNode& ownerNode() const { return const_cast<ContainerNode&>(m_ownerNode.get()); }
     ALWAYS_INLINE void invalidateCacheForAttribute(const QualifiedName* attrName) const
@@ -62,21 +58,23 @@ public:
     }
     virtual void invalidateCache(Document&) const = 0;
 
+    bool isRegisteredForInvalidationAtDocument() const { return m_isRegisteredForInvalidationAtDocument; }
+    void setRegisteredForInvalidationAtDocument(bool f) { m_isRegisteredForInvalidationAtDocument = f; }
+
 protected:
     Document& document() const { return m_ownerNode->document(); }
-    ContainerNode& rootNode() const;
-
-    ALWAYS_INLINE NodeListRootType rootType() const { return static_cast<NodeListRootType>(m_rootType); }
 
 private:
-    virtual bool isLiveNodeList() const override { return true; }
+    virtual bool isLiveNodeList() const override final { return true; }
+
+    ContainerNode& rootNode() const;
 
     Element* iterateForPreviousElement(Element* current) const;
 
     Ref<ContainerNode> m_ownerNode;
 
-    const unsigned m_rootType : 1;
-    const unsigned m_invalidationType : 4;
+    const unsigned m_invalidationType;
+    bool m_isRegisteredForInvalidationAtDocument;
 };
 
 template <class NodeListType>
@@ -99,9 +97,11 @@ public:
     virtual size_t memoryCost() const override;
 
 protected:
-    CachedLiveNodeList(ContainerNode& rootNode, NodeListInvalidationType, NodeListRootType = NodeListIsRootedAtNode);
+    CachedLiveNodeList(ContainerNode& rootNode, NodeListInvalidationType);
 
 private:
+    ContainerNode& rootNode() const;
+
     mutable CollectionIndexCache<NodeListType, Element> m_indexCache;
 };
 
@@ -129,25 +129,26 @@ ALWAYS_INLINE bool shouldInvalidateTypeOnAttributeChange(NodeListInvalidationTyp
     return false;
 }
 
-inline ContainerNode& LiveNodeList::rootNode() const
+template <class NodeListType>
+CachedLiveNodeList<NodeListType>::CachedLiveNodeList(ContainerNode& ownerNode, NodeListInvalidationType invalidationType)
+    : LiveNodeList(ownerNode, invalidationType)
 {
-    if (isRootedAtDocument() && ownerNode().inDocument())
-        return ownerNode().document();
-
-    return ownerNode();
 }
 
 template <class NodeListType>
-CachedLiveNodeList<NodeListType>::CachedLiveNodeList(ContainerNode& ownerNode, NodeListInvalidationType invalidationType, NodeListRootType rootType)
-    : LiveNodeList(ownerNode, invalidationType, rootType)
+CachedLiveNodeList<NodeListType>::~CachedLiveNodeList()
 {
+    if (m_indexCache.hasValidCache())
+        document().unregisterNodeListForInvalidation(*this);
 }
 
 template <class NodeListType>
-CachedLiveNodeList<NodeListType>::~CachedLiveNodeList()
+inline ContainerNode& CachedLiveNodeList<NodeListType>::rootNode() const
 {
-    if (m_indexCache.hasValidCache())
-        document().unregisterNodeList(*this);
+    if (static_cast<const NodeListType&>(*this).isRootedAtDocument() && ownerNode().inDocument())
+        return ownerNode().document();
+
+    return ownerNode();
 }
 
 template <class NodeListType>
@@ -216,7 +217,7 @@ Element* CachedLiveNodeList<NodeListType>::collectionTraverseBackward(Element& c
 template <class NodeListType>
 void CachedLiveNodeList<NodeListType>::willValidateIndexCache() const
 {
-    document().registerNodeList(const_cast<NodeListType&>(static_cast<const NodeListType&>(*this)));
+    document().registerNodeListForInvalidation(const_cast<NodeListType&>(static_cast<const NodeListType&>(*this)));
 }
 
 template <class NodeListType>
@@ -224,7 +225,7 @@ void CachedLiveNodeList<NodeListType>::invalidateCache(Document& document) const
 {
     if (!m_indexCache.hasValidCache())
         return;
-    document.unregisterNodeList(const_cast<NodeListType&>(static_cast<const NodeListType&>(*this)));
+    document.unregisterNodeListForInvalidation(const_cast<NodeListType&>(static_cast<const NodeListType&>(*this)));
     m_indexCache.invalidate();
 }
 
index 5ff1556..8891889 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2007, 2014 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
index 9f83cba..c786607 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2007m 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2007-2008, 2014 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -41,6 +41,7 @@ public:
     virtual ~NameNodeList();
 
     virtual bool nodeMatches(Element*) const override;
+    virtual bool isRootedAtDocument() const override { return false; }
 
 private:
     NameNodeList(ContainerNode& rootNode, const AtomicString& name);
index 329e0e7..80ffe58 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2004-2007, 2014 Apple Inc. All rights reserved.
  * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
  *
  * This library is free software; you can redistribute it and/or
index 2cf1e93..36f797d 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2004-2008, 2014 Apple Inc. All rights reserved.
  * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
  *
  * This library is free software; you can redistribute it and/or
@@ -47,6 +47,7 @@ public:
     virtual ~TagNodeList();
 
     virtual bool nodeMatches(Element*) const override;
+    virtual bool isRootedAtDocument() const override { return false; }
 
 protected:
     TagNodeList(ContainerNode& rootNode, const AtomicString& namespaceURI, const AtomicString& localName);
@@ -74,6 +75,7 @@ public:
     virtual ~HTMLTagNodeList();
 
     virtual bool nodeMatches(Element*) const override;
+    virtual bool isRootedAtDocument() const override { return false; }
 
 private:
     HTMLTagNodeList(ContainerNode& rootNode, const AtomicString& localName);
index fb07da4..94766ea 100644 (file)
@@ -65,7 +65,7 @@ static bool shouldOnlyIncludeDirectChildren(CollectionType type)
     return false;
 }
 
-static NodeListRootType rootTypeFromCollectionType(CollectionType type)
+static HTMLCollection::RootType rootTypeFromCollectionType(CollectionType type)
 {
     switch (type) {
     case DocImages:
@@ -79,7 +79,7 @@ static NodeListRootType rootTypeFromCollectionType(CollectionType type)
     case WindowNamedItems:
     case DocumentNamedItems:
     case FormControls:
-        return NodeListIsRootedAtDocument;
+        return HTMLCollection::IsRootedAtDocument;
     case NodeChildren:
     case TableTBodies:
     case TSectionRows:
@@ -89,10 +89,10 @@ static NodeListRootType rootTypeFromCollectionType(CollectionType type)
     case SelectedOptions:
     case DataListOptions:
     case MapAreas:
-        return NodeListIsRootedAtNode;
+        return HTMLCollection::IsRootedAtNode;
     }
     ASSERT_NOT_REACHED();
-    return NodeListIsRootedAtNode;
+    return HTMLCollection::IsRootedAtNode;
 }
 
 static NodeListInvalidationType invalidationTypeExcludingIdAndNameAttributes(CollectionType type)
index 26f388f..e0a3871 100644 (file)
@@ -100,7 +100,11 @@ public:
     void namedItems(const AtomicString& name, Vector<Ref<Element>>&) const;
     size_t memoryCost() const { return m_indexCache.memoryCost() + (m_namedElementCache ? m_namedElementCache->memoryCost() : 0); }
 
-    bool isRootedAtDocument() const { return m_rootType == NodeListIsRootedAtDocument; }
+    enum RootType {
+        IsRootedAtNode,
+        IsRootedAtDocument
+    };
+    bool isRootedAtDocument() const { return m_rootType == IsRootedAtDocument; }
     NodeListInvalidationType invalidationType() const { return static_cast<NodeListInvalidationType>(m_invalidationType); }
     CollectionType type() const { return static_cast<CollectionType>(m_collectionType); }
     ContainerNode& ownerNode() const { return const_cast<ContainerNode&>(m_ownerNode.get()); }
@@ -133,7 +137,7 @@ protected:
     ContainerNode& rootNode() const;
     bool usesCustomForwardOnlyTraversal() const { return m_usesCustomForwardOnlyTraversal; }
 
-    NodeListRootType rootType() const { return static_cast<NodeListRootType>(m_rootType); }
+    RootType rootType() const { return static_cast<RootType>(m_rootType); }
 
     CollectionNamedElementCache& createNameItemCache() const
     {
index d5905ef..586a374 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2007, 2008, 2014 Apple Inc. All rights reserved.
  * Copyright (C) 2010 Nokia Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
@@ -34,7 +34,7 @@ namespace WebCore {
 using namespace HTMLNames;
 
 LabelsNodeList::LabelsNodeList(LabelableElement& forNode)
-    : CachedLiveNodeList(forNode, InvalidateOnForAttrChange, NodeListIsRootedAtDocument)
+    : CachedLiveNodeList(forNode, InvalidateOnForAttrChange)
 {
 }
 
index 3f97435..3270b60 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2007, 2014 Apple Inc. All rights reserved.
  * Copyright (C) 2010 Nokia Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
@@ -39,6 +39,7 @@ public:
     ~LabelsNodeList();
 
     virtual bool nodeMatches(Element*) const override;
+    virtual bool isRootedAtDocument() const override { return true; }
 
 private:
     explicit LabelsNodeList(LabelableElement& forNode);
index 397d35a..1c44732 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2012 Motorola Mobility, Inc. All rights reserved.
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -38,8 +39,9 @@ namespace WebCore {
 using namespace HTMLNames;
 
 RadioNodeList::RadioNodeList(ContainerNode& rootNode, const AtomicString& name)
-    : CachedLiveNodeList(rootNode, InvalidateForFormControls, isHTMLFormElement(rootNode) ? NodeListIsRootedAtDocument : NodeListIsRootedAtNode)
+    : CachedLiveNodeList(rootNode, InvalidateForFormControls)
     , m_name(name)
+    , m_isRootedAtDocument(isHTMLFormElement(ownerNode()))
 {
 }
 
index f90ed46..f811d8f 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2012 Motorola Mobility, Inc. All rights reserved.
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -45,12 +46,14 @@ public:
     void setValue(const String&);
 
     virtual bool nodeMatches(Element*) const override;
+    virtual bool isRootedAtDocument() const override { return m_isRootedAtDocument; }
 
 private:
     RadioNodeList(ContainerNode&, const AtomicString& name);
     bool checkElementMatchesRadioNodeListFilter(Element*) const;
 
     AtomicString m_name;
+    bool m_isRootedAtDocument;
 };
 
 } // namepsace