REGRESSION(r230743): Mousemove events are not coalesced properly, mousemove/drag...
authorbburg@apple.com <bburg@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 8 May 2018 21:19:36 +0000 (21:19 +0000)
committerbburg@apple.com <bburg@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 8 May 2018 21:19:36 +0000 (21:19 +0000)
https://bugs.webkit.org/show_bug.cgi?id=185425
<rdar://problem/39323336>

Reviewed by Simon Fraser.

When mousemove events come in faster than they can be processed, we should coalesce
pending mousemoves that have not yet been sent to WebProcess. This has the effect of
processing the most recent mousemove location, which is the old behavior that regressed.

* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::handleMouseEvent):
If there is >1 event in the mouse queue, then the first one is being processed by WebProcess
and the second one is eligible for coalescing. Replace it if the last event and new event
are both mousemoves.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@231511 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit/ChangeLog
Source/WebKit/UIProcess/WebPageProxy.cpp

index ef32ee3..f4a3174 100644 (file)
@@ -1,3 +1,21 @@
+2018-05-08  Brian Burg  <bburg@apple.com>
+
+        REGRESSION(r230743): Mousemove events are not coalesced properly, mousemove/drag is very laggy
+        https://bugs.webkit.org/show_bug.cgi?id=185425
+        <rdar://problem/39323336>
+
+        Reviewed by Simon Fraser.
+
+        When mousemove events come in faster than they can be processed, we should coalesce
+        pending mousemoves that have not yet been sent to WebProcess. This has the effect of
+        processing the most recent mousemove location, which is the old behavior that regressed.
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::handleMouseEvent):
+        If there is >1 event in the mouse queue, then the first one is being processed by WebProcess
+        and the second one is eligible for coalescing. Replace it if the last event and new event
+        are both mousemoves.
+
 2018-05-08  Per Arne Vollan  <pvollan@apple.com>
 
         The PDF context menu should not be created in the WebContent process.
index 30d5860..d7df4cf 100644 (file)
@@ -1928,8 +1928,16 @@ void WebPageProxy::handleMouseEvent(const NativeWebMouseEvent& event)
     if (!isValid())
         return;
 
-    LOG(MouseHandling, "UIProcess: enqueued mouse event %s (queue size %zu)", webMouseEventTypeString(event.type()), m_mouseEventQueue.size());
-    m_mouseEventQueue.append(event);
+    // If we receive multiple mousemove events and the most recent mousemove event has not been
+    // sent to WebProcess for processing, replace the pending mousemove event with a new one.
+    if (event.type() == WebEvent::MouseMove && m_mouseEventQueue.size() > 1 && m_mouseEventQueue.last().type() == WebEvent::MouseMove) {
+        LOG(MouseHandling, "UIProcess: updated pending mousemove event (queue size %zu)", m_mouseEventQueue.size());
+        m_mouseEventQueue.removeLast();
+        m_mouseEventQueue.append(event);
+    } else {
+        LOG(MouseHandling, "UIProcess: enqueued mouse event %s (queue size %zu)", webMouseEventTypeString(event.type()), m_mouseEventQueue.size());
+        m_mouseEventQueue.append(event);
+    }
     if (m_mouseEventQueue.size() == 1) // Otherwise, called from DidReceiveEvent message handler.
         processNextQueuedMouseEvent();
 }