#ifndef NetworkSession_h
#define NetworkSession_h
#if PLATFORM(COCOA)
OBJC_CLASS NSURLSession;
OBJC_CLASS NSOperationQueue;
OBJC_CLASS WKNetworkSessionDelegate;
#endif
#include "DownloadID.h"
#include "NetworkDataTask.h"
#include <WebCore/SessionID.h>
#include <wtf/HashMap.h>
#include <wtf/Ref.h>
#include <wtf/RefCounted.h>
namespace WebCore {
class NetworkStorageSession;
}
namespace WebKit {
class CustomProtocolManager;
class NetworkSession : public RefCounted<NetworkSession> {
friend class NetworkDataTask;
public:
enum class Type {
Normal,
Ephemeral
};
static Ref<NetworkSession> create(Type, WebCore::SessionID, CustomProtocolManager*, std::unique_ptr<WebCore::NetworkStorageSession>);
static NetworkSession& defaultSession();
~NetworkSession();
void invalidateAndCancel();
WebCore::SessionID sessionID() const { return m_sessionID; }
WebCore::NetworkStorageSession& networkStorageSession();
static void setCustomProtocolManager(CustomProtocolManager*);
#if PLATFORM(COCOA)
static void setSourceApplicationAuditTokenData(RetainPtr<CFDataRef>&&);
#endif
void clearCredentials();
NetworkDataTask* dataTaskForIdentifier(NetworkDataTask::TaskIdentifier, WebCore::StoredCredentials);
void addDownloadID(NetworkDataTask::TaskIdentifier, DownloadID);
DownloadID downloadID(NetworkDataTask::TaskIdentifier);
DownloadID takeDownloadID(NetworkDataTask::TaskIdentifier);
private:
NetworkSession(Type, WebCore::SessionID, CustomProtocolManager*, std::unique_ptr<WebCore::NetworkStorageSession>);
WebCore::SessionID m_sessionID;
std::unique_ptr<WebCore::NetworkStorageSession> m_networkStorageSession;
HashMap<NetworkDataTask::TaskIdentifier, NetworkDataTask*> m_dataTaskMapWithCredentials;
HashMap<NetworkDataTask::TaskIdentifier, NetworkDataTask*> m_dataTaskMapWithoutCredentials;
HashMap<NetworkDataTask::TaskIdentifier, DownloadID> m_downloadMap;
#if PLATFORM(COCOA)
RetainPtr<NSURLSession> m_sessionWithCredentialStorage;
RetainPtr<WKNetworkSessionDelegate> m_sessionWithCredentialStorageDelegate;
RetainPtr<NSURLSession> m_sessionWithoutCredentialStorage;
RetainPtr<WKNetworkSessionDelegate> m_sessionWithoutCredentialStorageDelegate;
#endif
};
}
#endif // NetworkSession_h