Modified: trunk/Source/WebCore/ChangeLog (118610 => 118611)
--- trunk/Source/WebCore/ChangeLog 2012-05-26 15:34:56 UTC (rev 118610)
+++ trunk/Source/WebCore/ChangeLog 2012-05-26 17:14:05 UTC (rev 118611)
@@ -1,3 +1,26 @@
+2012-05-25 Dan Bernstein <[email protected]>
+
+ <rdar://problem/11439771> WebProcess sends many synchronous messages to the UI process while scrolling beneath ScrollView::contentsToScreen()
+ https://bugs.webkit.org/show_bug.cgi?id=87571
+
+ Reviewed by Anders Carlsson.
+
+ fakeMouseEventTimerFired() uses the last known mouse position for the fake mouse event, but
+ calls contentsToScreen() to compute a corresponding position in screen coordinates. Avoid
+ this by also recording the last known mouse position in screen coordinates, and using that
+ value.
+
+ * page/EventHandler.cpp:
+ (WebCore::EventHandler::clear): Added resetting m_currentMouseGlobalPosition.
+ (WebCore::EventHandler::handleMousePressEvent): Added updating m_currentMouseGlobalPosition
+ when updating m_currentMousePosition.
+ (WebCore::EventHandler::handleMouseDoubleClickEvent): Ditto.
+ (WebCore::EventHandler::handleMouseMoveEvent): Ditto.
+ (WebCore::EventHandler::handleMouseReleaseEvent): Ditto.
+ (WebCore::EventHandler::fakeMouseMoveEventTimerFired): Changed to use m_currentMouseGlobalPosition
+ in the fake event instead of calling contentsToScreen().
+ * page/EventHandler.h: Added m_currentMouseGlobalPosition data member.
+
2012-05-25 Philippe Normand <[email protected]>
[GStreamer] Remove ImageGStreamerCG implementation
Modified: trunk/Source/WebCore/page/EventHandler.cpp (118610 => 118611)
--- trunk/Source/WebCore/page/EventHandler.cpp 2012-05-26 15:34:56 UTC (rev 118610)
+++ trunk/Source/WebCore/page/EventHandler.cpp 2012-05-26 17:14:05 UTC (rev 118611)
@@ -357,6 +357,7 @@
m_shouldOnlyFireDragOverEvent = false;
#endif
m_currentMousePosition = IntPoint();
+ m_currentMouseGlobalPosition = IntPoint();
m_mousePressNode = 0;
m_mousePressed = false;
m_capturesDragging = false;
@@ -1498,6 +1499,7 @@
m_mousePressed = true;
m_capturesDragging = true;
m_currentMousePosition = mouseEvent.position();
+ m_currentMouseGlobalPosition = mouseEvent.globalPosition();
m_mouseDownTimestamp = mouseEvent.timestamp();
#if ENABLE(DRAG_SUPPORT)
m_mouseDownMayStartDrag = false;
@@ -1631,6 +1633,7 @@
// We get this instead of a second mouse-up
m_mousePressed = false;
m_currentMousePosition = mouseEvent.position();
+ m_currentMouseGlobalPosition = mouseEvent.globalPosition();
HitTestRequest request(HitTestRequest::Active);
MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseEvent);
@@ -1725,6 +1728,7 @@
RefPtr<FrameView> protector(m_frame->view());
m_currentMousePosition = mouseEvent.position();
+ m_currentMouseGlobalPosition = mouseEvent.globalPosition();
if (m_hoverTimer.isActive())
m_hoverTimer.stop();
@@ -1848,6 +1852,7 @@
m_mousePressed = false;
m_currentMousePosition = mouseEvent.position();
+ m_currentMouseGlobalPosition = mouseEvent.globalPosition();
#if ENABLE(SVG)
if (m_svgPan) {
@@ -2668,8 +2673,7 @@
bool altKey;
bool metaKey;
PlatformKeyboardEvent::getCurrentModifierState(shiftKey, ctrlKey, altKey, metaKey);
- IntPoint globalPoint = view->contentsToScreen(IntRect(view->windowToContents(m_currentMousePosition), IntSize())).location();
- PlatformMouseEvent fakeMouseMoveEvent(m_currentMousePosition, globalPoint, NoButton, PlatformEvent::MouseMoved, 0, shiftKey, ctrlKey, altKey, metaKey, currentTime());
+ PlatformMouseEvent fakeMouseMoveEvent(m_currentMousePosition, m_currentMouseGlobalPosition, NoButton, PlatformEvent::MouseMoved, 0, shiftKey, ctrlKey, altKey, metaKey, currentTime());
mouseMoved(fakeMouseMoveEvent);
}
Modified: trunk/Source/WebCore/page/EventHandler.h (118610 => 118611)
--- trunk/Source/WebCore/page/EventHandler.h 2012-05-26 15:34:56 UTC (rev 118610)
+++ trunk/Source/WebCore/page/EventHandler.h 2012-05-26 17:14:05 UTC (rev 118611)
@@ -425,6 +425,7 @@
LayoutSize m_offsetFromResizeCorner; // In the coords of m_resizeLayer.
IntPoint m_currentMousePosition;
+ IntPoint m_currentMouseGlobalPosition;
IntPoint m_mouseDownPos; // In our view's coords.
double m_mouseDownTimestamp;
PlatformMouseEvent m_mouseDown;