[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-10851-g50815da

weinig at apple.com weinig at apple.com
Wed Dec 22 18:27:16 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit d252730dd6fc64df4494d9374ae3acfffb72c3b1
Author: weinig at apple.com <weinig at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Sat Dec 11 02:14:22 2010 +0000

    Ensure that we are not getting too many wheel events
    <rdar://problem/7881465>
    
    Reviewed by Anders Carlsson.
    
    Add simple coalescing of wheel events being sent to the WebProcess. This
    adds two models, one which drops interim events and one which merges events
    together. For now, we are using the simpler dropping model.
    
    * Shared/WebEvent.h:
    (WebKit::WebEvent::modifiers):
    * UIProcess/WebPageProxy.cpp:
    (WebKit::WebPageProxy::WebPageProxy):
    (WebKit::coalesceWheelEvents):
    (WebKit::WebPageProxy::handleWheelEvent):
    (WebKit::WebPageProxy::didReceiveEvent):
    * UIProcess/WebPageProxy.h:
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@73828 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index 00f9652..02f4ec3 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,3 +1,23 @@
+2010-12-10  Sam Weinig  <sam at webkit.org>
+
+        Reviewed by Anders Carlsson.
+
+        Ensure that we are not getting too many wheel events
+        <rdar://problem/7881465>
+
+        Add simple coalescing of wheel events being sent to the WebProcess. This 
+        adds two models, one which drops interim events and one which merges events
+        together. For now, we are using the simpler dropping model.
+
+        * Shared/WebEvent.h:
+        (WebKit::WebEvent::modifiers):
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::WebPageProxy):
+        (WebKit::coalesceWheelEvents):
+        (WebKit::WebPageProxy::handleWheelEvent):
+        (WebKit::WebPageProxy::didReceiveEvent):
+        * UIProcess/WebPageProxy.h:
+
 2010-12-10  Anders Carlsson  <andersca at apple.com>
 
         Reviewed by John Sullivan.
diff --git a/WebKit2/Shared/WebEvent.h b/WebKit2/Shared/WebEvent.h
index 1b9ca9a..caee65f 100644
--- a/WebKit2/Shared/WebEvent.h
+++ b/WebKit2/Shared/WebEvent.h
@@ -79,6 +79,8 @@ public:
     bool altKey() const { return m_modifiers & AltKey; }
     bool metaKey() const { return m_modifiers & MetaKey; }
 
+    Modifiers modifiers() const { return static_cast<Modifiers>(m_modifiers); }
+
     double timestamp() const { return m_timestamp; }
 
 protected:
diff --git a/WebKit2/UIProcess/WebPageProxy.cpp b/WebKit2/UIProcess/WebPageProxy.cpp
index fd54982..5ac0991 100644
--- a/WebKit2/UIProcess/WebPageProxy.cpp
+++ b/WebKit2/UIProcess/WebPageProxy.cpp
@@ -70,6 +70,9 @@
 #include <wtf/RefCountedLeakCounter.h>
 #endif
 
