| Index: third_party/WebKit/Source/core/fetch/ResourceFetcher.h
|
| diff --git a/third_party/WebKit/Source/core/fetch/ResourceFetcher.h b/third_party/WebKit/Source/core/fetch/ResourceFetcher.h
|
| index 847ce9e077d904310327c9ab0cf57a979bcff074..1efcf217b32ccb4150e08274316eab9d88064bbc 100644
|
| --- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.h
|
| +++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.h
|
| @@ -37,6 +37,8 @@
|
| #include "platform/Timer.h"
|
| #include "platform/network/ResourceError.h"
|
| #include "platform/network/ResourceLoadPriority.h"
|
| +#include "public/platform/WebURLLoader.h"
|
| +#include "public/platform/WebURLLoaderClient.h"
|
| #include "wtf/HashMap.h"
|
| #include "wtf/HashSet.h"
|
| #include "wtf/ListHashSet.h"
|
| @@ -65,7 +67,7 @@ class ResourceTimingInfo;
|
| // to ResourceFetcher for their lifetime (and will create one if they
|
| // are initialized without a LocalFrame), so a Document can keep a ResourceFetcher
|
| // alive past detach if scripts still reference the Document.
|
| -class CORE_EXPORT ResourceFetcher : public GarbageCollectedFinalized<ResourceFetcher> {
|
| +class CORE_EXPORT ResourceFetcher : public GarbageCollectedFinalized<ResourceFetcher>, private WebURLLoaderClient {
|
| WTF_MAKE_NONCOPYABLE(ResourceFetcher);
|
| USING_PRE_FINALIZER(ResourceFetcher, clearPreloads);
|
| public:
|
| @@ -103,24 +105,40 @@ public:
|
| MHTMLArchive* archive() const { return m_archive.get(); }
|
| ArchiveResource* createArchive(Resource*);
|
|
|
| + bool defersLoading() const;
|
| void setDefersLoading(bool);
|
| + void setDefersLoadingForResource(Resource*, bool);
|
| void stopFetching();
|
| bool isFetching() const;
|
|
|
| - bool willFollowRedirect(Resource*, ResourceRequest&, const ResourceResponse&, int64_t encodedDataLength);
|
| - enum DidFinishLoadingReason {
|
| - DidFinishLoading,
|
| - DidFinishFirstPartInMultipart
|
| - };
|
| - void didFinishLoading(Resource*, double finishTime, int64_t encodedDataLength, DidFinishLoadingReason);
|
| - void didFailLoading(Resource*, const ResourceError&);
|
| - void didReceiveResponse(Resource*, const ResourceResponse&, WebDataConsumerHandle*);
|
| - void didReceiveData(const Resource*, const char* data, int dataLength, int encodedDataLength);
|
| - void didDownloadData(const Resource*, int dataLength, int encodedDataLength);
|
| - bool defersLoading() const;
|
| - bool isControlledByServiceWorker() const;
|
| + // WebURLLoaderClient
|
| + //
|
| + // A succesful load will consist of:
|
| + // 0+ willFollowRedirect()
|
| + // 0+ didSendData()
|
| + // 1 didReceiveResponse()
|
| + // 0-1 didReceiveCachedMetadata()
|
| + // 0+ didReceiveData() or didDownloadData(), but never both
|
| + // 1 didFinishLoading()
|
| + // A failed load is indicated by 1 didFail(), which can occur at any time
|
| + // before didFinishLoading(), including synchronously inside one of the other
|
| + // callbacks.
|
| + void willFollowRedirect(WebURLLoader*, WebURLRequest&, const WebURLResponse& redirectResponse, int64_t encodedDataLength) override;
|
| + void didSendData(WebURLLoader*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override;
|
| + void didReceiveResponse(WebURLLoader*, const WebURLResponse&) override;
|
| + void didReceiveResponse(WebURLLoader*, const WebURLResponse&, WebDataConsumerHandle*) override;
|
| + void didReceiveCachedMetadata(WebURLLoader*, const char* data, int length) override;
|
| + void didReceiveData(WebURLLoader*, const char*, int, int encodedDataLength, int encodedBodyLength) override;
|
| + void didDownloadData(WebURLLoader*, int, int) override;
|
| + void didFinishLoading(WebURLLoader*, double finishTime, int64_t encodedDataLength) override;
|
| + void didFail(WebURLLoader*, const WebURLError&) override;
|
| +
|
| + void didFinishLoadingFirstPartInMultipart(Resource*);
|
| + void cancelResourceLoad(Resource*);
|
| +
|
| + WebURLLoader* loaderForResource(Resource* resource) { return m_resourcesInProgress.get(resource); }
|
|
|
| - void acceptDataFromThreadedReceiver(unsigned long identifier, const char* data, int dataLength, int encodedDataLength);
|
| + bool isControlledByServiceWorker() const;
|
|
|
| enum ResourceLoadStartType {
|
| ResourceLoadingFromNetwork,
|
| @@ -152,14 +170,18 @@ private:
|
| ResourceLoadPriority computeLoadPriority(Resource::Type, const FetchRequest&, ResourcePriority::VisibilityStatus);
|
|
|
| Resource* resourceForStaticData(const FetchRequest&, const ResourceFactory&, const SubstituteData&);
|
| + void requestSynchronously(WebURLLoader*, Resource*, const ResourceRequest&);
|
| + bool canFollowRedirect(Resource*, ResourceRequest&, const ResourceResponse&);
|
| + void didFinishLoading(Resource*, double finishTime, int64_t encodedDataLength);
|
|
|
| // RevalidationPolicy enum values are used in UMAs https://crbug.com/579496.
|
| enum RevalidationPolicy { Use, Revalidate, Reload, Load };
|
| RevalidationPolicy determineRevalidationPolicy(Resource::Type, const FetchRequest&, Resource* existingResource, bool isStaticData) const;
|
|
|
| + void startRequestForResource(Resource*, const ResourceRequest&);
|
| + Resource* resourceForLoader(WebURLLoader*);
|
| void moveCachedNonBlockingResourceToBlocking(Resource*, const FetchRequest&);
|
| - void moveResourceLoaderToNonBlocking(ResourceLoader*);
|
| - void removeResourceLoader(ResourceLoader*);
|
| + void removeLoader(WebURLLoader*, Resource*);
|
|
|
| void initializeResourceRequest(ResourceRequest&, Resource::Type, FetchRequest::DeferOption);
|
| void willSendRequest(unsigned long identifier, ResourceRequest&, const ResourceResponse&, const ResourceLoaderOptions&);
|
| @@ -189,8 +211,9 @@ private:
|
|
|
| Vector<std::unique_ptr<ResourceTimingInfo>> m_scheduledResourceTimingReports;
|
|
|
| - HeapHashSet<Member<ResourceLoader>> m_loaders;
|
| - HeapHashSet<Member<ResourceLoader>> m_nonBlockingLoaders;
|
| + HeapHashMap<WebURLLoader*, Member<Resource>> m_loaders;
|
| + HeapHashMap<WebURLLoader*, Member<Resource>> m_nonBlockingLoaders;
|
| + HeapHashMap<Member<Resource>, std::unique_ptr<WebURLLoader>> m_resourcesInProgress;
|
|
|
| // Used in hit rate histograms.
|
| class DeadResourceStatsRecorder {
|
|
|