1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_REQUEST_HANDLER_H_ 6 #define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_REQUEST_HANDLER_H_ 7 8 #include "base/basictypes.h" 9 #include "base/memory/weak_ptr.h" 10 #include "base/supports_user_data.h" 11 #include "content/common/content_export.h" 12 #include "content/common/service_worker/service_worker_status_code.h" 13 #include "net/url_request/url_request_job_factory.h" 14 #include "webkit/common/resource_type.h" 15 16 namespace net { 17 class NetworkDelegate; 18 class URLRequest; 19 class URLRequestInterceptor; 20 } 21 22 namespace webkit_blob { 23 class BlobStorageContext; 24 } 25 26 namespace content { 27 28 class ServiceWorkerContextCore; 29 class ServiceWorkerContextWrapper; 30 class ServiceWorkerProviderHost; 31 32 // Abstract base class for routing network requests to ServiceWorkers. 33 // Created one per URLRequest and attached to each request. 34 class CONTENT_EXPORT ServiceWorkerRequestHandler 35 : public base::SupportsUserData::Data { 36 public: 37 // Attaches a newly created handler if the given |request| needs to 38 // be handled by ServiceWorker. 39 // TODO(kinuko): While utilizing UserData to attach data to URLRequest 40 // has some precedence, it might be better to attach this handler in a more 41 // explicit way within content layer, e.g. have ResourceRequestInfoImpl 42 // own it. 43 static void InitializeHandler( 44 net::URLRequest* request, 45 ServiceWorkerContextWrapper* context_wrapper, 46 webkit_blob::BlobStorageContext* blob_storage_context, 47 int process_id, 48 int provider_id, 49 ResourceType::Type resource_type); 50 51 // Returns the handler attached to |request|. This may return NULL 52 // if no handler is attached. 53 static ServiceWorkerRequestHandler* GetHandler( 54 net::URLRequest* request); 55 56 // Creates a protocol interceptor for ServiceWorker. 57 static scoped_ptr<net::URLRequestInterceptor> CreateInterceptor(); 58 59 virtual ~ServiceWorkerRequestHandler(); 60 61 // Called via custom URLRequestJobFactory. 62 virtual net::URLRequestJob* MaybeCreateJob( 63 net::URLRequest* request, 64 net::NetworkDelegate* network_delegate) = 0; 65 66 protected: 67 ServiceWorkerRequestHandler( 68 base::WeakPtr<ServiceWorkerContextCore> context, 69 base::WeakPtr<ServiceWorkerProviderHost> provider_host, 70 base::WeakPtr<webkit_blob::BlobStorageContext> blob_storage_context, 71 ResourceType::Type resource_type); 72 73 base::WeakPtr<ServiceWorkerContextCore> context_; 74 base::WeakPtr<ServiceWorkerProviderHost> provider_host_; 75 base::WeakPtr<webkit_blob::BlobStorageContext> blob_storage_context_; 76 ResourceType::Type resource_type_; 77 78 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerRequestHandler); 79 }; 80 81 } // namespace content 82 83 #endif // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_REQUEST_HANDLER_H_ 84