void StorageTracker::deleteOrigin(SecurityOrigin* origin) { ASSERT(m_isActive); ASSERT(isMainThread()); ASSERT(m_thread); if (!m_isActive) return; // Before deleting database, we need to clear in-memory local storage data // in StorageArea, and to close the StorageArea db. It's possible for an // item to be added immediately after closing the db and cause StorageAreaSync // to reopen the db before the db is deleted by a StorageTracker thread. // In this case, reopening the db in StorageAreaSync will cancel a pending // StorageTracker db deletion. WebStorageNamespaceProvider::clearLocalStorageForOrigin(origin); String originId = origin->databaseIdentifier(); { MutexLocker locker(m_originSetMutex); willDeleteOrigin(originId); m_originSet.remove(originId); } String originIdCopy = originId.isolatedCopy(); m_thread->dispatch([this, originIdCopy] { syncDeleteOrigin(originIdCopy); }); }
void StorageTracker::deleteOrigin(SecurityOrigin* origin) { ASSERT(m_isActive); ASSERT(isMainThread()); ASSERT(m_thread); if (!m_isActive) return; // Before deleting database, we need to clear in-memory local storage data // in StorageArea, and to close the StorageArea db. It's possible for an // item to be added immediately after closing the db and cause StorageAreaSync // to reopen the db before the db is deleted by a StorageTracker thread. // In this case, reopening the db in StorageAreaSync will cancel a pending // StorageTracker db deletion. PageGroup::clearLocalStorageForOrigin(origin); String originId = origin->databaseIdentifier(); { MutexLocker lockOrigins(m_originSetGuard); willDeleteOrigin(originId); m_originSet.remove(originId); } m_thread->scheduleTask(LocalStorageTask::createDeleteOrigin(originId)); }