Title: [185521] trunk/Source/WebKit2
Revision
185521
Author
[email protected]
Date
2015-06-12 15:04:27 -0700 (Fri, 12 Jun 2015)

Log Message

Clean up IndexedDB website data retrieval and removal
https://bugs.webkit.org/show_bug.cgi?id=145941

Reviewed by Andreas Kling.

- Use SecurityOrigin instead of SecurityOriginData; It's not possible to pass SecurityOriginData
safely between threads.

- Use std::chrono instead of double for modification times.

- Get rid of endTime since it's not used.

- Change deleteIndexedDatabaseEntriesForOrigin to deleteIndexedDatabaseEntriesForOrigins and make it take
a vector of origins instead of a single one.

- Get rid of deleteAllIndexedDatabaseEntries.

- Change SecurityOriginData::securityOrigin to call isolatedCopy on the origin components, since it's common
to pass origins to other threads and we want that to be safe.

* DatabaseProcess/DatabaseProcess.cpp:
(WebKit::DatabaseProcess::fetchWebsiteData):
(WebKit::DatabaseProcess::deleteWebsiteData):
(WebKit::DatabaseProcess::deleteWebsiteDataForOrigins):
(WebKit::DatabaseProcess::indexedDatabaseOrigins):
(WebKit::removeAllDatabasesForOriginPath):
(WebKit::DatabaseProcess::deleteIndexedDatabaseEntriesForOrigins):
(WebKit::DatabaseProcess::deleteIndexedDatabaseEntriesModifiedSince):
(WebKit::DatabaseProcess::getIndexedDatabaseOrigins): Deleted.
(WebKit::DatabaseProcess::deleteIndexedDatabaseEntriesForOrigin): Deleted.
(WebKit::DatabaseProcess::deleteIndexedDatabaseEntriesModifiedBetweenDates): Deleted.
(WebKit::DatabaseProcess::deleteAllIndexedDatabaseEntries): Deleted.
* DatabaseProcess/DatabaseProcess.h:
* Shared/SecurityOriginData.cpp:
(WebKit::SecurityOriginData::securityOrigin):

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (185520 => 185521)


--- trunk/Source/WebKit2/ChangeLog	2015-06-12 21:01:17 UTC (rev 185520)
+++ trunk/Source/WebKit2/ChangeLog	2015-06-12 22:04:27 UTC (rev 185521)
@@ -1,3 +1,41 @@
+2015-06-12  Anders Carlsson  <[email protected]>
+
+        Clean up IndexedDB website data retrieval and removal
+        https://bugs.webkit.org/show_bug.cgi?id=145941
+
+        Reviewed by Andreas Kling.
+
+        - Use SecurityOrigin instead of SecurityOriginData; It's not possible to pass SecurityOriginData
+        safely between threads.
+        
+        - Use std::chrono instead of double for modification times.
+        
+        - Get rid of endTime since it's not used.
+        
+        - Change deleteIndexedDatabaseEntriesForOrigin to deleteIndexedDatabaseEntriesForOrigins and make it take
+        a vector of origins instead of a single one.
+
+        - Get rid of deleteAllIndexedDatabaseEntries.
+
+        - Change SecurityOriginData::securityOrigin to call isolatedCopy on the origin components, since it's common
+        to pass origins to other threads and we want that to be safe.
+
+        * DatabaseProcess/DatabaseProcess.cpp:
+        (WebKit::DatabaseProcess::fetchWebsiteData):
+        (WebKit::DatabaseProcess::deleteWebsiteData):
+        (WebKit::DatabaseProcess::deleteWebsiteDataForOrigins):
+        (WebKit::DatabaseProcess::indexedDatabaseOrigins):
+        (WebKit::removeAllDatabasesForOriginPath):
+        (WebKit::DatabaseProcess::deleteIndexedDatabaseEntriesForOrigins):
+        (WebKit::DatabaseProcess::deleteIndexedDatabaseEntriesModifiedSince):
+        (WebKit::DatabaseProcess::getIndexedDatabaseOrigins): Deleted.
+        (WebKit::DatabaseProcess::deleteIndexedDatabaseEntriesForOrigin): Deleted.
+        (WebKit::DatabaseProcess::deleteIndexedDatabaseEntriesModifiedBetweenDates): Deleted.
+        (WebKit::DatabaseProcess::deleteAllIndexedDatabaseEntries): Deleted.
+        * DatabaseProcess/DatabaseProcess.h:
+        * Shared/SecurityOriginData.cpp:
+        (WebKit::SecurityOriginData::securityOrigin):
+
 2015-06-12  Antti Koivisto  <[email protected]>
 
         Network Cache: Use SHA1 for header checksum

Modified: trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.cpp (185520 => 185521)


--- trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.cpp	2015-06-12 21:01:17 UTC (rev 185520)
+++ trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.cpp	2015-06-12 22:04:27 UTC (rev 185521)
@@ -227,11 +227,8 @@
         // FIXME: Pick the right database store based on the session ID.
         postDatabaseTask(std::make_unique<AsyncTask>([callbackAggregator, websiteDataTypes, this] {
 
-            Vector<RefPtr<SecurityOrigin>> securityOrigins;
+            Vector<RefPtr<SecurityOrigin>> securityOrigins = indexedDatabaseOrigins();
 
-            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 });
@@ -244,7 +241,7 @@
 {
     struct CallbackAggregator final : public ThreadSafeRefCounted<CallbackAggregator> {
         explicit CallbackAggregator(std::function<void ()> completionHandler)
-        : m_completionHandler(WTF::move(completionHandler))
+            : m_completionHandler(WTF::move(completionHandler))
         {
         }
 
@@ -264,15 +261,14 @@
 
     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());
+            deleteIndexedDatabaseEntriesModifiedSince(modifiedSince);
             RunLoop::main().dispatch([callbackAggregator] { });
         }));
     }
 }
 
-void DatabaseProcess::deleteWebsiteDataForOrigins(WebCore::SessionID, uint64_t websiteDataTypes, const Vector<SecurityOriginData>& origins, uint64_t callbackID)
+void DatabaseProcess::deleteWebsiteDataForOrigins(WebCore::SessionID, uint64_t websiteDataTypes, const Vector<SecurityOriginData>& securityOriginDatas, uint64_t callbackID)
 {
     struct CallbackAggregator final : public ThreadSafeRefCounted<CallbackAggregator> {
         explicit CallbackAggregator(std::function<void ()> completionHandler)
@@ -295,42 +291,35 @@
     }));
 
     if (websiteDataTypes & WebsiteDataTypeIndexedDBDatabases) {
-        postDatabaseTask(std::make_unique<AsyncTask>([this, origins, callbackAggregator] {
-            for (const auto& origin: origins)
-                deleteIndexedDatabaseEntriesForOrigin(origin);
+        Vector<RefPtr<WebCore::SecurityOrigin>> securityOrigins;
+        for (const auto& securityOriginData : securityOriginDatas)
+            securityOrigins.append(securityOriginData.securityOrigin());
 
+        postDatabaseTask(std::make_unique<AsyncTask>([this, securityOrigins, callbackAggregator] {
+            deleteIndexedDatabaseEntriesForOrigins(securityOrigins);
+
             RunLoop::main().dispatch([callbackAggregator] { });
         }));
     }
 }
 
-Vector<SecurityOriginData> DatabaseProcess::getIndexedDatabaseOrigins()
+Vector<RefPtr<WebCore::SecurityOrigin>> DatabaseProcess::indexedDatabaseOrigins()
 {
-    Vector<SecurityOriginData> results;
+    if (m_indexedDatabaseDirectory.isEmpty())
+        return { };
 
-    if (m_indexedDatabaseDirectory.isEmpty()) {
-        return results;
-    }
+    Vector<RefPtr<WebCore::SecurityOrigin>> securityOrigins;
+    for (auto& originPath : listDirectory(m_indexedDatabaseDirectory, "*")) {
+        String databaseIdentifier = pathGetFileName(originPath);
 
-    Vector<String> originPaths = listDirectory(m_indexedDatabaseDirectory, "*");
-    for (auto& originPath : originPaths) {
-        URL url;
-        url.setProtocol(ASCIILiteral("file"));
-        url.setPath(originPath);
-
-        String databaseIdentifier = url.lastPathComponent();
-
-        RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::maybeCreateFromDatabaseIdentifier(databaseIdentifier);
-        if (!securityOrigin)
-            continue;
-
-        results.append(SecurityOriginData::fromSecurityOrigin(*securityOrigin));
+        if (auto securityOrigin = SecurityOrigin::maybeCreateFromDatabaseIdentifier(databaseIdentifier))
+            securityOrigins.append(WTF::move(securityOrigin));
     }
 
-    return results;
+    return securityOrigins;
 }
 
-static void removeAllDatabasesForOriginPath(const String& originPath, double startDate, double endDate)
+static void removeAllDatabasesForOriginPath(const String& originPath, std::chrono::system_clock::time_point modifiedSince)
 {
     // FIXME: We should also close/invalidate any live handles to the database files we are about to delete.
     // Right now:
@@ -346,11 +335,14 @@
         if (!fileExists(databaseFile))
             continue;
 
-        time_t modTime;
-        getFileModificationTime(databaseFile, modTime);
+        if (modifiedSince > std::chrono::system_clock::time_point::min()) {
+            time_t modificationTime;
+            if (!getFileModificationTime(databaseFile, modificationTime))
+                continue;
 
-        if (modTime < startDate || modTime > endDate)
-            continue;
+            if (std::chrono::system_clock::from_time_t(modificationTime) < modifiedSince)
+                continue;
+        }
 
         deleteFile(databaseFile);
         deleteEmptyDirectory(databasePath);
@@ -359,38 +351,28 @@
     deleteEmptyDirectory(originPath);
 }
 
-void DatabaseProcess::deleteIndexedDatabaseEntriesForOrigin(const SecurityOriginData& originData)
+void DatabaseProcess::deleteIndexedDatabaseEntriesForOrigins(const Vector<RefPtr<WebCore::SecurityOrigin>>& securityOrigins)
 {
     if (m_indexedDatabaseDirectory.isEmpty())
         return;
 
-    Ref<SecurityOrigin> origin = originData.securityOrigin();
-    String databaseIdentifier = origin->databaseIdentifier();
-    String originPath = pathByAppendingComponent(m_indexedDatabaseDirectory, databaseIdentifier);
+    for (const auto& securityOrigin : securityOrigins) {
+        String originPath = pathByAppendingComponent(m_indexedDatabaseDirectory, securityOrigin->databaseIdentifier());
 
-    removeAllDatabasesForOriginPath(originPath, std::numeric_limits<double>::lowest(), std::numeric_limits<double>::max());
+        removeAllDatabasesForOriginPath(originPath, std::chrono::system_clock::time_point::min());
+    }
 }
 
-void DatabaseProcess::deleteIndexedDatabaseEntriesModifiedBetweenDates(double startDate, double endDate)
+void DatabaseProcess::deleteIndexedDatabaseEntriesModifiedSince(std::chrono::system_clock::time_point modifiedSince)
 {
     if (m_indexedDatabaseDirectory.isEmpty())
         return;
 
     Vector<String> originPaths = listDirectory(m_indexedDatabaseDirectory, "*");
     for (auto& originPath : originPaths)
-        removeAllDatabasesForOriginPath(originPath, startDate, endDate);
+        removeAllDatabasesForOriginPath(originPath, modifiedSince);
 }
 
-void DatabaseProcess::deleteAllIndexedDatabaseEntries()
-{
-    if (m_indexedDatabaseDirectory.isEmpty())
-        return;
-
-    Vector<String> originPaths = listDirectory(m_indexedDatabaseDirectory, "*");
-    for (auto& originPath : originPaths)
-        removeAllDatabasesForOriginPath(originPath, std::numeric_limits<double>::lowest(), std::numeric_limits<double>::max());
-}
-
 #if !PLATFORM(COCOA)
 void DatabaseProcess::initializeProcess(const ChildProcessInitializationParameters&)
 {

Modified: trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.h (185520 => 185521)


--- trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.h	2015-06-12 21:01:17 UTC (rev 185520)
+++ trunk/Source/WebKit2/DatabaseProcess/DatabaseProcess.h	2015-06-12 22:04:27 UTC (rev 185521)
@@ -57,11 +57,6 @@
 
     WorkQueue& queue() { return m_queue.get(); }
 
-    Vector<SecurityOriginData> getIndexedDatabaseOrigins();
-    void deleteIndexedDatabaseEntriesForOrigin(const SecurityOriginData&);
-    void deleteIndexedDatabaseEntriesModifiedBetweenDates(double startDate, double endDate);
-    void deleteAllIndexedDatabaseEntries();
-
     void postDatabaseTask(std::unique_ptr<AsyncTask>);
 
 private:
@@ -90,6 +85,10 @@
     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);
 
+    Vector<RefPtr<WebCore::SecurityOrigin>> indexedDatabaseOrigins();
+    void deleteIndexedDatabaseEntriesForOrigins(const Vector<RefPtr<WebCore::SecurityOrigin>>&);
+    void deleteIndexedDatabaseEntriesModifiedSince(std::chrono::system_clock::time_point modifiedSince);
+
     // For execution on work queue thread only
     void performNextDatabaseTask();
     void ensurePathExists(const String&);

Modified: trunk/Source/WebKit2/Shared/SecurityOriginData.cpp (185520 => 185521)


--- trunk/Source/WebKit2/Shared/SecurityOriginData.cpp	2015-06-12 21:01:17 UTC (rev 185520)
+++ trunk/Source/WebKit2/Shared/SecurityOriginData.cpp	2015-06-12 22:04:27 UTC (rev 185521)
@@ -48,7 +48,7 @@
 
 Ref<SecurityOrigin> SecurityOriginData::securityOrigin() const
 {
-    return SecurityOrigin::create(protocol, host, port);
+    return SecurityOrigin::create(protocol.isolatedCopy(), host.isolatedCopy(), port);
 }
 
 void SecurityOriginData::encode(IPC::ArgumentEncoder& encoder) const
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to