Title: [187375] trunk/Source
Revision
187375
Author
[email protected]
Date
2015-07-24 17:33:03 -0700 (Fri, 24 Jul 2015)

Log Message

WKWebsiteDataStore remove methods don't properly delete cookies
https://bugs.webkit.org/show_bug.cgi?id=147282
rdar://problem/21948230

Reviewed by Sam Weinig.

Source/WebCore:

Rename deleteCookiesForHostname to deleteCookiesForHostnames and
make it take a vector of hostnames instead.

Also, fix the Mac implementation to not be O(n2) by putting all cookies
in a dictionary keyed on the domain.

Also make sure to call _saveStorage after deleting cookies.

Finally, get rid of deleteCookiesForHostname from CookieJarCFNet.cpp and
use the Mac implementation on iOS as well. Just stub out deleteCookiesForHostnames
on Windows since nobody is calling it.

* platform/network/PlatformCookieJar.h:
* platform/network/cf/CookieJarCFNet.cpp:
(WebCore::deleteCookiesForHostnames):
(WebCore::deleteCookiesForHostname): Deleted.
* platform/network/mac/CookieJarMac.mm:
(WebCore::deleteCookiesForHostnames):
(WebCore::deleteAllCookiesModifiedSince):
(WebCore::deleteCookiesForHostname): Deleted.
* platform/network/soup/CookieJarSoup.cpp:
(WebCore::deleteCookiesForHostnames):
(WebCore::deleteCookiesForHostname): Deleted.
* platform/spi/cf/CFNetworkSPI.h:

Source/WebKit2:

* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::deleteWebsiteDataForOrigins):
Call deleteCookiesForHostnames instead of iterating over each hostname.

* WebProcess/Cookies/WebCookieManager.cpp:
(WebKit::WebCookieManager::deleteCookiesForHostname):
Call deleteCookiesForHostnames.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (187374 => 187375)


--- trunk/Source/WebCore/ChangeLog	2015-07-25 00:29:26 UTC (rev 187374)
+++ trunk/Source/WebCore/ChangeLog	2015-07-25 00:33:03 UTC (rev 187375)
@@ -1,3 +1,36 @@
+2015-07-24  Anders Carlsson  <[email protected]>
+
+        WKWebsiteDataStore remove methods don't properly delete cookies
+        https://bugs.webkit.org/show_bug.cgi?id=147282
+        rdar://problem/21948230
+
+        Reviewed by Sam Weinig.
+
+        Rename deleteCookiesForHostname to deleteCookiesForHostnames and
+        make it take a vector of hostnames instead.
+        
+        Also, fix the Mac implementation to not be O(n2) by putting all cookies
+        in a dictionary keyed on the domain.
+        
+        Also make sure to call _saveStorage after deleting cookies.
+        
+        Finally, get rid of deleteCookiesForHostname from CookieJarCFNet.cpp and
+        use the Mac implementation on iOS as well. Just stub out deleteCookiesForHostnames
+        on Windows since nobody is calling it.
+
+        * platform/network/PlatformCookieJar.h:
+        * platform/network/cf/CookieJarCFNet.cpp:
+        (WebCore::deleteCookiesForHostnames):
+        (WebCore::deleteCookiesForHostname): Deleted.
+        * platform/network/mac/CookieJarMac.mm:
+        (WebCore::deleteCookiesForHostnames):
+        (WebCore::deleteAllCookiesModifiedSince):
+        (WebCore::deleteCookiesForHostname): Deleted.
+        * platform/network/soup/CookieJarSoup.cpp:
+        (WebCore::deleteCookiesForHostnames):
+        (WebCore::deleteCookiesForHostname): Deleted.
+        * platform/spi/cf/CFNetworkSPI.h:
+
 2015-07-24  Chris Fleizach  <[email protected]>
 
         AX: scrollable elements do not allow 3-finger swipe

Modified: trunk/Source/WebCore/platform/network/PlatformCookieJar.h (187374 => 187375)


