Move URL from WebCore to WTF
[WebKit-https.git] / Source / WebKit / 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 #pragma once
27
28 #include "DownloadID.h"
29 #include "MessageSender.h"
30 #include "NetworkDataTask.h"
31 #include "SandboxExtension.h"
32 #include <WebCore/AuthenticationChallenge.h>
33 #include <WebCore/ResourceRequest.h>
34 #include <memory>
35 #include <pal/SessionID.h>
36 #include <wtf/Noncopyable.h>
37 #include <wtf/RetainPtr.h>
38
39 #if PLATFORM(COCOA)
40 OBJC_CLASS NSProgress;
41 OBJC_CLASS NSURLSessionDownloadTask;
42 #endif
43
44 namespace IPC {
45 class DataReference;
46 }
47
48 namespace WebCore {
49 class AuthenticationChallenge;
50 class BlobDataFileReference;
51 class Credential;
52 class ResourceError;
53 class ResourceHandle;
54 class ResourceRequest;
55 class ResourceResponse;
56 }
57
58 namespace WebKit {
59
60 class DownloadManager;
61 class NetworkDataTask;
62 class NetworkSession;
63 class WebPage;
64
65 class Download : public IPC::MessageSender {
66     WTF_MAKE_NONCOPYABLE(Download); WTF_MAKE_FAST_ALLOCATED;
67 public:
68     Download(DownloadManager&, DownloadID, NetworkDataTask&, const PAL::SessionID& sessionID, const String& suggestedFilename = { });
69 #if PLATFORM(COCOA)
70     Download(DownloadManager&, DownloadID, NSURLSessionDownloadTask*, const PAL::SessionID& sessionID, const String& suggestedFilename = { });
71 #endif
72
73     ~Download();
74
75     void resume(const IPC::DataReference& resumeData, const String& path, SandboxExtension::Handle&&);
76     void cancel();
77 #if PLATFORM(COCOA)
78     void publishProgress(const URL&, SandboxExtension::Handle&&);
79 #endif
80
81     DownloadID downloadID() const { return m_downloadID; }
82     const String& suggestedName() const { return m_suggestedName; }
83
84     void setSandboxExtension(RefPtr<SandboxExtension>&& sandboxExtension) { m_sandboxExtension = WTFMove(sandboxExtension); }
85     void didReceiveChallenge(const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler&&);
86     void didCreateDestination(const String& path);
87     void didReceiveData(uint64_t length);
88     void didFinish();
89     void didFail(const WebCore::ResourceError&, const IPC::DataReference& resumeData);
90     void didCancel(const IPC::DataReference& resumeData);
91
92 private:
93     // IPC::MessageSender
94     IPC::Connection* messageSenderConnection() override;
95     uint64_t messageSenderDestinationID() override;
96
97     void platformCancelNetworkLoad();
98     void platformDestroyDownload();
99
100     bool isAlwaysOnLoggingAllowed() const;
101
102     DownloadManager& m_downloadManager;
103     DownloadID m_downloadID;
104
105     Vector<RefPtr<WebCore::BlobDataFileReference>> m_blobFileReferences;
106     RefPtr<SandboxExtension> m_sandboxExtension;
107
108     RefPtr<NetworkDataTask> m_download;
109 #if PLATFORM(COCOA)
110     RetainPtr<NSURLSessionDownloadTask> m_downloadTask;
111     RetainPtr<NSProgress> m_progress;
112 #endif
113     PAL::SessionID m_sessionID;
114     String m_suggestedName;
115     bool m_hasReceivedData { false };
116 };
117
118 } // namespace WebKit