<!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>[197413] trunk/Source/WebKit2</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/197413">197413</a></dd>
<dt>Author</dt> <dd>achristensen@apple.com</dd>
<dt>Date</dt> <dd>2016-03-01 14:13:00 -0800 (Tue, 01 Mar 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Correctly keep track of NetworkDataTasks with and without credentials when using NetworkSession
https://bugs.webkit.org/show_bug.cgi?id=154876

Reviewed by Brady Eidson.

I was seeing an assertion failure from ASSERT(!m_session.m_dataTaskMap.contains(taskIdentifier()))
in the NetworkDataTask constructor sometimes.  This is because a task identifier is not enough information
to uniquely find a NetworkDataTask in a NetworkSession since <a href="http://trac.webkit.org/projects/webkit/changeset/196034">r196034</a> because there are two NSURLSessions
in a NetworkSession, one with credentials and one without.  The assertion would fire in a case like if we
made the first NetworkDataTask with credentials (taskIdentifier is 1) and the first NetworkDataTask 
without credentials before the first NetworkDataTask with credentials was finished.  In that case, the 
taskIdentifier would also be 1, which would conflict with the other taskIdentifier.  That taskIdentifier
would uniquely identify the task in the correct NSURLSession, though, so the solution is to keep a map
for each NSURLSession in the NetworkSession.

* NetworkProcess/NetworkDataTask.h:
* NetworkProcess/NetworkSession.h:
* NetworkProcess/cocoa/NetworkDataTaskCocoa.mm:
(WebKit::NetworkDataTask::NetworkDataTask):
(WebKit::NetworkDataTask::~NetworkDataTask):
(WebKit::NetworkDataTask::suspend):
(WebKit::serverTrustCredential):
* NetworkProcess/cocoa/NetworkSessionCocoa.mm:
(-[WKNetworkSessionDelegate URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:]):
(-[WKNetworkSessionDelegate URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:]):
(-[WKNetworkSessionDelegate URLSession:task:didReceiveChallenge:completionHandler:]):
(-[WKNetworkSessionDelegate URLSession:task:didCompleteWithError:]):
(-[WKNetworkSessionDelegate URLSession:dataTask:didReceiveResponse:completionHandler:]):
(-[WKNetworkSessionDelegate URLSession:dataTask:didReceiveData:]):
(-[WKNetworkSessionDelegate URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:]):
(-[WKNetworkSessionDelegate URLSession:dataTask:didBecomeDownloadTask:]):
(WebKit::NetworkSession::clearCredentials):
(WebKit::NetworkSession::dataTaskForIdentifier):
(WebKit::NetworkSession::addDownloadID):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkDataTaskh">trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkSessionh">trunk/Source/WebKit2/NetworkProcess/NetworkSession.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscocoaNetworkDataTaskCocoamm">trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm</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="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (197412 => 197413)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-03-01 21:45:16 UTC (rev 197412)
+++ trunk/Source/WebKit2/ChangeLog        2016-03-01 22:13:00 UTC (rev 197413)
</span><span class="lines">@@ -1,3 +1,40 @@
</span><ins>+2016-03-01  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        Correctly keep track of NetworkDataTasks with and without credentials when using NetworkSession
+        https://bugs.webkit.org/show_bug.cgi?id=154876
+
+        Reviewed by Brady Eidson.
+
+        I was seeing an assertion failure from ASSERT(!m_session.m_dataTaskMap.contains(taskIdentifier()))
+        in the NetworkDataTask constructor sometimes.  This is because a task identifier is not enough information
+        to uniquely find a NetworkDataTask in a NetworkSession since r196034 because there are two NSURLSessions
+        in a NetworkSession, one with credentials and one without.  The assertion would fire in a case like if we
+        made the first NetworkDataTask with credentials (taskIdentifier is 1) and the first NetworkDataTask 
+        without credentials before the first NetworkDataTask with credentials was finished.  In that case, the 
+        taskIdentifier would also be 1, which would conflict with the other taskIdentifier.  That taskIdentifier
+        would uniquely identify the task in the correct NSURLSession, though, so the solution is to keep a map
+        for each NSURLSession in the NetworkSession.
+
+        * NetworkProcess/NetworkDataTask.h:
+        * NetworkProcess/NetworkSession.h:
+        * NetworkProcess/cocoa/NetworkDataTaskCocoa.mm:
+        (WebKit::NetworkDataTask::NetworkDataTask):
+        (WebKit::NetworkDataTask::~NetworkDataTask):
+        (WebKit::NetworkDataTask::suspend):
+        (WebKit::serverTrustCredential):
+        * NetworkProcess/cocoa/NetworkSessionCocoa.mm:
+        (-[WKNetworkSessionDelegate URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:]):
+        (-[WKNetworkSessionDelegate URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:]):
+        (-[WKNetworkSessionDelegate URLSession:task:didReceiveChallenge:completionHandler:]):
+        (-[WKNetworkSessionDelegate URLSession:task:didCompleteWithError:]):
+        (-[WKNetworkSessionDelegate URLSession:dataTask:didReceiveResponse:completionHandler:]):
+        (-[WKNetworkSessionDelegate URLSession:dataTask:didReceiveData:]):
+        (-[WKNetworkSessionDelegate URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:]):
+        (-[WKNetworkSessionDelegate URLSession:dataTask:didBecomeDownloadTask:]):
+        (WebKit::NetworkSession::clearCredentials):
+        (WebKit::NetworkSession::dataTaskForIdentifier):
+        (WebKit::NetworkSession::addDownloadID):
+
</ins><span class="cx"> 2016-03-01  Andreas Kling  &lt;akling@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION (r154616): Accelerated drawing is off during the initial load
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkDataTaskh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.h (197412 => 197413)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.h        2016-03-01 21:45:16 UTC (rev 197412)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkDataTask.h        2016-03-01 22:13:00 UTC (rev 197413)
</span><span class="lines">@@ -93,7 +93,6 @@
</span><span class="cx">     void resume();
</span><span class="cx">     
</span><span class="cx">     typedef uint64_t TaskIdentifier;
</span><del>-    TaskIdentifier taskIdentifier();
</del><span class="cx">     
</span><span class="cx">     ~NetworkDataTask();
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkSessionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkSession.h (197412 => 197413)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkSession.h        2016-03-01 21:45:16 UTC (rev 197412)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkSession.h        2016-03-01 22:13:00 UTC (rev 197413)
</span><span class="lines">@@ -57,14 +57,15 @@
</span><span class="cx">     static NetworkSession&amp; defaultSession();
</span><span class="cx">     void clearCredentials();
</span><span class="cx"> 
</span><del>-    NetworkDataTask* dataTaskForIdentifier(NetworkDataTask::TaskIdentifier);
</del><ins>+    NetworkDataTask* dataTaskForIdentifier(NetworkDataTask::TaskIdentifier, WebCore::StoredCredentials);
</ins><span class="cx"> 
</span><span class="cx">     void addDownloadID(NetworkDataTask::TaskIdentifier, DownloadID);
</span><span class="cx">     DownloadID downloadID(NetworkDataTask::TaskIdentifier);
</span><span class="cx">     DownloadID takeDownloadID(NetworkDataTask::TaskIdentifier);
</span><span class="cx">     
</span><span class="cx"> private:
</span><del>-    HashMap&lt;NetworkDataTask::TaskIdentifier, NetworkDataTask*&gt; m_dataTaskMap;
</del><ins>+    HashMap&lt;NetworkDataTask::TaskIdentifier, NetworkDataTask*&gt; m_dataTaskMapWithCredentials;
+    HashMap&lt;NetworkDataTask::TaskIdentifier, NetworkDataTask*&gt; m_dataTaskMapWithoutCredentials;
</ins><span class="cx">     HashMap&lt;NetworkDataTask::TaskIdentifier, DownloadID&gt; m_downloadMap;
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx">     RetainPtr&lt;NSURLSession&gt; m_sessionWithCredentialStorage;
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscocoaNetworkDataTaskCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm (197412 => 197413)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm        2016-03-01 21:45:16 UTC (rev 197412)
+++ trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm        2016-03-01 22:13:00 UTC (rev 197413)
</span><span class="lines">@@ -76,22 +76,28 @@
</span><span class="cx">         nsRequest = mutableRequest;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (storedCredentials == WebCore::AllowStoredCredentials)
</del><ins>+    if (storedCredentials == WebCore::AllowStoredCredentials) {
</ins><span class="cx">         m_task = [m_session.m_sessionWithCredentialStorage dataTaskWithRequest:nsRequest];
</span><del>-    else
</del><ins>+        ASSERT(!m_session.m_dataTaskMapWithCredentials.contains([m_task taskIdentifier]));
+        m_session.m_dataTaskMapWithCredentials.add([m_task taskIdentifier], this);
+    } else {
</ins><span class="cx">         m_task = [m_session.m_sessionWithoutCredentialStorage dataTaskWithRequest:nsRequest];
</span><del>-    
-    ASSERT(!m_session.m_dataTaskMap.contains(taskIdentifier()));
-    m_session.m_dataTaskMap.add(taskIdentifier(), this);
</del><ins>+        ASSERT(!m_session.m_dataTaskMapWithoutCredentials.contains([m_task taskIdentifier]));
+        m_session.m_dataTaskMapWithoutCredentials.add([m_task taskIdentifier], this);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> NetworkDataTask::~NetworkDataTask()
</span><span class="cx"> {
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx">     if (m_task) {
</span><del>-        ASSERT(m_session.m_dataTaskMap.contains(taskIdentifier()));
-        ASSERT(m_session.m_dataTaskMap.get(taskIdentifier()) == this);
-        ASSERT(isMainThread());
-        m_session.m_dataTaskMap.remove(taskIdentifier());
</del><ins>+        if (m_storedCredentials == WebCore::StoredCredentials::AllowStoredCredentials) {
+            ASSERT(m_session.m_dataTaskMapWithCredentials.get([m_task taskIdentifier]) == this);
+            m_session.m_dataTaskMapWithCredentials.remove([m_task taskIdentifier]);
+        } else {
+            ASSERT(m_session.m_dataTaskMapWithoutCredentials.get([m_task taskIdentifier]) == this);
+            m_session.m_dataTaskMapWithoutCredentials.remove([m_task taskIdentifier]);
+        }
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -260,11 +266,6 @@
</span><span class="cx">     [m_task suspend];
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-auto NetworkDataTask::taskIdentifier() -&gt; TaskIdentifier
-{
-    return [m_task taskIdentifier];
-}
-
</del><span class="cx"> WebCore::Credential serverTrustCredential(const WebCore::AuthenticationChallenge&amp; challenge)
</span><span class="cx"> {
</span><span class="cx">     return WebCore::Credential([NSURLCredential credentialForTrust:challenge.nsURLAuthenticationChallenge().protectionSpace.serverTrust]);
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscocoaNetworkSessionCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm (197412 => 197413)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm        2016-03-01 21:45:16 UTC (rev 197412)
+++ trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm        2016-03-01 22:13:00 UTC (rev 197413)
</span><span class="lines">@@ -98,13 +98,15 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
</span><span class="cx"> {
</span><del>-    if (auto* networkDataTask = _session-&gt;dataTaskForIdentifier(task.taskIdentifier))
</del><ins>+    auto storedCredentials = session.configuration.URLCredentialStorage ? WebCore::StoredCredentials::AllowStoredCredentials : WebCore::StoredCredentials::DoNotAllowStoredCredentials;
+    if (auto* networkDataTask = _session-&gt;dataTaskForIdentifier(task.taskIdentifier, storedCredentials))
</ins><span class="cx">         networkDataTask-&gt;didSendData(totalBytesSent, totalBytesExpectedToSend);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLRequest *))completionHandler
</span><span class="cx"> {
</span><del>-    if (auto* networkDataTask = _session-&gt;dataTaskForIdentifier(task.taskIdentifier)) {
</del><ins>+    auto storedCredentials = session.configuration.URLCredentialStorage ? WebCore::StoredCredentials::AllowStoredCredentials : WebCore::StoredCredentials::DoNotAllowStoredCredentials;
+    if (auto* networkDataTask = _session-&gt;dataTaskForIdentifier(task.taskIdentifier, storedCredentials)) {
</ins><span class="cx">         auto completionHandlerCopy = Block_copy(completionHandler);
</span><span class="cx">         networkDataTask-&gt;willPerformHTTPRedirection(response, request, [completionHandlerCopy](const WebCore::ResourceRequest&amp; request) {
</span><span class="cx">             completionHandlerCopy(request.nsURLRequest(WebCore::UpdateHTTPBody));
</span><span class="lines">@@ -115,7 +117,8 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
</span><span class="cx"> {
</span><del>-    if (auto* networkDataTask = _session-&gt;dataTaskForIdentifier(task.taskIdentifier)) {
</del><ins>+    auto storedCredentials = session.configuration.URLCredentialStorage ? WebCore::StoredCredentials::AllowStoredCredentials : WebCore::StoredCredentials::DoNotAllowStoredCredentials;
+    if (auto* networkDataTask = _session-&gt;dataTaskForIdentifier(task.taskIdentifier, storedCredentials)) {
</ins><span class="cx">         auto completionHandlerCopy = Block_copy(completionHandler);
</span><span class="cx">         auto challengeCompletionHandler = [completionHandlerCopy](WebKit::AuthenticationChallengeDisposition disposition, const WebCore::Credential&amp; credential)
</span><span class="cx">         {
</span><span class="lines">@@ -132,7 +135,8 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
</span><span class="cx"> {
</span><del>-    if (auto* networkDataTask = _session-&gt;dataTaskForIdentifier(task.taskIdentifier))
</del><ins>+    auto storedCredentials = session.configuration.URLCredentialStorage ? WebCore::StoredCredentials::AllowStoredCredentials : WebCore::StoredCredentials::DoNotAllowStoredCredentials;
+    if (auto* networkDataTask = _session-&gt;dataTaskForIdentifier(task.taskIdentifier, storedCredentials))
</ins><span class="cx">         networkDataTask-&gt;didCompleteWithError(error);
</span><span class="cx">     else if (error) {
</span><span class="cx">         auto downloadID = _session-&gt;takeDownloadID(task.taskIdentifier);
</span><span class="lines">@@ -145,7 +149,8 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
</span><span class="cx"> {
</span><del>-    if (auto* networkDataTask = _session-&gt;dataTaskForIdentifier(dataTask.taskIdentifier)) {
</del><ins>+    auto storedCredentials = session.configuration.URLCredentialStorage ? WebCore::StoredCredentials::AllowStoredCredentials : WebCore::StoredCredentials::DoNotAllowStoredCredentials;
+    if (auto* networkDataTask = _session-&gt;dataTaskForIdentifier(dataTask.taskIdentifier, storedCredentials)) {
</ins><span class="cx">         ASSERT(isMainThread());
</span><span class="cx">         WebCore::ResourceResponse resourceResponse(response);
</span><span class="cx">         copyTimingData([dataTask _timingData], resourceResponse.resourceLoadTiming());
</span><span class="lines">@@ -159,7 +164,8 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
</span><span class="cx"> {
</span><del>-    if (auto* networkDataTask = _session-&gt;dataTaskForIdentifier(dataTask.taskIdentifier))
</del><ins>+    auto storedCredentials = session.configuration.URLCredentialStorage ? WebCore::StoredCredentials::AllowStoredCredentials : WebCore::StoredCredentials::DoNotAllowStoredCredentials;
+    if (auto* networkDataTask = _session-&gt;dataTaskForIdentifier(dataTask.taskIdentifier, storedCredentials))
</ins><span class="cx">         networkDataTask-&gt;didReceiveData(WebCore::SharedBuffer::wrapNSData(data));
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -172,7 +178,8 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
</span><span class="cx"> {
</span><del>-    ASSERT_WITH_MESSAGE(!_session-&gt;dataTaskForIdentifier([downloadTask taskIdentifier]), &quot;The NetworkDataTask should be destroyed immediately after didBecomeDownloadTask returns&quot;);
</del><ins>+    auto storedCredentials = session.configuration.URLCredentialStorage ? WebCore::StoredCredentials::AllowStoredCredentials : WebCore::StoredCredentials::DoNotAllowStoredCredentials;
+    ASSERT_WITH_MESSAGE(!_session-&gt;dataTaskForIdentifier([downloadTask taskIdentifier], storedCredentials), &quot;The NetworkDataTask should be destroyed immediately after didBecomeDownloadTask returns&quot;);
</ins><span class="cx"> 
</span><span class="cx">     auto downloadID = _session-&gt;downloadID([downloadTask taskIdentifier]);
</span><span class="cx">     if (auto* download = WebKit::NetworkProcess::singleton().downloadManager().download(downloadID))
</span><span class="lines">@@ -186,7 +193,8 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask
</span><span class="cx"> {
</span><del>-    if (auto* networkDataTask = _session-&gt;dataTaskForIdentifier([dataTask taskIdentifier])) {
</del><ins>+    auto storedCredentials = session.configuration.URLCredentialStorage ? WebCore::StoredCredentials::AllowStoredCredentials : WebCore::StoredCredentials::DoNotAllowStoredCredentials;
+    if (auto* networkDataTask = _session-&gt;dataTaskForIdentifier([dataTask taskIdentifier], storedCredentials)) {
</ins><span class="cx">         auto downloadID = networkDataTask-&gt;pendingDownloadID();
</span><span class="cx">         auto&amp; downloadManager = WebKit::NetworkProcess::singleton().downloadManager();
</span><span class="cx">         auto download = std::make_unique&lt;WebKit::Download&gt;(downloadManager, downloadID);
</span><span class="lines">@@ -266,15 +274,18 @@
</span><span class="cx"> 
</span><span class="cx"> void NetworkSession::clearCredentials()
</span><span class="cx"> {
</span><del>-    ASSERT(m_dataTaskMap.isEmpty());
</del><ins>+    ASSERT(m_dataTaskMapWithCredentials.isEmpty());
+    ASSERT(m_dataTaskMapWithoutCredentials.isEmpty());
</ins><span class="cx">     ASSERT(m_downloadMap.isEmpty());
</span><span class="cx">     m_sessionWithCredentialStorage = [NSURLSession sessionWithConfiguration:m_sessionWithCredentialStorage.get().configuration delegate:static_cast&lt;id&gt;(m_sessionDelegate.get()) delegateQueue:[NSOperationQueue mainQueue]];
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-NetworkDataTask* NetworkSession::dataTaskForIdentifier(NetworkDataTask::TaskIdentifier taskIdentifier)
</del><ins>+NetworkDataTask* NetworkSession::dataTaskForIdentifier(NetworkDataTask::TaskIdentifier taskIdentifier, WebCore::StoredCredentials storedCredentials)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(isMainThread());
</span><del>-    return m_dataTaskMap.get(taskIdentifier);
</del><ins>+    if (storedCredentials == WebCore::StoredCredentials::AllowStoredCredentials)
+        return m_dataTaskMapWithCredentials.get(taskIdentifier);
+    return m_dataTaskMapWithoutCredentials.get(taskIdentifier);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void NetworkSession::addDownloadID(NetworkDataTask::TaskIdentifier taskIdentifier, DownloadID downloadID)
</span></span></pre>
</div>
</div>

</body>
</html>