Chromium Code Reviews| Index: Source/core/dom/TreeScope.cpp |
| diff --git a/Source/core/dom/TreeScope.cpp b/Source/core/dom/TreeScope.cpp |
| index 801eafbc6ec8c056517e19f50aa3d1c0749c8d40..131a6a5cc56329e724f72f838d24e9a3f760b7ac 100644 |
| --- a/Source/core/dom/TreeScope.cpp |
| +++ b/Source/core/dom/TreeScope.cpp |
| @@ -60,6 +60,7 @@ TreeScope::TreeScope(ContainerNode& rootNode, Document& document) |
| : m_rootNode(&rootNode) |
| , m_document(&document) |
| , m_parentTreeScope(&document) |
| + , m_composedParent(nullptr) |
| #if !ENABLE(OILPAN) |
| , m_guardRefCount(0) |
| #endif |
| @@ -568,11 +569,35 @@ void TreeScope::setNeedsStyleRecalcForViewportUnits() |
| } |
| } |
| +TreeScope* TreeScope::composedParent() |
| +{ |
| + if (rootNode().isDocumentNode()) |
| + return nullptr; |
| + if (!m_composedParent) { |
| + ShadowRoot& root = toShadowRoot(rootNode()); |
| + if (root.olderShadowRoot()) |
| + m_composedParent = root.olderShadowRoot(); |
| + else if (ContainerNode* host = rootNode().parentOrShadowHostNode()) |
| + m_composedParent = treeScopeInComposedTree(*host); |
|
esprehn
2015/05/19 02:37:56
Can we update these pointers inside the updateDist
rune
2015/05/19 11:08:18
Maybe, I need to look closer at the distribution c
|
| + } |
| + return m_composedParent; |
| +} |
| + |
| +TreeScope* TreeScope::treeScopeInComposedTree(const Node& node) |
| +{ |
| + for (Node* composedParent = ComposedTreeTraversal::parent(node); composedParent; composedParent = ComposedTreeTraversal::parent(*composedParent)) { |
| + if (composedParent && isShadowHost(composedParent)) |
|
esprehn
2015/05/19 02:37:56
This null check doesn't make sense, you're in a lo
rune
2015/05/19 11:08:18
Done.
|
| + return toElement(composedParent)->shadow()->youngestShadowRoot(); |
|
esprehn
2015/05/19 02:37:56
there's a getter right on Node for this, just do c
rune
2015/05/19 11:08:18
Done.
|
| + } |
| + return &node.document(); |
| +} |
| + |
| DEFINE_TRACE(TreeScope) |
| { |
| visitor->trace(m_rootNode); |
| visitor->trace(m_document); |
| visitor->trace(m_parentTreeScope); |
| + visitor->trace(m_composedParent); |
| visitor->trace(m_idTargetObserverRegistry); |
| visitor->trace(m_selection); |
| visitor->trace(m_elementsById); |