Title: [231850] trunk
Revision
231850
Author
commit-qu...@webkit.org
Date
2018-05-16 10:19:17 -0700 (Wed, 16 May 2018)

Log Message

Session cookies aren't reliably set when using default WKWebSiteDataStore
https://bugs.webkit.org/show_bug.cgi?id=185624
<rdar://problem/39111626>

Patch by Sihui Liu <sihui_...@apple.com> on 2018-05-16
Reviewed by Geoffrey Garen.

Source/WebKit:

Session cookies of default session were set in UI Process when there was no process pool,
but they were not synced (or synced slowly to) Network Process. To make these cookies visible
as soon as they were set through API, we could manually set those cookies in Network Process
during its initilization.

* NetworkProcess/mac/RemoteNetworkingContext.mm:
(WebKit::RemoteNetworkingContext::ensureWebsiteDataStoreSession):
* UIProcess/API/APIHTTPCookieStore.cpp:
(API::HTTPCookieStore::cookies):
(API::HTTPCookieStore::setCookie):
(API::HTTPCookieStore::deleteCookie):
* UIProcess/WebProcessPool.cpp:
(WebKit::WebProcessPool::ensureNetworkProcess):
(WebKit::WebProcessPool::pageBeginUsingWebsiteDataStore):
* UIProcess/WebsiteData/WebsiteDataStore.cpp:
(WebKit::WebsiteDataStore::clearPendingCookies):
* UIProcess/WebsiteData/WebsiteDataStore.h:

Tools:

Modified and enabled WebKit.WKHTTPCookieStoreWithoutProcessPool.