+// This controls what strategy we use for mouse wheel coalesing.
+#define MERGE_WHEEL_EVENTS 0
+
 using namespace WebCore;
 
 namespace WebKit {
@@ -102,6 +105,7 @@ WebPageProxy::WebPageProxy(WebPageNamespace* pageNamespace, WebPageGroup* pageGr
     , m_syncMimeTypePolicyActionIsValid(false)
     , m_syncMimeTypePolicyAction(PolicyUse)
     , m_syncMimeTypePolicyDownloadID(0)
+    , m_processingWheelEvent(false)
     , m_pageID(pageID)
 {
 #ifndef NDEBUG
@@ -522,13 +526,39 @@ void WebPageProxy::handleMouseEvent(const WebMouseEvent& event)
     process()->send(Messages::WebPage::MouseEvent(event), m_pageID);
 }
 
+static PassOwnPtr<WebWheelEvent> coalesceWheelEvents(WebWheelEvent* oldNextWheelEvent, const WebWheelEvent& newWheelEvent)
+{
+#if MERGE_WHEEL_EVENTS
+    // Merge model: Combine wheel event deltas (and wheel ticks) into a single wheel event.
+    if (!oldNextWheelEvent)
+        return adoptPtr(new WebWheelEvent(newWheelEvent));
+
+    if (oldNextWheelEvent->position() != newWheelEvent.position() || oldNextWheelEvent->modifiers() != newWheelEvent.modifiers() || oldNextWheelEvent->granularity() != newWheelEvent.granularity())
+        return adoptPtr(new WebWheelEvent(newWheelEvent));
+
+    FloatSize mergedDelta = oldNextWheelEvent->delta() + newWheelEvent.delta();
+    FloatSize mergedWheelTicks = oldNextWheelEvent->wheelTicks() + newWheelEvent.wheelTicks();
+
+    return adoptPtr(new WebWheelEvent(WebEvent::Wheel, newWheelEvent.position(), newWheelEvent.globalPosition(), mergedDelta, mergedWheelTicks, newWheelEvent.granularity(), newWheelEvent.modifiers(), newWheelEvent.timestamp()));
+#else
+    // Simple model: Just keep the last event, dropping all interim events.
+    return adoptPtr(new WebWheelEvent(newWheelEvent));
+#endif
+}
+
 void WebPageProxy::handleWheelEvent(const WebWheelEvent& event)
 {
     if (!isValid())
         return;
 
+    if (m_processingWheelEvent) {
+        m_nextWheelEvent = coalesceWheelEvents(m_nextWheelEvent.get(), event);
+        return;
+    }
+
     process()->responsivenessTimer()->start();
     process()->send(Messages::WebPage::WheelEvent(event), m_pageID);
+    m_processingWheelEvent = true;
 }
 
 void WebPageProxy::handleKeyboardEvent(const NativeWebKeyboardEvent& event)
@@ -1417,32 +1447,51 @@ void WebPageProxy::didReceiveEvent(uint32_t opaqueType, bool handled)
     WebEvent::Type type = static_cast<WebEvent::Type>(opaqueType);
 
     switch (type) {
-        case WebEvent::MouseMove:
-            break;
-
-        case WebEvent::MouseDown:
-        case WebEvent::MouseUp:
-        case WebEvent::Wheel:
-        case WebEvent::KeyDown:
-        case WebEvent::KeyUp:
-        case WebEvent::RawKeyDown:
-        case WebEvent::Char:
-            process()->responsivenessTimer()->stop();
-            break;
+    case WebEvent::MouseMove:
+        break;
+
+    case WebEvent::MouseDown:
+    case WebEvent::MouseUp:
+    case WebEvent::Wheel:
+    case WebEvent::KeyDown:
+    case WebEvent::KeyUp:
+    case WebEvent::RawKeyDown:
+    case WebEvent::Char:
+        process()->responsivenessTimer()->stop();
+        break;
     }
 
-    if (!WebKeyboardEvent::isKeyboardEventType(type))
-        return;
+    switch (type) {
+    case WebEvent::MouseMove:
+    case WebEvent::MouseDown:
+    case WebEvent::MouseUp:
+        break;
+
+    case WebEvent::Wheel: {
+        m_processingWheelEvent = false;
+        if (m_nextWheelEvent) {
+            handleWheelEvent(*m_nextWheelEvent);
+            m_nextWheelEvent.clear();
+        }
+        break;
+    }
 
-    NativeWebKeyboardEvent event = m_keyEventQueue.first();
-    ASSERT(type == event.type());
-    m_keyEventQueue.removeFirst();
+    case WebEvent::KeyDown:
+    case WebEvent::KeyUp:
+    case WebEvent::RawKeyDown:
+    case WebEvent::Char: {
+        NativeWebKeyboardEvent event = m_keyEventQueue.first();
+        ASSERT(type == event.type());
+        m_keyEventQueue.removeFirst();
 
-    if (handled)
-        return;
+        if (handled)
+            break;
 
-    m_pageClient->didNotHandleKeyEvent(event);
-    m_uiClient.didNotHandleKeyEvent(this, event);
+        m_pageClient->didNotHandleKeyEvent(event);
+        m_uiClient.didNotHandleKeyEvent(this, event);
+        break;
+    }
+    }
 }
 
 void WebPageProxy::didGetContentsAsString(const String& resultString, uint64_t callbackID)
diff --git a/WebKit2/UIProcess/WebPageProxy.h b/WebKit2/UIProcess/WebPageProxy.h
index fd59719..7f9a57b 100644
--- a/WebKit2/UIProcess/WebPageProxy.h
+++ b/WebKit2/UIProcess/WebPageProxy.h
@@ -459,9 +459,11 @@ private:
     WebCore::PolicyAction m_syncMimeTypePolicyAction;
     uint64_t m_syncMimeTypePolicyDownloadID;
 
-    uint64_t m_pageID;
-
     Deque<NativeWebKeyboardEvent> m_keyEventQueue;
+    bool m_processingWheelEvent;
+    OwnPtr<WebWheelEvent> m_nextWheelEvent;
+
+    uint64_t m_pageID;
 };
 
 } // namespace WebKit

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list