NetworkStorageSessionMap.cpp [plain text]
#include "NetworkStorageSessionMap.h"
#include <WebCore/NetworkStorageSession.h>
#include <pal/SessionID.h>
#include <wtf/MainThread.h>
#include <wtf/ProcessID.h>
#include <wtf/ProcessPrivilege.h>
#include <wtf/UUID.h>
#include <wtf/text/StringConcatenateNumbers.h>
static std::unique_ptr<WebCore::NetworkStorageSession>& defaultNetworkStorageSession()
{
ASSERT(isMainThread());
static NeverDestroyed<std::unique_ptr<WebCore::NetworkStorageSession>> session;
return session;
}
static HashMap<PAL::SessionID, std::unique_ptr<WebCore::NetworkStorageSession>>& globalSessionMap()
{
static NeverDestroyed<HashMap<PAL::SessionID, std::unique_ptr<WebCore::NetworkStorageSession>>> map;
return map;
}
WebCore::NetworkStorageSession* NetworkStorageSessionMap::storageSession(const PAL::SessionID& sessionID)
{
if (sessionID == PAL::SessionID::defaultSessionID())
return &defaultStorageSession();
return globalSessionMap().get(sessionID);
}
WebCore::NetworkStorageSession& NetworkStorageSessionMap::defaultStorageSession()
{
if (!defaultNetworkStorageSession())
defaultNetworkStorageSession() = makeUnique<WebCore::NetworkStorageSession>(PAL::SessionID::defaultSessionID());
return *defaultNetworkStorageSession();
}
void NetworkStorageSessionMap::switchToNewTestingSession()
{
#if PLATFORM(COCOA) || USE(CFURLCONNECTION)
String sessionName = makeString("WebKit Test-", getCurrentProcessID());
auto session = adoptCF(WebCore::createPrivateStorageSession(sessionName.createCFString().get()));
RetainPtr<CFHTTPCookieStorageRef> cookieStorage;
if (WebCore::NetworkStorageSession::processMayUseCookieAPI()) {
ASSERT(hasProcessPrivilege(ProcessPrivilege::CanAccessRawCookies));
if (session)
cookieStorage = adoptCF(_CFURLStorageSessionCopyCookieStorage(kCFAllocatorDefault, session.get()));
}
defaultNetworkStorageSession() = makeUnique<WebCore::NetworkStorageSession>(PAL::SessionID::defaultSessionID(), WTFMove(session), WTFMove(cookieStorage));
#endif
}
void NetworkStorageSessionMap::ensureSession(const PAL::SessionID& sessionID, const String& identifierBase)
{
#if PLATFORM(COCOA) || USE(CFURLCONNECTION)
auto addResult = globalSessionMap().add(sessionID, nullptr);
if (!addResult.isNewEntry)
return;
RetainPtr<CFStringRef> cfIdentifier = makeString(identifierBase, ".PrivateBrowsing.", createCanonicalUUIDString()).createCFString();
RetainPtr<CFURLStorageSessionRef> storageSession;
if (sessionID.isEphemeral())
storageSession = adoptCF(WebCore::createPrivateStorageSession(cfIdentifier.get()));
else
storageSession = WebCore::NetworkStorageSession::createCFStorageSessionForIdentifier(cfIdentifier.get());
RetainPtr<CFHTTPCookieStorageRef> cookieStorage;
if (WebCore::NetworkStorageSession::processMayUseCookieAPI()) {
ASSERT(hasProcessPrivilege(ProcessPrivilege::CanAccessRawCookies));
if (storageSession)
cookieStorage = adoptCF(_CFURLStorageSessionCopyCookieStorage(kCFAllocatorDefault, storageSession.get()));
}
addResult.iterator->value = makeUnique<WebCore::NetworkStorageSession>(sessionID, WTFMove(storageSession), WTFMove(cookieStorage));
#elif USE(CURL)
globalSessionMap().ensure(sessionID, [sessionID] {
return makeUnique<WebCore::NetworkStorageSession>(sessionID);
});
#endif
}
void NetworkStorageSessionMap::destroySession(const PAL::SessionID& sessionID)
{
globalSessionMap().remove(sessionID);
}