Title: [211035] trunk/Source/WebCore
Revision
211035
Author
[email protected]
Date
2017-01-22 23:28:48 -0800 (Sun, 22 Jan 2017)

Log Message

Database file not removed for origins after deleting all databases
https://bugs.webkit.org/show_bug.cgi?id=167281

Reviewed by Darin Adler.

When DatabaseTracker::deleteDatabasesModifiedSince() is called with a min time, all databases for every origin
are deleted. For each origin if all databases are removed DatabaseTracker::deleteOrigin() is called to remove
also the origin database file. However, DatabaseTracker::deleteOrigin() returns early if the origin doesn't have
databases and in this particular case it never has databases, because we have just removed them.

This will be covered by GTK+ unit tests.

* Modules/webdatabase/DatabaseTracker.cpp:
(WebCore::DatabaseTracker::deleteDatabasesModifiedSince): Instead of removing the databases while iterating
them, add the ones to be removed to a vector. If after the iteration all databases should be removed call
DatabaseTracker::deleteOrigin() to ensure both the databases and the database file are removed for the origin,
otherwhise call DatabaseTracker::deleteDatabase() for every database to delete.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (211034 => 211035)


--- trunk/Source/WebCore/ChangeLog	2017-01-23 07:25:41 UTC (rev 211034)
+++ trunk/Source/WebCore/ChangeLog	2017-01-23 07:28:48 UTC (rev 211035)
@@ -1,3 +1,23 @@
+2017-01-22  Carlos Garcia Campos  <[email protected]>
+
+        Database file not removed for origins after deleting all databases
+        https://bugs.webkit.org/show_bug.cgi?id=167281
+
+        Reviewed by Darin Adler.
+
+        When DatabaseTracker::deleteDatabasesModifiedSince() is called with a min time, all databases for every origin
+        are deleted. For each origin if all databases are removed DatabaseTracker::deleteOrigin() is called to remove
+        also the origin database file. However, DatabaseTracker::deleteOrigin() returns early if the origin doesn't have
+        databases and in this particular case it never has databases, because we have just removed them.
+
+        This will be covered by GTK+ unit tests.
+
+        * Modules/webdatabase/DatabaseTracker.cpp:
+        (WebCore::DatabaseTracker::deleteDatabasesModifiedSince): Instead of removing the databases while iterating
+        them, add the ones to be removed to a vector. If after the iteration all databases should be removed call
+        DatabaseTracker::deleteOrigin() to ensure both the databases and the database file are removed for the origin,
+        otherwhise call DatabaseTracker::deleteDatabase() for every database to delete.
+
 2017-01-22  Michael Catanzaro  <[email protected]>
 
         [GTK] Update Safari version in user agent

Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.cpp (211034 => 211035)


--- trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.cpp	2017-01-23 07:25:41 UTC (rev 211034)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.cpp	2017-01-23 07:28:48 UTC (rev 211035)
@@ -776,25 +776,28 @@
 void DatabaseTracker::deleteDatabasesModifiedSince(std::chrono::system_clock::time_point time)
 {
     for (auto& origin : origins()) {
-        bool deletedAll = true;
-        for (auto& databaseName : databaseNames(origin)) {
+        Vector<String> databaseNames = this->databaseNames(origin);
+        Vector<String> databaseNamesToDelete;
+        databaseNamesToDelete.reserveInitialCapacity(databaseNames.size());
+        for (const auto& databaseName : databaseNames) {
             auto fullPath = fullPathForDatabase(origin, databaseName, false);
 
             time_t modificationTime;
-            if (!getFileModificationTime(fullPath, modificationTime)) {
-                deletedAll = false;
+            if (!getFileModificationTime(fullPath, modificationTime))
                 continue;
-            }
 
-            if (modificationTime < std::chrono::system_clock::to_time_t(time)) {
-                deletedAll = false;
+            if (modificationTime < std::chrono::system_clock::to_time_t(time))
                 continue;
-            }
 
-            deleteDatabase(origin, databaseName);
+            databaseNamesToDelete.uncheckedAppend(databaseName);
         }
-        if (deletedAll)
+
+        if (databaseNames.size() == databaseNamesToDelete.size())
             deleteOrigin(origin);
+        else {
+            for (const auto& databaseName : databaseNamesToDelete)
+                deleteDatabase(origin, databaseName);
+        }
     }
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to