- 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()