void EventPath::calculateTreeScopePrePostOrderNumbers() { // Precondition: // - TreeScopes in m_treeScopeEventContexts must be *connected* in the same tree of trees. // - The root tree must be included. HashMap<const TreeScope*, TreeScopeEventContext*> treeScopeEventContextMap; for (size_t i = 0; i < m_treeScopeEventContexts.size(); ++i) treeScopeEventContextMap.add(&m_treeScopeEventContexts[i]->treeScope(), m_treeScopeEventContexts[i].get()); TreeScopeEventContext* rootTree = 0; for (size_t i = 0; i < m_treeScopeEventContexts.size(); ++i) { TreeScopeEventContext* treeScopeEventContext = m_treeScopeEventContexts[i].get(); // Use olderShadowRootOrParentTreeScope here for parent-child relationships. // See the definition of trees of trees in the Shado DOM spec: http://w3c.github.io/webcomponents/spec/shadow/ TreeScope* parent = treeScopeEventContext->treeScope().olderShadowRootOrParentTreeScope(); if (!parent) { ASSERT(!rootTree); rootTree = treeScopeEventContext; continue; } ASSERT(treeScopeEventContextMap.find(parent) != treeScopeEventContextMap.end()); treeScopeEventContextMap.find(parent)->value->addChild(*treeScopeEventContext); } ASSERT(rootTree); rootTree->calculatePrePostOrderNumber(0); }
void EventPath::adjustForRelatedTarget(Node* target, EventTarget* relatedTarget) { if (!target) return; if (!relatedTarget) return; Node* relatedNode = relatedTarget->toNode(); if (!relatedNode) return; if (target->document() != relatedNode->document()) return; if (!target->inDocument() || !relatedNode->inDocument()) return; RelatedTargetMap relatedNodeMap; buildRelatedNodeMap(relatedNode, relatedNodeMap); for (size_t i = 0; i < m_treeScopeEventContexts.size(); ++i) { TreeScopeEventContext* treeScopeEventContext = m_treeScopeEventContexts[i].get(); EventTarget* adjustedRelatedTarget = findRelatedNode(&treeScopeEventContext->treeScope(), relatedNodeMap); ASSERT(adjustedRelatedTarget); treeScopeEventContext->setRelatedTarget(adjustedRelatedTarget); } shrinkIfNeeded(target, relatedTarget); }
void EventPath::buildRelatedNodeMap(const Node& relatedNode, RelatedTargetMap& relatedTargetMap) { EventPath relatedTargetEventPath(const_cast<Node&>(relatedNode)); for (size_t i = 0; i < relatedTargetEventPath.m_treeScopeEventContexts.size(); ++i) { TreeScopeEventContext* treeScopeEventContext = relatedTargetEventPath.m_treeScopeEventContexts[i].get(); relatedTargetMap.add(&treeScopeEventContext->treeScope(), treeScopeEventContext->target()); } }
void EventPath::buildRelatedNodeMap(const Node& relatedNode, RelatedTargetMap& relatedTargetMap) { OwnPtrWillBeRawPtr<EventPath> relatedTargetEventPath = adoptPtrWillBeNoop(new EventPath(const_cast<Node&>(relatedNode))); for (size_t i = 0; i < relatedTargetEventPath->m_treeScopeEventContexts.size(); ++i) { TreeScopeEventContext* treeScopeEventContext = relatedTargetEventPath->m_treeScopeEventContexts[i].get(); relatedTargetMap.add(&treeScopeEventContext->treeScope(), treeScopeEventContext->target()); } #if ENABLE(OILPAN) // Oilpan: It is important to explicitly clear the vectors to reuse // the memory in subsequent event dispatchings. relatedTargetEventPath->clear(); #endif }
void EventPath::calculateAdjustedEventPath() { if (!RuntimeEnabledFeatures::shadowDOMEnabled()) return; for (size_t i = 0; i < m_treeScopeEventContexts.size(); ++i) { TreeScopeEventContext* treeScopeEventContext = m_treeScopeEventContexts[i].get(); Vector<RefPtr<Node> > nodes; nodes.reserveInitialCapacity(size()); for (size_t i = 0; i < size(); ++i) { if (at(i).node()->treeScope().isInclusiveAncestorOf(treeScopeEventContext->treeScope())) nodes.append(at(i).node()); } treeScopeEventContext->adoptEventPath(nodes); } }