* TestWebKitAPI/Tests/WebKitCocoa/WKHTTPCookieStore.mm:
(-[CookieUIDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
(TEST):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (231849 => 231850)


--- trunk/Source/WebKit/ChangeLog	2018-05-16 16:20:26 UTC (rev 231849)
+++ trunk/Source/WebKit/ChangeLog	2018-05-16 17:19:17 UTC (rev 231850)
@@ -1,3 +1,29 @@
+2018-05-16  Sihui Liu  <sihui_...@apple.com>
+
+        Session cookies aren't reliably set when using default WKWebSiteDataStore
+        https://bugs.webkit.org/show_bug.cgi?id=185624
+        <rdar://problem/39111626>
+
+        Reviewed by Geoffrey Garen.
+
+        Session cookies of default session were set in UI Process when there was no process pool, 
+        but they were not synced (or synced slowly to) Network Process. To make these cookies visible
+        as soon as they were set through API, we could manually set those cookies in Network Process
+        during its initilization. 
+
+        * NetworkProcess/mac/RemoteNetworkingContext.mm:
+        (WebKit::RemoteNetworkingContext::ensureWebsiteDataStoreSession):
+        * UIProcess/API/APIHTTPCookieStore.cpp:
+        (API::HTTPCookieStore::cookies):
+        (API::HTTPCookieStore::setCookie):
+        (API::HTTPCookieStore::deleteCookie):
+        * UIProcess/WebProcessPool.cpp:
+        (WebKit::WebProcessPool::ensureNetworkProcess):
+        (WebKit::WebProcessPool::pageBeginUsingWebsiteDataStore):
+        * UIProcess/WebsiteData/WebsiteDataStore.cpp:
+        (WebKit::WebsiteDataStore::clearPendingCookies):
+        * UIProcess/WebsiteData/WebsiteDataStore.h:
+
 2018-05-16  Chris Nardi  <cna...@chromium.org>
 
         Remove Document#selectedStylesheetSet/preferredStylesheetSet

Modified: trunk/Source/WebKit/NetworkProcess/mac/RemoteNetworkingContext.mm (231849 => 231850)


--- trunk/Source/WebKit/NetworkProcess/mac/RemoteNetworkingContext.mm	2018-05-16 16:20:26 UTC (rev 231849)
+++ trunk/Source/WebKit/NetworkProcess/mac/RemoteNetworkingContext.mm	2018-05-16 17:19:17 UTC (rev 231850)
@@ -36,6 +36,7 @@
 #import "WebsiteDataStoreParameters.h"
 #import <WebCore/NetworkStorageSession.h>
 #import <WebCore/ResourceError.h>
+#import <pal/SessionID.h>
 #import <wtf/MainThread.h>
 
 using namespace WebCore;
@@ -45,8 +46,12 @@
 void RemoteNetworkingContext::ensureWebsiteDataStoreSession(WebsiteDataStoreParameters&& parameters)
 {
     auto sessionID = parameters.networkSessionParameters.sessionID;
-    if (NetworkStorageSession::storageSession(sessionID))
+    if (auto* session = NetworkStorageSession::storageSession(sessionID)) {
+        ASSERT(parameters.pendingCookies.isEmpty() || sessionID == PAL::SessionID::defaultSessionID());
+        for (const auto& cookie : parameters.pendingCookies)
+            session->setCookie(cookie);
         return;
+    }
 
     String base;
     if (SessionTracker::getIdentifierBase().isNull())

Modified: trunk/Source/WebKit/UIProcess/API/APIHTTPCookieStore.cpp (231849 => 231850)


--- trunk/Source/WebKit/UIProcess/API/APIHTTPCookieStore.cpp	2018-05-16 16:20:26 UTC (rev 231849)
+++ trunk/Source/WebKit/UIProcess/API/APIHTTPCookieStore.cpp	2018-05-16 17:19:17 UTC (rev 231850)
@@ -52,7 +52,7 @@
     unregisterForNewProcessPoolNotifications();
 }
 
-void HTTPCookieStore::cookies(Function<void (const Vector<WebCore::Cookie>&)>&& completionHandler)
+void HTTPCookieStore::cookies(Function<void(const Vector<WebCore::Cookie>&)>&& completionHandler)
 {
     auto* pool = m_owningDataStore->processPoolForCookieStorageOperations();
     if (!pool) {
@@ -59,8 +59,7 @@
         Vector<WebCore::Cookie> allCookies;
         if (m_owningDataStore->sessionID() == PAL::SessionID::defaultSessionID())
             allCookies = WebCore::NetworkStorageSession::defaultStorageSession().getAllCookies();
-        else
-            allCookies = m_owningDataStore->pendingCookies();
+        allCookies.appendVector(m_owningDataStore->pendingCookies());
 
         callOnMainThread([completionHandler = WTFMove(completionHandler), allCookies]() {
             completionHandler(allCookies);
@@ -78,7 +77,8 @@
 {
     auto* pool = m_owningDataStore->processPoolForCookieStorageOperations();
     if (!pool) {
-        if (m_owningDataStore->sessionID() == PAL::SessionID::defaultSessionID())
+        // FIXME: pendingCookies used for defaultSession because session cookies cannot be propagated to Network Process with uiProcessCookieStorageIdentifier.
+        if (m_owningDataStore->sessionID() == PAL::SessionID::defaultSessionID() && !cookie.session)
             WebCore::NetworkStorageSession::defaultStorageSession().setCookie(cookie);
         else
             m_owningDataStore->addPendingCookie(cookie);
@@ -99,10 +99,11 @@
 {
     auto* pool = m_owningDataStore->processPoolForCookieStorageOperations();
     if (!pool) {
-        if (m_owningDataStore->sessionID() == PAL::SessionID::defaultSessionID())
+        if (m_owningDataStore->sessionID() == PAL::SessionID::defaultSessionID() && !cookie.session)
             WebCore::NetworkStorageSession::defaultStorageSession().deleteCookie(cookie);
         else
             m_owningDataStore->removePendingCookie(cookie);
+
         callOnMainThread([completionHandler = WTFMove(completionHandler)]() {
             completionHandler();
         });

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (231849 => 231850)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2018-05-16 16:20:26 UTC (rev 231849)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2018-05-16 17:19:17 UTC (rev 231850)
@@ -429,8 +429,10 @@
 NetworkProcessProxy& WebProcessPool::ensureNetworkProcess(WebsiteDataStore* withWebsiteDataStore)
 {
     if (m_networkProcess) {
-        if (withWebsiteDataStore)
+        if (withWebsiteDataStore) {
             m_networkProcess->send(Messages::NetworkProcess::AddWebsiteDataStore(withWebsiteDataStore->parameters()), 0);
+            withWebsiteDataStore->clearPendingCookies();
+        }
         return *m_networkProcess;
     }
 
@@ -523,8 +525,15 @@
             m_websiteDataStore->websiteDataStore().networkProcessDidCrash();
     }
 
-    if (withWebsiteDataStore)
+    if (m_websiteDataStore) {
+        m_networkProcess->send(Messages::NetworkProcess::AddWebsiteDataStore(m_websiteDataStore->websiteDataStore().parameters()), 0);
+        m_websiteDataStore->websiteDataStore().clearPendingCookies();
+    }
+    
+    if (withWebsiteDataStore) {
         m_networkProcess->send(Messages::NetworkProcess::AddWebsiteDataStore(withWebsiteDataStore->parameters()), 0);
+        withWebsiteDataStore->clearPendingCookies();
+    }
 
     return *m_networkProcess;
 }
@@ -1168,9 +1177,11 @@
         ASSERT(page.websiteDataStore().parameters().networkSessionParameters.sessionID == sessionID);
         sendToNetworkingProcess(Messages::NetworkProcess::AddWebsiteDataStore(page.websiteDataStore().parameters()));
         page.process().send(Messages::WebProcess::AddWebsiteDataStore(WebsiteDataStoreParameters::privateSessionParameters(sessionID)), 0);
+        page.websiteDataStore().clearPendingCookies();
     } else if (sessionID != PAL::SessionID::defaultSessionID()) {
         sendToNetworkingProcess(Messages::NetworkProcess::AddWebsiteDataStore(page.websiteDataStore().parameters()));
         page.process().send(Messages::WebProcess::AddWebsiteDataStore(page.websiteDataStore().parameters()), 0);
+        page.websiteDataStore().clearPendingCookies();
 
 #if ENABLE(INDEXED_DATABASE)
         if (!page.websiteDataStore().resolvedIndexedDatabaseDirectory().isEmpty())

Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp (231849 => 231850)


--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp	2018-05-16 16:20:26 UTC (rev 231849)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp	2018-05-16 17:19:17 UTC (rev 231850)
@@ -1523,6 +1523,11 @@
 {
     m_pendingCookies.remove(cookie);
 }
+    
+void WebsiteDataStore::clearPendingCookies()
+{
+    m_pendingCookies.clear();
+}
 
 #if !PLATFORM(COCOA)
 WebsiteDataStoreParameters WebsiteDataStore::parameters()

Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h (231849 => 231850)


--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h	2018-05-16 16:20:26 UTC (rev 231849)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h	2018-05-16 17:19:17 UTC (rev 231850)
@@ -160,6 +160,7 @@
     Vector<WebCore::Cookie> pendingCookies() const;
     void addPendingCookie(const WebCore::Cookie&);
     void removePendingCookie(const WebCore::Cookie&);
+    void clearPendingCookies();
 
     void enableResourceLoadStatisticsAndSetTestingCallback(Function<void (const String&)>&& callback);
 

Modified: trunk/Tools/ChangeLog (231849 => 231850)


--- trunk/Tools/ChangeLog	2018-05-16 16:20:26 UTC (rev 231849)
+++ trunk/Tools/ChangeLog	2018-05-16 17:19:17 UTC (rev 231850)
@@ -1,3 +1,17 @@
+2018-05-16  Sihui Liu  <sihui_...@apple.com>
+
+        Session cookies aren't reliably set when using default WKWebSiteDataStore
+        https://bugs.webkit.org/show_bug.cgi?id=185624
+        <rdar://problem/39111626>
+
+        Reviewed by Geoffrey Garen.
+
+        Modified and enabled WebKit.WKHTTPCookieStoreWithoutProcessPool.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/WKHTTPCookieStore.mm:
+        (-[CookieUIDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
+        (TEST):
+
 2018-05-16  Valerie R Young  <vale...@bocoup.com>
 
         test262/Runner.pm: save to supplied expectation file if supplied

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKHTTPCookieStore.mm (231849 => 231850)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKHTTPCookieStore.mm	2018-05-16 16:20:26 UTC (rev 231849)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKHTTPCookieStore.mm	2018-05-16 17:19:17 UTC (rev 231850)
@@ -376,62 +376,101 @@
 @implementation CookieUIDelegate
 - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
 {
-    EXPECT_STREQ("cookie:cookiename=cookievalue", message.UTF8String);
+    EXPECT_STREQ("cookie:PersistentCookieName=CookieValue; SessionCookieName=CookieValue", message.UTF8String);
     finished = true;
     completionHandler();
 }
 @end
 
-// FIXME: This should be removed once <rdar://problem/35344202> is resolved and bots are updated.
-#if (PLATFORM(MAC) && __MAC_OS_X_VERSION_MAX_ALLOWED <= 101301) || (PLATFORM(IOS) && __IPHONE_OS_VERSION_MAX_ALLOWED <= 110102)
 TEST(WebKit, WKHTTPCookieStoreWithoutProcessPool)
 {
-    NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:[NSDictionary dictionaryWithObjectsAndKeys:@"127.0.0.1", NSHTTPCookieDomain, @"/", NSHTTPCookiePath, @"cookiename", NSHTTPCookieName, @"cookievalue", NSHTTPCookieValue, [NSDate distantFuture], NSHTTPCookieExpires, nil]];
+    RetainPtr<NSHTTPCookie> sessionCookie = [NSHTTPCookie cookieWithProperties:@{
+        NSHTTPCookiePath: @"/",
+        NSHTTPCookieName: @"SessionCookieName",
+        NSHTTPCookieValue: @"CookieValue",
+        NSHTTPCookieDomain: @"127.0.0.1",
+    }];
+    RetainPtr<NSHTTPCookie> persistentCookie = [NSHTTPCookie cookieWithProperties:@{
+        NSHTTPCookiePath: @"/",
+        NSHTTPCookieName: @"PersistentCookieName",
+        NSHTTPCookieValue: @"CookieValue",
+        NSHTTPCookieDomain: @"127.0.0.1",
+        NSHTTPCookieExpires: [NSDate distantFuture],
+    }];
     NSString *alertCookieHTML = @"<script>alert('cookie:'+document.cookie);</script>";
-    
+
+    // NonPersistentDataStore
+    RetainPtr<WKWebsiteDataStore> ephemeralStoreWithCookies = [WKWebsiteDataStore nonPersistentDataStore];
+
     finished = false;
-    WKWebsiteDataStore *ephemeralStoreWithCookies = [WKWebsiteDataStore nonPersistentDataStore];
-    [ephemeralStoreWithCookies.httpCookieStore setCookie:cookie completionHandler:^ {
+    [ephemeralStoreWithCookies.get().httpCookieStore setCookie:persistentCookie.get() completionHandler:^{
         WKWebsiteDataStore *ephemeralStoreWithIndependentCookieStorage = [WKWebsiteDataStore nonPersistentDataStore];
         [ephemeralStoreWithIndependentCookieStorage.httpCookieStore getAllCookies:^(NSArray<NSHTTPCookie *> *cookies) {
-            ASSERT_EQ(cookies.count, 0u);
-            
-            WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
-            configuration.websiteDataStore = ephemeralStoreWithCookies;
-            WKWebView *view = [[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration];
-            view.UIDelegate = [[CookieUIDelegate alloc] init];
+            ASSERT_EQ(0u, cookies.count);
+            finished = true;
+        }];
+    }];
+    TestWebKitAPI::Util::run(&finished);
 
-            [view loadHTMLString:alertCookieHTML baseURL:[NSURL URLWithString:@"http://127.0.0.1/"]];
+    finished = false;
+    [ephemeralStoreWithCookies.get().httpCookieStore setCookie:sessionCookie.get() completionHandler:^{
+        [ephemeralStoreWithCookies.get().httpCookieStore getAllCookies:^(NSArray<NSHTTPCookie *> *cookies) {
+            ASSERT_EQ(2u, cookies.count);
+            finished = true;
         }];
     }];
     TestWebKitAPI::Util::run(&finished);
+
+    finished = false;
+    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    configuration.get().websiteDataStore = ephemeralStoreWithCookies.get();
+    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+    auto delegate = adoptNS([[CookieUIDelegate alloc] init]);
+    webView.get().UIDelegate = delegate.get();
+    [webView loadHTMLString:alertCookieHTML baseURL:[NSURL URLWithString:@"http://127.0.0.1"]];
+    TestWebKitAPI::Util::run(&finished);
+
+    finished = false;
+    [ephemeralStoreWithCookies.get().httpCookieStore deleteCookie:sessionCookie.get() completionHandler:^{
+        [ephemeralStoreWithCookies.get().httpCookieStore getAllCookies:^(NSArray<NSHTTPCookie *> *cookies) {
+            ASSERT_EQ(1u, cookies.count);
+            finished = true;
+        }];
+    }];
+    TestWebKitAPI::Util::run(&finished);
     
-    // FIXME: Get this to work on iOS. <rdar://problem/32260156>
-#if !PLATFORM(IOS)
+    // DefaultDataStore
+    auto defaultStore = [WKWebsiteDataStore defaultDataStore];
     finished = false;
-    WKWebsiteDataStore *defaultStore = [WKWebsiteDataStore defaultDataStore];
-    [defaultStore.httpCookieStore setCookie:cookie completionHandler:^ {
+    [defaultStore removeDataOfTypes:[WKWebsiteDataStore allWebsiteDataTypes] modifiedSince:[NSDate distantPast] completionHandler:[] {
+        finished = true;
+    }];
+    TestWebKitAPI::Util::run(&finished);
+
+    finished = false;
+    [defaultStore.httpCookieStore setCookie:persistentCookie.get() completionHandler:^{
         [defaultStore.httpCookieStore getAllCookies:^(NSArray<NSHTTPCookie *> *cookies) {
-            ASSERT_EQ(cookies.count, 1u);
-            
-            WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
-            configuration.websiteDataStore = defaultStore;
-            WKWebView *view = [[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration];
-            view.UIDelegate = [[CookieUIDelegate alloc] init];
-            
-            [view loadHTMLString:alertCookieHTML baseURL:[NSURL URLWithString:@"http://127.0.0.1/"]];
+            ASSERT_EQ(1u, cookies.count);
+            finished = true;
         }];
     }];
     TestWebKitAPI::Util::run(&finished);
-    
-    [defaultStore.httpCookieStore deleteCookie:cookie completionHandler:^ {
+
+    finished = false;
+    [defaultStore.httpCookieStore setCookie:sessionCookie.get() completionHandler:^{
         [defaultStore.httpCookieStore getAllCookies:^(NSArray<NSHTTPCookie *> *cookies) {
-            ASSERT_EQ(cookies.count, 0u);
+            ASSERT_EQ(2u, cookies.count);
             finished = true;
         }];
     }];
     TestWebKitAPI::Util::run(&finished);
-#endif
+
+    finished = false;
+    configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    configuration.get().websiteDataStore = defaultStore;
+    webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+    webView.get().UIDelegate = delegate.get();
+    [webView loadHTMLString:alertCookieHTML baseURL:[NSURL URLWithString:@"http://127.0.0.1"]];
+    TestWebKitAPI::Util::run(&finished);
 }
-#endif // (PLATFORM(MAC) && __MAC_OS_X_VERSION_MAX_ALLOWED <= 101301) || (PLATFORM(IOS) && __IPHONE_OS_VERSION_MAX_ALLOWED <= 110102)
 #endif
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to