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..d9b95f3f7b5f1f27281a8bf7c0b49b5224577155 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,25 @@ void EventPath::initializeWith(Node& node, Event* event) |
initialize(); |
} |
-static inline bool eventPathShouldBeEmptyFor(Node& node) |
+static inline bool eventPathShouldBeEmptyFor(Node& node, Event* event) |
{ |
- return node.isPseudoElement() && !node.parentElement(); |
+ if (node.isPseudoElement() && !node.parentElement()) |
+ return true; |
+ |
+ // Do not dispatch non-composed events in SVG use trees. |
+ if (node.isSVGElement()) { |
+ if (toSVGElement(node).inUseShadowTree() && event && !event->composed()) |
+ return true; |
+ } |
+ |
+ return false; |
} |
void EventPath::initialize() |
{ |
- if (eventPathShouldBeEmptyFor(*m_node)) |
+ if (eventPathShouldBeEmptyFor(*m_node, m_event)) |
return; |
+ |
calculatePath(); |
calculateAdjustedTargets(); |
calculateTreeOrderAndSetNearestAncestorClosedTree(); |
@@ -102,6 +113,16 @@ 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 (current->isSVGElement()) { |
+ SVGUseElement* correspondingUseElement = toSVGElement(current)->correspondingUseElement(); |
+ if (!correspondingUseElement) |
+ break; |
+ current = correspondingUseElement; |
+ } |
+ |
nodesInPath.append(current); |
while (current) { |
if (m_event && current->keepEventInNode(m_event)) |