Title: [180706] trunk/Source
Revision
180706
Author
ander...@apple.com
Date
2015-02-26 15:34:16 -0800 (Thu, 26 Feb 2015)

Log Message

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.

Source/WebCore:

* loader/cache/MemoryCache.cpp:
(WebCore::MemoryCache::removeResourcesWithOrigins):
New function that removes all resources that match the set of origins in a given session.

Source/WebKit2:

* 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.

Modified Paths

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);
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to