Index: third_party/WebKit/Source/core/input/PointerEventManager.cpp |
diff --git a/third_party/WebKit/Source/core/input/PointerEventManager.cpp b/third_party/WebKit/Source/core/input/PointerEventManager.cpp |
index 7e47ca1262db223305a146c552435bad1dd47e56..8a1ecee6972e5d68721b2cdf4e57ca9c6a29d8d9 100644 |
--- a/third_party/WebKit/Source/core/input/PointerEventManager.cpp |
+++ b/third_party/WebKit/Source/core/input/PointerEventManager.cpp |
@@ -4,8 +4,10 @@ |
#include "core/input/PointerEventManager.h" |
+#include "core/dom/ElementTraversal.h" |
#include "core/dom/shadow/FlatTreeTraversal.h" |
#include "core/events/MouseEvent.h" |
+#include "core/html/HTMLCanvasElement.h" |
#include "core/input/EventHandler.h" |
namespace blink { |
@@ -58,6 +60,25 @@ WebInputEventResult dispatchMouseEvent( |
return WebInputEventResult::NotHandled; |
} |
+PlatformMouseEvent mouseEventWithRegion(Node* node, const PlatformMouseEvent& mouseEvent) |
+{ |
+ if (!node->isElementNode()) |
+ return mouseEvent; |
+ |
+ Element* element = toElement(node); |
+ if (!element->isInCanvasSubtree()) |
+ return mouseEvent; |
+ |
+ HTMLCanvasElement* canvas = Traversal<HTMLCanvasElement>::firstAncestorOrSelf(*element); |
+ // In this case, the event target is canvas and mouse rerouting doesn't happen. |
+ if (canvas == element) |
+ return mouseEvent; |
+ String region = canvas->getIdFromControl(element); |
+ PlatformMouseEvent newMouseEvent = mouseEvent; |
+ newMouseEvent.setRegion(region); |
+ return newMouseEvent; |
+} |
+ |
} // namespace |
WebInputEventResult PointerEventManager::dispatchPointerEvent( |
@@ -159,7 +180,9 @@ void PointerEventManager::sendNodeTransitionEvents( |
pointerEvent, EventTypeNames::pointerout, enteredTarget)); |
if (sendMouseEvent) { |
dispatchMouseEvent(exitedTarget, |
- EventTypeNames::mouseout, mouseEvent, enteredTarget); |
+ EventTypeNames::mouseout, |
+ mouseEventWithRegion(exitedTarget->toNode(), mouseEvent), |
+ enteredTarget); |
} |
} |
@@ -227,8 +250,9 @@ void PointerEventManager::sendNodeTransitionEvents( |
!exitedNodeHasCapturingAncestor); |
if (sendMouseEvent) { |
dispatchMouseEvent(exitedAncestors[j].get(), |
- EventTypeNames::mouseleave, mouseEvent, enteredTarget, |
- 0, !exitedNodeHasCapturingAncestor); |
+ EventTypeNames::mouseleave, |
+ mouseEventWithRegion(exitedTarget->toNode(), mouseEvent), |
+ enteredTarget, 0, !exitedNodeHasCapturingAncestor); |
} |
} |