| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Neither the name of Google Inc. nor the names of its | 10 * * Neither the name of Google Inc. nor the names of its |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 Node* current = m_node; | 104 Node* current = m_node; |
| 105 addNodeEventContext(current); | 105 addNodeEventContext(current); |
| 106 if (!m_node->inDocument()) | 106 if (!m_node->inDocument()) |
| 107 return; | 107 return; |
| 108 while (current) { | 108 while (current) { |
| 109 if (m_event && current->keepEventInNode(m_event)) | 109 if (m_event && current->keepEventInNode(m_event)) |
| 110 break; | 110 break; |
| 111 WillBeHeapVector<RawPtrWillBeMember<InsertionPoint>, 8> insertionPoints; | 111 WillBeHeapVector<RawPtrWillBeMember<InsertionPoint>, 8> insertionPoints; |
| 112 collectDestinationInsertionPoints(*current, insertionPoints); | 112 collectDestinationInsertionPoints(*current, insertionPoints); |
| 113 if (!insertionPoints.isEmpty()) { | 113 if (!insertionPoints.isEmpty()) { |
| 114 for (size_t i = 0; i < insertionPoints.size(); ++i) { | 114 for (const auto& insertionPoint : insertionPoints) { |
| 115 InsertionPoint* insertionPoint = insertionPoints[i]; | |
| 116 if (insertionPoint->isShadowInsertionPoint()) { | 115 if (insertionPoint->isShadowInsertionPoint()) { |
| 117 ShadowRoot* containingShadowRoot = insertionPoint->containin
gShadowRoot(); | 116 ShadowRoot* containingShadowRoot = insertionPoint->containin
gShadowRoot(); |
| 118 ASSERT(containingShadowRoot); | 117 ASSERT(containingShadowRoot); |
| 119 if (!containingShadowRoot->isOldest()) | 118 if (!containingShadowRoot->isOldest()) |
| 120 addNodeEventContext(containingShadowRoot->olderShadowRoo
t()); | 119 addNodeEventContext(containingShadowRoot->olderShadowRoo
t()); |
| 121 } | 120 } |
| 122 addNodeEventContext(insertionPoint); | 121 addNodeEventContext(insertionPoint); |
| 123 } | 122 } |
| 124 current = insertionPoints.last(); | 123 current = insertionPoints.last(); |
| 125 continue; | 124 continue; |
| 126 } | 125 } |
| 127 if (current->isShadowRoot()) { | 126 if (current->isShadowRoot()) { |
| 128 if (m_event && shouldStopAtShadowRoot(*m_event, *toShadowRoot(curren
t), *m_node)) | 127 if (m_event && shouldStopAtShadowRoot(*m_event, *toShadowRoot(curren
t), *m_node)) |
| 129 break; | 128 break; |
| 130 current = current->shadowHost(); | 129 current = current->shadowHost(); |
| 131 addNodeEventContext(current); | 130 addNodeEventContext(current); |
| 132 } else { | 131 } else { |
| 133 current = current->parentNode(); | 132 current = current->parentNode(); |
| 134 if (current) | 133 if (current) |
| 135 addNodeEventContext(current); | 134 addNodeEventContext(current); |
| 136 } | 135 } |
| 137 } | 136 } |
| 138 } | 137 } |
| 139 | 138 |
| 140 void EventPath::calculateTreeScopePrePostOrderNumbers() | 139 void EventPath::calculateTreeScopePrePostOrderNumbers() |
| 141 { | 140 { |
| 142 // Precondition: | 141 // Precondition: |
| 143 // - TreeScopes in m_treeScopeEventContexts must be *connected* in the sam
e tree of trees. | 142 // - TreeScopes in m_treeScopeEventContexts must be *connected* in the sam
e tree of trees. |
| 144 // - The root tree must be included. | 143 // - The root tree must be included. |
| 145 WillBeHeapHashMap<RawPtrWillBeMember<const TreeScope>, RawPtrWillBeMember<Tr
eeScopeEventContext> > treeScopeEventContextMap; | 144 WillBeHeapHashMap<RawPtrWillBeMember<const TreeScope>, RawPtrWillBeMember<Tr
eeScopeEventContext>> treeScopeEventContextMap; |
| 146 for (size_t i = 0; i < m_treeScopeEventContexts.size(); ++i) | 145 for (const auto& treeScopeEventContext : m_treeScopeEventContexts) |
| 147 treeScopeEventContextMap.add(&m_treeScopeEventContexts[i]->treeScope(),
m_treeScopeEventContexts[i].get()); | 146 treeScopeEventContextMap.add(&treeScopeEventContext->treeScope(), treeSc
opeEventContext.get()); |
| 148 TreeScopeEventContext* rootTree = 0; | 147 TreeScopeEventContext* rootTree = 0; |
| 149 for (size_t i = 0; i < m_treeScopeEventContexts.size(); ++i) { | 148 for (const auto& treeScopeEventContext : m_treeScopeEventContexts) { |
| 150 TreeScopeEventContext* treeScopeEventContext = m_treeScopeEventContexts[
i].get(); | |
| 151 // Use olderShadowRootOrParentTreeScope here for parent-child relationsh
ips. | 149 // Use olderShadowRootOrParentTreeScope here for parent-child relationsh
ips. |
| 152 // See the definition of trees of trees in the Shado DOM spec: http://w3
c.github.io/webcomponents/spec/shadow/ | 150 // See the definition of trees of trees in the Shado DOM spec: http://w3
c.github.io/webcomponents/spec/shadow/ |
| 153 TreeScope* parent = treeScopeEventContext->treeScope().olderShadowRootOr
ParentTreeScope(); | 151 TreeScope* parent = treeScopeEventContext.get()->treeScope().olderShadow
RootOrParentTreeScope(); |
| 154 if (!parent) { | 152 if (!parent) { |
| 155 ASSERT(!rootTree); | 153 ASSERT(!rootTree); |
| 156 rootTree = treeScopeEventContext; | 154 rootTree = treeScopeEventContext.get(); |
| 157 continue; | 155 continue; |
| 158 } | 156 } |
| 159 ASSERT(treeScopeEventContextMap.find(parent) != treeScopeEventContextMap
.end()); | 157 ASSERT(treeScopeEventContextMap.find(parent) != treeScopeEventContextMap
.end()); |
| 160 treeScopeEventContextMap.find(parent)->value->addChild(*treeScopeEventCo
ntext); | 158 treeScopeEventContextMap.find(parent)->value->addChild(*treeScopeEventCo
ntext.get()); |
| 161 } | 159 } |
| 162 ASSERT(rootTree); | 160 ASSERT(rootTree); |
| 163 rootTree->calculatePrePostOrderNumber(0); | 161 rootTree->calculatePrePostOrderNumber(0); |
| 164 } | 162 } |
| 165 | 163 |
| 166 TreeScopeEventContext* EventPath::ensureTreeScopeEventContext(Node* currentTarge
t, TreeScope* treeScope, TreeScopeEventContextMap& treeScopeEventContextMap) | 164 TreeScopeEventContext* EventPath::ensureTreeScopeEventContext(Node* currentTarge
t, TreeScope* treeScope, TreeScopeEventContextMap& treeScopeEventContextMap) |
| 167 { | 165 { |
| 168 if (!treeScope) | 166 if (!treeScope) |
| 169 return 0; | 167 return 0; |
| 170 TreeScopeEventContext* treeScopeEventContext; | 168 TreeScopeEventContext* treeScopeEventContext; |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 if (!relatedNode) | 245 if (!relatedNode) |
| 248 return; | 246 return; |
| 249 if (target->document() != relatedNode->document()) | 247 if (target->document() != relatedNode->document()) |
| 250 return; | 248 return; |
| 251 if (!target->inDocument() || !relatedNode->inDocument()) | 249 if (!target->inDocument() || !relatedNode->inDocument()) |
| 252 return; | 250 return; |
| 253 | 251 |
| 254 RelatedTargetMap relatedNodeMap; | 252 RelatedTargetMap relatedNodeMap; |
| 255 buildRelatedNodeMap(relatedNode, relatedNodeMap); | 253 buildRelatedNodeMap(relatedNode, relatedNodeMap); |
| 256 | 254 |
| 257 for (size_t i = 0; i < m_treeScopeEventContexts.size(); ++i) { | 255 for (const auto& treeScopeEventContext : m_treeScopeEventContexts) { |
| 258 TreeScopeEventContext* treeScopeEventContext = m_treeScopeEventContexts[
i].get(); | 256 EventTarget* adjustedRelatedTarget = findRelatedNode(&treeScopeEventCont
ext.get()->treeScope(), relatedNodeMap); |
| 259 EventTarget* adjustedRelatedTarget = findRelatedNode(&treeScopeEventCont
ext->treeScope(), relatedNodeMap); | |
| 260 ASSERT(adjustedRelatedTarget); | 257 ASSERT(adjustedRelatedTarget); |
| 261 treeScopeEventContext->setRelatedTarget(adjustedRelatedTarget); | 258 treeScopeEventContext.get()->setRelatedTarget(adjustedRelatedTarget); |
| 262 } | 259 } |
| 263 | 260 |
| 264 shrinkIfNeeded(target, relatedTarget); | 261 shrinkIfNeeded(target, relatedTarget); |
| 265 } | 262 } |
| 266 | 263 |
| 267 void EventPath::shrinkIfNeeded(const Node* target, const EventTarget* relatedTar
get) | 264 void EventPath::shrinkIfNeeded(const Node* target, const EventTarget* relatedTar
get) |
| 268 { | 265 { |
| 269 // Synthetic mouse events can have a relatedTarget which is identical to the
target. | 266 // Synthetic mouse events can have a relatedTarget which is identical to the
target. |
| 270 bool targetIsIdenticalToToRelatedTarget = (target == relatedTarget); | 267 bool targetIsIdenticalToToRelatedTarget = (target == relatedTarget); |
| 271 | 268 |
| 272 for (size_t i = 0; i < size(); ++i) { | 269 for (size_t i = 0; i < size(); ++i) { |
| 273 if (targetIsIdenticalToToRelatedTarget) { | 270 if (targetIsIdenticalToToRelatedTarget) { |
| 274 if (target->treeScope().rootNode() == at(i).node()) { | 271 if (target->treeScope().rootNode() == at(i).node()) { |
| 275 shrink(i + 1); | 272 shrink(i + 1); |
| 276 break; | 273 break; |
| 277 } | 274 } |
| 278 } else if (at(i).target() == at(i).relatedTarget()) { | 275 } else if (at(i).target() == at(i).relatedTarget()) { |
| 279 // Event dispatching should be stopped here. | 276 // Event dispatching should be stopped here. |
| 280 shrink(i); | 277 shrink(i); |
| 281 break; | 278 break; |
| 282 } | 279 } |
| 283 } | 280 } |
| 284 } | 281 } |
| 285 | 282 |
| 286 void EventPath::adjustForTouchEvent(Node* node, TouchEvent& touchEvent) | 283 void EventPath::adjustForTouchEvent(Node* node, TouchEvent& touchEvent) |
| 287 { | 284 { |
| 288 WillBeHeapVector<RawPtrWillBeMember<TouchList> > adjustedTouches; | 285 WillBeHeapVector<RawPtrWillBeMember<TouchList>> adjustedTouches; |
| 289 WillBeHeapVector<RawPtrWillBeMember<TouchList> > adjustedTargetTouches; | 286 WillBeHeapVector<RawPtrWillBeMember<TouchList>> adjustedTargetTouches; |
| 290 WillBeHeapVector<RawPtrWillBeMember<TouchList> > adjustedChangedTouches; | 287 WillBeHeapVector<RawPtrWillBeMember<TouchList>> adjustedChangedTouches; |
| 291 WillBeHeapVector<RawPtrWillBeMember<TreeScope> > treeScopes; | 288 WillBeHeapVector<RawPtrWillBeMember<TreeScope>> treeScopes; |
| 292 | 289 |
| 293 for (size_t i = 0; i < m_treeScopeEventContexts.size(); ++i) { | 290 for (const auto& treeScopeEventContext : m_treeScopeEventContexts) { |
| 294 TouchEventContext* touchEventContext = m_treeScopeEventContexts[i]->ensu
reTouchEventContext(); | 291 TouchEventContext* touchEventContext = treeScopeEventContext->ensureTouc
hEventContext(); |
| 295 adjustedTouches.append(&touchEventContext->touches()); | 292 adjustedTouches.append(&touchEventContext->touches()); |
| 296 adjustedTargetTouches.append(&touchEventContext->targetTouches()); | 293 adjustedTargetTouches.append(&touchEventContext->targetTouches()); |
| 297 adjustedChangedTouches.append(&touchEventContext->changedTouches()); | 294 adjustedChangedTouches.append(&touchEventContext->changedTouches()); |
| 298 treeScopes.append(&m_treeScopeEventContexts[i]->treeScope()); | 295 treeScopes.append(&treeScopeEventContext->treeScope()); |
| 299 } | 296 } |
| 300 | 297 |
| 301 adjustTouchList(node, touchEvent.touches(), adjustedTouches, treeScopes); | 298 adjustTouchList(node, touchEvent.touches(), adjustedTouches, treeScopes); |
| 302 adjustTouchList(node, touchEvent.targetTouches(), adjustedTargetTouches, tre
eScopes); | 299 adjustTouchList(node, touchEvent.targetTouches(), adjustedTargetTouches, tre
eScopes); |
| 303 adjustTouchList(node, touchEvent.changedTouches(), adjustedChangedTouches, t
reeScopes); | 300 adjustTouchList(node, touchEvent.changedTouches(), adjustedChangedTouches, t
reeScopes); |
| 304 | 301 |
| 305 #if ENABLE(ASSERT) | 302 #if ENABLE(ASSERT) |
| 306 for (size_t i = 0; i < m_treeScopeEventContexts.size(); ++i) { | 303 for (const auto& treeScopeEventContext : m_treeScopeEventContexts) { |
| 307 TreeScope& treeScope = m_treeScopeEventContexts[i]->treeScope(); | 304 TreeScope& treeScope = treeScopeEventContext->treeScope(); |
| 308 TouchEventContext* touchEventContext = m_treeScopeEventContexts[i]->touc
hEventContext(); | 305 TouchEventContext* touchEventContext = treeScopeEventContext->touchEvent
Context(); |
| 309 checkReachability(treeScope, touchEventContext->touches()); | 306 checkReachability(treeScope, touchEventContext->touches()); |
| 310 checkReachability(treeScope, touchEventContext->targetTouches()); | 307 checkReachability(treeScope, touchEventContext->targetTouches()); |
| 311 checkReachability(treeScope, touchEventContext->changedTouches()); | 308 checkReachability(treeScope, touchEventContext->changedTouches()); |
| 312 } | 309 } |
| 313 #endif | 310 #endif |
| 314 } | 311 } |
| 315 | 312 |
| 316 void EventPath::adjustTouchList(const Node* node, const TouchList* touchList, Wi
llBeHeapVector<RawPtrWillBeMember<TouchList> > adjustedTouchList, const WillBeHe
apVector<RawPtrWillBeMember<TreeScope> >& treeScopes) | 313 void EventPath::adjustTouchList(const Node* node, const TouchList* touchList, Wi
llBeHeapVector<RawPtrWillBeMember<TouchList>> adjustedTouchList, const WillBeHea
pVector<RawPtrWillBeMember<TreeScope>>& treeScopes) |
| 317 { | 314 { |
| 318 if (!touchList) | 315 if (!touchList) |
| 319 return; | 316 return; |
| 320 for (size_t i = 0; i < touchList->length(); ++i) { | 317 for (size_t i = 0; i < touchList->length(); ++i) { |
| 321 const Touch& touch = *touchList->item(i); | 318 const Touch& touch = *touchList->item(i); |
| 322 RelatedTargetMap relatedNodeMap; | 319 RelatedTargetMap relatedNodeMap; |
| 323 buildRelatedNodeMap(touch.target()->toNode(), relatedNodeMap); | 320 buildRelatedNodeMap(touch.target()->toNode(), relatedNodeMap); |
| 324 for (size_t j = 0; j < treeScopes.size(); ++j) { | 321 for (size_t j = 0; j < treeScopes.size(); ++j) { |
| 325 adjustedTouchList[j]->append(touch.cloneWithNewTarget(findRelatedNod
e(treeScopes[j], relatedNodeMap))); | 322 adjustedTouchList[j]->append(touch.cloneWithNewTarget(findRelatedNod
e(treeScopes[j], relatedNodeMap))); |
| 326 } | 323 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 337 | 334 |
| 338 void EventPath::trace(Visitor* visitor) | 335 void EventPath::trace(Visitor* visitor) |
| 339 { | 336 { |
| 340 visitor->trace(m_nodeEventContexts); | 337 visitor->trace(m_nodeEventContexts); |
| 341 visitor->trace(m_node); | 338 visitor->trace(m_node); |
| 342 visitor->trace(m_event); | 339 visitor->trace(m_event); |
| 343 visitor->trace(m_treeScopeEventContexts); | 340 visitor->trace(m_treeScopeEventContexts); |
| 344 } | 341 } |
| 345 | 342 |
| 346 } // namespace | 343 } // namespace |
| OLD | NEW |