Add types for DownloadID and TaskIdentifier
[WebKit-https.git] / Source / WebKit2 / NetworkProcess / NetworkSession.h
1 /*
2  * Copyright (C) 2015 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef NetworkSession_h
27 #define NetworkSession_h
28
29 #if PLATFORM(COCOA)
30 OBJC_CLASS NSURLSession;
31 OBJC_CLASS NSURLSessionDataTask;
32 OBJC_CLASS NSOperationQueue;
33 OBJC_CLASS WKNetworkSessionDelegate;
34 #endif
35
36 #include "DownloadID.h"
37 #include <WebCore/FrameLoaderTypes.h>
38 #include <WebCore/SessionID.h>
39 #include <wtf/HashMap.h>
40 #include <wtf/Ref.h>
41 #include <wtf/RefCounted.h>
42 #include <wtf/RetainPtr.h>
43 #include <wtf/WeakPtr.h>
44
45 namespace WebCore {
46 class AuthenticationChallenge;
47 class Credential;
48 class ResourceError;
49 class ResourceRequest;
50 class ResourceResponse;
51 class SharedBuffer;
52 }
53
54 namespace WebKit {
55
56 enum class AuthenticationChallengeDisposition {
57     UseCredential,
58     PerformDefaultHandling,
59     Cancel,
60     RejectProtectionSpace
61 };
62
63 class NetworkSession;
64
65 class NetworkSessionTaskClient {
66 public:
67     typedef std::function<void(const WebCore::ResourceRequest&)> RedirectCompletionHandler;
68     virtual void willPerformHTTPRedirection(const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, RedirectCompletionHandler) = 0;
69     typedef std::function<void(AuthenticationChallengeDisposition, const WebCore::Credential&)> ChallengeCompletionHandler;
70     virtual void didReceiveChallenge(const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler) = 0;
71     typedef std::function<void(WebCore::PolicyAction)> ResponseCompletionHandler;
72     virtual void didReceiveResponse(const WebCore::ResourceResponse&, ResponseCompletionHandler) = 0;
73     virtual void didReceiveData(RefPtr<WebCore::SharedBuffer>&&) = 0;
74     virtual void didCompleteWithError(const WebCore::ResourceError&) = 0;
75     virtual void didBecomeDownload() = 0;
76
77     virtual ~NetworkSessionTaskClient() { }
78 };
79
80 class NetworkDataTask : public RefCounted<NetworkDataTask> {
81     friend class NetworkSession;
82 public:
83     void cancel();
84     void resume();
85
86     typedef uint64_t TaskIdentifier;
87     TaskIdentifier taskIdentifier();
88
89     ~NetworkDataTask();
90
91     NetworkSessionTaskClient* client() { return m_client; }
92     void clearClient() { m_client = nullptr; }
93
94 private:
95     NetworkSession& m_session;
96     NetworkSessionTaskClient* m_client;
97 #if PLATFORM(COCOA)
98     explicit NetworkDataTask(NetworkSession&, NetworkSessionTaskClient&, RetainPtr<NSURLSessionDataTask>&&);
99     RetainPtr<NSURLSessionDataTask> m_task;
100 #else
101     explicit NetworkDataTask(NetworkSession&, NetworkSessionTaskClient&);
102 #endif
103 };
104
105 class NetworkSession {
106     friend class NetworkDataTask;
107 public:
108     enum class Type {
109         Normal,
110         Ephemeral
111     };
112     NetworkSession(Type, WebCore::SessionID);
113     ~NetworkSession();
114
115     static NetworkSession& defaultSession();
116     
117     Ref<NetworkDataTask> createDataTaskWithRequest(const WebCore::ResourceRequest&, NetworkSessionTaskClient&);
118
119     NetworkDataTask* dataTaskForIdentifier(NetworkDataTask::TaskIdentifier);
120
121 private:
122     WebCore::SessionID m_sessionID;
123     HashMap<NetworkDataTask::TaskIdentifier, NetworkDataTask*> m_dataTaskMap;
124     HashMap<NetworkDataTask::TaskIdentifier, DownloadID> m_downloadMap;
125 #if PLATFORM(COCOA)
126     RetainPtr<NSURLSession> m_session;
127     RetainPtr<WKNetworkSessionDelegate> m_sessionDelegate;
128 #endif
129 };
130
131 } // namespace WebKit
132
133 #endif // NetworkSession_h