summaryrefslogtreecommitdiff
path: root/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/NetworkProcess/NetworkResourceLoader.h')
-rw-r--r--Source/WebKit2/NetworkProcess/NetworkResourceLoader.h199
1 files changed, 85 insertions, 114 deletions
diff --git a/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h b/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h
index 7b69a5911..fe93ee054 100644
--- a/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h
+++ b/Source/WebKit2/NetworkProcess/NetworkResourceLoader.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2012-2015 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -26,174 +26,145 @@
#ifndef NetworkResourceLoader_h
#define NetworkResourceLoader_h
-#if ENABLE(NETWORK_PROCESS)
-
-#include "HostRecord.h"
+#include "DownloadID.h"
#include "MessageSender.h"
#include "NetworkConnectionToWebProcessMessages.h"
+#include "NetworkLoadClient.h"
+#include "NetworkResourceLoadParameters.h"
#include "ShareableResource.h"
-#include <WebCore/ResourceHandleClient.h>
-#include <WebCore/ResourceLoaderOptions.h>
-#include <WebCore/ResourceRequest.h>
-#include <wtf/MainThread.h>
-#include <wtf/RunLoop.h>
-
-typedef const struct _CFCachedURLResponse* CFCachedURLResponseRef;
+#include <WebCore/Timer.h>
namespace WebCore {
-class ResourceBuffer;
-class ResourceHandle;
+class BlobDataFileReference;
class ResourceRequest;
}
namespace WebKit {
class NetworkConnectionToWebProcess;
-class NetworkLoaderClient;
-class NetworkResourceLoadParameters;
-class RemoteNetworkingContext;
+class NetworkLoad;
class SandboxExtension;
-class NetworkResourceLoader : public RefCounted<NetworkResourceLoader>, public WebCore::ResourceHandleClient, public IPC::MessageSender {
+namespace NetworkCache {
+class Entry;
+}
+
+class NetworkResourceLoader final : public RefCounted<NetworkResourceLoader>, public NetworkLoadClient, public IPC::MessageSender {
public:
- static RefPtr<NetworkResourceLoader> create(const NetworkResourceLoadParameters& parameters, NetworkConnectionToWebProcess* connection)
+ static Ref<NetworkResourceLoader> create(const NetworkResourceLoadParameters& parameters, NetworkConnectionToWebProcess& connection, RefPtr<Messages::NetworkConnectionToWebProcess::PerformSynchronousLoad::DelayedReply>&& reply = nullptr)
{
- return adoptRef(new NetworkResourceLoader(parameters, connection, nullptr));
+ return adoptRef(*new NetworkResourceLoader(parameters, connection, WTFMove(reply)));
}
-
- static RefPtr<NetworkResourceLoader> create(const NetworkResourceLoadParameters& parameters, NetworkConnectionToWebProcess* connection, PassRefPtr<Messages::NetworkConnectionToWebProcess::PerformSynchronousLoad::DelayedReply> reply)
- {
- return adoptRef(new NetworkResourceLoader(parameters, connection, reply));
- }
- ~NetworkResourceLoader();
+ virtual ~NetworkResourceLoader();
- NetworkConnectionToWebProcess* connectionToWebProcess() const { return m_connection.get(); }
+ const WebCore::ResourceRequest& originalRequest() const { return m_parameters.request; }
- WebCore::ResourceLoadPriority priority() { return m_priority; }
- WebCore::ResourceRequest& request() { return m_request; }
-
- WebCore::ResourceHandle* handle() const { return m_handle.get(); }
- void didConvertHandleToDownload();
+ NetworkLoad* networkLoad() const { return m_networkLoad.get(); }
void start();
void abort();
- // ResourceHandleClient methods
- virtual void willSendRequestAsync(WebCore::ResourceHandle*, const WebCore::ResourceRequest&, const WebCore::ResourceResponse& redirectResponse) override;
- virtual void didSendData(WebCore::ResourceHandle*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override;
- virtual void didReceiveResponseAsync(WebCore::ResourceHandle*, const WebCore::ResourceResponse&) override;
- virtual void didReceiveData(WebCore::ResourceHandle*, const char*, unsigned, int encodedDataLength) override;
- virtual void didReceiveBuffer(WebCore::ResourceHandle*, PassRefPtr<WebCore::SharedBuffer>, int encodedDataLength) override;
- virtual void didFinishLoading(WebCore::ResourceHandle*, double finishTime) override;
- virtual void didFail(WebCore::ResourceHandle*, const WebCore::ResourceError&) override;
- virtual void wasBlocked(WebCore::ResourceHandle*) override;
- virtual void cannotShowURL(WebCore::ResourceHandle*) override;
- virtual bool shouldUseCredentialStorage(WebCore::ResourceHandle*) override;
- virtual void shouldUseCredentialStorageAsync(WebCore::ResourceHandle*) override;
- virtual void didReceiveAuthenticationChallenge(WebCore::ResourceHandle*, const WebCore::AuthenticationChallenge&) override;
- virtual void didCancelAuthenticationChallenge(WebCore::ResourceHandle*, const WebCore::AuthenticationChallenge&) override;
- virtual void receivedCancellation(WebCore::ResourceHandle*, const WebCore::AuthenticationChallenge&) override;
- virtual bool usesAsyncCallbacks() override { return true; }
-
-#if USE(PROTECTION_SPACE_AUTH_CALLBACK)
- virtual void canAuthenticateAgainstProtectionSpaceAsync(WebCore::ResourceHandle*, const WebCore::ProtectionSpace&) override;
-#endif
-
-#if USE(NETWORK_CFDATA_ARRAY_CALLBACK)
- virtual bool supportsDataArray() override;
- virtual void didReceiveDataArray(WebCore::ResourceHandle*, CFArrayRef) override;
-#endif
-
-#if PLATFORM(MAC)
- static size_t fileBackedResourceMinimumSize();
-#if !PLATFORM(IOS)
- virtual void willCacheResponseAsync(WebCore::ResourceHandle*, NSCachedURLResponse *) override;
- virtual void willStopBufferingData(WebCore::ResourceHandle*, const char*, unsigned) override;
-#endif
-#endif // PLATFORM(MAC)
+ void setDefersLoading(bool);
// Message handlers.
- void didReceiveNetworkResourceLoaderMessage(IPC::Connection*, IPC::MessageDecoder&);
+ void didReceiveNetworkResourceLoaderMessage(IPC::Connection&, IPC::Decoder&);
-#if PLATFORM(IOS) || (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090)
- static void tryGetShareableHandleFromCFURLCachedResponse(ShareableResource::Handle&, CFCachedURLResponseRef);
+#if USE(PROTECTION_SPACE_AUTH_CALLBACK)
+ void continueCanAuthenticateAgainstProtectionSpace(bool);
#endif
+ void continueWillSendRequest(WebCore::ResourceRequest&& newRequest);
- bool isSynchronous() const;
- bool isLoadingMainResource() const { return m_isLoadingMainResource; }
-
- void setHostRecord(HostRecord* hostRecord) { ASSERT(isMainThread()); m_hostRecord = hostRecord; }
- HostRecord* hostRecord() const { ASSERT(isMainThread()); return m_hostRecord.get(); }
+ WebCore::SharedBuffer* bufferedData() { return m_bufferedData.get(); }
+ const WebCore::ResourceResponse& response() const { return m_response; }
- template<typename T>
- bool sendAbortingOnFailure(T&& message, unsigned messageSendFlags = 0)
- {
- bool result = messageSenderConnection()->send(std::forward<T>(message), messageSenderDestinationID(), messageSendFlags);
- if (!result)
- abort();
- return result;
- }
+ NetworkConnectionToWebProcess& connectionToWebProcess() { return m_connection; }
+ WebCore::SessionID sessionID() const { return m_parameters.sessionID; }
+ ResourceLoadIdentifier identifier() const { return m_parameters.identifier; }
+ uint64_t frameID() const { return m_parameters.webFrameID; }
+ uint64_t pageID() const { return m_parameters.webPageID; }
+ struct SynchronousLoadData;
+ // NetworkLoadClient.
+ void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override;
#if USE(PROTECTION_SPACE_AUTH_CALLBACK)
- void continueCanAuthenticateAgainstProtectionSpace(bool);
+ void canAuthenticateAgainstProtectionSpaceAsync(const WebCore::ProtectionSpace&) override;
#endif
- void continueWillSendRequest(const WebCore::ResourceRequest& newRequest);
+ bool isSynchronous() const override;
+ void willSendRedirectedRequest(WebCore::ResourceRequest&&, WebCore::ResourceRequest&& redirectRequest, WebCore::ResourceResponse&&) override;
+ ShouldContinueDidReceiveResponse didReceiveResponse(WebCore::ResourceResponse&&) override;
+ void didReceiveBuffer(Ref<WebCore::SharedBuffer>&&, int reportedEncodedDataLength) override;
+ void didFinishLoading(double finishTime) override;
+ void didFailLoading(const WebCore::ResourceError&) override;
-#if PLATFORM(IOS) || (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090)
- static void tryGetShareableHandleFromSharedBuffer(ShareableResource::Handle&, WebCore::SharedBuffer*);
-#endif
+ void convertToDownload(DownloadID, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&);
+
+ bool isMainResource() const { return m_parameters.request.requester() == WebCore::ResourceRequest::Requester::Main; }
+ bool isAlwaysOnLoggingAllowed() const;
private:
- NetworkResourceLoader(const NetworkResourceLoadParameters&, NetworkConnectionToWebProcess*, PassRefPtr<Messages::NetworkConnectionToWebProcess::PerformSynchronousLoad::DelayedReply>);
+ NetworkResourceLoader(const NetworkResourceLoadParameters&, NetworkConnectionToWebProcess&, RefPtr<Messages::NetworkConnectionToWebProcess::PerformSynchronousLoad::DelayedReply>&&);
// IPC::MessageSender
- virtual IPC::Connection* messageSenderConnection() override;
- virtual uint64_t messageSenderDestinationID() override { return m_identifier; }
+ IPC::Connection* messageSenderConnection() override;
+ uint64_t messageSenderDestinationID() override { return m_parameters.identifier; }
+
+#if ENABLE(NETWORK_CACHE)
+ bool canUseCache(const WebCore::ResourceRequest&) const;
+ bool canUseCachedRedirect(const WebCore::ResourceRequest&) const;
+
+ void tryStoreAsCacheEntry();
+ void retrieveCacheEntry(const WebCore::ResourceRequest&);
+ void didRetrieveCacheEntry(std::unique_ptr<NetworkCache::Entry>);
+ void sendResultForCacheEntry(std::unique_ptr<NetworkCache::Entry>);
+ void validateCacheEntry(std::unique_ptr<NetworkCache::Entry>);
+ void dispatchWillSendRequestForCacheEntry(std::unique_ptr<NetworkCache::Entry>);
+#endif
+ void startNetworkLoad(const WebCore::ResourceRequest&);
void continueDidReceiveResponse();
void cleanup();
void platformDidReceiveResponse(const WebCore::ResourceResponse&);
+ void startBufferingTimerIfNeeded();
+ void bufferingTimerFired();
+ void sendBuffer(WebCore::SharedBuffer&, size_t encodedDataLength);
+
void consumeSandboxExtensions();
void invalidateSandboxExtensions();
- RefPtr<RemoteNetworkingContext> m_networkingContext;
- RefPtr<WebCore::ResourceHandle> m_handle;
+ const NetworkResourceLoadParameters m_parameters;
- // Keep the suggested request around while asynchronously asking to update it, because some parts of the request don't survive IPC.
- WebCore::ResourceRequest m_suggestedRequestForWillSendRequest;
+ Ref<NetworkConnectionToWebProcess> m_connection;
- uint64_t m_bytesReceived;
+ std::unique_ptr<NetworkLoad> m_networkLoad;
- bool m_handleConvertedToDownload;
- std::unique_ptr<NetworkLoaderClient> m_networkLoaderClient;
+ WebCore::ResourceResponse m_response;
- ResourceLoadIdentifier m_identifier;
- uint64_t m_webPageID;
- uint64_t m_webFrameID;
- uint64_t m_sessionID;
- WebCore::ResourceRequest m_request;
- WebCore::ResourceLoadPriority m_priority;
- WebCore::ContentSniffingPolicy m_contentSniffingPolicy;
- WebCore::StoredCredentials m_allowStoredCredentials;
- WebCore::ClientCredentialPolicy m_clientCredentialPolicy;
- bool m_shouldClearReferrerOnHTTPSToHTTPRedirect;
- bool m_isLoadingMainResource;
+ size_t m_bytesReceived { 0 };
+ size_t m_bufferedDataEncodedDataLength { 0 };
+ RefPtr<WebCore::SharedBuffer> m_bufferedData;
+ unsigned m_redirectCount { 0 };
- Vector<RefPtr<SandboxExtension>> m_requestBodySandboxExtensions;
- Vector<RefPtr<SandboxExtension>> m_resourceSandboxExtensions;
- bool m_sandboxExtensionsAreConsumed;
+ std::unique_ptr<SynchronousLoadData> m_synchronousLoadData;
+ Vector<RefPtr<WebCore::BlobDataFileReference>> m_fileReferences;
- RefPtr<NetworkConnectionToWebProcess> m_connection;
-
- RefPtr<HostRecord> m_hostRecord;
+ bool m_didConsumeSandboxExtensions { false };
+ bool m_defersLoading { false };
+ bool m_hasReceivedData { false };
+
+ unsigned m_retrievedDerivedDataCount { 0 };
+
+ WebCore::Timer m_bufferingTimer;
+#if ENABLE(NETWORK_CACHE)
+ RefPtr<WebCore::SharedBuffer> m_bufferedDataForCache;
+ std::unique_ptr<NetworkCache::Entry> m_cacheEntryForValidation;
+ bool m_isWaitingContinueWillSendRequestForCachedRedirect { false };
+#endif
};
} // namespace WebKit
-#endif // ENABLE(NETWORK_PROCESS)
-
#endif // NetworkResourceLoader_h