<!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>[175414] trunk</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/175414">175414</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2014-10-31 12:04:19 -0700 (Fri, 31 Oct 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[GTK] Support script message handlers WebKitUserContentManager
https://bugs.webkit.org/show_bug.cgi?id=133730

Patch by Adrian Perez de Castro &lt;aperez@igalia.com&gt; on 2014-10-31
Reviewed by Carlos Garcia Campos.

Support user script message handlers in WebKitUserContentManager.
This needs building with ENABLE_USER_MESSAGE_HANDLERS, for which
an option is added to the CMake build files. The option is disabled
globally by default, and the WebKitGTK port enables it. On the API
level, two new methods to register and unregister names are provided
in the &quot;window.webkit&quot; namespace, and on message reception the
&quot;WebKitUserContentManager::script-message-received&quot; signal is
emitted, using the registered names as signal detail.

.:

* Source/cmake/OptionsGTK.cmake: For the GTK port, enable the
ENABLE_USER_MESSAGE_HANDLERS feature by default.
* Source/cmake/WebKitFeatures.cmake: Add feature description for
ENABLE_USER_MESSAGE_HANDLERS, disabled by default.

Source/WebCore:

* CMakeLists.txt: Conditionally add the needed files to the build
when the ENABLE_USER_MESSAGE_HANDLERS feature is enabled.

Source/WebKit2:

* UIProcess/API/gtk/WebKitJavascriptResult.cpp: Add a new private
function to construct a WebKitJavascriptResult directly from a
WebCore::SerializedScriptValue.
(_WebKitJavascriptResult::_WebKitJavascriptResult): Ditto.
(webkitJavascriptResultCreate): Ditto.
* UIProcess/API/gtk/WebKitJavascriptResultPrivate.h: Ditto.
* UIProcess/API/gtk/WebKitUserContentManager.cpp:
(webkit_user_content_manager_class_init): Install the
&quot;script-message-received&quot; signal.
(webkit_user_content_manager_register_script_message_handler):
Added.
(webkit_user_content_manager_unregister_script_message_handler):
Added.
* UIProcess/API/gtk/WebKitUserContentManager.h: Added the new
public API methods.
* UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Ditto.
* UIProcess/API/gtk/docs/webkit2gtk.types: Add
webkit_user_content_manager_get_type() to the list in order to make
gtk-doc to generate documentation for signals.

Tools:

* TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitUserContentManager.cpp:
Add test case for user script message handlers.
(scriptMessageReceived):
(testUserContentManagerScriptMessageReceived):
(beforeAll):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkChangeLog">trunk/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitJavascriptResultcpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitJavascriptResultPrivateh">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResultPrivate.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitUserContentManagercpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitUserContentManagerh">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewcpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkdocswebkit2gtksectionstxt">trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkdocswebkit2gtktypes">trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk.types</a></li>
<li><a href="#trunkSourcecmakeOptionsGTKcmake">trunk/Source/cmake/OptionsGTK.cmake</a></li>
<li><a href="#trunkSourcecmakeWebKitFeaturescmake">trunk/Source/cmake/WebKitFeatures.cmake</a></li>
<li><a href="#trunkSourcecmakeconfighcmake">trunk/Source/cmakeconfig.h.cmake</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2GtkTestWebKitUserContentManagercpp">trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitUserContentManager.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/ChangeLog (175413 => 175414)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/ChangeLog        2014-10-31 19:02:39 UTC (rev 175413)
+++ trunk/ChangeLog        2014-10-31 19:04:19 UTC (rev 175414)
</span><span class="lines">@@ -1,3 +1,24 @@
</span><ins>+2014-10-31  Adrian Perez de Castro  &lt;aperez@igalia.com&gt;
+
+        [GTK] Support script message handlers WebKitUserContentManager
+        https://bugs.webkit.org/show_bug.cgi?id=133730
+
+        Reviewed by Carlos Garcia Campos.
+
+        Support user script message handlers in WebKitUserContentManager.
+        This needs building with ENABLE_USER_MESSAGE_HANDLERS, for which
+        an option is added to the CMake build files. The option is disabled
+        globally by default, and the WebKitGTK port enables it. On the API
+        level, two new methods to register and unregister names are provided
+        in the &quot;window.webkit&quot; namespace, and on message reception the
+        &quot;WebKitUserContentManager::script-message-received&quot; signal is
+        emitted, using the registered names as signal detail.
+
+        * Source/cmake/OptionsGTK.cmake: For the GTK port, enable the
+        ENABLE_USER_MESSAGE_HANDLERS feature by default.
+        * Source/cmake/WebKitFeatures.cmake: Add feature description for
+        ENABLE_USER_MESSAGE_HANDLERS, disabled by default.
+
</ins><span class="cx"> 2014-10-29  Raphael Kubo da Costa  &lt;rakuco@FreeBSD.org&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] Bump libsoup's minimum version to 2.42.0.
</span></span></pre></div>
<a id="trunkSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt (175413 => 175414)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/CMakeLists.txt        2014-10-31 19:02:39 UTC (rev 175413)
+++ trunk/Source/WebCore/CMakeLists.txt        2014-10-31 19:04:19 UTC (rev 175414)
</span><span class="lines">@@ -3107,6 +3107,21 @@
</span><span class="cx">     )
</span><span class="cx"> endif ()
</span><span class="cx"> 
</span><ins>+if (ENABLE_USER_MESSAGE_HANDLERS)
+    list(APPEND WebCore_IDL_FILES
+        page/UserMessageHandler.idl
+        page/UserMessageHandlersNamespace.idl
+        page/WebKitNamespace.idl
+    )
+    list(APPEND WebCore_SOURCES
+        bindings/js/JSUserMessageHandlersNamespaceCustom.cpp
+        page/UserMessageHandler.cpp
+        page/UserMessageHandlerDescriptor.cpp
+        page/UserMessageHandlersNamespace.cpp
+        page/WebKitNamespace.cpp
+    )
+endif ()
+
</ins><span class="cx"> set(WebCoreTestSupport_INCLUDE_DIRECTORIES
</span><span class="cx">     &quot;${WEBCORE_DIR}/platform/mock&quot;
</span><span class="cx">     &quot;${WEBCORE_DIR}/testing&quot;
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (175413 => 175414)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-10-31 19:02:39 UTC (rev 175413)
+++ trunk/Source/WebCore/ChangeLog        2014-10-31 19:04:19 UTC (rev 175414)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2014-10-31  Adrian Perez de Castro  &lt;aperez@igalia.com&gt;
+
+        [GTK] Support script message handlers WebKitUserContentManager
+        https://bugs.webkit.org/show_bug.cgi?id=133730
+
+        Reviewed by Carlos Garcia Campos.
+
+        Support user script message handlers in WebKitUserContentManager.
+        This needs building with ENABLE_USER_MESSAGE_HANDLERS, for which
+        an option is added to the CMake build files. The option is disabled
+        globally by default, and the WebKitGTK port enables it. On the API
+        level, two new methods to register and unregister names are provided
+        in the &quot;window.webkit&quot; namespace, and on message reception the
+        &quot;WebKitUserContentManager::script-message-received&quot; signal is
+        emitted, using the registered names as signal detail.
+
+        * CMakeLists.txt: Conditionally add the needed files to the build
+        when the ENABLE_USER_MESSAGE_HANDLERS feature is enabled.
+
</ins><span class="cx"> 2014-10-31  Andrzej Badowski  &lt;a.badowski@samsung.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [ATK] Improve AccessibilityTableCell's determineAccessibilityRole function.
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (175413 => 175414)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-10-31 19:02:39 UTC (rev 175413)
+++ trunk/Source/WebKit2/ChangeLog        2014-10-31 19:04:19 UTC (rev 175414)
</span><span class="lines">@@ -1,3 +1,39 @@
</span><ins>+2014-10-31  Adrian Perez de Castro  &lt;aperez@igalia.com&gt;
+
+        [GTK] Support script message handlers WebKitUserContentManager
+        https://bugs.webkit.org/show_bug.cgi?id=133730
+
+        Reviewed by Carlos Garcia Campos.
+
+        Support user script message handlers in WebKitUserContentManager.
+        This needs building with ENABLE_USER_MESSAGE_HANDLERS, for which
+        an option is added to the CMake build files. The option is disabled
+        globally by default, and the WebKitGTK port enables it. On the API
+        level, two new methods to register and unregister names are provided
+        in the &quot;window.webkit&quot; namespace, and on message reception the
+        &quot;WebKitUserContentManager::script-message-received&quot; signal is
+        emitted, using the registered names as signal detail.
+
+        * UIProcess/API/gtk/WebKitJavascriptResult.cpp: Add a new private
+        function to construct a WebKitJavascriptResult directly from a
+        WebCore::SerializedScriptValue.
+        (_WebKitJavascriptResult::_WebKitJavascriptResult): Ditto.
+        (webkitJavascriptResultCreate): Ditto.
+        * UIProcess/API/gtk/WebKitJavascriptResultPrivate.h: Ditto.
+        * UIProcess/API/gtk/WebKitUserContentManager.cpp:
+        (webkit_user_content_manager_class_init): Install the
+        &quot;script-message-received&quot; signal.
+        (webkit_user_content_manager_register_script_message_handler):
+        Added.
+        (webkit_user_content_manager_unregister_script_message_handler):
+        Added.
+        * UIProcess/API/gtk/WebKitUserContentManager.h: Added the new
+        public API methods.
+        * UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Ditto.
+        * UIProcess/API/gtk/docs/webkit2gtk.types: Add
+        webkit_user_content_manager_get_type() to the list in order to make
+        gtk-doc to generate documentation for signals.
+
</ins><span class="cx"> 2014-10-31  Martin Hock  &lt;mhock@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, iOS build fix since 175406.
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitJavascriptResultcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.cpp (175413 => 175414)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.cpp        2014-10-31 19:02:39 UTC (rev 175413)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResult.cpp        2014-10-31 19:04:19 UTC (rev 175414)
</span><span class="lines">@@ -27,11 +27,11 @@
</span><span class="cx"> using namespace WebKit;
</span><span class="cx"> 
</span><span class="cx"> struct _WebKitJavascriptResult {
</span><del>-    _WebKitJavascriptResult(WebKitWebView* view, WebSerializedScriptValue* serializedScriptValue)
</del><ins>+    _WebKitJavascriptResult(WebKitWebView* view, WebCore::SerializedScriptValue&amp; serializedScriptValue)
</ins><span class="cx">         : webView(view)
</span><span class="cx">         , referenceCount(1)
</span><span class="cx">     {
</span><del>-        value = serializedScriptValue-&gt;deserialize(webkit_web_view_get_javascript_global_context(view), 0);
</del><ins>+        value = serializedScriptValue.deserialize(webkit_web_view_get_javascript_global_context(view), nullptr);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     GRefPtr&lt;WebKitWebView&gt; webView;
</span><span class="lines">@@ -42,7 +42,7 @@
</span><span class="cx"> 
</span><span class="cx"> G_DEFINE_BOXED_TYPE(WebKitJavascriptResult, webkit_javascript_result, webkit_javascript_result_ref, webkit_javascript_result_unref)
</span><span class="cx"> 
</span><del>-WebKitJavascriptResult* webkitJavascriptResultCreate(WebKitWebView* webView, WebSerializedScriptValue* serializedScriptValue)
</del><ins>+WebKitJavascriptResult* webkitJavascriptResultCreate(WebKitWebView* webView, WebCore::SerializedScriptValue&amp; serializedScriptValue)
</ins><span class="cx"> {
</span><span class="cx">     WebKitJavascriptResult* result = g_slice_new(WebKitJavascriptResult);
</span><span class="cx">     new (result) WebKitJavascriptResult(webView, serializedScriptValue);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitJavascriptResultPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResultPrivate.h (175413 => 175414)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResultPrivate.h        2014-10-31 19:02:39 UTC (rev 175413)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitJavascriptResultPrivate.h        2014-10-31 19:04:19 UTC (rev 175414)
</span><span class="lines">@@ -20,10 +20,11 @@
</span><span class="cx"> #ifndef WebKitJavascriptResultPrivate_h
</span><span class="cx"> #define WebKitJavascriptResultPrivate_h
</span><span class="cx"> 
</span><ins>+#include &lt;WebCore/SerializedScriptValue.h&gt;
</ins><span class="cx"> #include &quot;WebKitJavascriptResult.h&quot;
</span><span class="cx"> #include &quot;WebKitPrivate.h&quot;
</span><span class="cx"> #include &quot;WebKitWebView.h&quot;
</span><span class="cx"> 
</span><del>-WebKitJavascriptResult* webkitJavascriptResultCreate(WebKitWebView*, WebKit::WebSerializedScriptValue*);
</del><ins>+WebKitJavascriptResult* webkitJavascriptResultCreate(WebKitWebView*, WebCore::SerializedScriptValue&amp;);
</ins><span class="cx"> 
</span><span class="cx"> #endif // WebKitJavascriptResultPrivate_h
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitUserContentManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.cpp (175413 => 175414)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.cpp        2014-10-31 19:02:39 UTC (rev 175413)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.cpp        2014-10-31 19:04:19 UTC (rev 175414)
</span><span class="lines">@@ -20,9 +20,13 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;WebKitUserContentManager.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;WebKitJavascriptResultPrivate.h&quot;
</ins><span class="cx"> #include &quot;WebKitPrivate.h&quot;
</span><span class="cx"> #include &quot;WebKitUserContentManagerPrivate.h&quot;
</span><span class="cx"> #include &quot;WebKitUserContentPrivate.h&quot;
</span><ins>+#include &quot;WebKitWebContextPrivate.h&quot;
+#include &quot;WebScriptMessageHandler.h&quot;
+#include &quot;WebSerializedScriptValue.h&quot;
</ins><span class="cx"> #include &lt;wtf/gobject/GRefPtr.h&gt;
</span><span class="cx"> 
</span><span class="cx"> using namespace WebCore;
</span><span class="lines">@@ -59,8 +63,39 @@
</span><span class="cx"> 
</span><span class="cx"> WEBKIT_DEFINE_TYPE(WebKitUserContentManager, webkit_user_content_manager, G_TYPE_OBJECT)
</span><span class="cx"> 
</span><del>-static void webkit_user_content_manager_class_init(WebKitUserContentManagerClass*)
</del><ins>+enum {
+    SCRIPT_MESSAGE_RECEIVED,
+
+    LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0, };
+
+static void webkit_user_content_manager_class_init(WebKitUserContentManagerClass* klass)
</ins><span class="cx"> {
</span><ins>+    GObjectClass* gObjectClass = G_OBJECT_CLASS(klass);
+
+    /**
+     * WebKitUserContentManager::script-message-received:
+     * @manager: the #WebKitUserContentManager
+     * @js_result: the #WebKitJavascriptResult holding the value received from the JavaScript world.
+     *
+     * This signal is emitted when JavaScript in a web view calls
+     * &lt;code&gt;window.webkit.messageHandlers.&amp;lt;name&amp;gt;.postMessage()&lt;/code&gt;, after registering
+     * &lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt; using
+     * webkit_user_content_manager_register_script_message_handler()
+     *
+     * Since: 2.8
+     */
+    signals[SCRIPT_MESSAGE_RECEIVED] =
+        g_signal_new(
+            &quot;script-message-received&quot;,
+            G_TYPE_FROM_CLASS(gObjectClass),
+            static_cast&lt;GSignalFlags&gt;(G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED),
+            0, nullptr, nullptr,
+            g_cclosure_marshal_VOID__BOXED,
+            G_TYPE_NONE, 1,
+            WEBKIT_TYPE_JAVASCRIPT_RESULT);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> /**
</span><span class="lines">@@ -141,6 +176,90 @@
</span><span class="cx">     manager-&gt;priv-&gt;userContentController-&gt;removeAllUserScripts();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+class ScriptMessageClientGtk final : public WebScriptMessageHandler::Client {
+public:
+    ScriptMessageClientGtk(WebKitUserContentManager* manager, const char* handlerName)
+        : m_handlerName(g_quark_from_string(handlerName))
+        , m_manager(manager)
+    {
+    }
+
+    virtual void didPostMessage(WebPageProxy&amp; page, WebFrameProxy&amp;, WebCore::SerializedScriptValue&amp; serializedScriptValue)
+    {
+        WebKitJavascriptResult* jsResult = webkitJavascriptResultCreate(WEBKIT_WEB_VIEW(page.viewWidget()), serializedScriptValue);
+        g_signal_emit(m_manager, signals[SCRIPT_MESSAGE_RECEIVED], m_handlerName, jsResult);
+        webkit_javascript_result_unref(jsResult);
+    }
+
+    virtual ~ScriptMessageClientGtk() { }
+
+private:
+    GQuark m_handlerName;
+    WebKitUserContentManager* m_manager;
+};
+
+/**
+ * webkit_user_content_manager_register_script_message_handler:
+ * @manager: A #WebKitUserContentManager
+ * @name: Name of the script message channel
+ *
+ * Registers a new user script message handler. After it is registered,
+ * scripts can use `window.webkit.messageHandlers.&amp;lt;name&amp;gt;.postMessage(value)`
+ * to send messages. Those messages are received by connecting handlers
+ * to the #WebKitUserContentManager::script-message-received signal. The
+ * handler name is used as the detail of the signal. To avoid race
+ * conditions between registering the handler name, and starting to
+ * receive the signals, it is recommended to connect to the signal
+ * *before* registering the handler name:
+ *
+ * &lt;informalexample&gt;&lt;programlisting&gt;
+ * WebKitWebView *view = webkit_web_view_new ();
+ * WebKitUserContentManager *manager = webkit_web_view_get_user_content_manager ();
+ * g_signal_connect (manager, &quot;script-message-received::foobar&quot;,
+ *                   G_CALLBACK (handle_script_message), NULL);
+ * webkit_user_content_manager_register_script_message_handler (manager, &quot;foobar&quot;);
+ * &lt;/programlisting&gt;&lt;/informalexample&gt;
+ *
+ * Registering a script message handler will fail if the requested
+ * name has been already registered before.
+ *
+ * Returns: %TRUE if message handler was registered successfully, or %FALSE otherwise.
+ *
+ * Since: 2.8
+ */
+gboolean webkit_user_content_manager_register_script_message_handler(WebKitUserContentManager* manager, const char* name)
+{
+    g_return_val_if_fail(WEBKIT_IS_USER_CONTENT_MANAGER(manager), FALSE);
+    g_return_val_if_fail(name, FALSE);
+
+    RefPtr&lt;WebScriptMessageHandler&gt; handler =
+        WebScriptMessageHandler::create(std::make_unique&lt;ScriptMessageClientGtk&gt;(manager, name), String::fromUTF8(name));
+    return manager-&gt;priv-&gt;userContentController-&gt;addUserScriptMessageHandler(handler.get());
+}
+
+/**
+ * webkit_user_content_manager_unregister_script_message_handler:
+ * @manager: A #WebKitUserContentManager
+ * @name: Name of the script message channel
+ *
+ * Unregisters a previously registered message handler.
+ *
+ * Note that this does *not* disconnect handlers for the
+ * #WebKitUserContentManager::script-message-received signal,
+ * they will be kept connected, but the signal will not be emitted
+ * unless the handler name is registered again.
+ *
+ * See also webkit_user_content_manager_register_script_message_handler()
+ *
+ * Since: 2.8
+ */
+void webkit_user_content_manager_unregister_script_message_handler(WebKitUserContentManager* manager, const char* name)
+{
+    g_return_if_fail(WEBKIT_IS_USER_CONTENT_MANAGER(manager));
+    g_return_if_fail(name);
+    manager-&gt;priv-&gt;userContentController-&gt;removeUserMessageHandlerForName(String::fromUTF8(name));
+}
+
</ins><span class="cx"> WebUserContentControllerProxy* webkitUserContentManagerGetUserContentControllerProxy(WebKitUserContentManager* manager)
</span><span class="cx"> {
</span><span class="cx">     return manager-&gt;priv-&gt;userContentController.get();
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitUserContentManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.h (175413 => 175414)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.h        2014-10-31 19:02:39 UTC (rev 175413)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserContentManager.h        2014-10-31 19:04:19 UTC (rev 175414)
</span><span class="lines">@@ -60,18 +60,25 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> WEBKIT_API GType
</span><del>-webkit_user_content_manager_get_type                (void);
</del><ins>+webkit_user_content_manager_get_type                          (void);
</ins><span class="cx"> 
</span><span class="cx"> WEBKIT_API WebKitUserContentManager *
</span><del>-webkit_user_content_manager_new                     (void);
</del><ins>+webkit_user_content_manager_new                               (void);
</ins><span class="cx"> 
</span><span class="cx"> WEBKIT_API void
</span><del>-webkit_user_content_manager_add_style_sheet         (WebKitUserContentManager *manager,
-                                                     WebKitUserStyleSheet     *stylesheet);
</del><ins>+webkit_user_content_manager_add_style_sheet                   (WebKitUserContentManager *manager,
+                                                               WebKitUserStyleSheet     *stylesheet);
</ins><span class="cx"> WEBKIT_API void
</span><del>-webkit_user_content_manager_remove_all_style_sheets (WebKitUserContentManager *manager);
</del><ins>+webkit_user_content_manager_remove_all_style_sheets           (WebKitUserContentManager *manager);
</ins><span class="cx"> 
</span><ins>+WEBKIT_API gboolean
+webkit_user_content_manager_register_script_message_handler   (WebKitUserContentManager *manager,
+                                                               const gchar              *name);
</ins><span class="cx"> WEBKIT_API void
</span><ins>+webkit_user_content_manager_unregister_script_message_handler (WebKitUserContentManager *manager,
+                                                               const gchar              *name);
+
+WEBKIT_API void
</ins><span class="cx"> webkit_user_content_manager_add_script              (WebKitUserContentManager *manager,
</span><span class="cx">                                                      WebKitUserScript         *script);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp (175413 => 175414)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp        2014-10-31 19:02:39 UTC (rev 175413)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp        2014-10-31 19:04:19 UTC (rev 175414)
</span><span class="lines">@@ -57,6 +57,7 @@
</span><span class="cx"> #include &quot;WebKitWebViewBasePrivate.h&quot;
</span><span class="cx"> #include &quot;WebKitWebViewPrivate.h&quot;
</span><span class="cx"> #include &quot;WebKitWindowPropertiesPrivate.h&quot;
</span><ins>+#include &quot;WebSerializedScriptValue.h&quot;
</ins><span class="cx"> #include &lt;JavaScriptCore/APICast.h&gt;
</span><span class="cx"> #include &lt;WebCore/CertificateInfo.h&gt;
</span><span class="cx"> #include &lt;WebCore/DragIcon.h&gt;
</span><span class="lines">@@ -2778,7 +2779,8 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     WebKitWebView* webView = WEBKIT_WEB_VIEW(g_task_get_source_object(task));
</span><del>-    g_task_return_pointer(task, webkitJavascriptResultCreate(webView, wkSerializedScriptValue),
</del><ins>+    g_task_return_pointer(task, webkitJavascriptResultCreate(webView,
+        *static_cast&lt;WebCore::SerializedScriptValue*&gt;(wkSerializedScriptValue-&gt;internalRepresentation())),
</ins><span class="cx">         reinterpret_cast&lt;GDestroyNotify&gt;(webkit_javascript_result_unref));
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkdocswebkit2gtksectionstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt (175413 => 175414)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt        2014-10-31 19:02:39 UTC (rev 175413)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt        2014-10-31 19:04:19 UTC (rev 175414)
</span><span class="lines">@@ -106,6 +106,8 @@
</span><span class="cx"> webkit_user_content_manager_remove_all_style_sheets
</span><span class="cx"> webkit_user_content_manager_add_script
</span><span class="cx"> webkit_user_content_manager_remove_all_scripts
</span><ins>+webkit_user_content_manager_register_script_message_handler
+webkit_user_content_manager_unregister_script_message_handler
</ins><span class="cx"> 
</span><span class="cx"> &lt;SUBSECTION Standard&gt;
</span><span class="cx"> WEBKIT_IS_USER_CONTENT_MANAGER
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkdocswebkit2gtktypes"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk.types (175413 => 175414)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk.types        2014-10-31 19:02:39 UTC (rev 175413)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk.types        2014-10-31 19:04:19 UTC (rev 175414)
</span><span class="lines">@@ -27,3 +27,4 @@
</span><span class="cx"> webkit_credential_get_type
</span><span class="cx"> webkit_frame_get_type
</span><span class="cx"> webkit_certificate_info_get_type
</span><ins>+webkit_user_content_manager_get_type
</ins></span></pre></div>
<a id="trunkSourcecmakeOptionsGTKcmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/cmake/OptionsGTK.cmake (175413 => 175414)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/cmake/OptionsGTK.cmake        2014-10-31 19:02:39 UTC (rev 175413)
+++ trunk/Source/cmake/OptionsGTK.cmake        2014-10-31 19:04:19 UTC (rev 175414)
</span><span class="lines">@@ -145,6 +145,7 @@
</span><span class="cx"> WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_TEMPLATE_ELEMENT ON)
</span><span class="cx"> WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_TOUCH_EVENTS ON)
</span><span class="cx"> WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_USERSELECT_ALL ON)
</span><ins>+WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_USER_MESSAGE_HANDLERS ON)
</ins><span class="cx"> WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_VIBRATION OFF)
</span><span class="cx"> WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_VIDEO ON)
</span><span class="cx"> WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_VIDEO_TRACK ON)
</span></span></pre></div>
<a id="trunkSourcecmakeWebKitFeaturescmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/cmake/WebKitFeatures.cmake (175413 => 175414)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/cmake/WebKitFeatures.cmake        2014-10-31 19:02:39 UTC (rev 175413)
+++ trunk/Source/cmake/WebKitFeatures.cmake        2014-10-31 19:04:19 UTC (rev 175414)
</span><span class="lines">@@ -132,6 +132,7 @@
</span><span class="cx">     WEBKIT_OPTION_DEFINE(ENABLE_TOUCH_SLIDER &quot;Toggle Touch Slider support&quot; OFF)
</span><span class="cx">     WEBKIT_OPTION_DEFINE(ENABLE_TOUCH_ICON_LOADING &quot;Toggle Touch Icon Loading Support&quot; OFF)
</span><span class="cx">     WEBKIT_OPTION_DEFINE(ENABLE_USERSELECT_ALL &quot;Toggle user-select:all support&quot; OFF)
</span><ins>+    WEBKIT_OPTION_DEFINE(ENABLE_USER_MESSAGE_HANDLERS &quot;Toggle user script message handler support&quot; OFF)
</ins><span class="cx">     WEBKIT_OPTION_DEFINE(ENABLE_USER_TIMING &quot;Toggle User Timing support&quot; OFF)
</span><span class="cx">     WEBKIT_OPTION_DEFINE(ENABLE_VIBRATION &quot;Toggle Vibration API support&quot; OFF)
</span><span class="cx">     WEBKIT_OPTION_DEFINE(ENABLE_VIDEO &quot;Toggle Video support&quot; OFF)
</span></span></pre></div>
<a id="trunkSourcecmakeconfighcmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/cmakeconfig.h.cmake (175413 => 175414)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/cmakeconfig.h.cmake        2014-10-31 19:02:39 UTC (rev 175413)
+++ trunk/Source/cmakeconfig.h.cmake        2014-10-31 19:04:19 UTC (rev 175414)
</span><span class="lines">@@ -120,6 +120,7 @@
</span><span class="cx"> #cmakedefine01 ENABLE_TOUCH_SLIDER
</span><span class="cx"> #cmakedefine01 ENABLE_TOUCH_ICON_LOADING
</span><span class="cx"> #cmakedefine01 ENABLE_USERSELECT_ALL
</span><ins>+#cmakedefine01 ENABLE_USER_MESSAGE_HANDLERS
</ins><span class="cx"> #cmakedefine01 ENABLE_USER_TIMING
</span><span class="cx"> #cmakedefine01 ENABLE_VIBRATION
</span><span class="cx"> #cmakedefine01 ENABLE_VIDEO
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (175413 => 175414)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2014-10-31 19:02:39 UTC (rev 175413)
+++ trunk/Tools/ChangeLog        2014-10-31 19:04:19 UTC (rev 175414)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2014-10-31  Adrian Perez de Castro  &lt;aperez@igalia.com&gt;
+
+        [GTK] Support script message handlers WebKitUserContentManager
+        https://bugs.webkit.org/show_bug.cgi?id=133730
+
+        Reviewed by Carlos Garcia Campos.
+
+        Support user script message handlers in WebKitUserContentManager.
+        This needs building with ENABLE_USER_MESSAGE_HANDLERS, for which
+        an option is added to the CMake build files. The option is disabled
+        globally by default, and the WebKitGTK port enables it. On the API
+        level, two new methods to register and unregister names are provided
+        in the &quot;window.webkit&quot; namespace, and on message reception the
+        &quot;WebKitUserContentManager::script-message-received&quot; signal is
+        emitted, using the registered names as signal detail.
+
+        * TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitUserContentManager.cpp:
+        Add test case for user script message handlers.
+        (scriptMessageReceived):
+        (testUserContentManagerScriptMessageReceived):
+        (beforeAll):
+
</ins><span class="cx"> 2014-10-30  Matthew Hanson  &lt;matthew_hanson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         bisect-builds should support WebKit clients other than Safari
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2GtkTestWebKitUserContentManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitUserContentManager.cpp (175413 => 175414)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitUserContentManager.cpp        2014-10-31 19:02:39 UTC (rev 175413)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitUserContentManager.cpp        2014-10-31 19:04:19 UTC (rev 175414)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2013 Igalia S.L.
</del><ins>+ * Copyright (C) 2013-2014 Igalia S.L.
</ins><span class="cx">  *
</span><span class="cx">  * This library is free software; you can redistribute it and/or
</span><span class="cx">  * modify it under the terms of the GNU Lesser General Public
</span><span class="lines">@@ -25,6 +25,7 @@
</span><span class="cx"> #include &lt;gtk/gtk.h&gt;
</span><span class="cx"> #include &lt;webkit2/webkit2.h&gt;
</span><span class="cx"> #include &lt;wtf/gobject/GRefPtr.h&gt;
</span><ins>+#include &lt;wtf/gobject/GUniquePtr.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> class UserContentManagerTest : public WebViewTest {
</span><span class="cx"> public:
</span><span class="lines">@@ -212,6 +213,134 @@
</span><span class="cx">     removeOldInjectedContentAndResetLists(test-&gt;m_userContentManager.get(), whitelist, blacklist);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+class UserScriptMessageTest : public UserContentManagerTest {
+public:
+    MAKE_GLIB_TEST_FIXTURE(UserScriptMessageTest);
+
+    UserScriptMessageTest()
+        : UserContentManagerTest()
+        , m_userScriptMessage(nullptr)
+    {
+    }
+
+    ~UserScriptMessageTest()
+    {
+        if (m_userScriptMessage)
+            webkit_javascript_result_unref(m_userScriptMessage);
+    }
+
+    bool registerHandler(const char* handlerName)
+    {
+        return webkit_user_content_manager_register_script_message_handler(m_userContentManager.get(), handlerName);
+    }
+
+    void unregisterHandler(const char* handlerName)
+    {
+        webkit_user_content_manager_unregister_script_message_handler(m_userContentManager.get(), handlerName);
+    }
+
+    static void scriptMessageReceived(WebKitUserContentManager* userContentManager, WebKitJavascriptResult* jsResult, UserScriptMessageTest* test)
+    {
+        g_signal_handlers_disconnect_by_func(userContentManager, reinterpret_cast&lt;gpointer&gt;(scriptMessageReceived), test);
+        g_main_loop_quit(test-&gt;m_mainLoop);
+
+        g_assert(!test-&gt;m_userScriptMessage);
+        test-&gt;m_userScriptMessage = webkit_javascript_result_ref(jsResult);
+    }
+
+    WebKitJavascriptResult* postMessageAndWaitUntilReceived(const char* handlerName, const char* javascriptValueAsText)
+    {
+        if (m_userScriptMessage) {
+            webkit_javascript_result_unref(m_userScriptMessage);
+            m_userScriptMessage = nullptr;
+        }
+
+        GUniquePtr&lt;char&gt; signalName(g_strdup_printf(&quot;script-message-received::%s&quot;, handlerName));
+        g_signal_connect(m_userContentManager.get(), signalName.get(), G_CALLBACK(scriptMessageReceived), this);
+
+        GUniquePtr&lt;char&gt; javascriptSnippet(g_strdup_printf(&quot;window.webkit.messageHandlers.%s.postMessage(%s);&quot;, handlerName, javascriptValueAsText));
+        webkit_web_view_run_javascript(m_webView, javascriptSnippet.get(), nullptr, nullptr, nullptr);
+        g_main_loop_run(m_mainLoop);
+
+        g_assert(m_userScriptMessage);
+        return m_userScriptMessage;
+    }
+
+private:
+    WebKitJavascriptResult* m_userScriptMessage;
+};
+
+static void testUserContentManagerScriptMessageReceived(UserScriptMessageTest* test, gconstpointer)
+{
+    g_assert(test-&gt;registerHandler(&quot;msg&quot;));
+
+    // Trying to register the same handler a second time must fail.
+    g_assert(!test-&gt;registerHandler(&quot;msg&quot;));
+
+    test-&gt;loadHtml(&quot;&lt;html&gt;&lt;/html&gt;&quot;, nullptr);
+    test-&gt;waitUntilLoadFinished();
+
+    // Check that the &quot;window.webkit.messageHandlers&quot; namespace exists.
+    GUniqueOutPtr&lt;GError&gt; error;
+    WebKitJavascriptResult* javascriptResult = test-&gt;runJavaScriptAndWaitUntilFinished(&quot;window.webkit.messageHandlers ? 'y' : 'n';&quot;, &amp;error.outPtr());
+    g_assert(javascriptResult);
+    g_assert(!error.get());
+    GUniquePtr&lt;char&gt; valueString(WebViewTest::javascriptResultToCString(javascriptResult));
+    g_assert_cmpstr(valueString.get(), ==, &quot;y&quot;);
+
+    // Check that the &quot;document.webkit.messageHandlers.msg&quot; namespace exists.
+    javascriptResult = test-&gt;runJavaScriptAndWaitUntilFinished(&quot;window.webkit.messageHandlers.msg ? 'y' : 'n';&quot;, &amp;error.outPtr());
+    g_assert(javascriptResult);
+    g_assert(!error.get());
+    valueString.reset(WebViewTest::javascriptResultToCString(javascriptResult));
+    g_assert_cmpstr(valueString.get(), ==, &quot;y&quot;);
+
+    valueString.reset(WebViewTest::javascriptResultToCString(test-&gt;postMessageAndWaitUntilReceived(&quot;msg&quot;, &quot;'user message'&quot;)));
+    g_assert_cmpstr(valueString.get(), ==, &quot;user message&quot;);
+
+    // Messages should arrive despite of other handlers being registered.
+    g_assert(test-&gt;registerHandler(&quot;anotherHandler&quot;));
+
+    // Check that the &quot;document.webkit.messageHandlers.msg&quot; namespace still exists.
+    javascriptResult = test-&gt;runJavaScriptAndWaitUntilFinished(&quot;window.webkit.messageHandlers.msg ? 'y' : 'n';&quot;, &amp;error.outPtr());
+    g_assert(javascriptResult);
+    g_assert(!error.get());
+    valueString.reset(WebViewTest::javascriptResultToCString(javascriptResult));
+    g_assert_cmpstr(valueString.get(), ==, &quot;y&quot;);
+
+    // Check that the &quot;document.webkit.messageHandlers.anotherHandler&quot; namespace exists.
+    javascriptResult = test-&gt;runJavaScriptAndWaitUntilFinished(&quot;window.webkit.messageHandlers.anotherHandler ? 'y' : 'n';&quot;, &amp;error.outPtr());
+    g_assert(javascriptResult);
+    g_assert(!error.get());
+    valueString.reset(WebViewTest::javascriptResultToCString(javascriptResult));
+    g_assert_cmpstr(valueString.get(), ==, &quot;y&quot;);
+
+    valueString.reset(WebViewTest::javascriptResultToCString(test-&gt;postMessageAndWaitUntilReceived(&quot;msg&quot;, &quot;'handler: msg'&quot;)));
+    g_assert_cmpstr(valueString.get(), ==, &quot;handler: msg&quot;);
+
+    valueString.reset(WebViewTest::javascriptResultToCString(test-&gt;postMessageAndWaitUntilReceived(&quot;anotherHandler&quot;, &quot;'handler: anotherHandler'&quot;)));
+    g_assert_cmpstr(valueString.get(), ==, &quot;handler: anotherHandler&quot;);
+
+    // Unregistering a handler and re-registering again under the same name should work.
+    test-&gt;unregisterHandler(&quot;msg&quot;);
+
+    // FIXME: Enable after https://bugs.webkit.org/show_bug.cgi?id=138142 gets fixed.
+#if 0
+    javascriptResult = test-&gt;runJavaScriptAndWaitUntilFinished(&quot;window.webkit.messageHandlers.msg.postMessage('42');&quot;, &amp;error.outPtr());
+    g_assert(!javascriptResult);
+    g_assert(error.get());
+
+    // Re-registering a handler that has been unregistered must work
+    g_assert(test-&gt;registerHandler(&quot;msg&quot;));
+    message = test-&gt;postMessageAndWaitUntilReceived(&quot;msg&quot;, &quot;'handler: msg'&quot;);
+    valueString.reset(WebViewTest::javascriptResultToCString(message));
+    webkit_javascript_result_unref(message);
+    g_assert_cmpstr(valueString.get(), ==, &quot;handler: msg&quot;);
+#endif
+
+    test-&gt;unregisterHandler(&quot;anotherHandler&quot;);
+}
+
</ins><span class="cx"> static void serverCallback(SoupServer* server, SoupMessage* message, const char* path, GHashTable*, SoupClientContext*, gpointer)
</span><span class="cx"> {
</span><span class="cx">     soup_message_set_status(message, SOUP_STATUS_OK);
</span><span class="lines">@@ -227,6 +356,7 @@
</span><span class="cx">     Test::add(&quot;WebKitWebView&quot;, &quot;new-with-user-content-manager&quot;, testWebViewNewWithUserContentManager);
</span><span class="cx">     UserContentManagerTest::add(&quot;WebKitUserContentManager&quot;, &quot;injected-style-sheet&quot;, testUserContentManagerInjectedStyleSheet);
</span><span class="cx">     UserContentManagerTest::add(&quot;WebKitUserContentManager&quot;, &quot;injected-script&quot;, testUserContentManagerInjectedScript);
</span><ins>+    UserScriptMessageTest::add(&quot;WebKitUserContentManager&quot;, &quot;script-message-received&quot;, testUserContentManagerScriptMessageReceived);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void afterAll()
</span></span></pre>
</div>
</div>

</body>
</html>