<!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>[179397] 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/179397">179397</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2015-01-29 23:38:13 -0800 (Thu, 29 Jan 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[GTK] Resize the redirected XComposite again after leaving accelerated compositing mode
https://bugs.webkit.org/show_bug.cgi?id=140935

Reviewed by Sergio Villar Senin.

Since <a href="http://trac.webkit.org/projects/webkit/changeset/178414">r178414</a> we don't resize the redirected XComposite window
until we enter accelerated compositing mode, but after leaving it
the redirected window keeps its size. We should resize it to 1x1
again and free the XPixmap and cairo surface to save that memory
while not in accelerated compositing mode.

* UIProcess/API/gtk/PageClientImpl.cpp:
(WebKit::PageClientImpl::enterAcceleratedCompositingMode): Notify
the WebKitWebViewBase.
(WebKit::PageClientImpl::exitAcceleratedCompositingMode): Ditto.
* UIProcess/API/gtk/WebKitWebViewBase.cpp:
(webkitWebViewBaseEnterAcceleratedCompositingMode): Resize the
XComposite window to the current drawing area size.
(webkitWebViewBaseExitAcceleratedCompositingMode): Resize the
XComposite window to and empty size.
* UIProcess/API/gtk/WebKitWebViewBasePrivate.h:
* UIProcess/gtk/RedirectedXCompositeWindow.cpp:
(WebKit::RedirectedXCompositeWindow::RedirectedXCompositeWindow):
Do not initialize m_size since we now handle the empty size as a
especial case. Make sure we always create the X window with at
least 1x1 size.
(WebKit::RedirectedXCompositeWindow::resize): Resize the window to
at least 1x1, but when en empty size is given, call
cleanupPixmapAndPixmapSurface() to release those resources.
(WebKit::RedirectedXCompositeWindow::surface): Create the cairo
surface with at least 1x1 size.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkPageClientImplcpp">trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp</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="#trunkSourceWebKit2UIProcessgtkRedirectedXCompositeWindowcpp">trunk/Source/WebKit2/UIProcess/gtk/RedirectedXCompositeWindow.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (179396 => 179397)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-01-30 07:24:20 UTC (rev 179396)
+++ trunk/Source/WebKit2/ChangeLog        2015-01-30 07:38:13 UTC (rev 179397)
</span><span class="lines">@@ -1,5 +1,39 @@
</span><span class="cx"> 2015-01-29  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><ins>+        [GTK] Resize the redirected XComposite again after leaving accelerated compositing mode
+        https://bugs.webkit.org/show_bug.cgi?id=140935
+
+        Reviewed by Sergio Villar Senin.
+
+        Since r178414 we don't resize the redirected XComposite window
+        until we enter accelerated compositing mode, but after leaving it
+        the redirected window keeps its size. We should resize it to 1x1
+        again and free the XPixmap and cairo surface to save that memory
+        while not in accelerated compositing mode.
+
+        * UIProcess/API/gtk/PageClientImpl.cpp:
+        (WebKit::PageClientImpl::enterAcceleratedCompositingMode): Notify
+        the WebKitWebViewBase.
+        (WebKit::PageClientImpl::exitAcceleratedCompositingMode): Ditto.
+        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
+        (webkitWebViewBaseEnterAcceleratedCompositingMode): Resize the
+        XComposite window to the current drawing area size.
+        (webkitWebViewBaseExitAcceleratedCompositingMode): Resize the
+        XComposite window to and empty size.
+        * UIProcess/API/gtk/WebKitWebViewBasePrivate.h:
+        * UIProcess/gtk/RedirectedXCompositeWindow.cpp:
+        (WebKit::RedirectedXCompositeWindow::RedirectedXCompositeWindow):
+        Do not initialize m_size since we now handle the empty size as a
+        especial case. Make sure we always create the X window with at
+        least 1x1 size.
+        (WebKit::RedirectedXCompositeWindow::resize): Resize the window to
+        at least 1x1, but when en empty size is given, call
+        cleanupPixmapAndPixmapSurface() to release those resources.
+        (WebKit::RedirectedXCompositeWindow::surface): Create the cairo
+        surface with at least 1x1 size.
+
+2015-01-29  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
</ins><span class="cx">         [GTK] Runtime critical warnings sometimes at start up when using the network process
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=140998
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkPageClientImplcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp (179396 => 179397)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp        2015-01-30 07:24:20 UTC (rev 179396)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp        2015-01-30 07:38:13 UTC (rev 179397)
</span><span class="lines">@@ -245,12 +245,12 @@
</span><span class="cx"> 
</span><span class="cx"> void PageClientImpl::enterAcceleratedCompositingMode(const LayerTreeContext&amp;)
</span><span class="cx"> {
</span><del>-    notImplemented();
</del><ins>+    webkitWebViewBaseEnterAcceleratedCompositingMode(WEBKIT_WEB_VIEW_BASE(m_viewWidget));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void PageClientImpl::exitAcceleratedCompositingMode()
</span><span class="cx"> {
</span><del>-    notImplemented();
</del><ins>+    webkitWebViewBaseExitAcceleratedCompositingMode(WEBKIT_WEB_VIEW_BASE(m_viewWidget));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void PageClientImpl::updateAcceleratedCompositingMode(const LayerTreeContext&amp;)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp (179396 => 179397)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp        2015-01-30 07:24:20 UTC (rev 179396)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp        2015-01-30 07:38:13 UTC (rev 179397)
</span><span class="lines">@@ -1308,3 +1308,29 @@
</span><span class="cx"> {
</span><span class="cx">     webkitWebViewBase-&gt;priv-&gt;clickCounter.reset();
</span><span class="cx"> }
</span><ins>+
+void webkitWebViewBaseEnterAcceleratedCompositingMode(WebKitWebViewBase* webkitWebViewBase)
+{
+#if USE(TEXTURE_MAPPER_GL) &amp;&amp; PLATFORM(X11)
+    WebKitWebViewBasePrivate* priv = webkitWebViewBase-&gt;priv;
+    if (!priv-&gt;redirectedWindow)
+        return;
+    DrawingAreaProxyImpl* drawingArea = static_cast&lt;DrawingAreaProxyImpl*&gt;(priv-&gt;pageProxy-&gt;drawingArea());
+    if (!drawingArea)
+        return;
+    priv-&gt;redirectedWindow-&gt;resize(drawingArea-&gt;size());
+#else
+    UNUSED_PARAM(webkitWebViewBase);
+#endif
+}
+
+void webkitWebViewBaseExitAcceleratedCompositingMode(WebKitWebViewBase* webkitWebViewBase)
+{
+#if USE(TEXTURE_MAPPER_GL) &amp;&amp; PLATFORM(X11)
+    WebKitWebViewBasePrivate* priv = webkitWebViewBase-&gt;priv;
+    if (priv-&gt;redirectedWindow)
+        priv-&gt;redirectedWindow-&gt;resize(IntSize());
+#else
+    UNUSED_PARAM(webkitWebViewBase);
+#endif
+}
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewBasePrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h (179396 => 179397)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h        2015-01-30 07:24:20 UTC (rev 179396)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBasePrivate.h        2015-01-30 07:38:13 UTC (rev 179397)
</span><span class="lines">@@ -69,6 +69,8 @@
</span><span class="cx"> void webkitWebViewBaseCancelAuthenticationDialog(WebKitWebViewBase*);
</span><span class="cx"> void webkitWebViewBaseAddWebInspector(WebKitWebViewBase*, GtkWidget* inspector, WebKit::AttachmentSide);
</span><span class="cx"> void webkitWebViewBaseResetClickCounter(WebKitWebViewBase*);
</span><ins>+void webkitWebViewBaseEnterAcceleratedCompositingMode(WebKitWebViewBase*);
+void webkitWebViewBaseExitAcceleratedCompositingMode(WebKitWebViewBase*);
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(DRAG_SUPPORT)
</span><span class="cx"> WebKit::DragAndDropHandler&amp; webkitWebViewBaseDragAndDropHandler(WebKitWebViewBase*);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessgtkRedirectedXCompositeWindowcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/gtk/RedirectedXCompositeWindow.cpp (179396 => 179397)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/gtk/RedirectedXCompositeWindow.cpp        2015-01-30 07:24:20 UTC (rev 179396)
+++ trunk/Source/WebKit2/UIProcess/gtk/RedirectedXCompositeWindow.cpp        2015-01-30 07:38:13 UTC (rev 179397)
</span><span class="lines">@@ -135,7 +135,6 @@
</span><span class="cx"> 
</span><span class="cx"> RedirectedXCompositeWindow::RedirectedXCompositeWindow(GdkWindow* parentWindow, std::function&lt;void()&gt; damageNotify)
</span><span class="cx">     : m_display(GDK_DISPLAY_XDISPLAY(gdk_window_get_display(parentWindow)))
</span><del>-    , m_size(1, 1)
</del><span class="cx">     , m_window(0)
</span><span class="cx">     , m_parentWindow(0)
</span><span class="cx">     , m_pixmap(0)
</span><span class="lines">@@ -169,9 +168,12 @@
</span><span class="cx"> 
</span><span class="cx">     windowAttributes.event_mask = StructureNotifyMask;
</span><span class="cx">     windowAttributes.override_redirect = False;
</span><ins>+    // Create the window of at last 1x1 since X doesn't allow to create empty windows.
</ins><span class="cx">     m_window = XCreateWindow(m_display,
</span><span class="cx">         m_parentWindow,
</span><del>-        0, 0, m_size.width(), m_size.height(),
</del><ins>+        0, 0,
+        std::max(1, m_size.width()),
+        std::max(1, m_size.height()),
</ins><span class="cx">         0,
</span><span class="cx">         CopyFromParent,
</span><span class="cx">         InputOutput,
</span><span class="lines">@@ -215,11 +217,14 @@
</span><span class="cx">     if (size == m_size)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    XResizeWindow(m_display, m_window, size.width(), size.height());
</del><ins>+    // Resize the window to at last 1x1 since X doesn't allow to create empty windows.
+    XResizeWindow(m_display, m_window, std::max(1, size.width()), std::max(1, size.height()));
</ins><span class="cx">     XFlush(m_display);
</span><span class="cx"> 
</span><span class="cx">     m_size = size;
</span><span class="cx">     m_needsNewPixmapAfterResize = true;
</span><ins>+    if (m_size.isEmpty())
+        cleanupPixmapAndPixmapSurface();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void RedirectedXCompositeWindow::cleanupPixmapAndPixmapSurface()
</span><span class="lines">@@ -234,6 +239,9 @@
</span><span class="cx"> 
</span><span class="cx"> cairo_surface_t* RedirectedXCompositeWindow::surface()
</span><span class="cx"> {
</span><ins>+    // This should never be called with an empty size (not in Accelerated Compositing mode).
+    ASSERT(!m_size.isEmpty());
+
</ins><span class="cx">     if (!m_needsNewPixmapAfterResize &amp;&amp; m_surface)
</span><span class="cx">         return m_surface.get();
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>