<!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>[197720] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/197720">197720</a></dd>
<dt>Author</dt> <dd>achristensen@apple.com</dd>
<dt>Date</dt> <dd>2016-03-07 18:40:12 -0800 (Mon, 07 Mar 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Fix cookies with private browsing and NetworkSession
https://bugs.webkit.org/show_bug.cgi?id=155147
rdar://problem/25018279

Reviewed by Brady Eidson.

Source/WebKit2:

In the NetworkSession constructor, we look for a NetworkStorageSession in the SessionTracker
and use that NetworkStorageSession's CFHTTPCookieStorageRef in the NSURLSessionConfiguration.
NetworkStorageSessions were being set in SessionTracker's storageSessionMap after NetworkSessions
were created, causing the NSHTTPCookieStorage of the NSURLSession to be different from the
CFHTTPCookieStorageRef used by document.cookie in newly created private browsing sessions.
This fixes that problem by passing the NetworkStorageSession as a constructor parameter to the
NetworkSession so it can use the correct CFHTTPCookieStorageRef in its NSURLSessionConfiguration
before it is in the storageSessionMap.

* NetworkProcess/NetworkSession.h:
(WebKit::NetworkSession::sessionID):
* NetworkProcess/cocoa/NetworkSessionCocoa.mm:
(WebKit::NetworkSession::defaultSession):
(WebKit::NetworkSession::NetworkSession):
* NetworkProcess/mac/RemoteNetworkingContext.mm:
(WebKit::RemoteNetworkingContext::ensurePrivateBrowsingSession):
* WebProcess/WebCoreSupport/mac/WebFrameNetworkingContext.mm:
(WebKit::WebFrameNetworkingContext::ensurePrivateBrowsingSession):

LayoutTests:

* http/tests/cookies/private-cookie-storage-expected.txt: Added.
* http/tests/cookies/private-cookie-storage.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<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>
<li><a href="#trunkSourceWebKit2NetworkProcessmacRemoteNetworkingContextmm">trunk/Source/WebKit2/NetworkProcess/mac/RemoteNetworkingContext.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportmacWebFrameNetworkingContextmm">trunk/Source/WebKit2/WebProcess/WebCoreSupport/mac/WebFrameNetworkingContext.mm</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestshttptestscookiesprivatecookiestorageexpectedtxt">trunk/LayoutTests/http/tests/cookies/private-cookie-storage-expected.txt</a></li>
<li><a href="#trunkLayoutTestshttptestscookiesprivatecookiestoragehtml">trunk/LayoutTests/http/tests/cookies/private-cookie-storage.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (197719 => 197720)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-03-08 01:51:27 UTC (rev 197719)
+++ trunk/LayoutTests/ChangeLog        2016-03-08 02:40:12 UTC (rev 197720)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2016-03-07  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        Fix cookies with private browsing and NetworkSession
+        https://bugs.webkit.org/show_bug.cgi?id=155147
+        rdar://problem/25018279
+
+        Reviewed by Brady Eidson.
+
+        * http/tests/cookies/private-cookie-storage-expected.txt: Added.
+        * http/tests/cookies/private-cookie-storage.html: Added.
+
</ins><span class="cx"> 2016-03-07  Ryan Haddad  &lt;ryanhaddad@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Marking media/track/track-cues-pause-on-exit.html as flaky on ElCapitan Debug WK2
</span></span></pre></div>
<a id="trunkLayoutTestshttptestscookiesprivatecookiestorageexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/http/tests/cookies/private-cookie-storage-expected.txt (0 => 197720)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/cookies/private-cookie-storage-expected.txt                                (rev 0)
+++ trunk/LayoutTests/http/tests/cookies/private-cookie-storage-expected.txt        2016-03-08 02:40:12 UTC (rev 197720)
</span><span class="lines">@@ -0,0 +1,18 @@
</span><ins>+This test checks that cookies set from a Set-Cookie header in private browsing mode are stored in the same cookie storage as cookies set with document.cookie.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+Cookies before setting (should be empty):
+Cookies before enabling private browsing (should be key1=value1):key1=value1
+PASS cookie is 'key1=value1'.
+Cookies after enabling private browsing (should be empty):
+PASS cookie is ''.
+Cookies after setting in private browsing (should be key2=value2):key2=value2
+PASS cookie is 'key2=value2'.
+Cookies after disabling private browsing (should be key1=value1):key1=value1
+PASS cookie is 'key1=value1'.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestshttptestscookiesprivatecookiestoragehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/http/tests/cookies/private-cookie-storage.html (0 => 197720)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/cookies/private-cookie-storage.html                                (rev 0)
+++ trunk/LayoutTests/http/tests/cookies/private-cookie-storage.html        2016-03-08 02:40:12 UTC (rev 197720)
</span><span class="lines">@@ -0,0 +1,26 @@
</span><ins>+&lt;script src=&quot;resources/cookies-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+description(&quot;This test checks that cookies set from a Set-Cookie header in private browsing mode are stored in the same cookie storage as cookies set with document.cookie.&quot;);
+
+debug(&quot;Cookies before setting (should be empty):&quot; + document.cookie);
+
+document.cookie = &quot;key1=value1&quot;;
+debug(&quot;Cookies before enabling private browsing (should be key1=value1):&quot; + document.cookie);
+testCookies(&quot;key1=value1&quot;);
+
+if (window.testRunner) { testRunner.setPrivateBrowsingEnabled(true); }
+
+debug(&quot;Cookies after enabling private browsing (should be empty):&quot; + document.cookie);
+testCookies(&quot;&quot;); // We're using a different cookie storage now.  key1=value1 is still in the default cookie storage.
+document.cookie = &quot;key2=value2&quot;;
+debug(&quot;Cookies after setting in private browsing (should be key2=value2):&quot; + document.cookie);
+testCookies(&quot;key2=value2&quot;);
+clearCookies();
+
+if (window.testRunner) { testRunner.setPrivateBrowsingEnabled(false); }
+
+debug(&quot;Cookies after disabling private browsing (should be key1=value1):&quot; + document.cookie);
+testCookies(&quot;key1=value1&quot;);
+
+&lt;/script&gt;
+&lt;script src=&quot;resources/cookies-test-post.js&quot;&gt;&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (197719 => 197720)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-03-08 01:51:27 UTC (rev 197719)
+++ trunk/Source/WebKit2/ChangeLog        2016-03-08 02:40:12 UTC (rev 197720)
</span><span class="lines">@@ -1,3 +1,30 @@
</span><ins>+2016-03-07  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        Fix cookies with private browsing and NetworkSession
+        https://bugs.webkit.org/show_bug.cgi?id=155147
+        rdar://problem/25018279
+
+        Reviewed by Brady Eidson.
+
+        In the NetworkSession constructor, we look for a NetworkStorageSession in the SessionTracker
+        and use that NetworkStorageSession's CFHTTPCookieStorageRef in the NSURLSessionConfiguration.
+        NetworkStorageSessions were being set in SessionTracker's storageSessionMap after NetworkSessions
+        were created, causing the NSHTTPCookieStorage of the NSURLSession to be different from the
+        CFHTTPCookieStorageRef used by document.cookie in newly created private browsing sessions.
+        This fixes that problem by passing the NetworkStorageSession as a constructor parameter to the
+        NetworkSession so it can use the correct CFHTTPCookieStorageRef in its NSURLSessionConfiguration
+        before it is in the storageSessionMap.
+
+        * NetworkProcess/NetworkSession.h:
+        (WebKit::NetworkSession::sessionID):
+        * NetworkProcess/cocoa/NetworkSessionCocoa.mm:
+        (WebKit::NetworkSession::defaultSession):
+        (WebKit::NetworkSession::NetworkSession):
+        * NetworkProcess/mac/RemoteNetworkingContext.mm:
+        (WebKit::RemoteNetworkingContext::ensurePrivateBrowsingSession):
+        * WebProcess/WebCoreSupport/mac/WebFrameNetworkingContext.mm:
+        (WebKit::WebFrameNetworkingContext::ensurePrivateBrowsingSession):
+
</ins><span class="cx"> 2016-03-07  Brent Fulgham  &lt;bfulgham@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Correct bug in resource load statistics debug flag for legacy clients
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkSessionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkSession.h (197719 => 197720)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkSession.h        2016-03-08 01:51:27 UTC (rev 197719)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkSession.h        2016-03-08 02:40:12 UTC (rev 197720)
</span><span class="lines">@@ -39,6 +39,10 @@
</span><span class="cx"> #include &lt;wtf/Ref.h&gt;
</span><span class="cx"> #include &lt;wtf/RefCounted.h&gt;
</span><span class="cx"> 
</span><ins>+namespace WebCore {
+class NetworkStorageSession;
+}
+
</ins><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><span class="cx"> class CustomProtocolManager;
</span><span class="lines">@@ -50,7 +54,7 @@
</span><span class="cx">         Normal,
</span><span class="cx">         Ephemeral
</span><span class="cx">     };
</span><del>-    NetworkSession(Type, WebCore::SessionID, CustomProtocolManager*);
</del><ins>+    NetworkSession(Type, WebCore::SessionID, CustomProtocolManager*, WebCore::NetworkStorageSession*);
</ins><span class="cx">     ~NetworkSession();
</span><span class="cx"> 
</span><span class="cx">     WebCore::SessionID sessionID() { return m_sessionID; }
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscocoaNetworkSessionCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm (197719 => 197720)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm        2016-03-08 01:51:27 UTC (rev 197719)
+++ trunk/Source/WebKit2/NetworkProcess/cocoa/NetworkSessionCocoa.mm        2016-03-08 02:40:12 UTC (rev 197720)
</span><span class="lines">@@ -259,11 +259,11 @@
</span><span class="cx"> NetworkSession&amp; NetworkSession::defaultSession()
</span><span class="cx"> {
</span><span class="cx">     ASSERT(isMainThread());
</span><del>-    static NeverDestroyed&lt;NetworkSession&gt; session(NetworkSession::Type::Normal, WebCore::SessionID::defaultSessionID(), globalCustomProtocolManager().get());
</del><ins>+    static NeverDestroyed&lt;NetworkSession&gt; session(NetworkSession::Type::Normal, WebCore::SessionID::defaultSessionID(), globalCustomProtocolManager().get(), &amp;WebCore::NetworkStorageSession::defaultStorageSession());
</ins><span class="cx">     return session;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-NetworkSession::NetworkSession(Type type, WebCore::SessionID sessionID, CustomProtocolManager* customProtocolManager)
</del><ins>+NetworkSession::NetworkSession(Type type, WebCore::SessionID sessionID, CustomProtocolManager* customProtocolManager, WebCore::NetworkStorageSession* networkStorageSession)
</ins><span class="cx">     : m_sessionID(sessionID)
</span><span class="cx"> {
</span><span class="cx">     m_sessionDelegate = adoptNS([[WKNetworkSessionDelegate alloc] initWithNetworkSession:*this]);
</span><span class="lines">@@ -279,8 +279,8 @@
</span><span class="cx">     setCollectsTimingData();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    if (auto* storageSession = SessionTracker::storageSession(sessionID)) {
-        if (CFHTTPCookieStorageRef storage = storageSession-&gt;cookieStorage().get())
</del><ins>+    if (networkStorageSession) {
+        if (CFHTTPCookieStorageRef storage = networkStorageSession-&gt;cookieStorage().get())
</ins><span class="cx">             configuration.HTTPCookieStorage = [[[NSHTTPCookieStorage alloc] _initWithCFHTTPCookieStorage:storage] autorelease];
</span><span class="cx">     }
</span><span class="cx">     m_sessionWithCredentialStorage = [NSURLSession sessionWithConfiguration:configuration delegate:static_cast&lt;id&gt;(m_sessionDelegate.get()) delegateQueue:[NSOperationQueue mainQueue]];
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessmacRemoteNetworkingContextmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/mac/RemoteNetworkingContext.mm (197719 => 197720)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/mac/RemoteNetworkingContext.mm        2016-03-08 01:51:27 UTC (rev 197719)
+++ trunk/Source/WebKit2/NetworkProcess/mac/RemoteNetworkingContext.mm        2016-03-08 02:40:12 UTC (rev 197720)
</span><span class="lines">@@ -100,10 +100,14 @@
</span><span class="cx">     else
</span><span class="cx">         base = SessionTracker::getIdentifierBase();
</span><span class="cx"> 
</span><del>-    SessionTracker::setSession(sessionID, NetworkStorageSession::createPrivateBrowsingSession(base + '.' + String::number(sessionID.sessionID()))
</del><ins>+    auto networkStorageSession = NetworkStorageSession::createPrivateBrowsingSession(base + '.' + String::number(sessionID.sessionID()));
</ins><span class="cx"> #if USE(NETWORK_SESSION)
</span><del>-        , std::make_unique&lt;NetworkSession&gt;(NetworkSession::Type::Ephemeral, sessionID, NetworkProcess::singleton().supplement&lt;CustomProtocolManager&gt;())
</del><ins>+    auto networkSession = std::make_unique&lt;NetworkSession&gt;(NetworkSession::Type::Ephemeral, sessionID, NetworkProcess::singleton().supplement&lt;CustomProtocolManager&gt;(), networkStorageSession.get());
</ins><span class="cx"> #endif
</span><ins>+    SessionTracker::setSession(sessionID, WTFMove(networkStorageSession)
+#if USE(NETWORK_SESSION)
+        , WTFMove(networkSession)
+#endif
</ins><span class="cx">     );
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportmacWebFrameNetworkingContextmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/mac/WebFrameNetworkingContext.mm (197719 => 197720)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/mac/WebFrameNetworkingContext.mm        2016-03-08 01:51:27 UTC (rev 197719)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/mac/WebFrameNetworkingContext.mm        2016-03-08 02:40:12 UTC (rev 197720)
</span><span class="lines">@@ -58,10 +58,14 @@
</span><span class="cx">     else
</span><span class="cx">         base = SessionTracker::getIdentifierBase();
</span><span class="cx"> 
</span><del>-    SessionTracker::setSession(sessionID, NetworkStorageSession::createPrivateBrowsingSession(base + '.' + String::number(sessionID.sessionID()))
</del><ins>+    auto networkStorageSession = NetworkStorageSession::createPrivateBrowsingSession(base + '.' + String::number(sessionID.sessionID()));
</ins><span class="cx"> #if USE(NETWORK_SESSION)
</span><del>-        , std::make_unique&lt;NetworkSession&gt;(NetworkSession::Type::Ephemeral, sessionID, nullptr)
</del><ins>+    auto networkSession = std::make_unique&lt;NetworkSession&gt;(NetworkSession::Type::Ephemeral, sessionID, nullptr, networkStorageSession.get());
</ins><span class="cx"> #endif
</span><ins>+    SessionTracker::setSession(sessionID, WTFMove(networkStorageSession)
+#if USE(NETWORK_SESSION)
+        , WTFMove(networkSession)
+#endif
</ins><span class="cx">     );
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>