--- trunk/Source/WebCore/platform/network/PlatformCookieJar.h	2015-07-25 00:29:26 UTC (rev 187374)
+++ trunk/Source/WebCore/platform/network/PlatformCookieJar.h	2015-07-25 00:33:03 UTC (rev 187375)
@@ -47,7 +47,7 @@
 WEBCORE_EXPORT bool getRawCookies(const NetworkStorageSession&, const URL& firstParty, const URL&, Vector<Cookie>&);
 WEBCORE_EXPORT void deleteCookie(const NetworkStorageSession&, const URL&, const String&);
 WEBCORE_EXPORT void getHostnamesWithCookies(const NetworkStorageSession&, HashSet<String>& hostnames);
-WEBCORE_EXPORT void deleteCookiesForHostname(const NetworkStorageSession&, const String& hostname);
+WEBCORE_EXPORT void deleteCookiesForHostnames(const NetworkStorageSession&, const Vector<String>& cookieHostNames);
 WEBCORE_EXPORT void deleteAllCookies(const NetworkStorageSession&);
 WEBCORE_EXPORT void deleteAllCookiesModifiedSince(const NetworkStorageSession&, std::chrono::system_clock::time_point);
 

Modified: trunk/Source/WebCore/platform/network/cf/CookieJarCFNet.cpp (187374 => 187375)


--- trunk/Source/WebCore/platform/network/cf/CookieJarCFNet.cpp	2015-07-25 00:29:26 UTC (rev 187374)
+++ trunk/Source/WebCore/platform/network/cf/CookieJarCFNet.cpp	2015-07-25 00:33:03 UTC (rev 187375)
@@ -225,29 +225,16 @@
     }
 }
 
-void deleteCookiesForHostname(const NetworkStorageSession& session, const String& hostname)
-{
-    RetainPtr<CFHTTPCookieStorageRef> cookieStorage = session.cookieStorage();
-
-    RetainPtr<CFArrayRef> cookiesCF = adoptCF(CFHTTPCookieStorageCopyCookies(cookieStorage.get()));
-    if (!cookiesCF)
-        return;
-
-    CFIndex count = CFArrayGetCount(cookiesCF.get());
-    for (CFIndex i = count - 1; i >=0; i--) {
-        CFHTTPCookieRef cookie = static_cast<CFHTTPCookieRef>(const_cast<void *>(CFArrayGetValueAtIndex(cookiesCF.get(), i)));
-        RetainPtr<CFStringRef> domain = cookieDomain(cookie);
-        if (String(domain.get()) == hostname)
-            CFHTTPCookieStorageDeleteCookie(cookieStorage.get(), cookie);
-    }
-}
-
 void deleteAllCookies(const NetworkStorageSession& session)
 {
     CFHTTPCookieStorageDeleteAllCookies(session.cookieStorage().get());
 }
 
 #if PLATFORM(WIN)
+void deleteCookiesForHostnames(const NetworkStorageSession& session, const Vector<String>& hostnames)
+{
+}
+
 void deleteAllCookiesModifiedSince(const NetworkStorageSession&, std::chrono::system_clock::time_point)
 {
 }

Modified: trunk/Source/WebCore/platform/network/mac/CookieJarMac.mm (187374 => 187375)


--- trunk/Source/WebCore/platform/network/mac/CookieJarMac.mm	2015-07-25 00:29:26 UTC (rev 187374)
+++ trunk/Source/WebCore/platform/network/mac/CookieJarMac.mm	2015-07-25 00:33:03 UTC (rev 187375)
@@ -198,23 +198,6 @@
     END_BLOCK_OBJC_EXCEPTIONS;
 }
 
-void deleteCookiesForHostname(const NetworkStorageSession& session, const String& hostname)
-{
-    BEGIN_BLOCK_OBJC_EXCEPTIONS;
-
-    RetainPtr<CFHTTPCookieStorageRef> cookieStorage = session.cookieStorage();
-    NSArray *cookies = wkHTTPCookies(cookieStorage.get());
-    if (!cookies)
-        return;
-    
-    for (NSHTTPCookie* cookie in cookies) {
-        if (hostname == String([cookie domain]))
-            wkDeleteHTTPCookie(cookieStorage.get(), cookie);
-    }
-    
-    END_BLOCK_OBJC_EXCEPTIONS;
-}
-
 void deleteAllCookies(const NetworkStorageSession& session)
 {
     wkDeleteAllHTTPCookies(session.cookieStorage().get());
@@ -235,6 +218,30 @@
     return [[[NSHTTPCookieStorage alloc] _initWithCFHTTPCookieStorage:cookieStorage.get()] autorelease];
 }
 
