Title: [183093] trunk/Source/WebKit2
Revision
183093
Author
[email protected]
Date
2015-04-21 19:46:45 -0700 (Tue, 21 Apr 2015)

Log Message

WKWebsiteDataStore doesn't track and remove IndexedDB databases
https://bugs.webkit.org/show_bug.cgi?id=144032
rdar://problem/20242856

Reviewed by Tim Horton.

* DatabaseProcess/DatabaseProcess.cpp:
(WebKit::DatabaseProcess::fetchWebsiteData):
(WebKit::DatabaseProcess::deleteWebsiteData):
(WebKit::DatabaseProcess::deleteWebsiteDataForOrigins):
* DatabaseProcess/DatabaseProcess.h:
* DatabaseProcess/DatabaseProcess.messages.in:
* Shared/WebsiteData/WebsiteDataTypes.h:
* UIProcess/API/Cocoa/WKWebsiteDataRecord.h:
* UIProcess/API/Cocoa/WKWebsiteDataRecord.mm:
(dataTypesToString):
* UIProcess/API/Cocoa/WKWebsiteDataRecordInternal.h:
(WebKit::toWebsiteDataTypes):
(WebKit::toWKWebsiteDataTypes):
* UIProcess/Databases/DatabaseProcessProxy.cpp:
(WebKit::generateCallbackID):
(WebKit::DatabaseProcessProxy::~DatabaseProcessProxy):
(WebKit::DatabaseProcessProxy::fetchWebsiteData):
(WebKit::DatabaseProcessProxy::deleteWebsiteData):
(WebKit::DatabaseProcessProxy::deleteWebsiteDataForOrigins):
(WebKit::DatabaseProcessProxy::didClose):
(WebKit::DatabaseProcessProxy::didFetchWebsiteData):
(WebKit::DatabaseProcessProxy::didDeleteWebsiteData):
(WebKit::DatabaseProcessProxy::didDeleteWebsiteDataForOrigins):
* UIProcess/Databases/DatabaseProcessProxy.h:
* UIProcess/Databases/DatabaseProcessProxy.messages.in:
* UIProcess/WebProcessPool.h:
* UIProcess/WebsiteData/WebsiteDataStore.cpp:
(WebKit::WebsiteDataStore::fetchData):
(WebKit::WebsiteDataStore::removeData):

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (183092 => 183093)


--- trunk/Source/WebKit2/ChangeLog	2015-04-22 02:37:07 UTC (rev 183092)
+++ trunk/Source/WebKit2/ChangeLog	2015-04-22 02:46:45 UTC (rev 183093)
@@ -1,5 +1,43 @@
 2015-04-21  Anders Carlsson  <[email protected]>
 
+        WKWebsiteDataStore doesn't track and remove IndexedDB databases
+        https://bugs.webkit.org/show_bug.cgi?id=144032
+        rdar://problem/20242856
+
+        Reviewed by Tim Horton.
+
+        * DatabaseProcess/DatabaseProcess.cpp:
+        (WebKit::DatabaseProcess::fetchWebsiteData):
+        (WebKit::DatabaseProcess::deleteWebsiteData):
+        (WebKit::DatabaseProcess::deleteWebsiteDataForOrigins):
+        * DatabaseProcess/DatabaseProcess.h:
+        * DatabaseProcess/DatabaseProcess.messages.in:
+        * Shared/WebsiteData/WebsiteDataTypes.h:
+        * UIProcess/API/Cocoa/WKWebsiteDataRecord.h:
+        * UIProcess/API/Cocoa/WKWebsiteDataRecord.mm:
+        (dataTypesToString):
+        * UIProcess/API/Cocoa/WKWebsiteDataRecordInternal.h:
+        (WebKit::toWebsiteDataTypes):
+        (WebKit::toWKWebsiteDataTypes):
+        * UIProcess/Databases/DatabaseProcessProxy.cpp:
+        (WebKit::generateCallbackID):
+        (WebKit::DatabaseProcessProxy::~DatabaseProcessProxy):
+        (WebKit::DatabaseProcessProxy::fetchWebsiteData):
+        (WebKit::DatabaseProcessProxy::deleteWebsiteData):
+        (WebKit::DatabaseProcessProxy::deleteWebsiteDataForOrigins):
+        (WebKit::DatabaseProcessProxy::didClose):
+        (WebKit::DatabaseProcessProxy::didFetchWebsiteData):
+        (WebKit::DatabaseProcessProxy::didDeleteWebsiteData):
+        (WebKit::DatabaseProcessProxy::didDeleteWebsiteDataForOrigins):
+        * UIProcess/Databases/DatabaseProcessProxy.h:
+        * UIProcess/Databases/DatabaseProcessProxy.messages.in:
+        * UIProcess/WebProcessPool.h:
+        * UIProcess/WebsiteData/WebsiteDataStore.cpp:
+        (WebKit::WebsiteDataStore::fetchData):
+        (WebKit::WebsiteDataStore::removeData):
+
+2015-04-21  Anders Carlsson  <[email protected]>
+
         Add module maps for WebKit
         https://bugs.webkit.org/show_bug.cgi?id=144026
         rdar://problem/19665428

