Index: content/browser/service_worker/service_worker_controllee_url_loader_factory.h |
diff --git a/content/browser/service_worker/service_worker_controllee_url_loader_factory.h b/content/browser/service_worker/service_worker_controllee_url_loader_factory.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9ecae84dab45ed21613ec5b9ed1985aad16bc9fd |
--- /dev/null |
+++ b/content/browser/service_worker/service_worker_controllee_url_loader_factory.h |
@@ -0,0 +1,133 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_CONTROLLEE_URL_LOADER_FACTORY_H_ |
+#define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_CONTROLLEE_URL_LOADER_FACTORY_H_ |
+ |
+#include "content/browser/service_worker/service_worker_fetch_dispatcher.h" |
+#include "content/browser/service_worker/service_worker_version.h" |
+#include "content/common/service_worker/service_worker_types.h" |
+#include "content/common/url_loader_factory.mojom.h" |
+#include "storage/browser/blob/blob_reader.h" |
+ |
+namespace content { |
+ |
+class ServiceWorkerControlleeURLLoaderFactory : public mojom::URLLoaderFactory { |
+ public: |
+ class CONTENT_EXPORT Delegate { |
+ public: |
+ virtual ~Delegate() {} |
+ |
+ virtual ServiceWorkerVersion* GetServiceWorkerVersion( |
+ ServiceWorkerMetrics::URLRequestJobResult* result) = 0; |
+ }; |
+ |
+ ServiceWorkerControlleeURLLoaderFactory( |
+ std::unique_ptr<ServiceWorkerRequestHandler> handler, |
+ const std::string& client_id, |
+ base::WeakPtr<storage::BlobStorageContext> blob_storage_context, |
+ const ResourceContext* resource_context, |
+ FetchRequestMode request_mode, |
+ FetchCredentialsMode credentials_mode, |
+ FetchRedirectMode redirect_mode, |
+ ResourceType resource_type, |
+ RequestContextType request_context_type, |
+ RequestContextFrameType frame_type, |
+ scoped_refptr<ResourceRequestBodyImpl> body, |
+ ServiceWorkerFetchType fetch_type, |
+ const base::Optional<base::TimeDelta>& timeout, |
+ Delegate* delegate, |
+ NetworkFallbackCallback network_fallback_callback) |
+ : handler_(std::move(handler)), |
+ response_type_(ResponseType::kNotDetermined), |
+ client_id_(client_id), |
+ blob_storage_context_(blob_storage_context), |
+ resource_context_(resource_context), |
+ request_mode_(request_mode), |
+ credentials_mode_(credentials_mode), |
+ redirect_mode_(redirect_mode), |
+ resource_type_(resource_type), |
+ request_context_type_(request_context_type), |
+ frame_type_(frame_type), |
+ body_(body), |
+ fetch_type_(fetch_type), |
+ timeout_(timeout), |
+ delegate_(delegate), |
+ network_fallback_callback_(network_fallback_callback), |
+ weak_factory_(this) {} |
+ ~ServiceWorkerControlleeURLLoaderFactory() override; |
+ |
+ void CreateLoaderAndStart(mojom::URLLoaderAssociatedRequest request, |
+ int32_t routing_id, |
+ int32_t request_id, |
+ uint32_t options, |
+ const ResourceRequest& url_request, |
+ mojom::URLLoaderClientPtr client) override; |
+ void SyncLoad(int32_t routing_id, |
+ int32_t request_id, |
+ const ResourceRequest& request, |
+ SyncLoadCallback callback) override; |
+ |
+ void FallbackToNetwork(); |
+ bool ShouldFallbackToNetwork(); |
+ ui::PageTransition GetPageTransition(); |
+ size_t GetURLChainSize(); |
+ void ForwardToServiceWorker(); |
+ void FallbackToNetworkOrRenderer(); |
+ void FailToNetworkOrRenderer(); |
+ void FailDueToLostController(); |
+ bool WasCanceled() const; |
+ |
+ private: |
+ std::unique_ptr<ServiceWorkerFetchRequest> CreateFetchRequest(); |
+ void StartRequest(); |
+ |
+ // For kForwardToServiceWorker case. |
+ void DidPrepareFetchEvent(scoped_refptr<ServiceWorkerVersion> version); |
+ void DidDispatchFetchEvent( |
+ ServiceWorkerStatusCode status, |
+ ServiceWorkerFetchEventResult fetch_result, |
+ const ServiceWorkerResponse& response, |
+ blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream, |
+ const scoped_refptr<ServiceWorkerVersion>& version); |
+ void AfterRead(scoped_refptr<net::IOBuffer> buffer, int bytes); |
+ |
+ enum class ResponseType { |
+ kNotDetermined, |
+ kFailDueToLostController, |
+ kFallbackToNetwork, |
+ kFallbackToRenderer, // Use this when falling back with CORS check |
+ kForwardToServiceWorker, |
+ }; |
+ ResponseType response_type_; |
+ |
+ mojom::URLLoaderAssociatedRequest request_; |
+ ResourceRequest url_request_; |
+ mojom::URLLoaderClientPtr client_; |
+ |
+ std::unique_ptr<ServiceWorkerRequestHandler> handler_; |
+ std::unique_ptr<ServiceWorkerFetchDispatcher> fetch_dispatcher_; |
+ std::string client_id_; |
+ base::WeakPtr<storage::BlobStorageContext> blob_storage_context_; |
+ const ResourceContext* resource_context_; |
+ FetchRequestMode request_mode_; |
+ FetchCredentialsMode credentials_mode_; |
+ FetchRedirectMode redirect_mode_; |
+ const ResourceType resource_type_; |
+ RequestContextType request_context_type_; |
+ RequestContextFrameType frame_type_; |
+ scoped_refptr<ResourceRequestBodyImpl> body_; |
+ ServiceWorkerFetchType fetch_type_; |
+ base::Optional<base::TimeDelta> timeout_; |
+ Delegate* delegate_; |
+ std::unique_ptr<storage::BlobReader> blob_reader_; |
+ mojo::DataPipe data_pipe_; |
+ NetworkFallbackCallback network_fallback_callback_; |
+ |
+ base::WeakPtrFactory<ServiceWorkerControlleeURLLoaderFactory> weak_factory_; |
+}; |
+ |
+} // namespace content |
+ |
+#endif // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_CONTROLLEE_URL_LOADER_FACTORY_H_ |