Chromium Code Reviews| Index: third_party/WebKit/Source/core/events/EventPath.cpp |
| diff --git a/third_party/WebKit/Source/core/events/EventPath.cpp b/third_party/WebKit/Source/core/events/EventPath.cpp |
| index 91eb910123dbf79a5181116ccee8aea8c401d926..f45763f5d32e21fd5622a1432e1c86937a8eff29 100644 |
| --- a/third_party/WebKit/Source/core/events/EventPath.cpp |
| +++ b/third_party/WebKit/Source/core/events/EventPath.cpp |
| @@ -35,6 +35,7 @@ |
| #include "core/events/TouchEvent.h" |
| #include "core/events/TouchEventContext.h" |
| #include "core/html/HTMLSlotElement.h" |
| +#include "core/svg/SVGUseElement.h" |
| namespace blink { |
| @@ -76,15 +77,23 @@ void EventPath::initializeWith(Node& node, Event* event) |
| initialize(); |
| } |
| -static inline bool eventPathShouldBeEmptyFor(Node& node) |
| +static inline bool isInSVGUseShadowTree(Node& node) |
| { |
| - return node.isPseudoElement() && !node.parentElement(); |
| + if (ShadowRoot* root = node.containingShadowRoot()) |
| + return root->type() == ShadowRootType::UserAgent && isSVGUseElement(root->host()); |
| + return false; |
| +} |
| + |
| +static inline bool eventPathShouldBeEmptyFor(Node& node, Event* event) |
| +{ |
| + return (node.isPseudoElement() && !node.parentElement()) || (isInSVGUseShadowTree(node) && event && !event->composed()); |
|
pdr.
2016/07/30 04:02:42
WDYT of breaking these two complex cases apart as
hayato
2016/08/01 03:44:10
Sounds nice. Done
|
| } |
| void EventPath::initialize() |
| { |
| - if (eventPathShouldBeEmptyFor(*m_node)) |
| + if (eventPathShouldBeEmptyFor(*m_node, m_event)) |
| return; |
| + |
| calculatePath(); |
| calculateAdjustedTargets(); |
| calculateTreeOrderAndSetNearestAncestorClosedTree(); |
| @@ -102,6 +111,12 @@ void EventPath::calculatePath() |
| // storing it in a perfectly sized m_nodeEventContexts Vector. |
| HeapVector<Member<Node>, 64> nodesInPath; |
| Node* current = m_node; |
| + |
| + // Exclude nodes in SVG <use>'s shadow tree from event path. |
| + // See crbug.com/630870 |
| + while (isInSVGUseShadowTree(*current)) |
|
pdr.
2016/07/30 04:02:42
I think this can be rewritten using existing apis
hayato
2016/08/01 03:44:10
Thanks! Done.
|
| + current = ¤t->containingShadowRoot()->host(); |
| + |
| nodesInPath.append(current); |
| while (current) { |
| if (m_event && current->keepEventInNode(m_event)) |