Modified: trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.cpp (183092 => 183093)


--- trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.cpp	2015-04-22 02:37:07 UTC (rev 183092)
+++ trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.cpp	2015-04-22 02:46:45 UTC (rev 183093)
@@ -38,6 +38,7 @@
 #include "WebOriginDataManager.h"
 #include "WebOriginDataManagerMessages.h"
 #include "WebOriginDataManagerProxyMessages.h"
+#include "WebsiteData.h"
 #include <WebCore/FileSystem.h>
 #include <WebCore/NotImplemented.h>
 #include <WebCore/TextEncoding.h>
@@ -198,6 +199,115 @@
 #endif
 }
 
+void DatabaseProcess::fetchWebsiteData(SessionID, uint64_t websiteDataTypes, uint64_t callbackID)
+{
+    struct CallbackAggregator final : public ThreadSafeRefCounted<CallbackAggregator> {
+        explicit CallbackAggregator(std::function<void (WebsiteData)> completionHandler)
+            : m_completionHandler(WTF::move(completionHandler))
+        {
+        }
+
+        ~CallbackAggregator()
+        {
+            ASSERT(RunLoop::isMain());
+
+            auto completionHandler = WTF::move(m_completionHandler);
+            auto websiteData = WTF::move(m_websiteData);
+
+            RunLoop::main().dispatch([completionHandler, websiteData] {
+                completionHandler(websiteData);
+            });
+        }
+
+        std::function<void (WebsiteData)> m_completionHandler;
+        WebsiteData m_websiteData;
+    };
+
+    RefPtr<CallbackAggregator> callbackAggregator = adoptRef(new CallbackAggregator([this, callbackID](WebsiteData websiteData) {
+        parentProcessConnection()->send(Messages::DatabaseProcessProxy::DidFetchWebsiteData(callbackID, websiteData), 0);
+    }));
+
+    if (websiteDataTypes & WebsiteDataTypeIndexedDBDatabases) {
+        // FIXME: Pick the right database store based on the session ID.
+        postDatabaseTask(std::make_unique<AsyncTask>([callbackAggregator, websiteDataTypes, this] {
+
+            Vector<RefPtr<SecurityOrigin>> securityOrigins;
+
+            for (const auto& originData : getIndexedDatabaseOrigins())
+                securityOrigins.append(originData.securityOrigin());
+
+            RunLoop::main().dispatch([callbackAggregator, securityOrigins] {
+                for (const auto& securityOrigin : securityOrigins)
+                    callbackAggregator->m_websiteData.entries.append(WebsiteData::Entry { securityOrigin, WebsiteDataTypeIndexedDBDatabases });
+            });
+        }));
+    }
+}
+
+void DatabaseProcess::deleteWebsiteData(WebCore::SessionID, uint64_t websiteDataTypes, std::chrono::system_clock::time_point modifiedSince, uint64_t callbackID)
+{
+    struct CallbackAggregator final : public ThreadSafeRefCounted<CallbackAggregator> {
+        explicit CallbackAggregator(std::function<void ()> completionHandler)
+        : m_completionHandler(WTF::move(completionHandler))
+        {
+        }
+
+        ~CallbackAggregator()
+        {
+            ASSERT(RunLoop::isMain());
+
+            RunLoop::main().dispatch(WTF::move(m_completionHandler));
+        }
+
+        std::function<void ()> m_completionHandler;
+    };
+
+    RefPtr<CallbackAggregator> callbackAggregator = adoptRef(new CallbackAggregator([this, callbackID]() {
+        parentProcessConnection()->send(Messages::DatabaseProcessProxy::DidDeleteWebsiteData(callbackID), 0);
+    }));
+
+    if (websiteDataTypes & WebsiteDataTypeIndexedDBDatabases) {
+        postDatabaseTask(std::make_unique<AsyncTask>([this, callbackAggregator, modifiedSince] {
+            double startDate = std::chrono::system_clock::to_time_t(modifiedSince);
+
+            deleteIndexedDatabaseEntriesModifiedBetweenDates(startDate, std::numeric_limits<double>::max());
+            RunLoop::main().dispatch([callbackAggregator] { });
+        }));
+    }
+}
+
+void DatabaseProcess::deleteWebsiteDataForOrigins(WebCore::SessionID, uint64_t websiteDataTypes, const Vector<SecurityOriginData>& origins, uint64_t callbackID)
+{
+    struct CallbackAggregator final : public ThreadSafeRefCounted<CallbackAggregator> {
+        explicit CallbackAggregator(std::function<void ()> completionHandler)
+            : m_completionHandler(WTF::move(completionHandler))
+        {
+        }
+
+        ~CallbackAggregator()
+        {
+            ASSERT(RunLoop::isMain());
+
+            RunLoop::main().dispatch(WTF::move(m_completionHandler));
+        }
+
+        std::function<void ()> m_completionHandler;
+    };
+
+    RefPtr<CallbackAggregator> callbackAggregator = adoptRef(new CallbackAggregator([this, callbackID]() {
+        parentProcessConnection()->send(Messages::DatabaseProcessProxy::DidDeleteWebsiteDataForOrigins(callbackID), 0);
+    }));
+
+    if (websiteDataTypes & WebsiteDataTypeIndexedDBDatabases) {
+        postDatabaseTask(std::make_unique<AsyncTask>([this, origins, callbackAggregator] {
+            for (const auto& origin: origins)
+                deleteIndexedDatabaseEntriesForOrigin(origin);
+
+            RunLoop::main().dispatch([callbackAggregator] { });
+        }));
+    }
+}
+
 Vector<SecurityOriginData> DatabaseProcess::getIndexedDatabaseOrigins()
 {
     Vector<SecurityOriginData> results;

Modified: trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.h (183092 => 183093)


--- trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.h	2015-04-22 02:37:07 UTC (rev 183092)
+++ trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.h	2015-04-22 02:46:45 UTC (rev 183093)
@@ -88,6 +88,10 @@
     void initializeDatabaseProcess(const DatabaseProcessCreationParameters&);
     void createDatabaseToWebProcessConnection();
 
+    void fetchWebsiteData(WebCore::SessionID, uint64_t websiteDataTypes, uint64_t callbackID);
+    void deleteWebsiteData(WebCore::SessionID, uint64_t websiteDataTypes, std::chrono::system_clock::time_point modifiedSince, uint64_t callbackID);
+    void deleteWebsiteDataForOrigins(WebCore::SessionID, uint64_t websiteDataTypes, const Vector<SecurityOriginData>& origins, uint64_t callbackID);
+
     // For execution on work queue thread only
     void performNextDatabaseTask();
     void ensurePathExists(const String&);

Modified: trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.messages.in (183092 => 183093)


--- trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.messages.in	2015-04-22 02:37:07 UTC (rev 183092)
+++ trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.messages.in	2015-04-22 02:46:45 UTC (rev 183093)
@@ -28,6 +28,10 @@
 
     # Creates a connection for communication with a WebProcess
     CreateDatabaseToWebProcessConnection()
+
+    FetchWebsiteData(WebCore::SessionID sessionID, uint64_t websiteDataTypes, uint64_t callbackID)
+    DeleteWebsiteData(WebCore::SessionID sessionID, uint64_t websiteDataTypes, std::chrono::system_clock::time_point modifiedSince, uint64_t callbackID)
+    DeleteWebsiteDataForOrigins(WebCore::SessionID sessionID, uint64_t websiteDataTypes, Vector<WebKit::SecurityOriginData> origins, uint64_t callbackID)
 }
 
 #endif // ENABLE(DATABASE_PROCESS)

