<!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>[211372] 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/211372">211372</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2017-01-30 10:13:11 -0800 (Mon, 30 Jan 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>REGRESSION(<a href="http://trac.webkit.org/projects/webkit/changeset/202615">r202615</a>?): [GStreamer] ASSERTION FAILED: isMainThread() in WebCore::BuiltinResourceHandleConstructorMap&amp; WebCore::builtinResourceHandleConstructorMap()
https://bugs.webkit.org/show_bug.cgi?id=167003

Reviewed by Michael Catanzaro.

Add a way to create a ResourceHandle for a given SoupNetworkSession and use it in the GStreamer streaming client
to ensure both the session and the handle are created and destroyed in the secondary thread. This way we also
avoid using the default session for downloading HLS fragments.

* platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
(ResourceHandleStreamingClient::ResourceHandleStreamingClient): Create a SoupNetworkSession and pass it to ResourceHandle::create().
* platform/network/ResourceHandle.h: Add create and constructor to receive a SoupNetworkSession.
* platform/network/ResourceHandleInternal.h: Add SoupNetworkSession member.
* platform/network/soup/ResourceHandleSoup.cpp:
(WebCore::ResourceHandleInternal::soupSession): Return the SoupNetworkSession if not nullptr.
(WebCore::ResourceHandle::create): Create a ResourceHandle without trying to use any builtin constructor and
using the given SoupNetworkSession.
(WebCore::ResourceHandle::ResourceHandle): Set the SoupNetworkSession if early request validations didn't fail.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerWebKitWebSourceGStreamercpp">trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkResourceHandleh">trunk/Source/WebCore/platform/network/ResourceHandle.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkResourceHandleInternalh">trunk/Source/WebCore/platform/network/ResourceHandleInternal.h</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworksoupResourceHandleSoupcpp">trunk/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (211371 => 211372)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-01-30 17:36:43 UTC (rev 211371)
+++ trunk/Source/WebCore/ChangeLog        2017-01-30 18:13:11 UTC (rev 211372)
</span><span class="lines">@@ -1,3 +1,24 @@
</span><ins>+2017-01-30  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        REGRESSION(r202615?): [GStreamer] ASSERTION FAILED: isMainThread() in WebCore::BuiltinResourceHandleConstructorMap&amp; WebCore::builtinResourceHandleConstructorMap()
+        https://bugs.webkit.org/show_bug.cgi?id=167003
+
+        Reviewed by Michael Catanzaro.
+
+        Add a way to create a ResourceHandle for a given SoupNetworkSession and use it in the GStreamer streaming client
+        to ensure both the session and the handle are created and destroyed in the secondary thread. This way we also
+        avoid using the default session for downloading HLS fragments.
+
+        * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
+        (ResourceHandleStreamingClient::ResourceHandleStreamingClient): Create a SoupNetworkSession and pass it to ResourceHandle::create().
+        * platform/network/ResourceHandle.h: Add create and constructor to receive a SoupNetworkSession.
+        * platform/network/ResourceHandleInternal.h: Add SoupNetworkSession member.
+        * platform/network/soup/ResourceHandleSoup.cpp:
+        (WebCore::ResourceHandleInternal::soupSession): Return the SoupNetworkSession if not nullptr.
+        (WebCore::ResourceHandle::create): Create a ResourceHandle without trying to use any builtin constructor and
+        using the given SoupNetworkSession.
+        (WebCore::ResourceHandle::ResourceHandle): Set the SoupNetworkSession if early request validations didn't fail.
+
</ins><span class="cx"> 2017-01-30  Youenn Fablet  &lt;youennf@gmail.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WebRTC] Add support for libwebrtc data channel
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerWebKitWebSourceGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp (211371 => 211372)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp        2017-01-30 17:36:43 UTC (rev 211371)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp        2017-01-30 18:13:11 UTC (rev 211372)
</span><span class="lines">@@ -46,6 +46,10 @@
</span><span class="cx"> #include &lt;wtf/glib/GUniquePtr.h&gt;
</span><span class="cx"> #include &lt;wtf/text/CString.h&gt;
</span><span class="cx"> 
</span><ins>+#if USE(SOUP)
+#include &quot;SoupNetworkSession.h&quot;
+#endif
+
</ins><span class="cx"> using namespace WebCore;
</span><span class="cx"> 
</span><span class="cx"> class StreamingClient {
</span><span class="lines">@@ -111,6 +115,9 @@
</span><span class="cx">         Lock m_terminateRunLoopConditionMutex;
</span><span class="cx">         Condition m_terminateRunLoopCondition;
</span><span class="cx">         RefPtr&lt;ResourceHandle&gt; m_resource;
</span><ins>+#if USE(SOUP)
+        std::unique_ptr&lt;SoupNetworkSession&gt; m_session;
+#endif
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> enum MainThreadSourceNotification {
</span><span class="lines">@@ -1071,7 +1078,13 @@
</span><span class="cx">         {
</span><span class="cx">             LockHolder locker(m_initializeRunLoopConditionMutex);
</span><span class="cx">             m_runLoop = &amp;RunLoop::current();
</span><ins>+#if USE(SOUP)
+            m_session = std::make_unique&lt;SoupNetworkSession&gt;();
+            m_resource = ResourceHandle::create(*m_session, request, this, true, false);
+#else
+            // FIXME: This create will hit an assert in debug builds. See https://bugs.webkit.org/show_bug.cgi?id=167003.
</ins><span class="cx">             m_resource = ResourceHandle::create(nullptr /*context*/, request, this, true, false);
</span><ins>+#endif
</ins><span class="cx">             m_initializeRunLoopCondition.notifyOne();
</span><span class="cx">         }
</span><span class="cx">         if (!m_resource)
</span><span class="lines">@@ -1085,6 +1098,9 @@
</span><span class="cx">             m_resource-&gt;clearClient();
</span><span class="cx">             m_resource-&gt;cancel();
</span><span class="cx">             m_resource = nullptr;
</span><ins>+#if USE(SOUP)
+            m_session = nullptr;
+#endif
</ins><span class="cx">             m_terminateRunLoopCondition.notifyOne();
</span><span class="cx">         }
</span><span class="cx">     });
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkResourceHandleh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/ResourceHandle.h (211371 => 211372)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/ResourceHandle.h        2017-01-30 17:36:43 UTC (rev 211371)
+++ trunk/Source/WebCore/platform/network/ResourceHandle.h        2017-01-30 18:13:11 UTC (rev 211372)
</span><span class="lines">@@ -86,6 +86,7 @@
</span><span class="cx"> class NetworkLoadTiming;
</span><span class="cx"> class ResourceRequest;
</span><span class="cx"> class ResourceResponse;
</span><ins>+class SoupNetworkSession;
</ins><span class="cx"> class SharedBuffer;
</span><span class="cx"> class Timer;
</span><span class="cx"> 
</span><span class="lines">@@ -94,6 +95,10 @@
</span><span class="cx">     WEBCORE_EXPORT static RefPtr&lt;ResourceHandle&gt; create(NetworkingContext*, const ResourceRequest&amp;, ResourceHandleClient*, bool defersLoading, bool shouldContentSniff);
</span><span class="cx">     WEBCORE_EXPORT static void loadResourceSynchronously(NetworkingContext*, const ResourceRequest&amp;, StoredCredentials, ResourceError&amp;, ResourceResponse&amp;, Vector&lt;char&gt;&amp; data);
</span><span class="cx"> 
</span><ins>+#if USE(SOUP)
+    static RefPtr&lt;ResourceHandle&gt; create(SoupNetworkSession&amp;, const ResourceRequest&amp;, ResourceHandleClient*, bool defersLoading, bool shouldContentSniff);
+#endif
+
</ins><span class="cx">     WEBCORE_EXPORT virtual ~ResourceHandle();
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(COCOA) || USE(CFURLCONNECTION)
</span><span class="lines">@@ -241,6 +246,10 @@
</span><span class="cx">         InvalidURLFailure
</span><span class="cx">     };
</span><span class="cx"> 
</span><ins>+#if USE(SOUP)
+    ResourceHandle(SoupNetworkSession&amp;, const ResourceRequest&amp;, ResourceHandleClient*, bool defersLoading, bool shouldContentSniff);
+#endif
+
</ins><span class="cx">     void platformSetDefersLoading(bool);
</span><span class="cx"> 
</span><span class="cx">     void platformContinueSynchronousDidReceiveResponse();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkResourceHandleInternalh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/ResourceHandleInternal.h (211371 => 211372)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/ResourceHandleInternal.h        2017-01-30 17:36:43 UTC (rev 211371)
+++ trunk/Source/WebCore/platform/network/ResourceHandleInternal.h        2017-01-30 18:13:11 UTC (rev 211372)
</span><span class="lines">@@ -50,6 +50,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if USE(SOUP)
</span><span class="cx"> #include &quot;GUniquePtrSoup.h&quot;
</span><ins>+#include &quot;SoupNetworkSession.h&quot;
</ins><span class="cx"> #include &lt;libsoup/soup.h&gt;
</span><span class="cx"> #include &lt;wtf/RunLoop.h&gt;
</span><span class="cx"> #include &lt;wtf/glib/GRefPtr.h&gt;
</span><span class="lines">@@ -149,6 +150,7 @@
</span><span class="cx">     bool m_addedCacheValidationHeaders { false };
</span><span class="cx"> #endif
</span><span class="cx"> #if USE(SOUP)
</span><ins>+    SoupNetworkSession* m_session { nullptr };
</ins><span class="cx">     GRefPtr&lt;SoupMessage&gt; m_soupMessage;
</span><span class="cx">     ResourceResponse m_response;
</span><span class="cx">     bool m_cancelled { false };
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworksoupResourceHandleSoupcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp (211371 => 211372)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp        2017-01-30 17:36:43 UTC (rev 211371)
+++ trunk/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp        2017-01-30 18:13:11 UTC (rev 211372)
</span><span class="lines">@@ -91,9 +91,38 @@
</span><span class="cx"> 
</span><span class="cx"> SoupSession* ResourceHandleInternal::soupSession()
</span><span class="cx"> {
</span><del>-    return sessionFromContext(m_context.get());
</del><ins>+    return m_session ? m_session-&gt;soupSession() : sessionFromContext(m_context.get());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+RefPtr&lt;ResourceHandle&gt; ResourceHandle::create(SoupNetworkSession&amp; session, const ResourceRequest&amp; request, ResourceHandleClient* client, bool defersLoading, bool shouldContentSniff)
+{
+    auto newHandle = adoptRef(*new ResourceHandle(session, request, client, defersLoading, shouldContentSniff));
+
+    if (newHandle-&gt;d-&gt;m_scheduledFailureType != NoFailure)
+        return WTFMove(newHandle);
+
+    if (newHandle-&gt;start())
+        return WTFMove(newHandle);
+
+    return nullptr;
+}
+
+ResourceHandle::ResourceHandle(SoupNetworkSession&amp; session, const ResourceRequest&amp; request, ResourceHandleClient* client, bool defersLoading, bool shouldContentSniff)
+    : d(std::make_unique&lt;ResourceHandleInternal&gt;(this, nullptr, request, client, defersLoading, shouldContentSniff &amp;&amp; shouldContentSniffURL(request.url())))
+{
+    if (!request.url().isValid()) {
+        scheduleFailure(InvalidURLFailure);
+        return;
+    }
+
+    if (!portAllowed(request.url())) {
+        scheduleFailure(BlockedFailure);
+        return;
+    }
+
+    d-&gt;m_session = &amp;session;
+}
+
</ins><span class="cx"> bool ResourceHandle::cancelledOrClientless()
</span><span class="cx"> {
</span><span class="cx">     if (!client())
</span></span></pre>
</div>
</div>

</body>
</html>