| Index: Source/WebCore/dom/Node.cpp
|
| ===================================================================
|
| --- Source/WebCore/dom/Node.cpp (revision 145445)
|
| +++ Source/WebCore/dom/Node.cpp (working copy)
|
| @@ -437,8 +437,7 @@
|
| if (m_next)
|
| m_next->setPreviousSibling(0);
|
|
|
| - if (doc)
|
| - doc->guardDeref();
|
| + m_treeScope->guardDeref();
|
|
|
| InspectorCounters::decrementCounter(InspectorCounters::NodeCounter);
|
| }
|
| @@ -887,11 +886,6 @@
|
| return true;
|
| }
|
|
|
| -bool Node::isTreeScope() const
|
| -{
|
| - return treeScope()->rootNode() == this;
|
| -}
|
| -
|
| bool Node::isKeyboardFocusable(KeyboardEvent*) const
|
| {
|
| return isFocusable() && tabIndex() >= 0;
|
| @@ -2561,6 +2555,31 @@
|
| }
|
| #endif
|
|
|
| +// This is here for inlining
|
| +inline void TreeScope::removedLastRefToScope()
|
| +{
|
| + ASSERT(!deletionHasBegun());
|
| + if (m_guardRefCount) {
|
| + // If removing a child removes the last self-only ref, we don't
|
| + // want the scope to be destructed until after
|
| + // removeDetachedChildren returns, so we guard ourselves with an
|
| + // extra self-only ref.
|
| + guardRef();
|
| + dispose();
|
| +#ifndef NDEBUG
|
| + // We need to do this right now since guardDeref() can delete this.
|
| + rootNode()->m_inRemovedLastRefFunction = false;
|
| +#endif
|
| + guardDeref();
|
| + } else {
|
| +#ifndef NDEBUG
|
| + rootNode()->m_inRemovedLastRefFunction = false;
|
| + beginDeletion();
|
| +#endif
|
| + delete this;
|
| + }
|
| +}
|
| +
|
| // It's important not to inline removedLastRef, because we don't want to inline the code to
|
| // delete a Node at each deref call site.
|
| void Node::removedLastRef()
|
| @@ -2568,10 +2587,11 @@
|
| // An explicit check for Document here is better than a virtual function since it is
|
| // faster for non-Document nodes, and because the call to removedLastRef that is inlined
|
| // at all deref call sites is smaller if it's a non-virtual function.
|
| - if (isDocumentNode()) {
|
| - static_cast<Document*>(this)->removedLastRef();
|
| + if (isTreeScope()) {
|
| + treeScope()->removedLastRefToScope();
|
| return;
|
| }
|
| +
|
| #ifndef NDEBUG
|
| m_deletionHasBegun = true;
|
| #endif
|
|
|