Modified: trunk/Source/WebKit2/Shared/WebsiteData/WebsiteDataTypes.h (183092 => 183093)


--- trunk/Source/WebKit2/Shared/WebsiteData/WebsiteDataTypes.h	2015-04-22 02:37:07 UTC (rev 183092)
+++ trunk/Source/WebKit2/Shared/WebsiteData/WebsiteDataTypes.h	2015-04-22 02:46:45 UTC (rev 183093)
@@ -35,6 +35,7 @@
     WebsiteDataTypeOfflineWebApplicationCache = 1 << 3,
     WebsiteDataTypeLocalStorage = 1 << 4,
     WebsiteDataTypeWebSQLDatabases = 1 << 5,
+    WebsiteDataTypeIndexedDBDatabases = 1 << 6,
 };
 
 };

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataRecord.h (183092 => 183093)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataRecord.h	2015-04-22 02:37:07 UTC (rev 183092)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataRecord.h	2015-04-22 02:46:45 UTC (rev 183093)
@@ -38,6 +38,7 @@
 WK_EXTERN NSString * const WKWebsiteDataTypeCookies WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
 WK_EXTERN NSString * const WKWebsiteDataTypeLocalStorage WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
 WK_EXTERN NSString * const WKWebsiteDataTypeWebSQLDatabases WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
