<!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>[191457] trunk/Source</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/191457">191457</a></dd>
<dt>Author</dt> <dd>achristensen@apple.com</dd>
<dt>Date</dt> <dd>2015-10-22 11:00:29 -0700 (Thu, 22 Oct 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Initial NSURLSession WebResourceLoader implementation
https://bugs.webkit.org/show_bug.cgi?id=150355

Reviewed by Antti Koivisto.

Source/WebCore:

* platform/network/cf/AuthenticationChallenge.h:
(WebCore::AuthenticationChallenge::AuthenticationChallenge): Export constructor for use in WebKit2.

Source/WebKit2:

* NetworkProcess/NetworkConnectionToWebProcess.cpp:
(WebKit::NetworkConnectionToWebProcess::convertMainResourceLoadToDownload):
(WebKit::NetworkConnectionToWebProcess::cookiesForDOM):
* NetworkProcess/NetworkResourceLoader.cpp:
(WebKit::NetworkResourceLoader::~NetworkResourceLoader):
(WebKit::NetworkResourceLoader::startNetworkLoad):
(WebKit::NetworkResourceLoader::setDefersLoading):
(WebKit::NetworkResourceLoader::cleanup):
(WebKit::NetworkResourceLoader::didConvertHandleToDownload):
(WebKit::NetworkResourceLoader::abort):
(WebKit::NetworkResourceLoader::willPerformHTTPRedirection):
(WebKit::NetworkResourceLoader::didReceiveChallenge):
(WebKit::NetworkResourceLoader::didReceiveResponse):
(WebKit::NetworkResourceLoader::didReceiveData):
(WebKit::NetworkResourceLoader::didCompleteWithError):
(WebKit::NetworkResourceLoader::didReceiveResponseAsync):
(WebKit::NetworkResourceLoader::willSendRequestAsync):
(WebKit::NetworkResourceLoader::continueWillSendRequest):
(WebKit::NetworkResourceLoader::continueDidReceiveResponse):
(WebKit::NetworkResourceLoader::didSendData):
(WebKit::NetworkResourceLoader::receivedCancellation):
(WebKit::NetworkResourceLoader::startBufferingTimerIfNeeded):
(WebKit::NetworkResourceLoader::bufferingTimerFired):
(WebKit::NetworkResourceLoader::validateCacheEntry):
(WebKit::NetworkResourceLoader::sendAbortingOnFailure):
(WebKit::NetworkResourceLoader::canAuthenticateAgainstProtectionSpaceAsync):
(WebKit::NetworkResourceLoader::continueCanAuthenticateAgainstProtectionSpace):
(WebKit::NetworkResourceLoader::supportsDataArray):
* NetworkProcess/NetworkResourceLoader.h:
(WebKit::NetworkResourceLoader::create):
(WebKit::NetworkResourceLoader::currentRequest):
(WebKit::NetworkResourceLoader::handle):
* NetworkProcess/NetworkSession.h: Added.
(WebKit::NetworkSessionTaskClient::~NetworkSessionTaskClient):
(WebKit::NetworkingDataTask::client):
(WebKit::NetworkingDataTask::clearClient):
(WebKit::NetworkSession::~NetworkSession):
* NetworkProcess/cocoa/NetworkSessionCocoa.mm: Added.
(toNSURLSessionResponseDisposition):
(toNSURLSessionAuthChallengeDisposition):
(-[NetworkSessionDelegate initWithNetworkSession:]):
(-[NetworkSessionDelegate URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:]):
(-[NetworkSessionDelegate URLSession:task:didReceiveChallenge:completionHandler:]):
(-[NetworkSessionDelegate URLSession:task:didCompleteWithError:]):
(-[NetworkSessionDelegate URLSession:dataTask:didReceiveResponse:completionHandler:]):
(-[NetworkSessionDelegate URLSession:dataTask:didReceiveData:]):
(WebKit::NetworkSession::create):
(WebKit::NetworkSession::singleton):
(WebKit::configurationForType):
(WebKit::NetworkSession::NetworkSession):
(WebKit::NetworkSession::createDataTaskWithRequest):
(WebKit::NetworkSession::dataTaskForIdentifier):
(WebKit::NetworkingDataTask::NetworkingDataTask):
(WebKit::NetworkingDataTask::~NetworkingDataTask):
(WebKit::NetworkingDataTask::suspend):
(WebKit::NetworkingDataTask::resume):
(WebKit::NetworkingDataTask::taskIdentifier):
* NetworkProcess/mac/NetworkResourceLoaderMac.mm:
(WebKit::NetworkResourceLoader::willCacheResponseAsync):
* WebKit2.xcodeproj/project.pbxproj:
* config.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworkcfAuthenticationChallengeh">trunk/Source/WebCore/platform/network/cf/AuthenticationChallenge.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkConnectionToWebProcesscpp">trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkResourceLoadercpp">trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkResourceLoaderh">trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessmacNetworkResourceLoaderMacmm">trunk/Source/WebKit2/NetworkProcess/mac/NetworkResourceLoaderMac.mm</a></li>
<li><a href="#trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj">trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebKit2configh">trunk/Source/WebKit2/config.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkSessionh">trunk/Source/WebKit2/NetworkProcess/NetworkSession.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscocoaNetworkSessionCocoamm">trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (191456 => 191457)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-10-22 17:17:56 UTC (rev 191456)
+++ trunk/Source/WebCore/ChangeLog        2015-10-22 18:00:29 UTC (rev 191457)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2015-10-22  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        Initial NSURLSession WebResourceLoader implementation
+        https://bugs.webkit.org/show_bug.cgi?id=150355
+
+        Reviewed by Antti Koivisto.
+
+        * platform/network/cf/AuthenticationChallenge.h:
+        (WebCore::AuthenticationChallenge::AuthenticationChallenge): Export constructor for use in WebKit2.
+
</ins><span class="cx"> 2015-10-22  Frederic Wang  &lt;fred.wang@free.fr&gt;
</span><span class="cx"> 
</span><span class="cx">         [Mac] Add support for the USE_TYPO_METRICS flag
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworkcfAuthenticationChallengeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/cf/AuthenticationChallenge.h (191456 => 191457)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/cf/AuthenticationChallenge.h        2015-10-22 17:17:56 UTC (rev 191456)
+++ trunk/Source/WebCore/platform/network/cf/AuthenticationChallenge.h        2015-10-22 18:00:29 UTC (rev 191457)
</span><span class="lines">@@ -55,7 +55,7 @@
</span><span class="cx"> 
</span><span class="cx">     CFURLAuthChallengeRef cfURLAuthChallengeRef() const { return m_cfChallenge.get(); }
</span><span class="cx"> #else
</span><del>-    AuthenticationChallenge(NSURLAuthenticationChallenge *);
</del><ins>+    WEBCORE_EXPORT AuthenticationChallenge(NSURLAuthenticationChallenge *);
</ins><span class="cx"> 
</span><span class="cx">     id sender() const { return m_sender.get(); }
</span><span class="cx">     NSURLAuthenticationChallenge *nsURLAuthenticationChallenge() const { return m_nsChallenge.get(); }
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (191456 => 191457)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-10-22 17:17:56 UTC (rev 191456)
+++ trunk/Source/WebKit2/ChangeLog        2015-10-22 18:00:29 UTC (rev 191457)
</span><span class="lines">@@ -1,3 +1,72 @@
</span><ins>+2015-10-22  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        Initial NSURLSession WebResourceLoader implementation
+        https://bugs.webkit.org/show_bug.cgi?id=150355
+
+        Reviewed by Antti Koivisto.
+
+        * NetworkProcess/NetworkConnectionToWebProcess.cpp:
+        (WebKit::NetworkConnectionToWebProcess::convertMainResourceLoadToDownload):
+        (WebKit::NetworkConnectionToWebProcess::cookiesForDOM):
+        * NetworkProcess/NetworkResourceLoader.cpp:
+        (WebKit::NetworkResourceLoader::~NetworkResourceLoader):
+        (WebKit::NetworkResourceLoader::startNetworkLoad):
+        (WebKit::NetworkResourceLoader::setDefersLoading):
+        (WebKit::NetworkResourceLoader::cleanup):
+        (WebKit::NetworkResourceLoader::didConvertHandleToDownload):
+        (WebKit::NetworkResourceLoader::abort):
+        (WebKit::NetworkResourceLoader::willPerformHTTPRedirection):
+        (WebKit::NetworkResourceLoader::didReceiveChallenge):
+        (WebKit::NetworkResourceLoader::didReceiveResponse):
+        (WebKit::NetworkResourceLoader::didReceiveData):
+        (WebKit::NetworkResourceLoader::didCompleteWithError):
+        (WebKit::NetworkResourceLoader::didReceiveResponseAsync):
+        (WebKit::NetworkResourceLoader::willSendRequestAsync):
+        (WebKit::NetworkResourceLoader::continueWillSendRequest):
+        (WebKit::NetworkResourceLoader::continueDidReceiveResponse):
+        (WebKit::NetworkResourceLoader::didSendData):
+        (WebKit::NetworkResourceLoader::receivedCancellation):
+        (WebKit::NetworkResourceLoader::startBufferingTimerIfNeeded):
+        (WebKit::NetworkResourceLoader::bufferingTimerFired):
+        (WebKit::NetworkResourceLoader::validateCacheEntry):
+        (WebKit::NetworkResourceLoader::sendAbortingOnFailure):
+        (WebKit::NetworkResourceLoader::canAuthenticateAgainstProtectionSpaceAsync):
+        (WebKit::NetworkResourceLoader::continueCanAuthenticateAgainstProtectionSpace):
+        (WebKit::NetworkResourceLoader::supportsDataArray):
+        * NetworkProcess/NetworkResourceLoader.h:
+        (WebKit::NetworkResourceLoader::create):
+        (WebKit::NetworkResourceLoader::currentRequest):
+        (WebKit::NetworkResourceLoader::handle):
+        * NetworkProcess/NetworkSession.h: Added.
+        (WebKit::NetworkSessionTaskClient::~NetworkSessionTaskClient):
+        (WebKit::NetworkingDataTask::client):
+        (WebKit::NetworkingDataTask::clearClient):
+        (WebKit::NetworkSession::~NetworkSession):
+        * NetworkProcess/cocoa/NetworkSessionCocoa.mm: Added.
+        (toNSURLSessionResponseDisposition):
+        (toNSURLSessionAuthChallengeDisposition):
+        (-[NetworkSessionDelegate initWithNetworkSession:]):
+        (-[NetworkSessionDelegate URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:]):
+        (-[NetworkSessionDelegate URLSession:task:didReceiveChallenge:completionHandler:]):
+        (-[NetworkSessionDelegate URLSession:task:didCompleteWithError:]):
+        (-[NetworkSessionDelegate URLSession:dataTask:didReceiveResponse:completionHandler:]):
+        (-[NetworkSessionDelegate URLSession:dataTask:didReceiveData:]):
+        (WebKit::NetworkSession::create):
+        (WebKit::NetworkSession::singleton):
+        (WebKit::configurationForType):
+        (WebKit::NetworkSession::NetworkSession):
+        (WebKit::NetworkSession::createDataTaskWithRequest):
+        (WebKit::NetworkSession::dataTaskForIdentifier):
+        (WebKit::NetworkingDataTask::NetworkingDataTask):
+        (WebKit::NetworkingDataTask::~NetworkingDataTask):
+        (WebKit::NetworkingDataTask::suspend):
+        (WebKit::NetworkingDataTask::resume):
+        (WebKit::NetworkingDataTask::taskIdentifier):
+        * NetworkProcess/mac/NetworkResourceLoaderMac.mm:
+        (WebKit::NetworkResourceLoader::willCacheResponseAsync):
+        * WebKit2.xcodeproj/project.pbxproj:
+        * config.h:
+
</ins><span class="cx"> 2015-10-22  Philippe Normand  &lt;pnormand@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, GTK build fix for disabled redirected XComposite window support.
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkConnectionToWebProcesscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp (191456 => 191457)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp        2015-10-22 17:17:56 UTC (rev 191456)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkConnectionToWebProcess.cpp        2015-10-22 18:00:29 UTC (rev 191457)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> #include &quot;NetworkResourceLoaderMessages.h&quot;
</span><span class="cx"> #include &quot;RemoteNetworkingContext.h&quot;
</span><span class="cx"> #include &quot;SessionTracker.h&quot;
</span><ins>+#include &lt;WebCore/NotImplemented.h&gt;
</ins><span class="cx"> #include &lt;WebCore/PingHandle.h&gt;
</span><span class="cx"> #include &lt;WebCore/PlatformCookieJar.h&gt;
</span><span class="cx"> #include &lt;WebCore/ResourceLoaderOptions.h&gt;
</span><span class="lines">@@ -197,12 +198,17 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+#if USE(NETWORK_SESSION)
+    // FIXME: Do something here.
+    notImplemented();
+#else
</ins><span class="cx">     networkProcess.downloadManager().convertHandleToDownload(downloadID, loader-&gt;handle(), request, response);
</span><span class="cx"> 
</span><span class="cx">     // Unblock the URL connection operation queue.
</span><span class="cx">     loader-&gt;handle()-&gt;continueDidReceiveResponse();
</span><span class="cx">     
</span><span class="cx">     loader-&gt;didConvertHandleToDownload();
</span><ins>+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void NetworkConnectionToWebProcess::cookiesForDOM(SessionID sessionID, const URL&amp; firstParty, const URL&amp; url, String&amp; result)
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkResourceLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp (191456 => 191457)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp        2015-10-22 17:17:56 UTC (rev 191456)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.cpp        2015-10-22 18:00:29 UTC (rev 191457)
</span><span class="lines">@@ -47,12 +47,15 @@
</span><span class="cx"> #include &lt;WebCore/CertificateInfo.h&gt;
</span><span class="cx"> #include &lt;WebCore/HTTPHeaderNames.h&gt;
</span><span class="cx"> #include &lt;WebCore/NotImplemented.h&gt;
</span><del>-#include &lt;WebCore/ResourceHandle.h&gt;
</del><span class="cx"> #include &lt;WebCore/SharedBuffer.h&gt;
</span><span class="cx"> #include &lt;WebCore/SynchronousLoaderClient.h&gt;
</span><span class="cx"> #include &lt;wtf/CurrentTime.h&gt;
</span><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><span class="cx"> 
</span><ins>+#if !USE(NETWORK_SESSION)
+#include &lt;WebCore/ResourceHandle.h&gt;
+#endif
+
</ins><span class="cx"> using namespace WebCore;
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="lines">@@ -116,7 +119,11 @@
</span><span class="cx"> NetworkResourceLoader::~NetworkResourceLoader()
</span><span class="cx"> {
</span><span class="cx">     ASSERT(RunLoop::isMain());
</span><ins>+#if USE(NETWORK_SESSION)
+    ASSERT(!m_task);
+#else
</ins><span class="cx">     ASSERT(!m_handle);
</span><ins>+#endif
</ins><span class="cx">     ASSERT(!isSynchronous() || !m_synchronousLoadData-&gt;delayedReply);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -180,7 +187,13 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     bool shouldSniff = m_parameters.contentSniffingPolicy == SniffContent;
</span><ins>+#if USE(NETWORK_SESSION)
+    UNUSED_PARAM(shouldSniff); // FIXME: Use this.
+    m_task = NetworkSession::singleton()-&gt;createDataTaskWithRequest(m_currentRequest, *this);
+    m_task-&gt;resume();
+#else
</ins><span class="cx">     m_handle = ResourceHandle::create(m_networkingContext.get(), m_currentRequest, this, m_defersLoading, shouldSniff);
</span><ins>+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void NetworkResourceLoader::setDefersLoading(bool defers)
</span><span class="lines">@@ -188,10 +201,15 @@
</span><span class="cx">     if (m_defersLoading == defers)
</span><span class="cx">         return;
</span><span class="cx">     m_defersLoading = defers;
</span><ins>+#if USE(NETWORK_SESSION)
+    // FIXME: Do something here.
+    notImplemented();
+#else
</ins><span class="cx">     if (m_handle) {
</span><span class="cx">         m_handle-&gt;setDefersLoading(defers);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><ins>+#endif
</ins><span class="cx">     if (!m_defersLoading)
</span><span class="cx">         start();
</span><span class="cx"> }
</span><span class="lines">@@ -204,25 +222,40 @@
</span><span class="cx"> 
</span><span class="cx">     invalidateSandboxExtensions();
</span><span class="cx"> 
</span><ins>+#if USE(NETWORK_SESSION)
+    if (m_task) {
+        m_task-&gt;clearClient();
+        m_task = nullptr;
+    }
+#else
</ins><span class="cx">     if (m_handle) {
</span><span class="cx">         m_handle-&gt;clearClient();
</span><span class="cx">         m_handle = nullptr;
</span><span class="cx">     }
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx">     // This will cause NetworkResourceLoader to be destroyed and therefore we do it last.
</span><span class="cx">     m_connection-&gt;didCleanupResourceLoader(*this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if !USE(NETWORK_SESSION)
</ins><span class="cx"> void NetworkResourceLoader::didConvertHandleToDownload()
</span><span class="cx"> {
</span><span class="cx">     ASSERT(m_handle);
</span><span class="cx">     m_didConvertHandleToDownload = true;
</span><span class="cx"> }
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx"> void NetworkResourceLoader::abort()
</span><span class="cx"> {
</span><span class="cx">     ASSERT(RunLoop::isMain());
</span><span class="cx"> 
</span><ins>+#if USE(NETWORK_SESSION)
+    if (m_task)
+        m_task-&gt;suspend();
+    // FIXME: Do something with the network cache here.
+    notImplemented();
+#else
</ins><span class="cx">     if (m_handle &amp;&amp; !m_didConvertHandleToDownload) {
</span><span class="cx">         m_handle-&gt;cancel();
</span><span class="cx"> 
</span><span class="lines">@@ -234,10 +267,51 @@
</span><span class="cx">         }
</span><span class="cx"> #endif
</span><span class="cx">     }
</span><del>-
</del><ins>+#endif
</ins><span class="cx">     cleanup();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if USE(NETWORK_SESSION)
+
+void NetworkResourceLoader::willPerformHTTPRedirection(const WebCore::ResourceResponse&amp;, const WebCore::ResourceRequest&amp; request, std::function&lt;void(const WebCore::ResourceRequest&amp;)&gt; completionHandler)
+{
+    notImplemented();
+    completionHandler(request);
+}
+
+void NetworkResourceLoader::didReceiveChallenge(const WebCore::AuthenticationChallenge&amp; challenge, std::function&lt;void(AuthenticationChallengeDisposition, const WebCore::Credential&amp;)&gt; completionHandler)
+{
+    notImplemented();
+    completionHandler(AuthenticationChallengeDisposition::PerformDefaultHandling, WebCore::Credential());
+}
+
+void NetworkResourceLoader::didReceiveResponse(WebCore::ResourceResponse&amp; response, std::function&lt;void(ResponseDisposition)&gt; completionHandler)
+{
+    ASSERT(isMainThread());
+    m_response = response;
+    m_response.setSource(ResourceResponse::Source::Network);
+    if (m_parameters.needsCertificateInfo)
+        m_response.includeCertificateInfo();
+    
+    bool shouldWaitContinueDidReceiveResponse = originalRequest().requester() == ResourceRequest::Requester::Main;
+    if (!sendAbortingOnFailure(Messages::WebResourceLoader::DidReceiveResponse(m_response, shouldWaitContinueDidReceiveResponse)))
+        return;
+    completionHandler(ResponseDisposition::Allow);
+}
+
+void NetworkResourceLoader::didReceiveData(RefPtr&lt;WebCore::SharedBuffer&gt; buffer)
+{
+    ASSERT(buffer);
+    sendBufferMaybeAborting(*buffer, buffer-&gt;size());
+}
+
+void NetworkResourceLoader::didCompleteWithError(const WebCore::ResourceError&amp;)
+{
+    send(Messages::WebResourceLoader::DidFinishResourceLoad(WTF::monotonicallyIncreasingTime()));
+}
+
+#else
+
</ins><span class="cx"> void NetworkResourceLoader::didReceiveResponseAsync(ResourceHandle* handle, const ResourceResponse&amp; receivedResponse)
</span><span class="cx"> {
</span><span class="cx">     ASSERT_UNUSED(handle, handle == m_handle);
</span><span class="lines">@@ -428,6 +502,8 @@
</span><span class="cx">     sendAbortingOnFailure(Messages::WebResourceLoader::WillSendRequest(m_currentRequest, redirectResponse));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#endif // USE(NETWORK_SESSION)
+    
</ins><span class="cx"> void NetworkResourceLoader::continueWillSendRequest(const ResourceRequest&amp; newRequest)
</span><span class="cx"> {
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="lines">@@ -438,24 +514,41 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     if (m_currentRequest.isNull()) {
</span><ins>+#if USE(NETWORK_SESSION)
+        // FIXME: Do something here.
+        notImplemented();
+#else
</ins><span class="cx">         m_handle-&gt;cancel();
</span><span class="cx">         didFail(m_handle.get(), cancelledError(m_currentRequest));
</span><ins>+#endif
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+#if USE(NETWORK_SESSION)
+    // FIXME: Do something here.
+    notImplemented();
+#else
</ins><span class="cx">     m_handle-&gt;continueWillSendRequest(m_currentRequest);
</span><ins>+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void NetworkResourceLoader::continueDidReceiveResponse()
</span><span class="cx"> {
</span><span class="cx">     // FIXME: Remove this check once BlobResourceHandle implements didReceiveResponseAsync correctly.
</span><span class="cx">     // Currently, it does not wait for response, so the load is likely to finish before continueDidReceiveResponse.
</span><ins>+#if USE(NETWORK_SESSION)
+    // FIXME: Do something here.
+    notImplemented();
+#else
</ins><span class="cx">     if (!m_handle)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     m_handle-&gt;continueDidReceiveResponse();
</span><ins>+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if !USE(NETWORK_SESSION)
+
</ins><span class="cx"> void NetworkResourceLoader::didSendData(ResourceHandle* handle, unsigned long long bytesSent, unsigned long long totalBytesToBeSent)
</span><span class="cx"> {
</span><span class="cx">     ASSERT_UNUSED(handle, handle == m_handle);
</span><span class="lines">@@ -520,6 +613,8 @@
</span><span class="cx">     didFail(m_handle.get(), cancelledError(m_currentRequest));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#endif // !USE(NETWORK_SESSION)
+
</ins><span class="cx"> void NetworkResourceLoader::startBufferingTimerIfNeeded()
</span><span class="cx"> {
</span><span class="cx">     if (isSynchronous())
</span><span class="lines">@@ -532,7 +627,9 @@
</span><span class="cx"> void NetworkResourceLoader::bufferingTimerFired()
</span><span class="cx"> {
</span><span class="cx">     ASSERT(m_bufferedData);
</span><ins>+#if !USE(NETWORK_SESSION)
</ins><span class="cx">     ASSERT(m_handle);
</span><ins>+#endif
</ins><span class="cx">     if (!m_bufferedData-&gt;size())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -600,7 +697,9 @@
</span><span class="cx"> 
</span><span class="cx"> void NetworkResourceLoader::validateCacheEntry(std::unique_ptr&lt;NetworkCache::Entry&gt; entry)
</span><span class="cx"> {
</span><ins>+#if !USE(NETWORK_SESSION)
</ins><span class="cx">     ASSERT(!m_handle);
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx">     // If the request is already conditional then the revalidation was not triggered by the disk cache
</span><span class="cx">     // and we should not overwrite the existing conditional headers.
</span><span class="lines">@@ -663,7 +762,7 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-#if USE(PROTECTION_SPACE_AUTH_CALLBACK)
</del><ins>+#if USE(PROTECTION_SPACE_AUTH_CALLBACK) &amp;&amp; !USE(NETWORK_SESSION)
</ins><span class="cx"> void NetworkResourceLoader::canAuthenticateAgainstProtectionSpaceAsync(ResourceHandle* handle, const ProtectionSpace&amp; protectionSpace)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(RunLoop::isMain());
</span><span class="lines">@@ -685,14 +784,21 @@
</span><span class="cx">     }
</span><span class="cx">     sendAbortingOnFailure(Messages::WebResourceLoader::CanAuthenticateAgainstProtectionSpace(protectionSpace));
</span><span class="cx"> }
</span><ins>+#endif
</ins><span class="cx"> 
</span><ins>+#if USE(PROTECTION_SPACE_AUTH_CALLBACK)
</ins><span class="cx"> void NetworkResourceLoader::continueCanAuthenticateAgainstProtectionSpace(bool result)
</span><span class="cx"> {
</span><ins>+#if USE(NETWORK_SESSION)
+    // FIXME: Do something here.
+    notImplemented();
+#else
</ins><span class="cx">     m_handle-&gt;continueCanAuthenticateAgainstProtectionSpace(result);
</span><ins>+#endif
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-#if USE(NETWORK_CFDATA_ARRAY_CALLBACK)
</del><ins>+#if USE(NETWORK_CFDATA_ARRAY_CALLBACK) &amp;&amp; !USE(NETWORK_SESSION)
</ins><span class="cx"> bool NetworkResourceLoader::supportsDataArray()
</span><span class="cx"> {
</span><span class="cx">     notImplemented();
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkResourceLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h (191456 => 191457)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h        2015-10-22 17:17:56 UTC (rev 191456)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h        2015-10-22 18:00:29 UTC (rev 191457)
</span><span class="lines">@@ -35,7 +35,6 @@
</span><span class="cx"> #include &quot;ShareableResource.h&quot;
</span><span class="cx"> #include &lt;WebCore/CacheValidation.h&gt;
</span><span class="cx"> #include &lt;WebCore/ResourceError.h&gt;
</span><del>-#include &lt;WebCore/ResourceHandleClient.h&gt;
</del><span class="cx"> #include &lt;WebCore/ResourceLoaderOptions.h&gt;
</span><span class="cx"> #include &lt;WebCore/ResourceRequest.h&gt;
</span><span class="cx"> #include &lt;WebCore/ResourceResponse.h&gt;
</span><span class="lines">@@ -44,11 +43,19 @@
</span><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><span class="cx"> #include &lt;wtf/RunLoop.h&gt;
</span><span class="cx"> 
</span><ins>+#if USE(NETWORK_SESSION)
+#include &quot;NetworkSession.h&quot;
+#else
+#include &lt;WebCore/ResourceHandleClient.h&gt;
+#endif
+
</ins><span class="cx"> typedef const struct _CFCachedURLResponse* CFCachedURLResponseRef;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> class BlobDataFileReference;
</span><ins>+#if !USE(NETWORK_SESSION)
</ins><span class="cx"> class ResourceHandle;
</span><ins>+#endif
</ins><span class="cx"> class ResourceRequest;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -59,7 +66,14 @@
</span><span class="cx"> class RemoteNetworkingContext;
</span><span class="cx"> class SandboxExtension;
</span><span class="cx"> 
</span><del>-class NetworkResourceLoader : public RefCounted&lt;NetworkResourceLoader&gt;, public WebCore::ResourceHandleClient, public IPC::MessageSender {
</del><ins>+class NetworkResourceLoader
+    : public RefCounted&lt;NetworkResourceLoader&gt;
+#if USE(NETWORK_SESSION)
+    , public NetworkSessionTaskClient
+#else
+    , public WebCore::ResourceHandleClient
+#endif
+    , public IPC::MessageSender {
</ins><span class="cx"> public:
</span><span class="cx">     static Ref&lt;NetworkResourceLoader&gt; create(const NetworkResourceLoadParameters&amp; parameters, NetworkConnectionToWebProcess* connection)
</span><span class="cx">     {
</span><span class="lines">@@ -77,7 +91,9 @@
</span><span class="cx">     // Changes with redirects.
</span><span class="cx">     WebCore::ResourceRequest&amp; currentRequest() { return m_currentRequest; }
</span><span class="cx"> 
</span><ins>+#if !USE(NETWORK_SESSION)
</ins><span class="cx">     WebCore::ResourceHandle* handle() const { return m_handle.get(); }
</span><ins>+#endif
</ins><span class="cx">     void didConvertHandleToDownload();
</span><span class="cx"> 
</span><span class="cx">     void start();
</span><span class="lines">@@ -117,6 +133,14 @@
</span><span class="cx">     virtual IPC::Connection* messageSenderConnection() override;
</span><span class="cx">     virtual uint64_t messageSenderDestinationID() override { return m_parameters.identifier; }
</span><span class="cx"> 
</span><ins>+#if USE(NETWORK_SESSION)
+    // NetworkSessionTaskClient.
+    virtual void willPerformHTTPRedirection(const WebCore::ResourceResponse&amp;, const WebCore::ResourceRequest&amp;, std::function&lt;void(const WebCore::ResourceRequest&amp;)&gt;) final override;
+    virtual void didReceiveChallenge(const WebCore::AuthenticationChallenge&amp;, std::function&lt;void(AuthenticationChallengeDisposition, const WebCore::Credential&amp;)&gt;) final override;
+    virtual void didReceiveResponse(WebCore::ResourceResponse&amp;, std::function&lt;void(ResponseDisposition)&gt;) final override;
+    virtual void didReceiveData(RefPtr&lt;WebCore::SharedBuffer&gt;) final override;
+    virtual void didCompleteWithError(const WebCore::ResourceError&amp;) final override;
+#else
</ins><span class="cx">     // ResourceHandleClient
</span><span class="cx">     virtual void willSendRequestAsync(WebCore::ResourceHandle*, const WebCore::ResourceRequest&amp;, const WebCore::ResourceResponse&amp; redirectResponse) override;
</span><span class="cx">     virtual void didSendData(WebCore::ResourceHandle*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override;
</span><span class="lines">@@ -148,6 +172,7 @@
</span><span class="cx">     virtual void willCacheResponseAsync(WebCore::ResourceHandle*, NSCachedURLResponse *) override;
</span><span class="cx"> #endif
</span><span class="cx"> #endif
</span><ins>+#endif // USE(NETWORK_SESSION)
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(NETWORK_CACHE)
</span><span class="cx">     void didRetrieveCacheEntry(std::unique_ptr&lt;NetworkCache::Entry&gt;);
</span><span class="lines">@@ -177,7 +202,11 @@
</span><span class="cx">     RefPtr&lt;NetworkConnectionToWebProcess&gt; m_connection;
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;RemoteNetworkingContext&gt; m_networkingContext;
</span><ins>+#if USE(NETWORK_SESSION)
+    RefPtr&lt;NetworkingDataTask&gt; m_task;
+#else
</ins><span class="cx">     RefPtr&lt;WebCore::ResourceHandle&gt; m_handle;
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx">     WebCore::ResourceRequest m_currentRequest;
</span><span class="cx">     WebCore::ResourceResponse m_response;
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkSessionh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/NetworkSession.h (0 => 191457)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkSession.h                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkSession.h        2015-10-22 18:00:29 UTC (rev 191457)
</span><span class="lines">@@ -0,0 +1,123 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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 NetworkSession_h
+#define NetworkSession_h
+
+OBJC_CLASS NSURLSession;
+OBJC_CLASS NSURLSessionDataTask;
+OBJC_CLASS NSOperationQueue;
+OBJC_CLASS NetworkSessionDelegate;
+
+#include &lt;wtf/HashMap.h&gt;
+#include &lt;wtf/Ref.h&gt;
+#include &lt;wtf/RefCounted.h&gt;
+#include &lt;wtf/RetainPtr.h&gt;
+#include &lt;wtf/WeakPtr.h&gt;
+
+namespace WebCore {
+class AuthenticationChallenge;
+class Credential;
+class ResourceError;
+class ResourceRequest;
+class ResourceResponse;
+class SharedBuffer;
+}
+
+namespace WebKit {
+
+enum class ResponseDisposition {
+    Cancel,
+    Allow,
+    BecomeDownload
+};
+
+enum class AuthenticationChallengeDisposition {
+    UseCredential,
+    PerformDefaultHandling,
+    Cancel,
+    RejectProtectionSpace
+};
+
+class NetworkSession;
+
+class NetworkSessionTaskClient {
+public:
+    virtual void willPerformHTTPRedirection(const WebCore::ResourceResponse&amp;, const WebCore::ResourceRequest&amp;, std::function&lt;void(const WebCore::ResourceRequest&amp;)&gt;) = 0;
+    virtual void didReceiveChallenge(const WebCore::AuthenticationChallenge&amp;, std::function&lt;void(AuthenticationChallengeDisposition, const WebCore::Credential&amp;)&gt;) = 0;
+    virtual void didReceiveResponse(WebCore::ResourceResponse&amp;, std::function&lt;void(ResponseDisposition)&gt;) = 0;
+    virtual void didReceiveData(RefPtr&lt;WebCore::SharedBuffer&gt;) = 0;
+    virtual void didCompleteWithError(const WebCore::ResourceError&amp;) = 0;
+
+    virtual ~NetworkSessionTaskClient() { }
+};
+
+class NetworkingDataTask : public RefCounted&lt;NetworkingDataTask&gt; {
+    friend class NetworkSession;
+public:
+    void suspend();
+    void resume();
+
+    uint64_t taskIdentifier();
+
+    ~NetworkingDataTask();
+
+    NetworkSessionTaskClient* client() { return m_client; }
+    void clearClient() { m_client = nullptr; }
+
+private:
+    explicit NetworkingDataTask(NetworkSession&amp;, NetworkSessionTaskClient&amp;, RetainPtr&lt;NSURLSessionDataTask&gt;);
+
+    NetworkSession&amp; m_session;
+    RetainPtr&lt;NSURLSessionDataTask&gt; m_task;
+    NetworkSessionTaskClient* m_client;
+};
+
+class NetworkSession : public RefCounted&lt;NetworkSession&gt; {
+    friend class NetworkingDataTask;
+public:
+    enum class Type {
+        Normal,
+        Ephemeral
+    };
+
+    RefPtr&lt;NetworkingDataTask&gt; createDataTaskWithRequest(const WebCore::ResourceRequest&amp;, NetworkSessionTaskClient&amp;);
+
+    static Ref&lt;NetworkSession&gt; singleton(); // FIXME: This shouldn't actually be a singleton.
+    NetworkingDataTask* dataTaskForIdentifier(uint64_t);
+
+    ~NetworkSession() { ASSERT(m_dataTaskMap.isEmpty()); }
+private:
+    static Ref&lt;NetworkSession&gt; create(Type);
+
+    NetworkSession(Type);
+    HashMap&lt;uint64_t, NetworkingDataTask*&gt; m_dataTaskMap;
+    RetainPtr&lt;NSURLSession&gt; m_session;
+    RetainPtr&lt;NetworkSessionDelegate&gt; m_sessionDelegate;
+};
+
+} // namespace WebKit
+
+#endif // NetworkSession_h
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscocoaNetworkSessionCocoamm"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm (0 => 191457)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm        2015-10-22 18:00:29 UTC (rev 191457)
</span><span class="lines">@@ -0,0 +1,236 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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.
+ */
+
+#import &quot;config.h&quot;
+#import &quot;NetworkSession.h&quot;
+
+#if USE(NETWORK_SESSION)
+
+#import &lt;Foundation/NSURLSession.h&gt;
+
+#import &lt;WebCore/AuthenticationChallenge.h&gt;
+#import &lt;WebCore/Credential.h&gt;
+#import &lt;WebCore/ResourceError.h&gt;
+#import &lt;WebCore/ResourceRequest.h&gt;
+#import &lt;WebCore/ResourceResponse.h&gt;
+#import &lt;WebCore/SharedBuffer.h&gt;
+#import &lt;wtf/MainThread.h&gt;
+#import &lt;wtf/NeverDestroyed.h&gt;
+
+static NSURLSessionResponseDisposition toNSURLSessionResponseDisposition(WebKit::ResponseDisposition disposition)
+{
+    switch (disposition) {
+    case WebKit::ResponseDisposition::Cancel:
+        return NSURLSessionResponseCancel;
+    case WebKit::ResponseDisposition::Allow:
+        return NSURLSessionResponseAllow;
+    case WebKit::ResponseDisposition::BecomeDownload:
+        return NSURLSessionResponseBecomeDownload;
+    }
+}
+
+static NSURLSessionAuthChallengeDisposition toNSURLSessionAuthChallengeDisposition(WebKit::AuthenticationChallengeDisposition disposition)
+{
+    switch (disposition) {
+    case WebKit::AuthenticationChallengeDisposition::UseCredential:
+        return NSURLSessionAuthChallengeUseCredential;
+    case WebKit::AuthenticationChallengeDisposition::PerformDefaultHandling:
+        return NSURLSessionAuthChallengePerformDefaultHandling;
+    case WebKit::AuthenticationChallengeDisposition::Cancel:
+        return NSURLSessionAuthChallengeCancelAuthenticationChallenge;
+    case WebKit::AuthenticationChallengeDisposition::RejectProtectionSpace:
+        return NSURLSessionAuthChallengeRejectProtectionSpace;
+    }
+}
+
+@interface NetworkSessionDelegate : NSObject &lt;NSURLSessionDataDelegate&gt; {
+    WebKit::NetworkSession* _session;
+}
+
+- (id)initWithNetworkSession:(WebKit::NetworkSession&amp;)session;
+
+@end
+
+@implementation NetworkSessionDelegate
+
+- (id)initWithNetworkSession:(WebKit::NetworkSession&amp;)session
+{
+    self = [super init];
+    if (!self)
+        return nil;
+
+    _session = &amp;session;
+
+    return self;
+}
+
+- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLRequest *))completionHandler
+{
+    UNUSED_PARAM(session);
+
+    if (auto* networkingTask = _session-&gt;dataTaskForIdentifier(task.taskIdentifier)) {
+        if (auto* client = networkingTask-&gt;client()) {
+            client-&gt;willPerformHTTPRedirection(response, request, ^(const WebCore::ResourceRequest&amp; request)
+                {
+                    completionHandler(request.nsURLRequest(WebCore::UpdateHTTPBody));
+                }
+            );
+        }
+    }
+}
+
+- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
+{
+    UNUSED_PARAM(session);
+
+    if (auto* networkingTask = _session-&gt;dataTaskForIdentifier(task.taskIdentifier)) {
+        if (auto* client = networkingTask-&gt;client()) {
+            client-&gt;didReceiveChallenge(challenge, ^(WebKit::AuthenticationChallengeDisposition disposition, const WebCore::Credential&amp; credential)
+                {
+                    completionHandler(toNSURLSessionAuthChallengeDisposition(disposition), credential.nsCredential());
+                }
+            );
+        }
+    }
+}
+
+- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
+{
+    UNUSED_PARAM(session);
+
+    if (auto* networkingTask = _session-&gt;dataTaskForIdentifier(task.taskIdentifier)) {
+        if (auto* client = networkingTask-&gt;client())
+            client-&gt;didCompleteWithError(error);
+    }
+}
+
+- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
+{
+    UNUSED_PARAM(session);
+
+    if (auto* networkingTask = _session-&gt;dataTaskForIdentifier(dataTask.taskIdentifier)) {
+        if (auto* client = networkingTask-&gt;client()) {
+            ASSERT(isMainThread());
+            WebCore::ResourceResponse resourceResponse(response);
+            client-&gt;didReceiveResponse(response, ^(WebKit::ResponseDisposition responseDisposition)
+                {
+                    completionHandler(toNSURLSessionResponseDisposition(responseDisposition));
+                }
+            );
+        }
+    }
+}
+
+- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
+{
+    UNUSED_PARAM(session);
+
+    if (auto* networkingTask = _session-&gt;dataTaskForIdentifier(dataTask.taskIdentifier)) {
+        if (auto* client = networkingTask-&gt;client())
+            client-&gt;didReceiveData(WebCore::SharedBuffer::wrapNSData(data));
+    }
+}
+
+@end
+
+namespace WebKit {
+    
+Ref&lt;NetworkSession&gt; NetworkSession::create(Type type)
+{
+    return adoptRef(*new NetworkSession(type));
+}
+
+Ref&lt;NetworkSession&gt; NetworkSession::singleton()
+{
+    static NeverDestroyed&lt;Ref&lt;NetworkSession&gt;&gt; sharedInstance(NetworkSession::create(Type::Normal));
+    return sharedInstance.get().copyRef();
+}
+    
+static NSURLSessionConfiguration *configurationForType(NetworkSession::Type type)
+{
+    switch (type) {
+    case NetworkSession::Type::Normal:
+        return [NSURLSessionConfiguration defaultSessionConfiguration];
+    case NetworkSession::Type::Ephemeral:
+        return [NSURLSessionConfiguration ephemeralSessionConfiguration];
+    }
+}
+
+NetworkSession::NetworkSession(Type type)
+{
+    m_sessionDelegate = adoptNS([[NetworkSessionDelegate alloc] initWithNetworkSession:*this]);
+
+    NSURLSessionConfiguration *configuration = configurationForType(type);
+    m_session = [NSURLSession sessionWithConfiguration:configuration delegate:static_cast&lt;id&gt;(m_sessionDelegate.get()) delegateQueue:[NSOperationQueue mainQueue]];
+}
+
+RefPtr&lt;NetworkingDataTask&gt; NetworkSession::createDataTaskWithRequest(const WebCore::ResourceRequest&amp; request, NetworkSessionTaskClient&amp; client)
+{
+    RefPtr&lt;NetworkingDataTask&gt; task = adoptRef(new NetworkingDataTask(*this, client, [m_session dataTaskWithRequest:request.nsURLRequest(WebCore::UpdateHTTPBody)]));
+    return task;
+}
+
+NetworkingDataTask* NetworkSession::dataTaskForIdentifier(uint64_t taskIdentifier)
+{
+    ASSERT(isMainThread());
+    return m_dataTaskMap.get(taskIdentifier);
+}
+
+NetworkingDataTask::NetworkingDataTask(NetworkSession&amp; session, NetworkSessionTaskClient&amp; client, RetainPtr&lt;NSURLSessionDataTask&gt; task)
+    : m_session(session)
+    , m_task(task)
+    , m_client(&amp;client)
+{
+    ASSERT(!m_session.m_dataTaskMap.contains(taskIdentifier()));
+    ASSERT(isMainThread());
+    m_session.m_dataTaskMap.add(taskIdentifier(), this);
+}
+
+NetworkingDataTask::~NetworkingDataTask()
+{
+    ASSERT(m_session.m_dataTaskMap.contains(taskIdentifier()));
+    ASSERT(m_session.m_dataTaskMap.get(taskIdentifier()) == this);
+    ASSERT(isMainThread());
+    m_session.m_dataTaskMap.remove(taskIdentifier());
+}
+
+void NetworkingDataTask::suspend()
+{
+    [m_task suspend];
+}
+
+void NetworkingDataTask::resume()
+{
+    [m_task resume];
+}
+
+uint64_t NetworkingDataTask::taskIdentifier()
+{
+    return [m_task taskIdentifier];
+}
+
+}
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessmacNetworkResourceLoaderMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/mac/NetworkResourceLoaderMac.mm (191456 => 191457)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/mac/NetworkResourceLoaderMac.mm        2015-10-22 17:17:56 UTC (rev 191456)
+++ trunk/Source/WebKit2/NetworkProcess/mac/NetworkResourceLoaderMac.mm        2015-10-22 18:00:29 UTC (rev 191457)
</span><span class="lines">@@ -94,7 +94,7 @@
</span><span class="cx">     m_handle-&gt;continueWillCacheResponse(cfResponse);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-#else
</del><ins>+#elif !USE(NETWORK_SESSION)
</ins><span class="cx"> 
</span><span class="cx"> void NetworkResourceLoader::willCacheResponseAsync(ResourceHandle* handle, NSCachedURLResponse *nsResponse)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (191456 => 191457)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2015-10-22 17:17:56 UTC (rev 191456)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2015-10-22 18:00:29 UTC (rev 191457)
</span><span class="lines">@@ -1049,6 +1049,8 @@
</span><span class="cx">                 5272B28A1406985D0096A5D0 /* StatisticsData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5272B2881406985D0096A5D0 /* StatisticsData.cpp */; };
</span><span class="cx">                 5272B28B1406985D0096A5D0 /* StatisticsData.h in Headers */ = {isa = PBXBuildFile; fileRef = 5272B2891406985D0096A5D0 /* StatisticsData.h */; };
</span><span class="cx">                 528C37C1195CBB1A00D8B9CC /* WKBackForwardListPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A9F28101958F478008CAC72 /* WKBackForwardListPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><ins>+                5C20CB9D1BB0DCFA00895BB1 /* NetworkSessionCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C20CB9B1BB0DCD200895BB1 /* NetworkSessionCocoa.mm */; };
+                5C20CBA01BB1ECD800895BB1 /* NetworkSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C20CB9E1BB0DD1800895BB1 /* NetworkSession.h */; };
</ins><span class="cx">                 5DA6ED0A1490606900B41D12 /* DynamicLinkerEnvironmentExtractor.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DA6ED081490606900B41D12 /* DynamicLinkerEnvironmentExtractor.h */; };
</span><span class="cx">                 5DA6ED0B1490606900B41D12 /* DynamicLinkerEnvironmentExtractor.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5DA6ED091490606900B41D12 /* DynamicLinkerEnvironmentExtractor.mm */; };
</span><span class="cx">                 6501BD1A12F1243400E9F248 /* WKBundleInspector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65B86F1712F11D7B00B7DD8A /* WKBundleInspector.cpp */; };
</span><span class="lines">@@ -3247,6 +3249,8 @@
</span><span class="cx">                 51FD18B41651FBAD00DBE1CE /* NetworkResourceLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkResourceLoader.h; path = NetworkProcess/NetworkResourceLoader.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5272B2881406985D0096A5D0 /* StatisticsData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StatisticsData.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5272B2891406985D0096A5D0 /* StatisticsData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StatisticsData.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                5C20CB9B1BB0DCD200895BB1 /* NetworkSessionCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = NetworkSessionCocoa.mm; path = NetworkProcess/cocoa/NetworkSessionCocoa.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5C20CB9E1BB0DD1800895BB1 /* NetworkSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkSession.h; path = NetworkProcess/NetworkSession.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 5D442A5516D5856700AC3331 /* PluginService.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PluginService.entitlements; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5DA6ED081490606900B41D12 /* DynamicLinkerEnvironmentExtractor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DynamicLinkerEnvironmentExtractor.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5DA6ED091490606900B41D12 /* DynamicLinkerEnvironmentExtractor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DynamicLinkerEnvironmentExtractor.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -5565,6 +5569,7 @@
</span><span class="cx">                                 51FD18B31651FBAD00DBE1CE /* NetworkResourceLoader.cpp */,
</span><span class="cx">                                 51FD18B41651FBAD00DBE1CE /* NetworkResourceLoader.h */,
</span><span class="cx">                                 E1525517170109FB003D7ADB /* NetworkResourceLoader.messages.in */,
</span><ins>+                                5C20CB9E1BB0DD1800895BB1 /* NetworkSession.h */,
</ins><span class="cx">                                 E1B78470163F24690007B692 /* RemoteNetworkingContext.h */,
</span><span class="cx">                         );
</span><span class="cx">                         name = NetworkProcess;
</span><span class="lines">@@ -5909,6 +5914,7 @@
</span><span class="cx">                 7EC4F0F818E4A922008056AF /* cocoa */ = {
</span><span class="cx">                         isa = PBXGroup;
</span><span class="cx">                         children = (
</span><ins>+                                5C20CB9B1BB0DCD200895BB1 /* NetworkSessionCocoa.mm */,
</ins><span class="cx">                                 7EC4F0F918E4A945008056AF /* NetworkProcessCocoa.mm */,
</span><span class="cx">                         );
</span><span class="cx">                         name = cocoa;
</span><span class="lines">@@ -8299,6 +8305,7 @@
</span><span class="cx">                                 378E1A4A18208CD60031007A /* WKNSString.h in Headers */,
</span><span class="cx">                                 378E1A4E18208D700031007A /* WKNSURL.h in Headers */,
</span><span class="cx">                                 37FC194B18510D6A008CFA47 /* WKNSURLAuthenticationChallenge.h in Headers */,
</span><ins>+                                5C20CBA01BB1ECD800895BB1 /* NetworkSession.h in Headers */,
</ins><span class="cx">                                 37183D57182F4E700080C811 /* WKNSURLExtras.h in Headers */,
</span><span class="cx">                                 37BF2F061947DEB400723C48 /* WKNSURLRequest.h in Headers */,
</span><span class="cx">                                 BC407602124FF0270068F20A /* WKNumber.h in Headers */,
</span><span class="lines">@@ -9850,6 +9857,7 @@
</span><span class="cx">                                 BCE469791214F2B4000B98EB /* WebFrameListenerProxy.cpp in Sources */,
</span><span class="cx">                                 BC111A5F112F4FBB00337BAB /* WebFrameLoaderClient.cpp in Sources */,
</span><span class="cx">                                 2D28F3E71885CCC1004B9EAE /* WebFrameLoaderClientIOS.mm in Sources */,
</span><ins>+                                5C20CB9D1BB0DCFA00895BB1 /* NetworkSessionCocoa.mm in Sources */,
</ins><span class="cx">                                 9391F2CA121B679A00EBF7E8 /* WebFrameNetworkingContext.mm in Sources */,
</span><span class="cx">                                 BCB9F6A11123A84B00A137E0 /* WebFramePolicyListenerProxy.cpp in Sources */,
</span><span class="cx">                                 BC111B0E112F5E4F00337BAB /* WebFrameProxy.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebKit2configh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/config.h (191456 => 191457)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/config.h        2015-10-22 17:17:56 UTC (rev 191456)
+++ trunk/Source/WebKit2/config.h        2015-10-22 18:00:29 UTC (rev 191457)
</span><span class="lines">@@ -73,7 +73,10 @@
</span><span class="cx"> #ifndef HAVE_WINDOW_SERVER_OCCLUSION_NOTIFICATIONS
</span><span class="cx"> #define HAVE_WINDOW_SERVER_OCCLUSION_NOTIFICATIONS 1
</span><span class="cx"> #endif
</span><ins>+#ifndef USE_NETWORK_SESSION
+#define USE_NETWORK_SESSION 0
</ins><span class="cx"> #endif
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx"> #ifndef HAVE_SEC_ACCESS_CONTROL
</span><span class="cx"> #if PLATFORM(IOS) || (PLATFORM(MAC) &amp;&amp; __MAC_OS_X_VERSION_MIN_REQUIRED &gt;= 101000)
</span></span></pre>
</div>
</div>

</body>
</html>