+void deleteCookiesForHostnames(const NetworkStorageSession& session, const Vector<String>& hostnames)
+{
+    BEGIN_BLOCK_OBJC_EXCEPTIONS;
+
+    RetainPtr<CFHTTPCookieStorageRef> cookieStorage = session.cookieStorage();
+    NSArray *cookies = wkHTTPCookies(cookieStorage.get());
+    if (!cookies)
+        return;
+
+    HashMap<String, RetainPtr<NSHTTPCookie>> cookiesByDomain;
+    for (NSHTTPCookie* cookie in cookies)
+        cookiesByDomain.set(cookie.domain, cookie);
+
+    for (const auto& hostname : hostnames) {
+        if (NSHTTPCookie *cookie = cookiesByDomain.get(hostname).get())
+            wkDeleteHTTPCookie(cookieStorage.get(), cookie);
+    }
+
+    [WebCore::cookieStorage(session) _saveCookies];
+
+    END_BLOCK_OBJC_EXCEPTIONS;
+}
+
+
 void deleteAllCookiesModifiedSince(const NetworkStorageSession& session, std::chrono::system_clock::time_point timePoint)
 {
     if (![NSHTTPCookieStorage instancesRespondToSelector:@selector(removeCookiesSinceDate:)])
@@ -243,7 +250,10 @@
     NSTimeInterval timeInterval = std::chrono::duration_cast<std::chrono::duration<double>>(timePoint.time_since_epoch()).count();
     NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeInterval];
 
-    [cookieStorage(session) removeCookiesSinceDate:date];
+    NSHTTPCookieStorage *storage = cookieStorage(session);
+
+    [storage removeCookiesSinceDate:date];
+    [storage _saveCookies];
 }
 
 }

Modified: trunk/Source/WebCore/platform/network/soup/CookieJarSoup.cpp (187374 => 187375)


--- trunk/Source/WebCore/platform/network/soup/CookieJarSoup.cpp	2015-07-25 00:29:26 UTC (rev 187374)
+++ trunk/Source/WebCore/platform/network/soup/CookieJarSoup.cpp	2015-07-25 00:33:03 UTC (rev 187375)
@@ -203,16 +203,18 @@
     }
 }
 