+WK_EXTERN NSString * const WKWebsiteDataTypeIndexedDBDatabases WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
 
 WK_CLASS_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA)
 @interface WKWebsiteDataRecord : NSObject

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataRecord.mm (183092 => 183093)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataRecord.mm	2015-04-22 02:37:07 UTC (rev 183092)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataRecord.mm	2015-04-22 02:46:45 UTC (rev 183093)
@@ -35,6 +35,7 @@
 NSString * const WKWebsiteDataTypeCookies = @"WKWebsiteDataTypeCookies";
 NSString * const WKWebsiteDataTypeLocalStorage = @"WKWebsiteDataTypeLocalStorage";
 NSString * const WKWebsiteDataTypeWebSQLDatabases = @"WKWebsiteDataTypeWebSQLDatabases";
+NSString * const WKWebsiteDataTypeIndexedDBDatabases = @"WKWebsiteDataTypeIndexedDBDatabases";
 
 @implementation WKWebsiteDataRecord
 
@@ -61,6 +62,8 @@
         [array addObject:@"Local Storage"];
     if ([dataTypes containsObject:WKWebsiteDataTypeWebSQLDatabases])
         [array addObject:@"Web SQL"];
+    if ([dataTypes containsObject:WKWebsiteDataTypeIndexedDBDatabases])
+        [array addObject:@"IndexedDB"];
 
     return [array componentsJoinedByString:@", "];
 }

Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataRecordInternal.h (183092 => 183093)


--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataRecordInternal.h	2015-04-22 02:37:07 UTC (rev 183092)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebsiteDataRecordInternal.h	2015-04-22 02:46:45 UTC (rev 183093)
@@ -56,6 +56,8 @@
         websiteDataTypes |= WebsiteDataTypes::WebsiteDataTypeLocalStorage;
     if ([wkWebsiteDataTypes containsObject:WKWebsiteDataTypeWebSQLDatabases])
         websiteDataTypes |= WebsiteDataTypes::WebsiteDataTypeWebSQLDatabases;
+    if ([wkWebsiteDataTypes containsObject:WKWebsiteDataTypeIndexedDBDatabases])
+        websiteDataTypes |= WebsiteDataTypes::WebsiteDataTypeIndexedDBDatabases;
 
     return static_cast<WebsiteDataTypes>(websiteDataTypes);
 }
@@ -78,6 +80,8 @@
         [wkWebsiteDataTypes addObject:WKWebsiteDataTypeLocalStorage];
     if (websiteDataTypes & WebsiteDataTypes::WebsiteDataTypeWebSQLDatabases)
         [wkWebsiteDataTypes addObject:WKWebsiteDataTypeWebSQLDatabases];
