Remove support for Node::willRemove()
[WebKit-https.git] / Source / WebCore / dom / ContainerNodeAlgorithms.cpp
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2001 Dirk Mueller (mueller@kde.org)
5  * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
6  * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
7  * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
8  * Copyright (C) 2012 Google Inc. All rights reserved.
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Library General Public
12  * License as published by the Free Software Foundation; either
13  * version 2 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Library General Public License for more details.
19  *
20  * You should have received a copy of the GNU Library General Public License
21  * along with this library; see the file COPYING.LIB.  If not, write to
22  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
23  * Boston, MA 02110-1301, USA.
24  */
25
26 #include "config.h"
27 #include "ContainerNodeAlgorithms.h"
28
29 #include "Element.h"
30 #include "ElementShadow.h"
31 #include "HTMLFrameOwnerElement.h"
32
33 namespace WebCore {
34
35 void ChildNodeInsertionNotifier::notifyDescendantInsertedIntoDocument(ContainerNode* node)
36 {
37     NodeVector children;
38     getChildNodes(node, children);
39     for (size_t i = 0; i < children.size(); ++i) {
40         // If we have been removed from the document during this loop, then
41         // we don't want to tell the rest of our children that they've been
42         // inserted into the document because they haven't.
43         if (node->inDocument() && children[i]->parentNode() == node)
44             notifyNodeInsertedIntoDocument(children[i].get());
45     }
46         
47     if (!node->isElementNode())
48         return;
49
50     if (ElementShadow* shadow = toElement(node)->shadow()) {
51         ShadowRootVector roots(shadow);
52         for (size_t i = 0; i < roots.size(); ++i)
53             notifyNodeInsertedIntoDocument(roots[i].get());
54     }
55 }
56
57 void ChildNodeInsertionNotifier::notifyDescendantInsertedIntoTree(ContainerNode* node)
58 {
59     for (Node* child = node->firstChild(); child; child = child->nextSibling()) {
60         if (child->isContainerNode())
61             notifyNodeInsertedIntoTree(toContainerNode(child));
62     }
63
64     if (!node->isElementNode())
65         return;
66
67     if (ElementShadow* shadow = toElement(node)->shadow()) {
68         for (ShadowRoot* root = shadow->youngestShadowRoot(); root; root = root->olderShadowRoot())
69             notifyNodeInsertedIntoTree(root);
70     }
71 }
72
73 void ChildNodeRemovalNotifier::notifyDescendantRemovedFromDocument(ContainerNode* node)
74 {
75     NodeVector children;
76     getChildNodes(node, children);
77     for (size_t i = 0; i < children.size(); ++i) {
78         // If we have been added to the document during this loop, then we
79         // don't want to tell the rest of our children that they've been
80         // removed from the document because they haven't.
81         if (!node->inDocument() && children[i]->parentNode() == node)
82             notifyNodeRemovedFromDocument(children[i].get());
83     }
84
85     if (!node->isElementNode())
86         return;
87
88     if (node->document()->cssTarget() == node)
89         node->document()->setCSSTarget(0);
90
91     if (ElementShadow* shadow = toElement(node)->shadow()) {
92         ShadowRootVector roots(shadow);
93         for (size_t i = 0; i < roots.size(); ++i)
94             notifyNodeRemovedFromDocument(roots[i].get());
95     }
96 }
97
98 void ChildNodeRemovalNotifier::notifyDescendantRemovedFromTree(ContainerNode* node)
99 {
100     for (Node* child = node->firstChild(); child; child = child->nextSibling()) {
101         if (child->isContainerNode())
102             notifyNodeRemovedFromTree(toContainerNode(child));
103     }
104
105     if (!node->isElementNode())
106         return;
107
108     if (ElementShadow* shadow = toElement(node)->shadow()) {
109         ShadowRootVector roots(shadow);
110         for (size_t i = 0; i < roots.size(); ++i)
111             notifyNodeRemovedFromTree(roots[i].get());
112     }
113 }
114
115 void ChildFrameDisconnector::collectDescendant(ElementShadow* shadow)
116 {
117     for (ShadowRoot* root = shadow->youngestShadowRoot(); root; root = root->olderShadowRoot())
118         collectDescendant(root);
119 }
120
121 void ChildFrameDisconnector::Target::disconnect()
122 {
123     ASSERT(isValid());
124     toFrameOwnerElement(m_owner.get())->disconnectContentFrame();
125 }
126
127 }