-void deleteCookiesForHostname(const NetworkStorageSession& session, const String& hostname)
+void deleteCookiesForHostnames(const NetworkStorageSession& session, const Vector<String>& hostnames)
 {
-    CString hostNameString = hostname.utf8();
-    SoupCookieJar* cookieJar = cookieJarForSession(session);
-    GUniquePtr<GSList> cookies(soup_cookie_jar_all_cookies(cookieJar));
-    for (GSList* item = cookies.get(); item; item = g_slist_next(item)) {
-        SoupCookie* cookie = static_cast<SoupCookie*>(item->data);
-        if (soup_cookie_domain_matches(cookie, hostNameString.data()))
-            soup_cookie_jar_delete_cookie(cookieJar, cookie);
-        soup_cookie_free(cookie);
+    for (const auto& hostname : hostnames) {
+        CString hostNameString = hostname.utf8();
+        SoupCookieJar* cookieJar = cookieJarForSession(session);
+        GUniquePtr<GSList> cookies(soup_cookie_jar_all_cookies(cookieJar));
+        for (GSList* item = cookies.get(); item; item = g_slist_next(item)) {
+            SoupCookie* cookie = static_cast<SoupCookie*>(item->data);
+            if (soup_cookie_domain_matches(cookie, hostNameString.data()))
+                soup_cookie_jar_delete_cookie(cookieJar, cookie);
+            soup_cookie_free(cookie);
+        }
     }
 }
 

Modified: trunk/Source/WebCore/platform/spi/cf/CFNetworkSPI.h (187374 => 187375)


--- trunk/Source/WebCore/platform/spi/cf/CFNetworkSPI.h	2015-07-25 00:29:26 UTC (rev 187374)
+++ trunk/Source/WebCore/platform/spi/cf/CFNetworkSPI.h	2015-07-25 00:33:03 UTC (rev 187375)
@@ -128,13 +128,16 @@
 #endif
 
 #if defined(__OBJC__)
+
 #if !USE(APPLE_INTERNAL_SDK) || (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED == 1090)
 @interface NSHTTPCookieStorage (Details)
 - (void)removeCookiesSinceDate:(NSDate *)date;
 - (id)_initWithCFHTTPCookieStorage:(CFHTTPCookieStorageRef)cfStorage;
 - (CFHTTPCookieStorageRef)_cookieStorage;
+- (void)_saveCookies;
 @end
 #endif
+
 // FIXME: Move +_setSharedHTTPCookieStorage: into the above section under !USE(APPLE_INTERNAL_SDK) when possible (soon).
 #if (TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MIN_REQUIRED >= 90000) || (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
 @interface NSHTTPCookieStorage (Details)

Modified: trunk/Source/WebKit2/ChangeLog (187374 => 187375)


--- trunk/Source/WebKit2/ChangeLog	2015-07-25 00:29:26 UTC (rev 187374)
+++ trunk/Source/WebKit2/ChangeLog	2015-07-25 00:33:03 UTC (rev 187375)
@@ -1,5 +1,21 @@
 2015-07-24  Anders Carlsson  <[email protected]>
 
+        WKWebsiteDataStore remove methods don't properly delete cookies
+        https://bugs.webkit.org/show_bug.cgi?id=147282
+        rdar://problem/21948230
+
+        Reviewed by Sam Weinig.
+
+        * NetworkProcess/NetworkProcess.cpp:
+        (WebKit::NetworkProcess::deleteWebsiteDataForOrigins):
+        Call deleteCookiesForHostnames instead of iterating over each hostname.
+
+        * WebProcess/Cookies/WebCookieManager.cpp:
+        (WebKit::WebCookieManager::deleteCookiesForHostname):
+        Call deleteCookiesForHostnames.
+
+2015-07-24  Anders Carlsson  <[email protected]>
+
         Networking process crash in NetworkConnectionToWebProcess::convertMainResourceLoadToDownload while attempting to download a blob
         https://bugs.webkit.org/show_bug.cgi?id=147276
         rdar://problem/21423353

Modified: trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp (187374 => 187375)


--- trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp	2015-07-25 00:29:26 UTC (rev 187374)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp	2015-07-25 00:33:03 UTC (rev 187375)
@@ -417,10 +417,8 @@
 void NetworkProcess::deleteWebsiteDataForOrigins(SessionID sessionID, uint64_t websiteDataTypes, const Vector<SecurityOriginData>& origins, const Vector<String>& cookieHostNames, uint64_t callbackID)
 {
     if (websiteDataTypes & WebsiteDataTypeCookies) {
-        if (auto* networkStorageSession = SessionTracker::session(sessionID)) {
-            for (const auto& cookieHostName : cookieHostNames)
-                deleteCookiesForHostname(*networkStorageSession, cookieHostName);
-        }
+        if (auto* networkStorageSession = SessionTracker::session(sessionID))
+            deleteCookiesForHostnames(*networkStorageSession, cookieHostNames);
     }
 
     auto completionHandler = [this, callbackID] {

Modified: trunk/Source/WebKit2/WebProcess/Cookies/WebCookieManager.cpp (187374 => 187375)


--- trunk/Source/WebKit2/WebProcess/Cookies/WebCookieManager.cpp	2015-07-25 00:29:26 UTC (rev 187374)
+++ trunk/Source/WebKit2/WebProcess/Cookies/WebCookieManager.cpp	2015-07-25 00:33:03 UTC (rev 187375)
@@ -70,7 +70,7 @@
 
 void WebCookieManager::deleteCookiesForHostname(const String& hostname)
 {
-    WebCore::deleteCookiesForHostname(NetworkStorageSession::defaultStorageSession(), hostname);
+    WebCore::deleteCookiesForHostnames(NetworkStorageSession::defaultStorageSession(), { hostname });
 }
 
 void WebCookieManager::deleteAllCookies()
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to