NetworkStorageSessionCFNet.cpp [plain text]
#include "config.h"
#include "NetworkStorageSession.h"
#include <wtf/MainThread.h>
#include <wtf/NeverDestroyed.h>
#include <wtf/PassOwnPtr.h>
#if PLATFORM(COCOA)
#include "WebCoreSystemInterface.h"
#else
#include <WebKitSystemInterface/WebKitSystemInterface.h>
#endif
namespace WebCore {
NetworkStorageSession::NetworkStorageSession(RetainPtr<CFURLStorageSessionRef> platformSession)
: m_platformSession(platformSession)
, m_isPrivate(false)
{
}
static OwnPtr<NetworkStorageSession>& defaultNetworkStorageSession()
{
ASSERT(isMainThread());
static NeverDestroyed<OwnPtr<NetworkStorageSession>> session;
return session;
}
void NetworkStorageSession::switchToNewTestingSession()
{
#if PLATFORM(COCOA)
defaultNetworkStorageSession() = adoptPtr(new NetworkStorageSession(adoptCF(wkCreatePrivateStorageSession(CFSTR("Private WebKit Session")))));
#else
defaultNetworkStorageSession() = adoptPtr(new NetworkStorageSession(adoptCF(wkCreatePrivateStorageSession(CFSTR("Private WebKit Session"), defaultNetworkStorageSession()->platformSession()))));
#endif
}
#if PLATFORM(WIN)
static RetainPtr<CFHTTPCookieStorageRef>& cookieStorageOverride()
{
static NeverDestroyed<RetainPtr<CFHTTPCookieStorageRef>> cookieStorage;
return cookieStorage;
}
void overrideCookieStorage(CFHTTPCookieStorageRef cookieStorage)
{
ASSERT(isMainThread());
cookieStorageOverride() = adoptCF(cookieStorage);
}
CFHTTPCookieStorageRef overridenCookieStorage()
{
return cookieStorageOverride().get();
}
#endif
NetworkStorageSession& NetworkStorageSession::defaultStorageSession()
{
if (!defaultNetworkStorageSession())
defaultNetworkStorageSession() = adoptPtr(new NetworkStorageSession(0));
return *defaultNetworkStorageSession();
}
std::unique_ptr<NetworkStorageSession> NetworkStorageSession::createPrivateBrowsingSession(const String& identifierBase)
{
RetainPtr<CFStringRef> cfIdentifier = String(identifierBase + ".PrivateBrowsing").createCFString();
#if PLATFORM(COCOA)
auto session = std::make_unique<NetworkStorageSession>(adoptCF(wkCreatePrivateStorageSession(cfIdentifier.get())));
#else
auto session = std::make_unique<NetworkStorageSession>(adoptCF(wkCreatePrivateStorageSession(cfIdentifier.get(), defaultNetworkStorageSession()->platformSession())));
#endif
session->m_isPrivate = true;
return session;
}
RetainPtr<CFHTTPCookieStorageRef> NetworkStorageSession::cookieStorage() const
{
#if PLATFORM(WIN)
if (RetainPtr<CFHTTPCookieStorageRef>& override = cookieStorageOverride())
return override;
#endif
if (m_platformSession)
return adoptCF(wkCopyHTTPCookieStorage(m_platformSession.get()));
#if USE(CFNETWORK)
return wkGetDefaultHTTPCookieStorage();
#else
return 0;
#endif
}
}