Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1453)

Unified Diff: third_party/WebKit/Source/core/events/EventPath.cpp

Issue 2186823002: Do not call an event listener on a cloned node in svg <use>'s UA shadow tree (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: skip timeout test Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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))
« no previous file with comments | « third_party/WebKit/Source/core/events/EventListenerMap.cpp ('k') | third_party/WebKit/Source/core/svg/SVGUseElement.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698