StorageManagerSet.h [plain text]
#pragma once
#include "SandboxExtension.h"
#include "StorageAreaIdentifier.h"
#include "StorageAreaImplIdentifier.h"
#include "StorageManager.h"
#include <WebCore/SecurityOriginData.h>
#include <pal/SessionID.h>
#include <wtf/WeakPtr.h>
using WebCore::SecurityOriginData;
namespace WebKit {
class SandboxExtension;
using ConnectToStorageAreaCallback = CompletionHandler<void(const Optional<StorageAreaIdentifier>&)>;
using GetValuesCallback = CompletionHandler<void(const HashMap<String, String>&)>;
using GetOriginsCallback = CompletionHandler<void(HashSet<WebCore::SecurityOriginData>&&)>;
using GetOriginDetailsCallback = CompletionHandler<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>;
using DeleteCallback = CompletionHandler<void()>;
class StorageManagerSet : public IPC::Connection::WorkQueueMessageReceiver {
public:
static Ref<StorageManagerSet> create();
~StorageManagerSet();
void add(PAL::SessionID, const String& localStorageDirectory, SandboxExtension::Handle& localStorageDirectoryHandle);
void remove(PAL::SessionID);
bool contains(PAL::SessionID);
void addConnection(IPC::Connection&);
void removeConnection(IPC::Connection&);
void waitUntilTasksFinished();
void waitUntilSyncingLocalStorageFinished();
void suspend(CompletionHandler<void()>&&);
void resume();
void getSessionStorageOrigins(PAL::SessionID, GetOriginsCallback&&);
void deleteSessionStorage(PAL::SessionID, DeleteCallback&&);
void deleteSessionStorageForOrigins(PAL::SessionID, const Vector<WebCore::SecurityOriginData>&, DeleteCallback&&);
void getLocalStorageOrigins(PAL::SessionID, GetOriginsCallback&&);
void deleteLocalStorageModifiedSince(PAL::SessionID, WallTime, DeleteCallback&&);
void deleteLocalStorageForOrigins(PAL::SessionID, const Vector<WebCore::SecurityOriginData>&, DeleteCallback&&);
void getLocalStorageOriginDetails(PAL::SessionID, GetOriginDetailsCallback&&);
void renameOrigin(PAL::SessionID, const URL&, const URL&, CompletionHandler<void()>&&);
void didReceiveMessage(IPC::Connection&, IPC::Decoder&);
void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>& replyEncoder);
private:
StorageManagerSet();
void connectToLocalStorageArea(IPC::Connection&, PAL::SessionID , StorageNamespaceIdentifier, SecurityOriginData&&, ConnectToStorageAreaCallback&&);
void connectToTransientLocalStorageArea(IPC::Connection&, PAL::SessionID , StorageNamespaceIdentifier, SecurityOriginData&&, SecurityOriginData&&, ConnectToStorageAreaCallback&&);
void connectToSessionStorageArea(IPC::Connection&, PAL::SessionID, StorageNamespaceIdentifier, SecurityOriginData&&, ConnectToStorageAreaCallback&&);
void disconnectFromStorageArea(IPC::Connection&, StorageAreaIdentifier);
void getValues(IPC::Connection&, StorageAreaIdentifier, GetValuesCallback&&);
void setItem(IPC::Connection&, StorageAreaIdentifier, StorageAreaImplIdentifier, uint64_t storageMapSeed, const String& key, const String& value, const String& urlString);
void removeItem(IPC::Connection&, StorageAreaIdentifier, StorageAreaImplIdentifier, uint64_t storageMapSeed, const String& key, const String& urlString);
void clear(IPC::Connection&, StorageAreaIdentifier, StorageAreaImplIdentifier, uint64_t storageMapSeed, const String& urlString);
void cloneSessionStorageNamespace(IPC::Connection&, PAL::SessionID, StorageNamespaceIdentifier fromStorageNamespaceID, StorageNamespaceIdentifier toStorageNamespaceID);
HashMap<PAL::SessionID, std::unique_ptr<StorageManager>> m_storageManagers;
HashMap<PAL::SessionID, String> m_storageManagerPaths;
HashMap<StorageAreaIdentifier, WeakPtr<StorageArea>> m_storageAreas;
HashSet<IPC::Connection::UniqueID> m_connections;
Ref<WorkQueue> m_queue;
enum class State {
Running,
WillSuspend,
Suspended
};
State m_state { State::Running };
Lock m_stateLock;
Condition m_stateChangeCondition;
};
}