LocalStorageNamespace.cpp [plain text]
#include "config.h"
#include "LocalStorageNamespace.h"
#include "StorageArea.h"
#include "StorageManager.h"
#include <WebCore/SecurityOriginData.h>
namespace WebKit {
using namespace WebCore;
LocalStorageNamespace::LocalStorageNamespace(StorageManager& storageManager, StorageNamespaceIdentifier storageNamespaceID)
: m_storageManager(storageManager)
, m_quotaInBytes(StorageManager::localStorageDatabaseQuotaInBytes)
{
ASSERT(!RunLoop::isMain());
}
LocalStorageNamespace::~LocalStorageNamespace()
{
ASSERT(!RunLoop::isMain());
}
StorageArea& LocalStorageNamespace::getOrCreateStorageArea(SecurityOriginData&& securityOrigin, IsEphemeral isEphemeral, Ref<WorkQueue>&& workQueue)
{
ASSERT(!RunLoop::isMain());
return *m_storageAreaMap.ensure(securityOrigin, [&]() mutable {
return makeUnique<StorageArea>(isEphemeral == IsEphemeral::Yes ? nullptr : this, WTFMove(securityOrigin), m_quotaInBytes, WTFMove(workQueue));
}).iterator->value.get();
}
void LocalStorageNamespace::clearStorageAreasMatchingOrigin(const SecurityOriginData& securityOrigin)
{
ASSERT(!RunLoop::isMain());
auto originAndStorageArea = m_storageAreaMap.find(securityOrigin);
if (originAndStorageArea != m_storageAreaMap.end())
originAndStorageArea->value->clear();
}
void LocalStorageNamespace::clearAllStorageAreas()
{
ASSERT(!RunLoop::isMain());
for (auto& storageArea : m_storageAreaMap.values())
storageArea->clear();
}
void LocalStorageNamespace::flushAndClose(const SecurityOriginData& origin)
{
ASSERT(!RunLoop::isMain());
if (auto* storageArea = m_storageAreaMap.get(origin)) {
storageArea->syncToDatabase();
storageArea->close();
}
}
Vector<SecurityOriginData> LocalStorageNamespace::ephemeralOrigins() const
{
ASSERT(!RunLoop::isMain());
Vector<SecurityOriginData> origins;
for (const auto& storageArea : m_storageAreaMap.values()) {
if (!storageArea->items().isEmpty())
origins.append(storageArea->securityOrigin());
}
return origins;
}
Vector<StorageAreaIdentifier> LocalStorageNamespace::storageAreaIdentifiers() const
{
Vector<StorageAreaIdentifier> identifiers;
for (auto& storageArea : m_storageAreaMap.values())
identifiers.append(storageArea->identifier());
return identifiers;
}
}