void EventPath::calculateTreeOrderAndSetNearestAncestorClosedTree() { // Precondition: // - TreeScopes in m_treeScopeEventContexts must be *connected* in the same tree of trees. // - The root tree must be included. WillBeHeapHashMap<RawPtrWillBeMember<const TreeScope>, RawPtrWillBeMember<TreeScopeEventContext>> treeScopeEventContextMap; for (const auto& treeScopeEventContext : m_treeScopeEventContexts) treeScopeEventContextMap.add(&treeScopeEventContext->treeScope(), treeScopeEventContext.get()); TreeScopeEventContext* rootTree = nullptr; for (const auto& treeScopeEventContext : m_treeScopeEventContexts) { // Use olderShadowRootOrParentTreeScope here for parent-child relationships. // See the definition of trees of trees in the Shadow DOM spec: // http://w3c.github.io/webcomponents/spec/shadow/ TreeScope* parent = treeScopeEventContext.get()->treeScope().olderShadowRootOrParentTreeScope(); if (!parent) { ASSERT(!rootTree); rootTree = treeScopeEventContext.get(); continue; } ASSERT(treeScopeEventContextMap.find(parent) != treeScopeEventContextMap.end()); treeScopeEventContextMap.find(parent)->value->addChild(*treeScopeEventContext.get()); } ASSERT(rootTree); rootTree->calculateTreeOrderAndSetNearestAncestorClosedTree(0, nullptr); }