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 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 void EventPath::adjustForRelatedTarget(Node& target, | 293 void EventPath::adjustForRelatedTarget(Node& target, |
294 EventTarget* relatedTarget) { | 294 EventTarget* relatedTarget) { |
295 if (!relatedTarget) | 295 if (!relatedTarget) |
296 return; | 296 return; |
297 Node* relatedNode = relatedTarget->toNode(); | 297 Node* relatedNode = relatedTarget->toNode(); |
298 if (!relatedNode) | 298 if (!relatedNode) |
299 return; | 299 return; |
300 if (target.document() != relatedNode->document()) | 300 if (target.document() != relatedNode->document()) |
301 return; | 301 return; |
302 retargetRelatedTarget(*relatedNode); | 302 retargetRelatedTarget(*relatedNode); |
303 shrinkForRelatedTarget(target, *relatedNode); | 303 shrinkForRelatedTarget(target); |
304 } | 304 } |
305 | 305 |
306 void EventPath::retargetRelatedTarget(const Node& relatedTargetNode) { | 306 void EventPath::retargetRelatedTarget(const Node& relatedTargetNode) { |
307 RelatedTargetMap relatedNodeMap; | 307 RelatedTargetMap relatedNodeMap; |
308 buildRelatedNodeMap(relatedTargetNode, relatedNodeMap); | 308 buildRelatedNodeMap(relatedTargetNode, relatedNodeMap); |
309 | 309 |
310 for (const auto& treeScopeEventContext : m_treeScopeEventContexts) { | 310 for (const auto& treeScopeEventContext : m_treeScopeEventContexts) { |
311 EventTarget* adjustedRelatedTarget = | 311 EventTarget* adjustedRelatedTarget = |
312 findRelatedNode(treeScopeEventContext->treeScope(), relatedNodeMap); | 312 findRelatedNode(treeScopeEventContext->treeScope(), relatedNodeMap); |
313 DCHECK(adjustedRelatedTarget); | 313 DCHECK(adjustedRelatedTarget); |
314 treeScopeEventContext.get()->setRelatedTarget(adjustedRelatedTarget); | 314 treeScopeEventContext.get()->setRelatedTarget(adjustedRelatedTarget); |
315 } | 315 } |
316 } | 316 } |
317 | 317 |
318 void EventPath::shrinkForRelatedTarget(const Node& target, | 318 bool EventPath::shouldStopEventPath(EventTarget& currentTarget, |
319 const Node& relatedTarget) { | 319 EventTarget& currentRelatedTarget, |
320 if (!target.isInShadowTree() && !relatedTarget.isInShadowTree()) | 320 const Node& target) { |
321 return; | 321 if (¤tTarget != ¤tRelatedTarget) |
| 322 return false; |
| 323 if (m_event->isTrusted()) |
| 324 return true; |
| 325 Node* currentTargetNode = currentTarget.toNode(); |
| 326 if (!currentTargetNode) |
| 327 return false; |
| 328 return currentTargetNode->treeScope() != target.treeScope(); |
| 329 } |
| 330 |
| 331 void EventPath::shrinkForRelatedTarget(const Node& target) { |
322 for (size_t i = 0; i < size(); ++i) { | 332 for (size_t i = 0; i < size(); ++i) { |
323 if (at(i).target() == at(i).relatedTarget()) { | 333 if (shouldStopEventPath(*at(i).target(), *at(i).relatedTarget(), target)) { |
324 // Event dispatching should be stopped here. | |
325 shrink(i); | 334 shrink(i); |
326 break; | 335 break; |
327 } | 336 } |
328 } | 337 } |
329 } | 338 } |
330 | 339 |
331 void EventPath::adjustForTouchEvent(TouchEvent& touchEvent) { | 340 void EventPath::adjustForTouchEvent(TouchEvent& touchEvent) { |
332 HeapVector<Member<TouchList>> adjustedTouches; | 341 HeapVector<Member<TouchList>> adjustedTouches; |
333 HeapVector<Member<TouchList>> adjustedTargetTouches; | 342 HeapVector<Member<TouchList>> adjustedTargetTouches; |
334 HeapVector<Member<TouchList>> adjustedChangedTouches; | 343 HeapVector<Member<TouchList>> adjustedChangedTouches; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 | 420 |
412 DEFINE_TRACE(EventPath) { | 421 DEFINE_TRACE(EventPath) { |
413 visitor->trace(m_nodeEventContexts); | 422 visitor->trace(m_nodeEventContexts); |
414 visitor->trace(m_node); | 423 visitor->trace(m_node); |
415 visitor->trace(m_event); | 424 visitor->trace(m_event); |
416 visitor->trace(m_treeScopeEventContexts); | 425 visitor->trace(m_treeScopeEventContexts); |
417 visitor->trace(m_windowEventContext); | 426 visitor->trace(m_windowEventContext); |
418 } | 427 } |
419 | 428 |
420 } // namespace blink | 429 } // namespace blink |
OLD | NEW |