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