void DatabaseTracker::deleteDatabasesModifiedSince(std::chrono::system_clock::time_point time) { Vector<RefPtr<SecurityOrigin>> originsCopy; origins(originsCopy); for (auto& origin : originsCopy) { Vector<String> databaseNames; if (!databaseNamesForOrigin(origin.get(), databaseNames)) continue; size_t deletedDatabases = 0; for (auto& databaseName : databaseNames) { auto fullPath = fullPathForDatabase(origin.get(), databaseName, false); time_t modificationTime; if (!getFileModificationTime(fullPath, modificationTime)) continue; if (modificationTime < std::chrono::system_clock::to_time_t(time)) continue; deleteDatabase(origin.get(), databaseName); ++deletedDatabases; } if (deletedDatabases == databaseNames.size()) deleteOrigin(origin.get()); } }
void DatabaseTracker::deleteAllDatabases() { Vector<RefPtr<SecurityOrigin>> originsCopy; origins(originsCopy); for (unsigned i = 0; i < originsCopy.size(); ++i) deleteOrigin(originsCopy[i].get()); }
void DatabaseTracker::deleteAllDatabasesImmediately() { Vector<RefPtr<SecurityOrigin>> originsCopy; origins(originsCopy); // This method is only intended for use by DumpRenderTree / WebKitTestRunner. // Actually deleting the databases is necessary to reset to a known state before running // each test case, but may be unsafe in deployment use cases (where multiple applications // may be accessing the same databases concurrently). for (auto& origin : originsCopy) deleteOrigin(origin.get(), DeletionMode::Immediate); }
void StorageTracker::deleteOriginWithIdentifier(const String& originIdentifier) { deleteOrigin(&SecurityOrigin::createFromDatabaseIdentifier(originIdentifier).get()); }
// It is the caller's responsibility to make sure that nobody is trying to create, delete, open, or close databases in this origin while the deletion is // taking place. bool DatabaseTracker::deleteOrigin(SecurityOrigin* origin) { return deleteOrigin(origin, DeletionMode::Default); }