summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/core/dom/ContainerNodeAlgorithms.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/core/dom/ContainerNodeAlgorithms.h')
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/ContainerNodeAlgorithms.h240
1 files changed, 7 insertions, 233 deletions
diff --git a/chromium/third_party/WebKit/Source/core/dom/ContainerNodeAlgorithms.h b/chromium/third_party/WebKit/Source/core/dom/ContainerNodeAlgorithms.h
index b863c252f2f..67691aade58 100644
--- a/chromium/third_party/WebKit/Source/core/dom/ContainerNodeAlgorithms.h
+++ b/chromium/third_party/WebKit/Source/core/dom/ContainerNodeAlgorithms.h
@@ -23,49 +23,10 @@
#define ContainerNodeAlgorithms_h
#include "core/dom/Document.h"
-#include "core/html/HTMLFrameOwnerElement.h"
-#include "core/inspector/InspectorInstrumentation.h"
#include "wtf/Assertions.h"
namespace WebCore {
-class ChildNodeInsertionNotifier {
-public:
- explicit ChildNodeInsertionNotifier(ContainerNode& insertionPoint)
- : m_insertionPoint(insertionPoint)
- {
- }
-
- void notify(Node&);
-
-private:
- void notifyDescendantInsertedIntoDocument(ContainerNode&);
- void notifyDescendantInsertedIntoTree(ContainerNode&);
- void notifyNodeInsertedIntoDocument(Node&);
- void notifyNodeInsertedIntoTree(ContainerNode&);
-
- ContainerNode& m_insertionPoint;
- Vector< RefPtr<Node> > m_postInsertionNotificationTargets;
-};
-
-class ChildNodeRemovalNotifier {
-public:
- explicit ChildNodeRemovalNotifier(ContainerNode& insertionPoint)
- : m_insertionPoint(insertionPoint)
- {
- }
-
- void notify(Node&);
-
-private:
- void notifyDescendantRemovedFromDocument(ContainerNode&);
- void notifyDescendantRemovedFromTree(ContainerNode&);
- void notifyNodeRemovedFromDocument(Node&);
- void notifyNodeRemovedFromTree(ContainerNode&);
-
- ContainerNode& m_insertionPoint;
-};
-
namespace Private {
template<class GenericNode, class GenericNodeContainer>
@@ -73,6 +34,7 @@ namespace Private {
}
+#if !ENABLE(OILPAN)
// Helper functions for TreeShared-derived classes, which have a 'Node' style interface
// This applies to 'ContainerNode' and 'SVGElementInstance'
template<class GenericNode, class GenericNodeContainer>
@@ -96,62 +58,17 @@ inline void removeDetachedChildrenInContainer(GenericNodeContainer& container)
if (next == 0)
tail = 0;
- if (n->hasChildNodes())
+ if (n->hasChildren())
Private::addChildNodesToDeletionQueue<GenericNode, GenericNodeContainer>(head, tail, static_cast<GenericNodeContainer&>(*n));
delete n;
}
}
-
-template<class GenericNode, class GenericNodeContainer>
-inline void appendChildToContainer(GenericNode& child, GenericNodeContainer& container)
-{
- child.setParentOrShadowHostNode(&container);
-
- GenericNode* lastChild = container.lastChild();
- if (lastChild) {
- child.setPreviousSibling(lastChild);
- lastChild->setNextSibling(&child);
- } else {
- container.setFirstChild(&child);
- }
-
- container.setLastChild(&child);
-}
+#endif
// Helper methods for removeDetachedChildrenInContainer, hidden from WebCore namespace
namespace Private {
- template<class GenericNode, class GenericNodeContainer, bool dispatchRemovalNotification>
- struct NodeRemovalDispatcher {
- static void dispatch(GenericNode&, GenericNodeContainer&)
- {
- // no-op, by default
- }
- };
-
- template<class GenericNode, class GenericNodeContainer>
- struct NodeRemovalDispatcher<GenericNode, GenericNodeContainer, true> {
- static void dispatch(GenericNode& node, GenericNodeContainer& container)
- {
- // Clean up any TreeScope to a removed tree.
- if (Document* containerDocument = container.ownerDocument())
- containerDocument->adoptIfNeeded(node);
- if (node.inDocument())
- ChildNodeRemovalNotifier(container).notify(node);
- }
- };
-
- template<class GenericNode>
- struct ShouldDispatchRemovalNotification {
- static const bool value = false;
- };
-
- template<>
- struct ShouldDispatchRemovalNotification<Node> {
- static const bool value = true;
- };
-
template<class GenericNode, class GenericNodeContainer>
void addChildNodesToDeletionQueue(GenericNode*& head, GenericNode*& tail, GenericNodeContainer& container)
{
@@ -180,8 +97,10 @@ namespace Private {
tail = n;
} else {
- RefPtr<GenericNode> protect(n); // removedFromDocument may remove remove all references to this node.
- NodeRemovalDispatcher<GenericNode, GenericNodeContainer, ShouldDispatchRemovalNotification<GenericNode>::value>::dispatch(*n, container);
+ RefPtrWillBeRawPtr<GenericNode> protect(n); // removedFromDocument may remove all references to this node.
+ container.document().adoptIfNeeded(*n);
+ if (n->inDocument())
+ container.notifyNodeRemoved(*n);
}
}
@@ -190,151 +109,6 @@ namespace Private {
} // namespace Private
-inline void ChildNodeInsertionNotifier::notifyNodeInsertedIntoDocument(Node& node)
-{
- ASSERT(m_insertionPoint.inDocument());
- RefPtr<Node> protect(node);
- if (Node::InsertionShouldCallDidNotifySubtreeInsertions == node.insertedInto(&m_insertionPoint))
- m_postInsertionNotificationTargets.append(&node);
- if (node.isContainerNode())
- notifyDescendantInsertedIntoDocument(toContainerNode(node));
-}
-
-inline void ChildNodeInsertionNotifier::notifyNodeInsertedIntoTree(ContainerNode& node)
-{
- NoEventDispatchAssertion assertNoEventDispatch;
- ASSERT(!m_insertionPoint.inDocument());
-
- if (Node::InsertionShouldCallDidNotifySubtreeInsertions == node.insertedInto(&m_insertionPoint))
- m_postInsertionNotificationTargets.append(&node);
- notifyDescendantInsertedIntoTree(node);
-}
-
-inline void ChildNodeInsertionNotifier::notify(Node& node)
-{
- ASSERT(!NoEventDispatchAssertion::isEventDispatchForbidden());
-
- InspectorInstrumentation::didInsertDOMNode(&node);
-
- RefPtr<Document> protectDocument(node.document());
- RefPtr<Node> protectNode(node);
-
- if (m_insertionPoint.inDocument())
- notifyNodeInsertedIntoDocument(node);
- else if (node.isContainerNode())
- notifyNodeInsertedIntoTree(toContainerNode(node));
-
- for (size_t i = 0; i < m_postInsertionNotificationTargets.size(); ++i) {
- Node* targetNode = m_postInsertionNotificationTargets[i].get();
- if (targetNode->inDocument())
- targetNode->didNotifySubtreeInsertionsToDocument();
- }
-}
-
-inline void ChildNodeRemovalNotifier::notifyNodeRemovedFromDocument(Node& node)
-{
- ASSERT(m_insertionPoint.inDocument());
- node.removedFrom(&m_insertionPoint);
-
- if (node.isContainerNode())
- notifyDescendantRemovedFromDocument(toContainerNode(node));
-}
-
-inline void ChildNodeRemovalNotifier::notifyNodeRemovedFromTree(ContainerNode& node)
-{
- NoEventDispatchAssertion assertNoEventDispatch;
- ASSERT(!m_insertionPoint.inDocument());
-
- node.removedFrom(&m_insertionPoint);
- notifyDescendantRemovedFromTree(node);
-}
-
-inline void ChildNodeRemovalNotifier::notify(Node& node)
-{
- if (node.inDocument()) {
- notifyNodeRemovedFromDocument(node);
- node.document().notifyRemovePendingSheetIfNeeded();
- } else if (node.isContainerNode())
- notifyNodeRemovedFromTree(toContainerNode(node));
-}
-
-class ChildFrameDisconnector {
-public:
- enum DisconnectPolicy {
- RootAndDescendants,
- DescendantsOnly
- };
-
- explicit ChildFrameDisconnector(Node& root)
- : m_root(root)
- {
- }
-
- void disconnect(DisconnectPolicy = RootAndDescendants);
-
-private:
- void collectFrameOwners(Node& root);
- void collectFrameOwners(ElementShadow&);
- void disconnectCollectedFrameOwners();
-
- Vector<RefPtr<HTMLFrameOwnerElement>, 10> m_frameOwners;
- Node& m_root;
-};
-
-#ifndef NDEBUG
-unsigned assertConnectedSubrameCountIsConsistent(Node&);
-#endif
-
-inline void ChildFrameDisconnector::collectFrameOwners(Node& root)
-{
- if (!root.connectedSubframeCount())
- return;
-
- if (root.isHTMLElement() && root.isFrameOwnerElement())
- m_frameOwners.append(&toHTMLFrameOwnerElement(root));
-
- for (Node* child = root.firstChild(); child; child = child->nextSibling())
- collectFrameOwners(*child);
-
- ElementShadow* shadow = root.isElementNode() ? toElement(root).shadow() : 0;
- if (shadow)
- collectFrameOwners(*shadow);
-}
-
-inline void ChildFrameDisconnector::disconnectCollectedFrameOwners()
-{
- // Must disable frame loading in the subtree so an unload handler cannot
- // insert more frames and create loaded frames in detached subtrees.
- SubframeLoadingDisabler disabler(m_root);
-
- for (unsigned i = 0; i < m_frameOwners.size(); ++i) {
- HTMLFrameOwnerElement* owner = m_frameOwners[i].get();
- // Don't need to traverse up the tree for the first owner since no
- // script could have moved it.
- if (!i || m_root.containsIncludingShadowDOM(owner))
- owner->disconnectContentFrame();
- }
-}
-
-inline void ChildFrameDisconnector::disconnect(DisconnectPolicy policy)
-{
-#ifndef NDEBUG
- assertConnectedSubrameCountIsConsistent(m_root);
-#endif
-
- if (!m_root.connectedSubframeCount())
- return;
-
- if (policy == RootAndDescendants)
- collectFrameOwners(m_root);
- else {
- for (Node* child = m_root.firstChild(); child; child = child->nextSibling())
- collectFrameOwners(*child);
- }
-
- disconnectCollectedFrameOwners();
-}
-
} // namespace WebCore
#endif // ContainerNodeAlgorithms_h