Index: third_party/WebKit/Source/core/events/MouseEvent.h |
diff --git a/third_party/WebKit/Source/core/events/MouseEvent.h b/third_party/WebKit/Source/core/events/MouseEvent.h |
index 25c0a4f1aa7ce93aaa5ec55c4099b7fe1f7611ea..d554587dba68ea3232293eecbda8b40f5d901209 100644 |
--- a/third_party/WebKit/Source/core/events/MouseEvent.h |
+++ b/third_party/WebKit/Source/core/events/MouseEvent.h |
@@ -27,14 +27,14 @@ |
#include "core/CoreExport.h" |
#include "core/events/EventDispatchMediator.h" |
#include "core/events/MouseEventInit.h" |
-#include "core/events/MouseRelatedEvent.h" |
+#include "core/events/UIEventWithKeyState.h" |
#include "platform/PlatformMouseEvent.h" |
namespace blink { |
class DataTransfer; |
class EventDispatcher; |
-class CORE_EXPORT MouseEvent : public MouseRelatedEvent { |
+class CORE_EXPORT MouseEvent : public UIEventWithKeyState { |
DEFINE_WRAPPERTYPEINFO(); |
public: |
@@ -134,6 +134,64 @@ class CORE_EXPORT MouseEvent : public MouseRelatedEvent { |
const PlatformMouseEvent* mouseEvent() const { return m_mouseEvent.get(); } |
+ enum class PositionType { |
+ Position, |
+ // Positionless mouse events are used, for example, for 'click' events from |
+ // keyboard input. It's kind of surprising for a mouse event not to have a |
+ // position. |
+ Positionless |
+ }; |
+ |
+ // Note that these values are adjusted to counter the effects of zoom, so that |
+ // values exposed via DOM APIs are invariant under zooming. |
+ // TODO(mustaq): Remove the PointerEvent specific code when mouse has |
+ // fractional coordinates. See crbug.com/655786. |
+ double screenX() const { |
+ return isPointerEvent() ? m_screenLocation.x() |
+ : static_cast<int>(m_screenLocation.x()); |
+ } |
+ double screenY() const { |
+ return isPointerEvent() ? m_screenLocation.y() |
+ : static_cast<int>(m_screenLocation.y()); |
+ } |
+ |
+ double clientX() const { |
+ return isPointerEvent() ? m_clientLocation.x() |
+ : static_cast<int>(m_clientLocation.x()); |
+ } |
+ double clientY() const { |
+ return isPointerEvent() ? m_clientLocation.y() |
+ : static_cast<int>(m_clientLocation.y()); |
+ } |
+ |
+ int movementX() const { return m_movementDelta.x(); } |
+ int movementY() const { return m_movementDelta.y(); } |
+ |
+ int layerX(); |
+ int layerY(); |
+ |
+ int offsetX(); |
+ int offsetY(); |
+ |
+ double pageX() const { |
+ return isPointerEvent() ? m_pageLocation.x() |
+ : static_cast<int>(m_pageLocation.x()); |
+ } |
+ double pageY() const { |
+ return isPointerEvent() ? m_pageLocation.y() |
+ : static_cast<int>(m_pageLocation.y()); |
+ } |
+ |
+ double x() const { return clientX(); } |
+ double y() const { return clientY(); } |
+ |
+ bool hasPosition() const { return m_positionType == PositionType::Position; } |
+ |
+ // Page point in "absolute" coordinates (i.e. post-zoomed, page-relative |
+ // coords, usable with LayoutObject::absoluteToLocal) relative to view(), i.e. |
+ // the local frame. |
+ const DoublePoint& absoluteLocation() const { return m_absoluteLocation; } |
+ |
DECLARE_VIRTUAL_TRACE(); |
protected: |
@@ -180,6 +238,22 @@ class CORE_EXPORT MouseEvent : public MouseRelatedEvent { |
InputDeviceCapabilities* sourceCapabilities, |
unsigned short buttons = 0); |
+ void initCoordinates(const double clientX, const double clientY); |
+ void receivedTarget() final; |
+ |
+ void computePageLocation(); |
+ void computeRelativePosition(); |
+ |
+ DoublePoint m_screenLocation; |
+ DoublePoint m_clientLocation; |
+ DoublePoint m_movementDelta; |
+ |
+ DoublePoint m_pageLocation; |
+ DoublePoint m_layerLocation; |
+ DoublePoint m_offsetLocation; |
+ DoublePoint m_absoluteLocation; |
+ PositionType m_positionType; |
+ bool m_hasCachedRelativePosition; |
short m_button; |
unsigned short m_buttons; |
Member<EventTarget> m_relatedTarget; |