+    if (websiteDataTypes & WebsiteDataTypes::WebsiteDataTypeIndexedDBDatabases)
+        [wkWebsiteDataTypes addObject:WKWebsiteDataTypeIndexedDBDatabases];
 
     return wkWebsiteDataTypes;
 }

Modified: trunk/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.cpp (183092 => 183093)


--- trunk/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.cpp	2015-04-22 02:37:07 UTC (rev 183092)
+++ trunk/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.cpp	2015-04-22 02:46:45 UTC (rev 183093)
@@ -31,6 +31,7 @@
 #include "WebOriginDataManagerProxy.h"
 #include "WebOriginDataManagerProxyMessages.h"
 #include "WebProcessPool.h"
+#include "WebsiteData.h"
 #include <WebCore/NotImplemented.h>
 
 #if ENABLE(DATABASE_PROCESS)
@@ -39,6 +40,13 @@
 
 namespace WebKit {
 
+static uint64_t generateCallbackID()
+{
+    static uint64_t callbackID;
+
+    return ++callbackID;
+}
+
 PassRefPtr<DatabaseProcessProxy> DatabaseProcessProxy::create(WebProcessPool* processPool)
 {
     return adoptRef(new DatabaseProcessProxy(processPool));
@@ -53,9 +61,11 @@
 
 DatabaseProcessProxy::~DatabaseProcessProxy()
 {
+    ASSERT(m_pendingFetchWebsiteDataCallbacks.isEmpty());
+    ASSERT(m_pendingDeleteWebsiteDataCallbacks.isEmpty());
+    ASSERT(m_pendingDeleteWebsiteDataForOriginsCallbacks.isEmpty());
 }
 
-
 void DatabaseProcessProxy::getLaunchOptions(ProcessLauncher::LaunchOptions& launchOptions)
 {
     launchOptions.processType = ProcessLauncher::DatabaseProcess;
@@ -75,6 +85,38 @@
     }
 }
 
+void DatabaseProcessProxy::fetchWebsiteData(SessionID sessionID, WebsiteDataTypes dataTypes, std::function<void (WebsiteData)> completionHandler)
+{
+    ASSERT(canSendMessage());
+
+    uint64_t callbackID = generateCallbackID();
+    m_pendingFetchWebsiteDataCallbacks.add(callbackID, WTF::move(completionHandler));
+
+    send(Messages::DatabaseProcess::FetchWebsiteData(sessionID, dataTypes, callbackID), 0);
+}
+
+void DatabaseProcessProxy::deleteWebsiteData(WebCore::SessionID sessionID, WebsiteDataTypes dataTypes, std::chrono::system_clock::time_point modifiedSince,  std::function<void ()> completionHandler)
+{
+    auto callbackID = generateCallbackID();
+
+    m_pendingDeleteWebsiteDataCallbacks.add(callbackID, WTF::move(completionHandler));
+    send(Messages::DatabaseProcess::DeleteWebsiteData(sessionID, dataTypes, modifiedSince, callbackID), 0);
+}
+
+void DatabaseProcessProxy::deleteWebsiteDataForOrigins(SessionID sessionID, WebsiteDataTypes dataTypes, const Vector<RefPtr<WebCore::SecurityOrigin>>& origins, std::function<void ()> completionHandler)
+{
+    ASSERT(canSendMessage());
+
+    uint64_t callbackID = generateCallbackID();
+    m_pendingDeleteWebsiteDataForOriginsCallbacks.add(callbackID, WTF::move(completionHandler));
+
+    Vector<SecurityOriginData> originData;
+    for (auto& origin : origins)
+        originData.append(SecurityOriginData::fromSecurityOrigin(*origin));
+
+    send(Messages::DatabaseProcess::DeleteWebsiteDataForOrigins(sessionID, dataTypes, originData, callbackID), 0);
+}
+
 void DatabaseProcessProxy::getDatabaseProcessConnection(PassRefPtr<Messages::WebProcessProxy::GetDatabaseProcessConnection::DelayedReply> reply)
 {
     m_pendingConnectionReplies.append(reply);
@@ -102,6 +144,18 @@
 #endif
     }
 
+    for (const auto& callback : m_pendingFetchWebsiteDataCallbacks.values())
+        callback(WebsiteData());
+    m_pendingFetchWebsiteDataCallbacks.clear();
+
+    for (const auto& callback : m_pendingDeleteWebsiteDataCallbacks.values())
+        callback();
+    m_pendingDeleteWebsiteDataCallbacks.clear();
+
+    for (const auto& callback : m_pendingDeleteWebsiteDataForOriginsCallbacks.values())
+        callback();
+    m_pendingDeleteWebsiteDataForOriginsCallbacks.clear();
+
     // Tell ProcessPool to forget about this database process. This may cause us to be deleted.
     m_processPool->databaseProcessCrashed(this);
 }
