<!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>[210177] releases/WebKitGTK/webkit-2.14/Source/WebCore</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/210177">210177</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2016-12-27 09:02:13 -0800 (Tue, 27 Dec 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/209064">r209064</a> - [GTK] Crash in WebCore::PlatformDisplayX11::supportsXComposite when running under Wayland
https://bugs.webkit.org/show_bug.cgi?id=164917

Reviewed by Michael Catanzaro.

WebKitGTK+ appplications are expected to call gtk_init(), because WebKitGTK+, like GTK+ itself, requires a
display to work. We currently fallback to create a X11 display when X11 is enabled in cases where GTK+ doesn't
have a default display (gtk_init() wasn't called or failed). That's why we end up creating an X11 display under
Wayland when both Wayland and X11 option are enabled. The code assumes X11 display creation will always work if
X11 is enabled, but that's not true now that we support also Wayland at runtime. So, we should try to get a
native display before creating the PlatformDisplay. Rendering will not work in any case when gtk_init() is not
called, but in most of the cases those applications are not actually going to render anything, so this way at
least we will not crash.

* platform/graphics/PlatformDisplay.cpp:
(WebCore::PlatformDisplay::createPlatformDisplay): Use create() method for X11 and Wayland if we couldn't get a
native display from GTK+. If everything fails create a display with no native.
(WebCore::PlatformDisplay::PlatformDisplay): Add NativeDisplayOwned parameter.
* platform/graphics/PlatformDisplay.h:
* platform/graphics/wayland/PlatformDisplayWayland.cpp:
(WebCore::PlatformDisplayWayland::create): Try to create a native Wayland display or return nullptr.
(WebCore::PlatformDisplayWayland::PlatformDisplayWayland): Initialize NativeDisplayOwned parameter.
(WebCore::PlatformDisplayWayland::~PlatformDisplayWayland): Destroy the display if owned.
(WebCore::PlatformDisplayWayland::initialize): Return early if native display is nullptr.
* platform/graphics/wayland/PlatformDisplayWayland.h:
* platform/graphics/x11/PlatformDisplayX11.cpp:
(WebCore::PlatformDisplayX11::create): Try to create a native X11 display or return nullptr.
(WebCore::PlatformDisplayX11::PlatformDisplayX11): Use NativeDisplayOwned now.
(WebCore::PlatformDisplayX11::~PlatformDisplayX11): Ditto.
* platform/graphics/x11/PlatformDisplayX11.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreplatformgraphicsPlatformDisplaycpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/PlatformDisplay.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreplatformgraphicsPlatformDisplayh">releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/PlatformDisplay.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreplatformgraphicswaylandPlatformDisplayWaylandcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/wayland/PlatformDisplayWayland.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreplatformgraphicswaylandPlatformDisplayWaylandh">releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/wayland/PlatformDisplayWayland.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreplatformgraphicsx11PlatformDisplayX11cpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/x11/PlatformDisplayX11.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreplatformgraphicsx11PlatformDisplayX11h">releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/x11/PlatformDisplayX11.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit214SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog (210176 => 210177)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog        2016-12-27 17:02:01 UTC (rev 210176)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog        2016-12-27 17:02:13 UTC (rev 210177)
</span><span class="lines">@@ -1,3 +1,36 @@
</span><ins>+2016-11-28  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [GTK] Crash in WebCore::PlatformDisplayX11::supportsXComposite when running under Wayland
+        https://bugs.webkit.org/show_bug.cgi?id=164917
+
+        Reviewed by Michael Catanzaro.
+
+        WebKitGTK+ appplications are expected to call gtk_init(), because WebKitGTK+, like GTK+ itself, requires a
+        display to work. We currently fallback to create a X11 display when X11 is enabled in cases where GTK+ doesn't
+        have a default display (gtk_init() wasn't called or failed). That's why we end up creating an X11 display under
+        Wayland when both Wayland and X11 option are enabled. The code assumes X11 display creation will always work if
+        X11 is enabled, but that's not true now that we support also Wayland at runtime. So, we should try to get a
+        native display before creating the PlatformDisplay. Rendering will not work in any case when gtk_init() is not
+        called, but in most of the cases those applications are not actually going to render anything, so this way at
+        least we will not crash.
+
+        * platform/graphics/PlatformDisplay.cpp:
+        (WebCore::PlatformDisplay::createPlatformDisplay): Use create() method for X11 and Wayland if we couldn't get a
+        native display from GTK+. If everything fails create a display with no native.
+        (WebCore::PlatformDisplay::PlatformDisplay): Add NativeDisplayOwned parameter.
+        * platform/graphics/PlatformDisplay.h:
+        * platform/graphics/wayland/PlatformDisplayWayland.cpp:
+        (WebCore::PlatformDisplayWayland::create): Try to create a native Wayland display or return nullptr.
+        (WebCore::PlatformDisplayWayland::PlatformDisplayWayland): Initialize NativeDisplayOwned parameter.
+        (WebCore::PlatformDisplayWayland::~PlatformDisplayWayland): Destroy the display if owned.
+        (WebCore::PlatformDisplayWayland::initialize): Return early if native display is nullptr.
+        * platform/graphics/wayland/PlatformDisplayWayland.h:
+        * platform/graphics/x11/PlatformDisplayX11.cpp:
+        (WebCore::PlatformDisplayX11::create): Try to create a native X11 display or return nullptr.
+        (WebCore::PlatformDisplayX11::PlatformDisplayX11): Use NativeDisplayOwned now.
+        (WebCore::PlatformDisplayX11::~PlatformDisplayX11): Ditto.
+        * platform/graphics/x11/PlatformDisplayX11.h:
+
</ins><span class="cx"> 2016-09-12  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] Crash of WebProcess on the last WebView disconnect (take two)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreplatformgraphicsPlatformDisplaycpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/PlatformDisplay.cpp (210176 => 210177)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/PlatformDisplay.cpp        2016-12-27 17:02:01 UTC (rev 210176)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/PlatformDisplay.cpp        2016-12-27 17:02:13 UTC (rev 210177)
</span><span class="lines">@@ -88,10 +88,24 @@
</span><span class="cx">     return std::make_unique&lt;PlatformDisplayWin&gt;();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if PLATFORM(WAYLAND)
+    if (auto platformDisplay = PlatformDisplayWayland::create())
+        return platformDisplay;
+#endif
+
</ins><span class="cx"> #if PLATFORM(X11)
</span><del>-    return std::make_unique&lt;PlatformDisplayX11&gt;();
</del><ins>+    if (auto platformDisplay = PlatformDisplayX11::create())
+        return platformDisplay;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    // If at this point we still don't have a display, just create a fake display with no native.
+#if PLATFORM(WAYLAND)
+    return std::make_unique&lt;PlatformDisplayWayland&gt;(nullptr);
+#endif
+#if PLATFORM(X11)
+    return std::make_unique&lt;PlatformDisplayX11&gt;(nullptr);
+#endif
+
</ins><span class="cx">     ASSERT_NOT_REACHED();
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="lines">@@ -118,9 +132,10 @@
</span><span class="cx">     s_sharedDisplayForCompositing = &amp;display;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-PlatformDisplay::PlatformDisplay()
</del><ins>+PlatformDisplay::PlatformDisplay(NativeDisplayOwned displayOwned)
+    : m_nativeDisplayOwned(displayOwned)
</ins><span class="cx"> #if USE(EGL)
</span><del>-    : m_eglDisplay(EGL_NO_DISPLAY)
</del><ins>+    , m_eglDisplay(EGL_NO_DISPLAY)
</ins><span class="cx"> #endif
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreplatformgraphicsPlatformDisplayh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/PlatformDisplay.h (210176 => 210177)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/PlatformDisplay.h        2016-12-27 17:02:01 UTC (rev 210176)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/PlatformDisplay.h        2016-12-27 17:02:13 UTC (rev 210177)
</span><span class="lines">@@ -70,10 +70,13 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    PlatformDisplay();
</del><ins>+    enum class NativeDisplayOwned { No, Yes };
+    explicit PlatformDisplay(NativeDisplayOwned = NativeDisplayOwned::No);
</ins><span class="cx"> 
</span><span class="cx">     static void setSharedDisplayForCompositing(PlatformDisplay&amp;);
</span><span class="cx"> 
</span><ins>+    NativeDisplayOwned m_nativeDisplayOwned { NativeDisplayOwned::No };
+
</ins><span class="cx"> #if USE(EGL)
</span><span class="cx">     virtual void initializeEGLDisplay();
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreplatformgraphicswaylandPlatformDisplayWaylandcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/wayland/PlatformDisplayWayland.cpp (210176 => 210177)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/wayland/PlatformDisplayWayland.cpp        2016-12-27 17:02:01 UTC (rev 210176)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/wayland/PlatformDisplayWayland.cpp        2016-12-27 17:02:13 UTC (rev 210177)
</span><span class="lines">@@ -50,18 +50,33 @@
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-PlatformDisplayWayland::PlatformDisplayWayland(struct wl_display* display)
</del><ins>+std::unique_ptr&lt;PlatformDisplay&gt; PlatformDisplayWayland::create()
</ins><span class="cx"> {
</span><ins>+    struct wl_display* display = wl_display_connect(getenv(&quot;DISPLAY&quot;));
+    if (!display)
+        return nullptr;
+
+    return std::make_unique&lt;PlatformDisplayWayland&gt;(display, NativeDisplayOwned::Yes);
+}
+
+PlatformDisplayWayland::PlatformDisplayWayland(struct wl_display* display, NativeDisplayOwned displayOwned)
+    : PlatformDisplay(displayOwned)
+{
</ins><span class="cx">     initialize(display);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> PlatformDisplayWayland::~PlatformDisplayWayland()
</span><span class="cx"> {
</span><ins>+    if (m_nativeDisplayOwned == NativeDisplayOwned::Yes)
+        wl_display_destroy(m_display);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void PlatformDisplayWayland::initialize(wl_display* display)
</span><span class="cx"> {
</span><span class="cx">     m_display = display;
</span><ins>+    if (!m_display)
+        return;
+
</ins><span class="cx">     m_registry.reset(wl_display_get_registry(m_display));
</span><span class="cx">     wl_registry_add_listener(m_registry.get(), &amp;s_registryListener, this);
</span><span class="cx">     wl_display_roundtrip(m_display);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreplatformgraphicswaylandPlatformDisplayWaylandh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/wayland/PlatformDisplayWayland.h (210176 => 210177)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/wayland/PlatformDisplayWayland.h        2016-12-27 17:02:01 UTC (rev 210176)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/wayland/PlatformDisplayWayland.h        2016-12-27 17:02:13 UTC (rev 210177)
</span><span class="lines">@@ -36,7 +36,8 @@
</span><span class="cx"> 
</span><span class="cx"> class PlatformDisplayWayland : public PlatformDisplay {
</span><span class="cx"> public:
</span><del>-    PlatformDisplayWayland(struct wl_display*);
</del><ins>+    static std::unique_ptr&lt;PlatformDisplay&gt; create();
+    PlatformDisplayWayland(struct wl_display*, NativeDisplayOwned = NativeDisplayOwned::No);
</ins><span class="cx">     virtual ~PlatformDisplayWayland();
</span><span class="cx"> 
</span><span class="cx">     struct wl_display* native() const { return m_display; }
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreplatformgraphicsx11PlatformDisplayX11cpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/x11/PlatformDisplayX11.cpp (210176 => 210177)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/x11/PlatformDisplayX11.cpp        2016-12-27 17:02:01 UTC (rev 210176)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/x11/PlatformDisplayX11.cpp        2016-12-27 17:02:13 UTC (rev 210177)
</span><span class="lines">@@ -42,15 +42,18 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-PlatformDisplayX11::PlatformDisplayX11()
-    : m_display(XOpenDisplay(nullptr))
</del><ins>+std::unique_ptr&lt;PlatformDisplay&gt; PlatformDisplayX11::create()
</ins><span class="cx"> {
</span><del>-    m_ownedDisplay = m_display != nullptr;
</del><ins>+    Display* display = XOpenDisplay(getenv(&quot;DISPLAY&quot;));
+    if (!display)
+        return nullptr;
+
+    return std::make_unique&lt;PlatformDisplayX11&gt;(display, NativeDisplayOwned::Yes);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-PlatformDisplayX11::PlatformDisplayX11(Display* display)
-    : m_display(display)
-    , m_ownedDisplay(false)
</del><ins>+PlatformDisplayX11::PlatformDisplayX11(Display* display, NativeDisplayOwned displayOwned)
+    : PlatformDisplay(displayOwned)
+    , m_display(display)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -60,7 +63,7 @@
</span><span class="cx">     // Clear the sharing context before releasing the display.
</span><span class="cx">     m_sharingGLContext = nullptr;
</span><span class="cx"> #endif
</span><del>-    if (m_ownedDisplay)
</del><ins>+    if (m_nativeDisplayOwned == NativeDisplayOwned::Yes)
</ins><span class="cx">         XCloseDisplay(m_display);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreplatformgraphicsx11PlatformDisplayX11h"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/x11/PlatformDisplayX11.h (210176 => 210177)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/x11/PlatformDisplayX11.h        2016-12-27 17:02:01 UTC (rev 210176)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/x11/PlatformDisplayX11.h        2016-12-27 17:02:13 UTC (rev 210177)
</span><span class="lines">@@ -37,8 +37,8 @@
</span><span class="cx"> 
</span><span class="cx"> class PlatformDisplayX11 final : public PlatformDisplay {
</span><span class="cx"> public:
</span><del>-    PlatformDisplayX11();
-    PlatformDisplayX11(Display*);
</del><ins>+    static std::unique_ptr&lt;PlatformDisplay&gt; create();
+    PlatformDisplayX11(Display*, NativeDisplayOwned = NativeDisplayOwned::No);
</ins><span class="cx">     virtual ~PlatformDisplayX11();
</span><span class="cx"> 
</span><span class="cx">     Display* native() const { return m_display; }
</span><span class="lines">@@ -53,7 +53,6 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     Display* m_display;
</span><del>-    bool m_ownedDisplay;
</del><span class="cx">     mutable Optional&lt;bool&gt; m_supportsXComposite;
</span><span class="cx">     mutable Optional&lt;bool&gt; m_supportsXDamage;
</span><span class="cx">     mutable Optional&lt;int&gt; m_damageEventBase;
</span></span></pre>
</div>
</div>

</body>
</html>