ef2a7bd38166678d4fef855f01a3c4edf3bd73fd
[WebKit-https.git] / Source / WebKit2 / NetworkProcess / Downloads / Download.h
1 /*
2  * Copyright (C) 2010-2016 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 Download_h
27 #define Download_h
28
29 #include "DownloadID.h"
30 #include "MessageSender.h"
31 #include "SandboxExtension.h"
32 #include <WebCore/ResourceHandle.h>
33 #include <WebCore/ResourceHandleClient.h>
34 #include <WebCore/ResourceRequest.h>
35 #include <WebCore/SessionID.h>
36 #include <memory>
37 #include <wtf/Noncopyable.h>
38
39 #if PLATFORM(COCOA)
40 #include <wtf/RetainPtr.h>
41
42 #if USE(NETWORK_SESSION)
43 OBJC_CLASS NSURLSessionDownloadTask;
44 #else
45 OBJC_CLASS NSURLDownload;
46 OBJC_CLASS WKDownloadAsDelegate;
47 #endif
48 #endif
49
50 #if USE(CFURLCONNECTION)
51 #include <CFNetwork/CFURLDownloadPriv.h>
52 #endif
53
54 namespace IPC {
55 class DataReference;
56 }
57
58 namespace WebCore {
59 class AuthenticationChallenge;
60 class Credential;
61 class ResourceError;
62 class ResourceHandle;
63 class ResourceResponse;
64 }
65
66 namespace WebKit {
67
68 class DownloadManager;
69 class NetworkSession;
70 class WebPage;
71
72 class Download : public IPC::MessageSender {
73     WTF_MAKE_NONCOPYABLE(Download); WTF_MAKE_FAST_ALLOCATED;
74 public:
75 #if USE(NETWORK_SESSION) && PLATFORM(COCOA)
76     Download(DownloadManager&, DownloadID, NSURLSessionDownloadTask*, const WebCore::SessionID& sessionID, const String& suggestedFilename = { });
77 #endif
78     Download(DownloadManager&, DownloadID, const WebCore::ResourceRequest&, const String& suggestedFilename = { });
79
80     ~Download();
81
82     void start();
83     void startWithHandle(WebCore::ResourceHandle*, const WebCore::ResourceResponse&);
84     void resume(const IPC::DataReference& resumeData, const String& path, const SandboxExtension::Handle&);
85     void cancel();
86
87     DownloadID downloadID() const { return m_downloadID; }
88     const String& suggestedName() const { return m_suggestedName; }
89     const WebCore::ResourceRequest& request() const { return m_request; }
90
91 #if USE(NETWORK_SESSION)
92     void setSandboxExtension(RefPtr<SandboxExtension>&& sandboxExtension) { m_sandboxExtension = WTFMove(sandboxExtension); }
93 #else
94     void didReceiveAuthenticationChallenge(const WebCore::AuthenticationChallenge&);
95 #endif
96     void didStart();
97     void didReceiveResponse(const WebCore::ResourceResponse&);
98     void didReceiveData(uint64_t length);
99     bool shouldDecodeSourceDataOfMIMEType(const String& mimeType);
100 #if !USE(NETWORK_SESSION)
101     String decideDestinationWithSuggestedFilename(const String& filename, bool& allowOverwrite);
102 #endif
103     void decideDestinationWithSuggestedFilenameAsync(const String&);
104     void didDecideDownloadDestination(const String& destinationPath, const SandboxExtension::Handle&, bool allowOverwrite);
105     void continueDidReceiveResponse();
106     void didCreateDestination(const String& path);
107     void didFinish();
108     void platformDidFinish();
109     void didFail(const WebCore::ResourceError&, const IPC::DataReference& resumeData);
110     void didCancel(const IPC::DataReference& resumeData);
111
112 private:
113     // IPC::MessageSender
114     IPC::Connection* messageSenderConnection() override;
115     uint64_t messageSenderDestinationID() override;
116
117 #if !USE(NETWORK_SESSION)
118     void startNetworkLoad();
119     void startNetworkLoadWithHandle(WebCore::ResourceHandle*, const WebCore::ResourceResponse&);
120 #endif
121     void cancelNetworkLoad();
122
123     void platformInvalidate();
124
125     bool isAlwaysOnLoggingAllowed() const;
126
127     DownloadManager& m_downloadManager;
128     DownloadID m_downloadID;
129     WebCore::ResourceRequest m_request;
130
131     RefPtr<SandboxExtension> m_sandboxExtension;
132
133 #if PLATFORM(COCOA)
134 #if USE(NETWORK_SESSION)
135     RetainPtr<NSURLSessionDownloadTask> m_download;
136     WebCore::SessionID m_sessionID;
137 #else
138     RetainPtr<NSURLDownload> m_nsURLDownload;
139     RetainPtr<WKDownloadAsDelegate> m_delegate;
140 #endif
141 #endif
142 #if USE(CFURLCONNECTION)
143     RetainPtr<CFURLDownloadRef> m_download;
144 #endif
145     std::unique_ptr<WebCore::ResourceHandleClient> m_downloadClient;
146     RefPtr<WebCore::ResourceHandle> m_resourceHandle;
147     String m_suggestedName;
148     bool m_hasReceivedData { false };
149 };
150
151 } // namespace WebKit
152
153 #endif // Download_h