<!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>[173651] trunk/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/173651">173651</a></dd>
<dt>Author</dt> <dd>zandobersek@gmail.com</dd>
<dt>Date</dt> <dd>2014-09-15 23:53:30 -0700 (Mon, 15 Sep 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[GTK] Add WaylandDisplay
https://bugs.webkit.org/show_bug.cgi?id=136216

Reviewed by Martin Robinson.

Add the WaylandDisplay class. This class is used in the LayerTreeHostGtk,
in the WebProcess, and controls the connection to the nested Wayland
compositor in the UIProcess. Only one instance of the class is used in the
WebProcess, accessible via the static WaylandDisplay::instance() method.

The WaylandDisplay constructor performs the EGL initialization while also
querying the Wayland register, resulting in initializing client-side objects
that can interact with the wl_compositor and wl_webkitgtk interfaces
implemented in the nested Wayland compositor. The single class instance is
only deemed properly initialized if it picked up the Wayland interface objects
and has properly acquired the EGL display and config.

WaylandDisplay::createSurface() is called by the LayerTreeHostGtk during
its own initialization. The method creates a new wl_surface object via the
wl_compositor interface and a new wl_egl_window object that's based on that
surface. For the wl_egl_window object, we fall back to a width or height of 1
in case the passed-in value for either is 0. This avoids problems in Mesa
where widths or heights of 0 are not supported.

We associate the created surface with the passed-in widget ID, as provided
by LayerTreeHostGtk, via the wl_webkitgtk interface. This enables proper
mapping of Wayland surfaces and the GtkWidgets in the UIProcess and makes
it possible for the nested Wayland compositor to correctly determine which
GtkWidget has to be redrawn after some surface has been committed.

WaylandDisplay::createSharingGLContext() creates a new GLContextEGL object
that's to be used as a sharing context. The method creates a new surface
via the wl_compositor interface and uses it to create a dummy native EGL
window that's 1x1px in size. The GLContextEGL object is then created
through the static GLContextEGL::createWindowContext() method.

* PlatformGTK.cmake:
* platform/graphics/wayland/WaylandDisplay.cpp: Added.
(WebCore::WaylandDisplay::globalCallback):
(WebCore::WaylandDisplay::globalRemoveCallback):
(WebCore::WaylandDisplay::instance):
(WebCore::WaylandDisplay::WaylandDisplay):
(WebCore::WaylandDisplay::createSurface):
(WebCore::WaylandDisplay::createSharingGLContext):
* platform/graphics/wayland/WaylandDisplay.h: Added.
(WebCore::WaylandDisplay::nativeDisplay):
(WebCore::WaylandDisplay::eglDisplay):
* platform/graphics/wayland/WaylandSurface.cpp:
(WebCore::WaylandSurface::~WaylandSurface): Assert that the WaylandDisplay
instance is present before going on to destroy the surface resources.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorePlatformGTKcmake">trunk/Source/WebCore/PlatformGTK.cmake</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicswaylandWaylandSurfacecpp">trunk/Source/WebCore/platform/graphics/wayland/WaylandSurface.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreplatformgraphicswaylandWaylandDisplaycpp">trunk/Source/WebCore/platform/graphics/wayland/WaylandDisplay.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicswaylandWaylandDisplayh">trunk/Source/WebCore/platform/graphics/wayland/WaylandDisplay.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (173650 => 173651)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-09-16 06:26:57 UTC (rev 173650)
+++ trunk/Source/WebCore/ChangeLog        2014-09-16 06:53:30 UTC (rev 173651)
</span><span class="lines">@@ -1,3 +1,56 @@
</span><ins>+2014-09-15  Iago Toral  &lt;itoral@igalia.com&gt; and Zan Dobersek  &lt;zdobersek@igalia.com&gt;
+
+        [GTK] Add WaylandDisplay
+        https://bugs.webkit.org/show_bug.cgi?id=136216
+
+        Reviewed by Martin Robinson.
+
+        Add the WaylandDisplay class. This class is used in the LayerTreeHostGtk,
+        in the WebProcess, and controls the connection to the nested Wayland
+        compositor in the UIProcess. Only one instance of the class is used in the
+        WebProcess, accessible via the static WaylandDisplay::instance() method.
+
+        The WaylandDisplay constructor performs the EGL initialization while also
+        querying the Wayland register, resulting in initializing client-side objects
+        that can interact with the wl_compositor and wl_webkitgtk interfaces
+        implemented in the nested Wayland compositor. The single class instance is
+        only deemed properly initialized if it picked up the Wayland interface objects
+        and has properly acquired the EGL display and config.
+
+        WaylandDisplay::createSurface() is called by the LayerTreeHostGtk during
+        its own initialization. The method creates a new wl_surface object via the
+        wl_compositor interface and a new wl_egl_window object that's based on that
+        surface. For the wl_egl_window object, we fall back to a width or height of 1
+        in case the passed-in value for either is 0. This avoids problems in Mesa
+        where widths or heights of 0 are not supported.
+
+        We associate the created surface with the passed-in widget ID, as provided
+        by LayerTreeHostGtk, via the wl_webkitgtk interface. This enables proper
+        mapping of Wayland surfaces and the GtkWidgets in the UIProcess and makes
+        it possible for the nested Wayland compositor to correctly determine which
+        GtkWidget has to be redrawn after some surface has been committed.
+
+        WaylandDisplay::createSharingGLContext() creates a new GLContextEGL object
+        that's to be used as a sharing context. The method creates a new surface
+        via the wl_compositor interface and uses it to create a dummy native EGL
+        window that's 1x1px in size. The GLContextEGL object is then created
+        through the static GLContextEGL::createWindowContext() method.
+
+        * PlatformGTK.cmake:
+        * platform/graphics/wayland/WaylandDisplay.cpp: Added.
+        (WebCore::WaylandDisplay::globalCallback):
+        (WebCore::WaylandDisplay::globalRemoveCallback):
+        (WebCore::WaylandDisplay::instance):
+        (WebCore::WaylandDisplay::WaylandDisplay):
+        (WebCore::WaylandDisplay::createSurface):
+        (WebCore::WaylandDisplay::createSharingGLContext):
+        * platform/graphics/wayland/WaylandDisplay.h: Added.
+        (WebCore::WaylandDisplay::nativeDisplay):
+        (WebCore::WaylandDisplay::eglDisplay):
+        * platform/graphics/wayland/WaylandSurface.cpp:
+        (WebCore::WaylandSurface::~WaylandSurface): Assert that the WaylandDisplay
+        instance is present before going on to destroy the surface resources.
+
</ins><span class="cx"> 2014-09-15  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Rename LiveNodeLists / HTMLCollections's nodeMatches() to elementMatches()
</span></span></pre></div>
<a id="trunkSourceWebCorePlatformGTKcmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/PlatformGTK.cmake (173650 => 173651)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/PlatformGTK.cmake        2014-09-16 06:26:57 UTC (rev 173650)
+++ trunk/Source/WebCore/PlatformGTK.cmake        2014-09-16 06:53:30 UTC (rev 173651)
</span><span class="lines">@@ -430,6 +430,7 @@
</span><span class="cx"> 
</span><span class="cx"> if (ENABLE_WAYLAND_TARGET)
</span><span class="cx">     list(APPEND WebCorePlatformGTK_SOURCES
</span><ins>+        platform/graphics/wayland/WaylandDisplay.cpp
</ins><span class="cx">         platform/graphics/wayland/WaylandEventSource.cpp
</span><span class="cx">         platform/graphics/wayland/WaylandSurface.cpp
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicswaylandWaylandDisplaycpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/graphics/wayland/WaylandDisplay.cpp (0 => 173651)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/wayland/WaylandDisplay.cpp                                (rev 0)
+++ trunk/Source/WebCore/platform/graphics/wayland/WaylandDisplay.cpp        2014-09-16 06:53:30 UTC (rev 173651)
</span><span class="lines">@@ -0,0 +1,143 @@
</span><ins>+/*
+ * Copyright (C) 2014 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;WaylandDisplay.h&quot;
+
+#if PLATFORM(WAYLAND)
+
+#include &quot;GLContextEGL.h&quot;
+#include &quot;WaylandSurface.h&quot;
+#include &lt;cstring&gt;
+#include &lt;glib.h&gt;
+
+namespace WebCore {
+
+const struct wl_registry_listener WaylandDisplay::m_registryListener = {
+    WaylandDisplay::globalCallback,
+    WaylandDisplay::globalRemoveCallback
+};
+
+void WaylandDisplay::globalCallback(void* data, struct wl_registry* registry, uint32_t name, const char* interface, uint32_t)
+{
+    auto display = static_cast&lt;WaylandDisplay*&gt;(data);
+    if (!std::strcmp(interface, &quot;wl_compositor&quot;))
+        display-&gt;m_compositor = static_cast&lt;struct wl_compositor*&gt;(wl_registry_bind(registry, name, &amp;wl_compositor_interface, 1));
+    else if (!std::strcmp(interface, &quot;wl_webkitgtk&quot;))
+        display-&gt;m_webkitgtk = static_cast&lt;struct wl_webkitgtk*&gt;(wl_registry_bind(registry, name, &amp;wl_webkitgtk_interface, 1));
+}
+
+void WaylandDisplay::globalRemoveCallback(void*, struct wl_registry*, uint32_t)
+{
+    // FIXME: if this can happen without the UI Process getting shut down
+    // we should probably destroy our cached display instance.
+}
+
+WaylandDisplay* WaylandDisplay::instance()
+{
+    static WaylandDisplay* display = nullptr;
+    static bool initialized = false;
+    if (initialized)
+        return display;
+
+    initialized = true;
+    struct wl_display* wlDisplay = wl_display_connect(&quot;webkitgtk-wayland-compositor-socket&quot;);
+    if (!wlDisplay)
+        return nullptr;
+
+    display = new WaylandDisplay(wlDisplay);
+    if (!display-&gt;isInitialized()) {
+        delete display;
+        return nullptr;
+    }
+
+    return display;
+}
+
+WaylandDisplay::WaylandDisplay(struct wl_display* wlDisplay)
+    : m_display(wlDisplay)
+    , m_registry(wl_display_get_registry(m_display))
+    , m_eglConfigChosen(false)
+{
+    wl_registry_add_listener(m_registry, &amp;m_registryListener, this);
+    wl_display_roundtrip(m_display);
+
+    static const EGLint configAttributes[] = {
+        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
+        EGL_RED_SIZE, 1,
+        EGL_GREEN_SIZE, 1,
+        EGL_BLUE_SIZE, 1,
+        EGL_ALPHA_SIZE, 1,
+        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
+        EGL_NONE
+    };
+
+    m_eglDisplay = eglGetDisplay(m_display);
+    if (m_eglDisplay == EGL_NO_DISPLAY) {
+        g_warning(&quot;WaylandDisplay initialization: failed to acquire EGL display.&quot;);
+        return;
+    }
+
+    if (eglInitialize(m_eglDisplay, 0, 0) == EGL_FALSE) {
+        g_warning(&quot;WaylandDisplay initialization: failed to initialize the EGL display.&quot;);
+        return;
+    }
+
+    if (eglBindAPI(EGL_OPENGL_ES_API) == EGL_FALSE) {
+        g_warning(&quot;WaylandDisplay initialization: failed to set EGL_OPENGL_ES_API as the rendering API.&quot;);
+        return;
+    }
+
+    EGLint numberOfConfigs;
+    if (!eglChooseConfig(m_eglDisplay, configAttributes, &amp;m_eglConfig, 1, &amp;numberOfConfigs) || numberOfConfigs != 1) {
+        g_warning(&quot;WaylandDisplay initialization: failed to find the desired EGL configuration.&quot;);
+        return;
+    }
+
+    m_eglConfigChosen = true;
+}
+
+std::unique_ptr&lt;WaylandSurface&gt; WaylandDisplay::createSurface(const IntSize&amp; size, int widgetId)
+{
+    struct wl_surface* wlSurface = wl_compositor_create_surface(m_compositor);
+    // We keep the minimum size at 1x1px since Mesa returns null values in wl_egl_window_create() for zero width or height.
+    EGLNativeWindowType nativeWindow = wl_egl_window_create(wlSurface, std::max(1, size.width()), std::max(1, size.height()));
+
+    wl_webkitgtk_set_surface_for_widget(m_webkitgtk, wlSurface, widgetId);
+    wl_display_roundtrip(m_display);
+
+    return std::make_unique&lt;WaylandSurface&gt;(wlSurface, nativeWindow);
+}
+
+PassOwnPtr&lt;GLContextEGL&gt; WaylandDisplay::createSharingGLContext()
+{
+    struct wl_surface* wlSurface = wl_compositor_create_surface(m_compositor);
+    EGLNativeWindowType nativeWindow = wl_egl_window_create(wlSurface, 1, 1);
+    return GLContextEGL::createWindowContext(nativeWindow, nullptr);
+}
+
+} // namespace WebCore
+
+#endif // PLATFORM(WAYLAND)
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicswaylandWaylandDisplayh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/graphics/wayland/WaylandDisplay.h (0 => 173651)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/wayland/WaylandDisplay.h                                (rev 0)
+++ trunk/Source/WebCore/platform/graphics/wayland/WaylandDisplay.h        2014-09-16 06:53:30 UTC (rev 173651)
</span><span class="lines">@@ -0,0 +1,78 @@
</span><ins>+/*
+ * Copyright (C) 2014 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef  WaylandDisplay_h
+#define  WaylandDisplay_h
+
+#if PLATFORM(WAYLAND)
+
+#include &quot;WebKitGtkWaylandClientProtocol.h&quot;
+#include &lt;memory&gt;
+#include &lt;wayland-client.h&gt;
+#include &lt;wtf/PassOwnPtr.h&gt;
+
+#include &lt;wayland-egl.h&gt;
+#include &lt;EGL/egl.h&gt;
+
+namespace WebCore {
+
+class GLContextEGL;
+class IntSize;
+class WaylandSurface;
+
+class WaylandDisplay {
+public:
+    static WaylandDisplay* instance();
+
+    struct wl_display* nativeDisplay() const { return m_display; }
+    EGLDisplay eglDisplay() const { return m_eglDisplay; }
+
+    std::unique_ptr&lt;WaylandSurface&gt; createSurface(const IntSize&amp;, int widgetID);
+
+    PassOwnPtr&lt;GLContextEGL&gt; createSharingGLContext();
+
+private:
+    static const struct wl_registry_listener m_registryListener;
+    static void globalCallback(void* data, struct wl_registry*, uint32_t name, const char* interface, uint32_t version);
+    static void globalRemoveCallback(void* data, struct wl_registry*, uint32_t name);
+
+    WaylandDisplay(struct wl_display*);
+    bool isInitialized() { return m_compositor &amp;&amp; m_webkitgtk &amp;&amp; m_eglDisplay != EGL_NO_DISPLAY &amp;&amp; m_eglConfigChosen; }
+
+    struct wl_display* m_display;
+    struct wl_registry* m_registry;
+    struct wl_compositor* m_compositor;
+    struct wl_webkitgtk* m_webkitgtk;
+
+    EGLDisplay m_eglDisplay;
+    EGLConfig m_eglConfig;
+    bool m_eglConfigChosen;
+};
+
+} // namespace WebCore
+
+#endif // PLATFORM(WAYLAND)
+
+#endif // WaylandDisplay_h
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicswaylandWaylandSurfacecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/wayland/WaylandSurface.cpp (173650 => 173651)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/wayland/WaylandSurface.cpp        2014-09-16 06:26:57 UTC (rev 173650)
+++ trunk/Source/WebCore/platform/graphics/wayland/WaylandSurface.cpp        2014-09-16 06:53:30 UTC (rev 173651)
</span><span class="lines">@@ -53,6 +53,8 @@
</span><span class="cx"> 
</span><span class="cx"> WaylandSurface::~WaylandSurface()
</span><span class="cx"> {
</span><ins>+    // The surface couldn't have been created in the first place if WaylandDisplay wasn't properly initialized.
+    ASSERT(WaylandDisplay::instance());
</ins><span class="cx">     eglMakeCurrent(WaylandDisplay::instance()-&gt;eglDisplay(), EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
</span><span class="cx"> 
</span><span class="cx">     wl_egl_window_destroy(m_nativeWindow);
</span></span></pre>
</div>
</div>

</body>
</html>