TreeScopeEventContext* EventPath::ensureTreeScopeEventContext(Node* currentTarget, TreeScope* treeScope, TreeScopeEventContextMap& treeScopeEventContextMap) { if (!treeScope) return 0; TreeScopeEventContext* treeScopeEventContext; bool isNewEntry; { TreeScopeEventContextMap::AddResult addResult = treeScopeEventContextMap.add(treeScope, nullptr); isNewEntry = addResult.isNewEntry; if (isNewEntry) addResult.storedValue->value = TreeScopeEventContext::create(*treeScope); treeScopeEventContext = addResult.storedValue->value.get(); } if (isNewEntry) { TreeScopeEventContext* parentTreeScopeEventContext = ensureTreeScopeEventContext(0, treeScope->olderShadowRootOrParentTreeScope(), treeScopeEventContextMap); if (parentTreeScopeEventContext && parentTreeScopeEventContext->target()) { treeScopeEventContext->setTarget(parentTreeScopeEventContext->target()); } else if (currentTarget) { treeScopeEventContext->setTarget(eventTargetRespectingTargetRules(*currentTarget)); } } else if (!treeScopeEventContext->target() && currentTarget) { treeScopeEventContext->setTarget(eventTargetRespectingTargetRules(*currentTarget)); } return treeScopeEventContext; }
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 }