@@ -125,6 +179,24 @@
 #endif
 }
 
+void DatabaseProcessProxy::didFetchWebsiteData(uint64_t callbackID, const WebsiteData& websiteData)
+{
+    auto callback = m_pendingFetchWebsiteDataCallbacks.take(callbackID);
+    callback(websiteData);
+}
+
+void DatabaseProcessProxy::didDeleteWebsiteData(uint64_t callbackID)
+{
+    auto callback = m_pendingDeleteWebsiteDataCallbacks.take(callbackID);
+    callback();
+}
+
+void DatabaseProcessProxy::didDeleteWebsiteDataForOrigins(uint64_t callbackID)
+{
+    auto callback = m_pendingDeleteWebsiteDataForOriginsCallbacks.take(callbackID);
+    callback();
+}
+
 void DatabaseProcessProxy::didFinishLaunching(ProcessLauncher* launcher, IPC::Connection::Identifier connectionIdentifier)
 {
     ChildProcessProxy::didFinishLaunching(launcher, connectionIdentifier);

Modified: trunk/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.h (183092 => 183093)


--- trunk/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.h	2015-04-22 02:37:07 UTC (rev 183092)
+++ trunk/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.h	2015-04-22 02:46:45 UTC (rev 183093)
@@ -31,8 +31,14 @@
 #include "ChildProcessProxy.h"
 #include "ProcessLauncher.h"
 #include "WebProcessProxyMessages.h"
+#include "WebsiteDataTypes.h"
 #include <wtf/Deque.h>
 
+namespace WebCore {
+class SecurityOrigin;
+class SessionID;
+}
+
 namespace WebKit {
 
 class WebProcessPool;
@@ -42,6 +48,10 @@
     static PassRefPtr<DatabaseProcessProxy> create(WebProcessPool*);
     ~DatabaseProcessProxy();
 
+    void fetchWebsiteData(WebCore::SessionID, WebsiteDataTypes, std::function<void (WebsiteData)> completionHandler);
+    void deleteWebsiteData(WebCore::SessionID, WebsiteDataTypes, std::chrono::system_clock::time_point modifiedSince, std::function<void ()> completionHandler);
+    void deleteWebsiteDataForOrigins(WebCore::SessionID, WebsiteDataTypes, const Vector<RefPtr<WebCore::SecurityOrigin>>& origins, std::function<void ()> completionHandler);
+
     void getDatabaseProcessConnection(PassRefPtr<Messages::WebProcessProxy::GetDatabaseProcessConnection::DelayedReply>);
 
 private:
@@ -61,6 +71,9 @@
 
     // Message handlers
     void didCreateDatabaseToWebProcessConnection(const IPC::Attachment&);
+    void didFetchWebsiteData(uint64_t callbackID, const WebsiteData&);
+    void didDeleteWebsiteData(uint64_t callbackID);
+    void didDeleteWebsiteDataForOrigins(uint64_t callbackID);
 
     // ProcessLauncher::Client
     virtual void didFinishLaunching(ProcessLauncher*, IPC::Connection::Identifier) override;
@@ -71,6 +84,10 @@
 
     unsigned m_numPendingConnectionRequests;
     Deque<RefPtr<Messages::WebProcessProxy::GetDatabaseProcessConnection::DelayedReply>> m_pendingConnectionReplies;
+
+    HashMap<uint64_t, std::function<void (WebsiteData)>> m_pendingFetchWebsiteDataCallbacks;
+    HashMap<uint64_t, std::function<void ()>> m_pendingDeleteWebsiteDataCallbacks;
+    HashMap<uint64_t, std::function<void ()>> m_pendingDeleteWebsiteDataForOriginsCallbacks;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.messages.in (183092 => 183093)


--- trunk/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.messages.in	2015-04-22 02:37:07 UTC (rev 183092)
+++ trunk/Source/WebKit2/UIProcess/Databases/DatabaseProcessProxy.messages.in	2015-04-22 02:46:45 UTC (rev 183093)
@@ -24,6 +24,10 @@
 
 messages -> DatabaseProcessProxy LegacyReceiver {
     DidCreateDatabaseToWebProcessConnection(IPC::Attachment connectionIdentifier)
+
+    DidFetchWebsiteData(uint64_t callbackID, struct WebKit::WebsiteData websiteData)
+    DidDeleteWebsiteData(uint64_t callbackID)
+    DidDeleteWebsiteDataForOrigins(uint64_t callbackID)
 }
 
 #endif // ENABLE(DATABASE_PROCESS)

Modified: trunk/Source/WebKit2/UIProcess/WebProcessPool.h (183092 => 183093)


--- trunk/Source/WebKit2/UIProcess/WebProcessPool.h	2015-04-22 02:37:07 UTC (rev 183092)
+++ trunk/Source/WebKit2/UIProcess/WebProcessPool.h	2015-04-22 02:46:45 UTC (rev 183093)
@@ -300,6 +300,7 @@
 
 #if ENABLE(DATABASE_PROCESS)
     void ensureDatabaseProcess();
+    DatabaseProcessProxy* databaseProcess() { return m_databaseProcess.get(); }
     void getDatabaseProcessConnection(PassRefPtr<Messages::WebProcessProxy::GetDatabaseProcessConnection::DelayedReply>);
     void databaseProcessCrashed(DatabaseProcessProxy*);
 #endif

Modified: trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.cpp (183092 => 183093)


--- trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.cpp	2015-04-22 02:37:07 UTC (rev 183092)
+++ trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.cpp	2015-04-22 02:46:45 UTC (rev 183093)
@@ -319,6 +319,23 @@
         });
     }
 
