Diff
Modified: trunk/Source/WebCore/ChangeLog (180705 => 180706)
--- trunk/Source/WebCore/ChangeLog 2015-02-26 23:26:03 UTC (rev 180705)
+++ trunk/Source/WebCore/ChangeLog 2015-02-26 23:34:16 UTC (rev 180706)
@@ -1,3 +1,14 @@
+2015-02-26 Anders Carlsson <ander...@apple.com>
+
+ Add API to remove all website data for the given data records
+ https://bugs.webkit.org/show_bug.cgi?id=142060
+
+ Reviewed by Beth Dakin.
+
+ * loader/cache/MemoryCache.cpp:
+ (WebCore::MemoryCache::removeResourcesWithOrigins):
+ New function that removes all resources that match the set of origins in a given session.
+
2015-02-26 Chris Dumez <cdu...@apple.com>
Rename DatabaseManager::manager() to DatabaseManager::singleton()
Modified: trunk/Source/WebCore/loader/cache/MemoryCache.cpp (180705 => 180706)
--- trunk/Source/WebCore/loader/cache/MemoryCache.cpp 2015-02-26 23:26:03 UTC (rev 180705)
+++ trunk/Source/WebCore/loader/cache/MemoryCache.cpp 2015-02-26 23:34:16 UTC (rev 180706)
@@ -543,6 +543,39 @@
remove(*resource);
}
+void MemoryCache::removeResourcesWithOrigins(SessionID sessionID, const HashSet<RefPtr<SecurityOrigin>>& origins)
+{
+ auto* resourceMap = sessionResourceMap(sessionID);
+ if (!resourceMap)
+ return;
+
+#if ENABLE(CACHE_PARTITIONING)
+ HashSet<String> originPartitions;
+
+ for (auto& origin : origins)
+ originPartitions.add(ResourceRequest::partitionName(origin->host()));
+#endif
+
+ Vector<CachedResource*> resourcesToRemove;
+ for (auto& keyValuePair : *resourceMap) {
+ auto& resource = *keyValuePair.value;
+
+#if ENABLE(CACHE_PARTITIONING)
+ auto& partitionName = keyValuePair.key.second;
+ if (originPartitions.contains(partitionName)) {
+ resourcesToRemove.append(&resource);
+ continue;
+ }
+#endif
+
+ if (origins.contains(SecurityOrigin::create(resource.url()).ptr()))
+ resourcesToRemove.append(&resource);
+ }
+
+ for (auto& resource : resourcesToRemove)
+ remove(*resource);
+}
+
void MemoryCache::getOriginsWithCache(SecurityOriginSet& origins)
{
#if ENABLE(CACHE_PARTITIONING)
@@ -568,7 +601,6 @@
auto it = m_sessionResources.find(sessionID);
if (it != m_sessionResources.end()) {
-
for (auto& keyValue : *it->value) {
auto& resource = *keyValue.value;
#if ENABLE(CACHE_PARTITIONING)
Modified: trunk/Source/WebCore/loader/cache/MemoryCache.h (180705 => 180706)
--- trunk/Source/WebCore/loader/cache/MemoryCache.h 2015-02-26 23:26:03 UTC (rev 180705)
+++ trunk/Source/WebCore/loader/cache/MemoryCache.h 2015-02-26 23:34:16 UTC (rev 180706)
@@ -147,6 +147,7 @@
typedef HashSet<RefPtr<SecurityOrigin>> SecurityOriginSet;
WEBCORE_EXPORT void removeResourcesWithOrigin(SecurityOrigin&);
+ WEBCORE_EXPORT void removeResourcesWithOrigins(SessionID, const HashSet<RefPtr<SecurityOrigin>>&);
WEBCORE_EXPORT void getOriginsWithCache(SecurityOriginSet& origins);
WEBCORE_EXPORT HashSet<RefPtr<SecurityOrigin>> originsWithCache(SessionID) const;
Modified: trunk/Source/WebKit2/ChangeLog (180705 => 180706)
--- trunk/Source/WebKit2/ChangeLog 2015-02-26 23:26:03 UTC (rev 180705)
+++ trunk/Source/WebKit2/ChangeLog 2015-02-26 23:34:16 UTC (rev 180706)
@@ -1,3 +1,32 @@
+2015-02-26 Anders Carlsson <ander...@apple.com>
+
+ Add API to remove all website data for the given data records
+ https://bugs.webkit.org/show_bug.cgi?id=142060
+
+ Reviewed by Beth Dakin.
+
+ * UIProcess/API/Cocoa/_WKWebsiteDataStore.h:
+ Add new method declaration.
+
+ * UIProcess/API/Cocoa/_WKWebsiteDataStore.mm:
+ (toWebsiteDataRecords):
+ Add a helper function that converts an NSArray of _WKWebsiteDataRecords to a Vector of WebsiteDataRecords.
+
+ (-[_WKWebsiteDataStore removeDataOfTypes:forDataRecords:completionHandler:]):
+ Call through to the underlying WebsiteDataStore.
+
+ * UIProcess/WebsiteData/WebsiteDataStore.cpp:
+ (WebKit::WebsiteDataStore::removeData):
+ Figure out which processes to call deleteWebsiteDataForOrigins for and do so. Add a callback aggregator so we can
+ call the completion handler at the right time.
+
+ * UIProcess/WebsiteData/WebsiteDataStore.h:
+ Add new members.
+
+ * WebProcess/WebProcess.cpp:
+ (WebKit::WebProcess::deleteWebsiteDataForOrigins):
+ Use the newly added MemoryCache member function to delete all resources matching the set of origins.
+
2015-02-26 Chris Dumez <cdu...@apple.com>
Rename DatabaseManager::manager() to DatabaseManager::singleton()
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsiteDataStore.h (180705 => 180706)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsiteDataStore.h 2015-02-26 23:26:03 UTC (rev 180705)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsiteDataStore.h 2015-02-26 23:34:16 UTC (rev 180706)
@@ -40,7 +40,8 @@
@property (readonly, getter=isNonPersistent) BOOL nonPersistent;
-- (void)fetchDataRecordsOfTypes:(WKWebsiteDataTypes)websiteDataTypes completionHandler:(void (^)(NSArray *))completionHandler;
+- (void)fetchDataRecordsOfTypes:(WKWebsiteDataTypes)websiteDataTypes completionHandler:(void (^)(NSArray *))completionHandler WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
+- (void)removeDataOfTypes:(WKWebsiteDataTypes)websiteDataTypes forDataRecords:(NSArray *)dataRecords completionHandler:(void (^)())completionHandler WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
- (void)removeDataOfTypes:(WKWebsiteDataTypes)websiteDataTypes modifiedSince:(NSDate *)date completionHandler:(void (^)())completionHandler WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
@end
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsiteDataStore.mm (180705 => 180706)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsiteDataStore.mm 2015-02-26 23:26:03 UTC (rev 180705)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsiteDataStore.mm 2015-02-26 23:34:16 UTC (rev 180706)
@@ -90,6 +90,26 @@
});
}
+static Vector<WebKit::WebsiteDataRecord> toWebsiteDataRecords(NSArray *dataRecords)
+{
+ Vector<WebKit::WebsiteDataRecord> result;
+
+ for (_WKWebsiteDataRecord *dataRecord in dataRecords)
+ result.append(dataRecord->_websiteDataRecord->websiteDataRecord());
+
+ return result;
+}
+
+- (void)removeDataOfTypes:(WKWebsiteDataTypes)websiteDataTypes forDataRecords:(NSArray *)dataRecords completionHandler:(void (^)())completionHandler
+{
+ auto completionHandlerCopy = Block_copy(completionHandler);
+
+ _websiteDataStore->websiteDataStore().removeData(WebKit::toWebsiteDataTypes(websiteDataTypes), toWebsiteDataRecords(dataRecords), [completionHandlerCopy] {
+ completionHandlerCopy();
+ Block_release(completionHandlerCopy);
+ });
+}
+
#pragma mark WKObject protocol implementation
- (API::Object&)_apiObject
Modified: trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.cpp (180705 => 180706)
--- trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.cpp 2015-02-26 23:26:03 UTC (rev 180705)
+++ trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.cpp 2015-02-26 23:34:16 UTC (rev 180706)
@@ -233,7 +233,6 @@
return processAccessType;
}
-
void WebsiteDataStore::removeData(WebsiteDataTypes dataTypes, std::chrono::system_clock::time_point modifiedSince, std::function<void ()> completionHandler)
{
struct CallbackAggregator : public RefCounted<CallbackAggregator> {
@@ -332,6 +331,75 @@
callbackAggregator->callIfNeeded();
}
+void WebsiteDataStore::removeData(WebsiteDataTypes dataTypes, const Vector<WebsiteDataRecord>& dataRecords, std::function<void ()> completionHandler)
+{
+ struct CallbackAggregator : public RefCounted<CallbackAggregator> {
+ explicit CallbackAggregator (std::function<void ()> completionHandler)
+ : completionHandler(WTF::move(completionHandler))
+ {
+ }
+
+ void addPendingCallback()
+ {
+ pendingCallbacks++;
+ }
+
+ void removePendingCallback()
+ {
+ ASSERT(pendingCallbacks);
+ --pendingCallbacks;
+
+ callIfNeeded();
+ }
+
+ void callIfNeeded()
+ {
+ if (!pendingCallbacks)
+ RunLoop::main().dispatch(WTF::move(completionHandler));
+ }
+
+ unsigned pendingCallbacks = 0;
+ std::function<void ()> completionHandler;
+ };
+
+ RefPtr<CallbackAggregator> callbackAggregator = adoptRef(new CallbackAggregator(WTF::move(completionHandler)));
+
+ auto webProcessAccessType = computeWebProcessAccessTypeForDataRemoval(dataTypes, isNonPersistent());
+ if (webProcessAccessType != ProcessAccessType::None) {
+ for (auto& process : processes()) {
+ switch (webProcessAccessType) {
+ case ProcessAccessType::OnlyIfLaunched:
+ if (!process->canSendMessage())
+ continue;
+ break;
+
+ case ProcessAccessType::Launch:
+ // FIXME: Handle this.
+ ASSERT_NOT_REACHED();
+ break;
+
+ case ProcessAccessType::None:
+ ASSERT_NOT_REACHED();
+ }
+
+ callbackAggregator->addPendingCallback();
+ Vector<RefPtr<WebCore::SecurityOrigin>> origins;
+
+ for (const auto& dataRecord : dataRecords) {
+ for (auto& origin : dataRecord.origins)
+ origins.append(origin);
+ }
+
+ process->deleteWebsiteDataForOrigins(m_sessionID, dataTypes, origins, [callbackAggregator] {
+ callbackAggregator->removePendingCallback();
+ });
+ }
+ }
+
+ // There's a chance that we don't have any pending callbacks. If so, we want to dispatch the completion handler right away.
+ callbackAggregator->callIfNeeded();
+}
+
void WebsiteDataStore::webPageWasAdded(WebPageProxy& webPageProxy)
{
if (m_storageManager)
Modified: trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.h (180705 => 180706)
--- trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.h 2015-02-26 23:26:03 UTC (rev 180705)
+++ trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.h 2015-02-26 23:34:16 UTC (rev 180706)
@@ -59,6 +59,7 @@
void fetchData(WebsiteDataTypes, std::function<void (Vector<WebsiteDataRecord>)> completionHandler);
void removeData(WebsiteDataTypes, std::chrono::system_clock::time_point modifiedSince, std::function<void ()> completionHandler);
+ void removeData(WebsiteDataTypes, const Vector<WebsiteDataRecord>&, std::function<void ()> completionHandler);
StorageManager* storageManager() { return m_storageManager.get(); }
Modified: trunk/Source/WebKit2/WebProcess/WebProcess.cpp (180705 => 180706)
--- trunk/Source/WebKit2/WebProcess/WebProcess.cpp 2015-02-26 23:26:03 UTC (rev 180705)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.cpp 2015-02-26 23:34:16 UTC (rev 180706)
@@ -1160,10 +1160,16 @@
parentProcessConnection()->send(Messages::WebProcessProxy::DidDeleteWebsiteData(callbackID), 0);
}
-void WebProcess::deleteWebsiteDataForOrigins(WebCore::SessionID sessionID, uint64_t websiteDataTypes, const Vector<WebKit::SecurityOriginData>& origins, uint64_t callbackID)
+void WebProcess::deleteWebsiteDataForOrigins(WebCore::SessionID sessionID, uint64_t websiteDataTypes, const Vector<WebKit::SecurityOriginData>& originDatas, uint64_t callbackID)
{
- // FIXME: Actually delete something here.
+ if (websiteDataTypes & WebsiteDataTypeMemoryCache) {
+ HashSet<RefPtr<SecurityOrigin>> origins;
+ for (auto& originData : originDatas)
+ origins.add(originData.securityOrigin());
+ MemoryCache::singleton().removeResourcesWithOrigins(sessionID, origins);
+ }
+
parentProcessConnection()->send(Messages::WebProcessProxy::DidDeleteWebsiteDataForOrigins(callbackID), 0);
}