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 5a18188771175f635344fb342c9b6c0b0ac91bbf..33e42c7c50b82523e12f95a44f3f1d7885518270 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 { |
@@ -128,6 +130,25 @@ void PointerEventManager::sendMouseAndPossiblyPointerNodeTransitionEvents( |
exitedNode, mouseEvent, true, isFrameBoundaryTransition); |
} |
+PlatformMouseEvent PointerEventManager::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; |
+} |
+ |
void PointerEventManager::sendNodeTransitionEvents( |
PassRefPtrWillBeRawPtr<EventTarget> prpExitedTarget, |
PassRefPtrWillBeRawPtr<EventTarget> prpEnteredTarget, |
@@ -157,7 +178,9 @@ void PointerEventManager::sendNodeTransitionEvents( |
pointerEvent, EventTypeNames::pointerout, enteredTarget)); |
} else { |
dispatchMouseEvent(exitedTarget, |
- EventTypeNames::mouseout, mouseEvent, enteredTarget); |
+ EventTypeNames::mouseout, |
+ mouseEventWithRegion(exitedTarget->toNode(), mouseEvent), |
+ enteredTarget); |
} |
} |
@@ -226,8 +249,9 @@ void PointerEventManager::sendNodeTransitionEvents( |
!exitedNodeHasCapturingAncestor); |
} else { |
dispatchMouseEvent(exitedAncestors[j].get(), |
- EventTypeNames::mouseleave, mouseEvent, enteredTarget, |
- 0, !exitedNodeHasCapturingAncestor); |
+ EventTypeNames::mouseleave, |
+ mouseEventWithRegion(exitedTarget->toNode(), mouseEvent), |
+ enteredTarget, 0, !exitedNodeHasCapturingAncestor); |
} |
} |