+#if ENABLE(DATABASE_PROCESS)
+    if (dataTypes & WebsiteDataTypeIndexedDBDatabases && !isNonPersistent()) {
+        HashSet<WebProcessPool*> processPools;
+        for (auto& process : processes())
+            processPools.add(&process->processPool());
+
+        for (auto& processPool : processPools) {
+            processPool->ensureDatabaseProcess();
+
+            callbackAggregator->addPendingCallback();
+            processPool->databaseProcess()->fetchWebsiteData(m_sessionID, dataTypes, [callbackAggregator](WebsiteData websiteData) {
+                callbackAggregator->removePendingCallback(WTF::move(websiteData));
+            });
+        }
+    }
+#endif
+
     callbackAggregator->callIfNeeded();
 }
 
@@ -475,6 +492,23 @@
         });
     }
 
+#if ENABLE(DATABASE_PROCESS)
+    if (dataTypes & WebsiteDataTypeIndexedDBDatabases && !isNonPersistent()) {
+        HashSet<WebProcessPool*> processPools;
+        for (auto& process : processes())
+            processPools.add(&process->processPool());
+
+        for (auto& processPool : processPools) {
+            processPool->ensureDatabaseProcess();
+
+            callbackAggregator->addPendingCallback();
+            processPool->databaseProcess()->deleteWebsiteData(m_sessionID, dataTypes, modifiedSince, [callbackAggregator]() {
+                callbackAggregator->removePendingCallback();
+            });
+        }
+    }
+#endif
+
     // 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();
 }
@@ -631,6 +665,23 @@
         });
     }
 
+#if ENABLE(DATABASE_PROCESS)
+    if (dataTypes & WebsiteDataTypeIndexedDBDatabases && !isNonPersistent()) {
+        HashSet<WebProcessPool*> processPools;
+        for (auto& process : processes())
+            processPools.add(&process->processPool());
+
+        for (auto& processPool : processPools) {
+            processPool->ensureDatabaseProcess();
+
+            callbackAggregator->addPendingCallback();
+            processPool->databaseProcess()->deleteWebsiteDataForOrigins(m_sessionID, dataTypes, origins, [callbackAggregator]() {
+                callbackAggregator->removePendingCallback();
+            });
+        }
+    }
+#endif
+
     // 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();
 }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to