diff options
Diffstat (limited to 'Source/WebKit2/NetworkProcess/NetworkDataTask.h')
-rw-r--r-- | Source/WebKit2/NetworkProcess/NetworkDataTask.h | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/Source/WebKit2/NetworkProcess/NetworkDataTask.h b/Source/WebKit2/NetworkProcess/NetworkDataTask.h new file mode 100644 index 000000000..cc47307d8 --- /dev/null +++ b/Source/WebKit2/NetworkProcess/NetworkDataTask.h @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2016 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#if USE(NETWORK_SESSION) + +#include "DownloadID.h" +#include "SandboxExtension.h" +#include <WebCore/Credential.h> +#include <WebCore/FrameLoaderTypes.h> +#include <WebCore/ResourceHandleTypes.h> +#include <WebCore/ResourceLoaderOptions.h> +#include <WebCore/ResourceRequest.h> +#include <WebCore/Timer.h> +#include <wtf/Function.h> +#include <wtf/text/WTFString.h> + +namespace WebCore { +class AuthenticationChallenge; +class ResourceError; +class ResourceResponse; +class SharedBuffer; +} + +namespace WebKit { + +class Download; +class NetworkLoadParameters; +class NetworkSession; +class PendingDownload; +enum class AuthenticationChallengeDisposition; + +typedef Function<void(const WebCore::ResourceRequest&)> RedirectCompletionHandler; +typedef Function<void(AuthenticationChallengeDisposition, const WebCore::Credential&)> ChallengeCompletionHandler; +typedef Function<void(WebCore::PolicyAction)> ResponseCompletionHandler; + +class NetworkDataTaskClient { +public: + virtual void willPerformHTTPRedirection(WebCore::ResourceResponse&&, WebCore::ResourceRequest&&, RedirectCompletionHandler&&) = 0; + virtual void didReceiveChallenge(const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler&&) = 0; + virtual void didReceiveResponseNetworkSession(WebCore::ResourceResponse&&, ResponseCompletionHandler&&) = 0; + virtual void didReceiveData(Ref<WebCore::SharedBuffer>&&) = 0; + virtual void didCompleteWithError(const WebCore::ResourceError&) = 0; + virtual void didSendData(uint64_t totalBytesSent, uint64_t totalBytesExpectedToSend) = 0; + virtual void wasBlocked() = 0; + virtual void cannotShowURL() = 0; + + virtual ~NetworkDataTaskClient() { } +}; + +class NetworkDataTask : public RefCounted<NetworkDataTask> { +public: + static Ref<NetworkDataTask> create(NetworkSession&, NetworkDataTaskClient&, const NetworkLoadParameters&); + + virtual ~NetworkDataTask(); + + virtual void suspend() = 0; + virtual void cancel() = 0; + virtual void resume() = 0; + virtual void invalidateAndCancel() = 0; + + void didReceiveResponse(WebCore::ResourceResponse&&, ResponseCompletionHandler&&); + + enum class State { + Running, + Suspended, + Canceling, + Completed + }; + virtual State state() const = 0; + + NetworkDataTaskClient* client() const { return m_client; } + void clearClient() { m_client = nullptr; } + + DownloadID pendingDownloadID() const { return m_pendingDownloadID; } + PendingDownload* pendingDownload() const { return m_pendingDownload; } + void setPendingDownloadID(DownloadID downloadID) + { + ASSERT(!m_pendingDownloadID.downloadID()); + ASSERT(downloadID.downloadID()); + m_pendingDownloadID = downloadID; + } + void setPendingDownload(PendingDownload& pendingDownload) + { + ASSERT(!m_pendingDownload); + m_pendingDownload = &pendingDownload; + } + + virtual void setPendingDownloadLocation(const String& filename, const SandboxExtension::Handle&, bool /*allowOverwrite*/) { m_pendingDownloadLocation = filename; } + const String& pendingDownloadLocation() const { return m_pendingDownloadLocation; } + bool isDownload() const { return !!m_pendingDownloadID.downloadID(); } + + const WebCore::ResourceRequest& firstRequest() const { return m_firstRequest; } + virtual String suggestedFilename() const { return String(); } + void setSuggestedFilename(const String& suggestedName) { m_suggestedFilename = suggestedName; } + virtual bool allowsSpecificHTTPSCertificateForHost(const WebCore::AuthenticationChallenge&) { return false; } + const String& partition() { return m_partition; } + +protected: + NetworkDataTask(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, WebCore::StoredCredentials, bool shouldClearReferrerOnHTTPSToHTTPRedirect); + + enum FailureType { + NoFailure, + BlockedFailure, + InvalidURLFailure + }; + void failureTimerFired(); + void scheduleFailure(FailureType); + + FailureType m_scheduledFailureType { NoFailure }; + WebCore::Timer m_failureTimer; + Ref<NetworkSession> m_session; + NetworkDataTaskClient* m_client { nullptr }; + PendingDownload* m_pendingDownload { nullptr }; + DownloadID m_pendingDownloadID; + String m_user; + String m_password; + String m_partition; +#if USE(CREDENTIAL_STORAGE_WITH_NETWORK_SESSION) + WebCore::Credential m_initialCredential; +#endif + WebCore::StoredCredentials m_storedCredentials { WebCore::DoNotAllowStoredCredentials }; + String m_lastHTTPMethod; + String m_pendingDownloadLocation; + WebCore::ResourceRequest m_firstRequest; + bool m_shouldClearReferrerOnHTTPSToHTTPRedirect { true }; + String m_suggestedFilename; +}; + +} // namespace WebKit + +#endif // USE(NETWORK_SESSION) |