NetworkStorageSessionCFNet.cpp [plain text]
#include "config.h"
#include "NetworkStorageSession.h"
#include <wtf/MainThread.h>
#include <wtf/NeverDestroyed.h>
#include <wtf/ProcessID.h>
#if PLATFORM(COCOA)
#include "PublicSuffix.h"
#include "ResourceRequest.h"
#include "Settings.h"
#include "WebCoreSystemInterface.h"
#else
#include <WebKitSystemInterface/WebKitSystemInterface.h>
#endif
namespace WebCore {
NetworkStorageSession::NetworkStorageSession(SessionID sessionID, RetainPtr<CFURLStorageSessionRef> platformSession)
: m_sessionID(sessionID)
, m_platformSession(platformSession)
{
}
static std::unique_ptr<NetworkStorageSession>& defaultNetworkStorageSession()
{
ASSERT(isMainThread());
static NeverDestroyed<std::unique_ptr<NetworkStorageSession>> session;
return session;
}
void NetworkStorageSession::switchToNewTestingSession()
{
String sessionName = String::format("WebKit Test-%u", static_cast<uint32_t>(getCurrentProcessID()));
#if PLATFORM(COCOA)
defaultNetworkStorageSession() = std::make_unique<NetworkStorageSession>(SessionID::defaultSessionID(), adoptCF(wkCreatePrivateStorageSession(sessionName.createCFString().get())));
#else
defaultNetworkStorageSession() = std::make_unique<NetworkStorageSession>(SessionID::defaultSessionID(), adoptCF(wkCreatePrivateStorageSession(sessionName.createCFString().get(), defaultNetworkStorageSession()->platformSession())));
#endif
}
NetworkStorageSession& NetworkStorageSession::defaultStorageSession()
{
if (!defaultNetworkStorageSession())
defaultNetworkStorageSession() = std::make_unique<NetworkStorageSession>(SessionID::defaultSessionID(), nullptr);
return *defaultNetworkStorageSession();
}
std::unique_ptr<NetworkStorageSession> NetworkStorageSession::createPrivateBrowsingSession(SessionID sessionID, const String& identifierBase)
{
RetainPtr<CFStringRef> cfIdentifier = String(identifierBase + ".PrivateBrowsing").createCFString();
#if PLATFORM(COCOA)
auto session = std::make_unique<NetworkStorageSession>(sessionID, adoptCF(wkCreatePrivateStorageSession(cfIdentifier.get())));
#else
auto session = std::make_unique<NetworkStorageSession>(sessionID, adoptCF(wkCreatePrivateStorageSession(cfIdentifier.get(), defaultNetworkStorageSession()->platformSession())));
#endif
return session;
}
RetainPtr<CFHTTPCookieStorageRef> NetworkStorageSession::cookieStorage() const
{
if (m_platformSession)
return adoptCF(_CFURLStorageSessionCopyCookieStorage(kCFAllocatorDefault, m_platformSession.get()));
#if USE(CFNETWORK)
return _CFHTTPCookieStorageGetDefault(kCFAllocatorDefault);
#else
return 0;
#endif
}
#if PLATFORM(COCOA)
String cookieStoragePartition(const ResourceRequest& request)
{
return cookieStoragePartition(request.firstPartyForCookies(), request.url());
}
static inline bool hostIsInDomain(StringView host, StringView domain)
{
if (!host.endsWithIgnoringASCIICase(domain))
return false;
ASSERT(host.length() >= domain.length());
unsigned suffixOffset = host.length() - domain.length();
return suffixOffset == 0 || host[suffixOffset - 1] == '.';
}
String cookieStoragePartition(const URL& firstPartyForCookies, const URL& resource)
{
if (!Settings::cookieStoragePartitioningEnabled())
return emptyString();
String firstPartyDomain = firstPartyForCookies.host();
#if ENABLE(PUBLIC_SUFFIX_LIST)
firstPartyDomain = topPrivatelyControlledDomain(firstPartyDomain);
#endif
return hostIsInDomain(resource.host(), firstPartyDomain) ? emptyString() : firstPartyDomain;
}
#endif
}