<!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>[180924] 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/180924">180924</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2015-03-03 00:10:01 -0800 (Tue, 03 Mar 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>REGRESSION(<a href="http://trac.webkit.org/projects/webkit/changeset/177075">r177075</a>): WebProcess crashes when entering accelerating compositing mode before the WebView is realized
https://bugs.webkit.org/show_bug.cgi?id=142079

Reviewed by Žan Doberšek.

The problem is that the texture mapper and native window handler
are initialized when the LayerTreeHost is initialized, assuming
the UI process has already sent the native window handler to the
web process, but that doesn't always happen since we moved the
redirected window creation to realize in <a href="http://trac.webkit.org/projects/webkit/changeset/177075">r177075</a>.

* WebProcess/WebPage/DrawingArea.h:
(WebKit::DrawingArea::nativeSurfaceHandleForCompositing): Deleted.
* WebProcess/WebPage/DrawingAreaImpl.cpp:
(WebKit::DrawingAreaImpl::enterAcceleratedCompositingMode): Call
LayerTreeHost::setNativeSurfaceHandleForCompositing if we
already have a native window handle at this point.
(WebKit::DrawingAreaImpl::setNativeSurfaceHandleForCompositing):
Call LayerTreeHost::setNativeSurfaceHandleForCompositing also when
not using threaded compositing.
* WebProcess/WebPage/LayerTreeHost.h:
* WebProcess/WebPage/gtk/LayerTreeHostGtk.cpp:
(WebKit::LayerTreeHostGtk::makeContextCurrent): Helper function to
ensure a context and making it current.
(WebKit::LayerTreeHostGtk::ensureTextureMapper): Ensure a texture
is created for the current context.
(WebKit::LayerTreeHostGtk::initialize): Use makeContextCurrent()
and ensureTextureMapper(), and remove the LayerTreeContext
initialization since that's is now always initialized in
setNativeSurfaceHandleForCompositing().
(WebKit::LayerTreeHostGtk::compositeLayersToContext): Use
makeContextCurrent() helper function and also call
ensureTextureMapper() just in case the texture could not be
created during initialization because the native window handle was
not yet available.
(WebKit::LayerTreeHostGtk::flushAndRenderLayers): Use makeContextCurrent().
(WebKit::LayerTreeHostGtk::setNativeSurfaceHandleForCompositing):
Initialize the LayerTreeContext.
(WebKit::LayerTreeHostGtk::glContext): Deleted.
* WebProcess/WebPage/gtk/LayerTreeHostGtk.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageDrawingAreah">trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageDrawingAreaImplcpp">trunk/Source/WebKit2/WebProcess/WebPage/DrawingAreaImpl.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageLayerTreeHosth">trunk/Source/WebKit2/WebProcess/WebPage/LayerTreeHost.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagegtkLayerTreeHostGtkcpp">trunk/Source/WebKit2/WebProcess/WebPage/gtk/LayerTreeHostGtk.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagegtkLayerTreeHostGtkh">trunk/Source/WebKit2/WebProcess/WebPage/gtk/LayerTreeHostGtk.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (180923 => 180924)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-03-03 07:20:06 UTC (rev 180923)
+++ trunk/Source/WebKit2/ChangeLog        2015-03-03 08:10:01 UTC (rev 180924)
</span><span class="lines">@@ -1,3 +1,46 @@
</span><ins>+2015-03-03  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        REGRESSION(r177075): WebProcess crashes when entering accelerating compositing mode before the WebView is realized
+        https://bugs.webkit.org/show_bug.cgi?id=142079
+
+        Reviewed by Žan Doberšek.
+
+        The problem is that the texture mapper and native window handler
+        are initialized when the LayerTreeHost is initialized, assuming
+        the UI process has already sent the native window handler to the
+        web process, but that doesn't always happen since we moved the
+        redirected window creation to realize in r177075.
+
+        * WebProcess/WebPage/DrawingArea.h:
+        (WebKit::DrawingArea::nativeSurfaceHandleForCompositing): Deleted.
+        * WebProcess/WebPage/DrawingAreaImpl.cpp:
+        (WebKit::DrawingAreaImpl::enterAcceleratedCompositingMode): Call
+        LayerTreeHost::setNativeSurfaceHandleForCompositing if we
+        already have a native window handle at this point.
+        (WebKit::DrawingAreaImpl::setNativeSurfaceHandleForCompositing):
+        Call LayerTreeHost::setNativeSurfaceHandleForCompositing also when
+        not using threaded compositing.
+        * WebProcess/WebPage/LayerTreeHost.h:
+        * WebProcess/WebPage/gtk/LayerTreeHostGtk.cpp:
+        (WebKit::LayerTreeHostGtk::makeContextCurrent): Helper function to
+        ensure a context and making it current.
+        (WebKit::LayerTreeHostGtk::ensureTextureMapper): Ensure a texture
+        is created for the current context.
+        (WebKit::LayerTreeHostGtk::initialize): Use makeContextCurrent()
+        and ensureTextureMapper(), and remove the LayerTreeContext
+        initialization since that's is now always initialized in
+        setNativeSurfaceHandleForCompositing().
+        (WebKit::LayerTreeHostGtk::compositeLayersToContext): Use
+        makeContextCurrent() helper function and also call
+        ensureTextureMapper() just in case the texture could not be
+        created during initialization because the native window handle was
+        not yet available.
+        (WebKit::LayerTreeHostGtk::flushAndRenderLayers): Use makeContextCurrent().
+        (WebKit::LayerTreeHostGtk::setNativeSurfaceHandleForCompositing):
+        Initialize the LayerTreeContext.
+        (WebKit::LayerTreeHostGtk::glContext): Deleted.
+        * WebProcess/WebPage/gtk/LayerTreeHostGtk.h:
+
</ins><span class="cx"> 2015-03-02  Gyuyoung Kim  &lt;gyuyoung.kim@samsung.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WK2] Remove unnecessary create() factory functions.
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageDrawingAreah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.h (180923 => 180924)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.h        2015-03-03 07:20:06 UTC (rev 180923)
+++ trunk/Source/WebKit2/WebProcess/WebPage/DrawingArea.h        2015-03-03 08:10:01 UTC (rev 180924)
</span><span class="lines">@@ -124,10 +124,6 @@
</span><span class="cx"> 
</span><span class="cx">     virtual void attachViewOverlayGraphicsLayer(WebCore::Frame*, WebCore::GraphicsLayer*) { }
</span><span class="cx"> 
</span><del>-#if USE(TEXTURE_MAPPER_GL) &amp;&amp; PLATFORM(GTK)
-    uint64_t nativeSurfaceHandleForCompositing() { return m_nativeSurfaceHandleForCompositing; }
-#endif
-
</del><span class="cx"> protected:
</span><span class="cx">     DrawingArea(DrawingAreaType, WebPage&amp;);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageDrawingAreaImplcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/DrawingAreaImpl.cpp (180923 => 180924)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/DrawingAreaImpl.cpp        2015-03-03 07:20:06 UTC (rev 180923)
+++ trunk/Source/WebKit2/WebProcess/WebPage/DrawingAreaImpl.cpp        2015-03-03 08:10:01 UTC (rev 180924)
</span><span class="lines">@@ -456,6 +456,8 @@
</span><span class="cx">     ASSERT(!m_layerTreeHost);
</span><span class="cx"> 
</span><span class="cx">     m_layerTreeHost = LayerTreeHost::create(&amp;m_webPage);
</span><ins>+    if (m_nativeSurfaceHandleForCompositing)
+        m_layerTreeHost-&gt;setNativeSurfaceHandleForCompositing(m_nativeSurfaceHandleForCompositing);
</ins><span class="cx">     if (!m_inUpdateBackingStoreState)
</span><span class="cx">         m_layerTreeHost-&gt;setShouldNotifyAfterNextScheduledLayerFlush(true);
</span><span class="cx"> 
</span><span class="lines">@@ -677,10 +679,8 @@
</span><span class="cx">     m_nativeSurfaceHandleForCompositing = handle;
</span><span class="cx">     m_webPage.corePage()-&gt;settings().setAcceleratedCompositingEnabled(true);
</span><span class="cx"> 
</span><del>-#if USE(COORDINATED_GRAPHICS_THREADED)
</del><span class="cx">     if (m_layerTreeHost)
</span><span class="cx">         m_layerTreeHost-&gt;setNativeSurfaceHandleForCompositing(handle);
</span><del>-#endif
</del><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageLayerTreeHosth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/LayerTreeHost.h (180923 => 180924)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/LayerTreeHost.h        2015-03-03 07:20:06 UTC (rev 180923)
+++ trunk/Source/WebKit2/WebProcess/WebPage/LayerTreeHost.h        2015-03-03 08:10:01 UTC (rev 180924)
</span><span class="lines">@@ -93,6 +93,10 @@
</span><span class="cx">     virtual void scheduleAnimation() = 0;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if USE(TEXTURE_MAPPER_GL) &amp;&amp; PLATFORM(GTK)
+    virtual void setNativeSurfaceHandleForCompositing(uint64_t) = 0;
+#endif
+
</ins><span class="cx">     virtual void setViewOverlayRootLayer(WebCore::GraphicsLayer*) = 0;
</span><span class="cx"> 
</span><span class="cx"> protected:
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagegtkLayerTreeHostGtkcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/gtk/LayerTreeHostGtk.cpp (180923 => 180924)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/gtk/LayerTreeHostGtk.cpp        2015-03-03 07:20:06 UTC (rev 180923)
+++ trunk/Source/WebKit2/WebProcess/WebPage/gtk/LayerTreeHostGtk.cpp        2015-03-03 08:10:01 UTC (rev 180924)
</span><span class="lines">@@ -78,19 +78,31 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GLContext* LayerTreeHostGtk::glContext()
</del><ins>+bool LayerTreeHostGtk::makeContextCurrent()
</ins><span class="cx"> {
</span><del>-    if (m_context)
-        return m_context.get();
</del><ins>+    if (!m_context) {
+        if (!m_layerTreeContext.contextID)
+            return false;
</ins><span class="cx"> 
</span><del>-    uint64_t windowHandle = m_webPage-&gt;drawingArea()-&gt;nativeSurfaceHandleForCompositing();
-    if (!windowHandle)
-        return 0;
</del><ins>+        m_context = GLContext::createContextForWindow(m_layerTreeContext.contextID, GLContext::sharingContext());
+        if (!m_context)
+            return false;
+    }
</ins><span class="cx"> 
</span><del>-    m_context = GLContext::createContextForWindow(windowHandle, GLContext::sharingContext());
-    return m_context.get();
</del><ins>+    return m_context-&gt;makeContextCurrent();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void LayerTreeHostGtk::ensureTextureMapper()
+{
+    if (m_textureMapper)
+        return;
+
+    ASSERT(m_isValid);
+    m_textureMapper = TextureMapper::create(TextureMapper::OpenGLMode);
+    static_cast&lt;TextureMapperGL*&gt;(m_textureMapper.get())-&gt;setEnableEdgeDistanceAntialiasing(true);
+    downcast&lt;GraphicsLayerTextureMapper&gt;(*m_rootLayer).layer().setTextureMapper(m_textureMapper.get());
+}
+
</ins><span class="cx"> void LayerTreeHostGtk::initialize()
</span><span class="cx"> {
</span><span class="cx">     m_rootLayer = GraphicsLayer::create(graphicsLayerFactory(), *this);
</span><span class="lines">@@ -113,19 +125,11 @@
</span><span class="cx">     m_rootLayer-&gt;addChild(m_nonCompositedContentLayer.get());
</span><span class="cx">     m_nonCompositedContentLayer-&gt;setNeedsDisplay();
</span><span class="cx"> 
</span><del>-    m_layerTreeContext.contextID = m_webPage-&gt;drawingArea()-&gt;nativeSurfaceHandleForCompositing();
-
-    GLContext* context = glContext();
-    if (!context)
</del><ins>+    // The creation of the TextureMapper needs an active OpenGL context.
+    if (!makeContextCurrent())
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    // The creation of the TextureMapper needs an active OpenGL context.
-    context-&gt;makeContextCurrent();
-
-    m_textureMapper = TextureMapper::create(TextureMapper::OpenGLMode);
-    static_cast&lt;TextureMapperGL*&gt;(m_textureMapper.get())-&gt;setEnableEdgeDistanceAntialiasing(true);
-    downcast&lt;GraphicsLayerTextureMapper&gt;(*m_rootLayer).layer().setTextureMapper(m_textureMapper.get());
-
</del><ins>+    ensureTextureMapper();
</ins><span class="cx">     scheduleLayerFlush();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -289,10 +293,11 @@
</span><span class="cx"> 
</span><span class="cx"> void LayerTreeHostGtk::compositeLayersToContext(CompositePurpose purpose)
</span><span class="cx"> {
</span><del>-    GLContext* context = glContext();
-    if (!context || !context-&gt;makeContextCurrent())
</del><ins>+    if (!makeContextCurrent())
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    ensureTextureMapper();
+
</ins><span class="cx">     // The window size may be out of sync with the page size at this point, and getting
</span><span class="cx">     // the viewport parameters incorrect, means that the content will be misplaced. Thus
</span><span class="cx">     // we set the viewport parameters directly from the window size.
</span><span class="lines">@@ -308,7 +313,7 @@
</span><span class="cx">     downcast&lt;GraphicsLayerTextureMapper&gt;(*m_rootLayer).layer().paint();
</span><span class="cx">     m_textureMapper-&gt;endPainting();
</span><span class="cx"> 
</span><del>-    context-&gt;swapBuffers();
</del><ins>+    m_context-&gt;swapBuffers();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void LayerTreeHostGtk::flushAndRenderLayers()
</span><span class="lines">@@ -321,8 +326,7 @@
</span><span class="cx">             return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    GLContext* context = glContext();
-    if (!context || !context-&gt;makeContextCurrent())
</del><ins>+    if (!makeContextCurrent())
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     if (!flushPendingLayerChanges())
</span><span class="lines">@@ -380,6 +384,11 @@
</span><span class="cx">         m_rootLayer-&gt;addChild(m_viewOverlayRootLayer);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void LayerTreeHostGtk::setNativeSurfaceHandleForCompositing(uint64_t handle)
+{
+    m_layerTreeContext.contextID = handle;
+}
+
</ins><span class="cx"> } // namespace WebKit
</span><span class="cx"> 
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagegtkLayerTreeHostGtkh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/gtk/LayerTreeHostGtk.h (180923 => 180924)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/gtk/LayerTreeHostGtk.h        2015-03-03 07:20:06 UTC (rev 180923)
+++ trunk/Source/WebKit2/WebProcess/WebPage/gtk/LayerTreeHostGtk.h        2015-03-03 08:10:01 UTC (rev 180924)
</span><span class="lines">@@ -61,6 +61,8 @@
</span><span class="cx">     virtual void deviceOrPageScaleFactorChanged() override;
</span><span class="cx">     virtual void pageBackgroundTransparencyChanged() override;
</span><span class="cx"> 
</span><ins>+    virtual void setNativeSurfaceHandleForCompositing(uint64_t) override;
+
</ins><span class="cx"> private:
</span><span class="cx">     // LayerTreeHost
</span><span class="cx">     virtual const LayerTreeContext&amp; layerTreeContext() override;
</span><span class="lines">@@ -84,7 +86,8 @@
</span><span class="cx"> 
</span><span class="cx">     void layerFlushTimerFired();
</span><span class="cx"> 
</span><del>-    WebCore::GLContext* glContext();
</del><ins>+    bool makeContextCurrent();
+    void ensureTextureMapper();
</ins><span class="cx"> 
</span><span class="cx">     LayerTreeContext m_layerTreeContext;
</span><span class="cx">     bool m_isValid;
</span></span></pre>
</div>
</div>

</body>
</html>