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::calculateAdjustedTargets() { const TreeScope* lastTreeScope = 0; bool useDeprecatedSVGUseTreeEventRules = usesDeprecatedSVGUseTreeEventRules(at(0).node()); TreeScopeEventContextMap treeScopeEventContextMap; TreeScopeEventContext* lastTreeScopeEventContext = 0; for (size_t i = 0; i < size(); ++i) { Node* currentNode = at(i).node(); TreeScope& currentTreeScope = currentNode->treeScope(); if (lastTreeScope != ¤tTreeScope) { if (!useDeprecatedSVGUseTreeEventRules) { lastTreeScopeEventContext = ensureTreeScopeEventContext(currentNode, ¤tTreeScope, treeScopeEventContextMap); } else { TreeScopeEventContextMap::AddResult addResult = treeScopeEventContextMap.add(¤tTreeScope, TreeScopeEventContext::create(currentTreeScope)); lastTreeScopeEventContext = addResult.storedValue->value.get(); if (addResult.isNewEntry) { // Don't adjust an event target for SVG. lastTreeScopeEventContext->setTarget(eventTargetRespectingTargetRules(at(0).node())); } } } ASSERT(lastTreeScopeEventContext); at(i).setTreeScopeEventContext(lastTreeScopeEventContext); lastTreeScope = ¤tTreeScope; } m_treeScopeEventContexts.appendRange(treeScopeEventContextMap.values().begin(), treeScopeEventContextMap.values().end()); }