X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=Source%2FWebCore%2Fstorage%2FStorageTracker.cpp;h=b9ce65fb5c8a2b73d1b129c3aa7b30c19f503bd1;hb=2daae5fd11344eaa88a0d92b0f6d65f8d2255c00;hp=e18b4b837083c7c5b5495aaa7ef7704659957505;hpb=87bdf0060a247bfbe668342b87e0874182e0ffa9;p=android-x86%2Fexternal-webkit.git diff --git a/Source/WebCore/storage/StorageTracker.cpp b/Source/WebCore/storage/StorageTracker.cpp index e18b4b837..b9ce65fb5 100644 --- a/Source/WebCore/storage/StorageTracker.cpp +++ b/Source/WebCore/storage/StorageTracker.cpp @@ -232,8 +232,10 @@ void StorageTracker::syncFileSystemAndTrackerDatabase() // Delete stale StorageTracker records. OriginSet::const_iterator setEnd = originSetCopy.end(); for (OriginSet::const_iterator it = originSetCopy.begin(); it != setEnd; ++it) { - if (!foundOrigins.contains(*it)) - syncDeleteOrigin(*it); + if (!foundOrigins.contains(*it)) { + RefPtr originIdentifier = (*it).threadsafeCopy().impl(); + callOnMainThread(deleteOriginOnMainThread, originIdentifier.release().leakRef()); + } } } @@ -376,10 +378,33 @@ void StorageTracker::syncDeleteAllOrigins() if (m_database.isOpen()) m_database.close(); - SQLiteFileSystem::deleteDatabaseFile(trackerDatabasePath()); + if (!SQLiteFileSystem::deleteDatabaseFile(trackerDatabasePath())) { + // In the case where it is not possible to delete the database file (e.g some other program + // like a virus scanner is accessing it), make sure to remove all entries. + openTrackerDatabase(false); + if (!m_database.isOpen()) + return; + SQLiteStatement deleteStatement(m_database, "DELETE FROM Origins"); + if (deleteStatement.prepare() != SQLResultOk) { + LOG_ERROR("Unable to prepare deletion of all origins"); + return; + } + if (!deleteStatement.executeCommand()) { + LOG_ERROR("Unable to execute deletion of all origins"); + return; + } + } SQLiteFileSystem::deleteEmptyDatabaseDirectory(m_storageDirectoryPath); } +void StorageTracker::deleteOriginOnMainThread(void* originIdentifier) +{ + ASSERT(isMainThread()); + + String identifier = adoptRef(reinterpret_cast(originIdentifier)); + tracker().deleteOrigin(identifier); +} + void StorageTracker::deleteOrigin(const String& originIdentifier) { deleteOrigin(SecurityOrigin::createFromDatabaseIdentifier(originIdentifier).get());