<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[199810] trunk/Source/WebKit2</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/199810">199810</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2016-04-21 03:50:59 -0700 (Thu, 21 Apr 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[GTK] WebKitWebView should propagate wheel events not handled by the web process
https://bugs.webkit.org/show_bug.cgi?id=156834

Reviewed by Žan Doberšek.

We are currently swallowing all wheel events unconditionally, not allowing applications to handle wheel events
when not handled by us. Since the GTK+ event propagation system is synchronous, and our events are handled
asynchronously, we need to do something similar to what we do for key events, not propagate the event the first
time and if not handled by the web process, re-inject it in the event loop and then just propagate it.

* Shared/NativeWebWheelEvent.h:
(WebKit::NativeWebWheelEvent::nativeEvent): Remove useless const.
* UIProcess/API/gtk/PageClientImpl.cpp:
(WebKit::PageClientImpl::wheelEventWasNotHandledByWebCore): Tell the web view to propagate the next wheel event,
and re-inject the event not handled by the web process in the event loop.
* UIProcess/API/gtk/PageClientImpl.h:
* UIProcess/API/gtk/WebKitWebViewBase.cpp:
(webkitWebViewBaseScrollEvent): Propagate the event if shouldForwardNextWheelEvent is true.
(webkitWebViewBaseForwardNextWheelEvent): Set shouldForwardNextWheelEvent to true.
* UIProcess/API/gtk/WebKitWebViewBasePrivate.h:
* UIProcess/PageClient.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::didReceiveEvent): Remove ifdef.
* UIProcess/efl/WebView.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2SharedNativeWebWheelEventh">trunk/Source/WebKit2/Shared/NativeWebWheelEvent.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkPageClientImplcpp">trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkPageClientImplh">trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewBasecpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewBasePrivateh">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessPageClienth">trunk/Source/WebKit2/UIProcess/PageClient.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxycpp">trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcesseflWebViewh">trunk/Source/WebKit2/UIProcess/efl/WebView.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (199809 => 199810)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-04-21 08:41:14 UTC (rev 199809)
+++ trunk/Source/WebKit2/ChangeLog        2016-04-21 10:50:59 UTC (rev 199810)
</span><span class="lines">@@ -1,3 +1,30 @@
</span><ins>+2016-04-21  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [GTK] WebKitWebView should propagate wheel events not handled by the web process
+        https://bugs.webkit.org/show_bug.cgi?id=156834
+
+        Reviewed by Žan Doberšek.
+
+        We are currently swallowing all wheel events unconditionally, not allowing applications to handle wheel events
+        when not handled by us. Since the GTK+ event propagation system is synchronous, and our events are handled
+        asynchronously, we need to do something similar to what we do for key events, not propagate the event the first
+        time and if not handled by the web process, re-inject it in the event loop and then just propagate it.
+
+        * Shared/NativeWebWheelEvent.h:
+        (WebKit::NativeWebWheelEvent::nativeEvent): Remove useless const.
+        * UIProcess/API/gtk/PageClientImpl.cpp:
+        (WebKit::PageClientImpl::wheelEventWasNotHandledByWebCore): Tell the web view to propagate the next wheel event,
+        and re-inject the event not handled by the web process in the event loop.
+        * UIProcess/API/gtk/PageClientImpl.h:
+        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
+        (webkitWebViewBaseScrollEvent): Propagate the event if shouldForwardNextWheelEvent is true.
+        (webkitWebViewBaseForwardNextWheelEvent): Set shouldForwardNextWheelEvent to true.
+        * UIProcess/API/gtk/WebKitWebViewBasePrivate.h:
+        * UIProcess/PageClient.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::didReceiveEvent): Remove ifdef.
+        * UIProcess/efl/WebView.h:
+
</ins><span class="cx"> 2016-04-20  Dustin Falgout  &lt;dustin@falgout.us&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] Expose AllowUniversalAccessFromFileURLs preference now that calling localStorage.getItem() results in SecurityError: DOM Exception 18
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedNativeWebWheelEventh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/NativeWebWheelEvent.h (199809 => 199810)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/NativeWebWheelEvent.h        2016-04-21 08:41:14 UTC (rev 199809)
+++ trunk/Source/WebKit2/Shared/NativeWebWheelEvent.h        2016-04-21 10:50:59 UTC (rev 199810)
</span><span class="lines">@@ -59,7 +59,7 @@
</span><span class="cx"> #if USE(APPKIT)
</span><span class="cx">     NSEvent* nativeEvent() const { return m_nativeEvent.get(); }
</span><span class="cx"> #elif PLATFORM(GTK)
</span><del>-    const GdkEvent* nativeEvent() const { return m_nativeEvent.get(); }
</del><ins>+    GdkEvent* nativeEvent() const { return m_nativeEvent.get(); }
</ins><span class="cx"> #elif PLATFORM(EFL)
</span><span class="cx">     const Evas_Event_Mouse_Wheel* nativeEvent() const { return m_nativeEvent; }
</span><span class="cx"> #elif PLATFORM(IOS)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkPageClientImplcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp (199809 => 199810)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp        2016-04-21 08:41:14 UTC (rev 199809)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp        2016-04-21 10:50:59 UTC (rev 199810)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &quot;DrawingAreaProxyImpl.h&quot;
</span><span class="cx"> #include &quot;NativeWebKeyboardEvent.h&quot;
</span><span class="cx"> #include &quot;NativeWebMouseEvent.h&quot;
</span><ins>+#include &quot;NativeWebWheelEvent.h&quot;
</ins><span class="cx"> #include &quot;NotImplemented.h&quot;
</span><span class="cx"> #include &quot;WebColorPickerGtk.h&quot;
</span><span class="cx"> #include &quot;WebContextMenuProxyGtk.h&quot;
</span><span class="lines">@@ -377,6 +378,12 @@
</span><span class="cx"> }
</span><span class="cx"> #endif // ENABLE(TOUCH_EVENTS)
</span><span class="cx"> 
</span><ins>+void PageClientImpl::wheelEventWasNotHandledByWebCore(const NativeWebWheelEvent&amp; event)
+{
+    webkitWebViewBaseForwardNextWheelEvent(WEBKIT_WEB_VIEW_BASE(m_viewWidget));
+    gtk_main_do_event(event.nativeEvent());
+}
+
</ins><span class="cx"> void PageClientImpl::didFinishLoadingDataForCustomContentProvider(const String&amp;, const IPC::DataReference&amp;)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkPageClientImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.h (199809 => 199810)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.h        2016-04-21 08:41:14 UTC (rev 199809)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.h        2016-04-21 10:50:59 UTC (rev 199810)
</span><span class="lines">@@ -131,6 +131,8 @@
</span><span class="cx">     void doneWithTouchEvent(const NativeWebTouchEvent&amp;, bool wasEventHandled) override;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    void wheelEventWasNotHandledByWebCore(const NativeWebWheelEvent&amp;) override;
+
</ins><span class="cx">     void didChangeBackgroundColor() override;
</span><span class="cx"> 
</span><span class="cx">     void refView() override;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp (199809 => 199810)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp        2016-04-21 08:41:14 UTC (rev 199809)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp        2016-04-21 10:50:59 UTC (rev 199810)
</span><span class="lines">@@ -177,6 +177,7 @@
</span><span class="cx">     std::unique_ptr&lt;PageClientImpl&gt; pageClient;
</span><span class="cx">     RefPtr&lt;WebPageProxy&gt; pageProxy;
</span><span class="cx">     bool shouldForwardNextKeyEvent;
</span><ins>+    bool shouldForwardNextWheelEvent;
</ins><span class="cx">     ClickCounter clickCounter;
</span><span class="cx">     CString tooltipText;
</span><span class="cx">     IntRect tooltipArea;
</span><span class="lines">@@ -853,8 +854,11 @@
</span><span class="cx">     WebKitWebViewBase* webViewBase = WEBKIT_WEB_VIEW_BASE(widget);
</span><span class="cx">     WebKitWebViewBasePrivate* priv = webViewBase-&gt;priv;
</span><span class="cx"> 
</span><ins>+    if (std::exchange(priv-&gt;shouldForwardNextWheelEvent, false))
+        return FALSE;
+
</ins><span class="cx">     if (priv-&gt;authenticationDialog)
</span><del>-        return TRUE;
</del><ins>+        return FALSE;
</ins><span class="cx"> 
</span><span class="cx">     priv-&gt;pageProxy-&gt;handleWheelEvent(NativeWebWheelEvent(reinterpret_cast&lt;GdkEvent*&gt;(event)));
</span><span class="cx"> 
</span><span class="lines">@@ -1283,6 +1287,11 @@
</span><span class="cx">     webkitWebViewBase-&gt;priv-&gt;shouldForwardNextKeyEvent = TRUE;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void webkitWebViewBaseForwardNextWheelEvent(WebKitWebViewBase* webkitWebViewBase)
+{
+    webkitWebViewBase-&gt;priv-&gt;shouldForwardNextWheelEvent = true;
+}
+
</ins><span class="cx"> #if ENABLE(FULLSCREEN_API)
</span><span class="cx"> static void screenSaverInhibitedCallback(GDBusProxy* screenSaverProxy, GAsyncResult* result, WebKitWebViewBase* webViewBase)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewBasePrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h (199809 => 199810)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h        2016-04-21 08:41:14 UTC (rev 199809)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h        2016-04-21 10:50:59 UTC (rev 199810)
</span><span class="lines">@@ -44,6 +44,7 @@
</span><span class="cx"> void webkitWebViewBaseSetTooltipText(WebKitWebViewBase*, const char*);
</span><span class="cx"> void webkitWebViewBaseSetTooltipArea(WebKitWebViewBase*, const WebCore::IntRect&amp;);
</span><span class="cx"> void webkitWebViewBaseForwardNextKeyEvent(WebKitWebViewBase*);
</span><ins>+void webkitWebViewBaseForwardNextWheelEvent(WebKitWebViewBase*);
</ins><span class="cx"> void webkitWebViewBaseChildMoveResize(WebKitWebViewBase*, GtkWidget*, const WebCore::IntRect&amp;);
</span><span class="cx"> void webkitWebViewBaseEnterFullScreen(WebKitWebViewBase*);
</span><span class="cx"> void webkitWebViewBaseExitFullScreen(WebKitWebViewBase*);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessPageClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/PageClient.h (199809 => 199810)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/PageClient.h        2016-04-21 08:41:14 UTC (rev 199809)
+++ trunk/Source/WebKit2/UIProcess/PageClient.h        2016-04-21 10:50:59 UTC (rev 199810)
</span><span class="lines">@@ -168,6 +168,7 @@
</span><span class="cx">     virtual void clearAllEditCommands() = 0;
</span><span class="cx">     virtual bool canUndoRedo(WebPageProxy::UndoOrRedo) = 0;
</span><span class="cx">     virtual void executeUndoRedo(WebPageProxy::UndoOrRedo) = 0;
</span><ins>+    virtual void wheelEventWasNotHandledByWebCore(const NativeWebWheelEvent&amp;) = 0;
</ins><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx">     virtual void accessibilityWebProcessTokenReceived(const IPC::DataReference&amp;) = 0;
</span><span class="cx">     virtual bool executeSavedCommandBySelector(const String&amp; selector) = 0;
</span><span class="lines">@@ -179,7 +180,6 @@
</span><span class="cx">     virtual void setAcceleratedCompositingRootLayer(LayerOrView *) = 0;
</span><span class="cx">     virtual LayerOrView *acceleratedCompositingRootLayer() const = 0;
</span><span class="cx">     virtual PassRefPtr&lt;ViewSnapshot&gt; takeViewSnapshot() = 0;
</span><del>-    virtual void wheelEventWasNotHandledByWebCore(const NativeWebWheelEvent&amp;) = 0;
</del><span class="cx"> #if ENABLE(MAC_GESTURE_EVENTS)
</span><span class="cx">     virtual void gestureEventWasNotHandledByWebCore(const NativeWebGestureEvent&amp;) = 0;
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (199809 => 199810)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2016-04-21 08:41:14 UTC (rev 199809)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2016-04-21 10:50:59 UTC (rev 199810)
</span><span class="lines">@@ -4646,9 +4646,7 @@
</span><span class="cx">         if (!handled) {
</span><span class="cx">             if (m_uiClient-&gt;implementsDidNotHandleWheelEvent())
</span><span class="cx">                 m_uiClient-&gt;didNotHandleWheelEvent(this, oldestCoalescedEvent-&gt;last());
</span><del>-#if PLATFORM(COCOA)
</del><span class="cx">             m_pageClient.wheelEventWasNotHandledByWebCore(oldestCoalescedEvent-&gt;last());
</span><del>-#endif
</del><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (!m_wheelEventQueue.isEmpty())
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcesseflWebViewh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/efl/WebView.h (199809 => 199810)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/efl/WebView.h        2016-04-21 08:41:14 UTC (rev 199809)
+++ trunk/Source/WebKit2/UIProcess/efl/WebView.h        2016-04-21 10:50:59 UTC (rev 199810)
</span><span class="lines">@@ -207,6 +207,7 @@
</span><span class="cx"> #if ENABLE(TOUCH_EVENTS)
</span><span class="cx">     void doneWithTouchEvent(const NativeWebTouchEvent&amp;, bool wasEventHandled) override;
</span><span class="cx"> #endif
</span><ins>+    void wheelEventWasNotHandledByWebCore(const NativeWebWheelEvent&amp;) override { }
</ins><span class="cx"> 
</span><span class="cx">     RefPtr&lt;WebPopupMenuProxy&gt; createPopupMenuProxy(WebPageProxy&amp;) override;
</span><span class="cx"> #if ENABLE(CONTEXT_MENUS)
</span></span></pre>
</div>
</div>

</body>
</html>