1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_WRITE_TO_CACHE_JOB_H_ 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_WRITE_TO_CACHE_JOB_H_ 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <string> 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/weak_ptr.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/service_worker/service_worker_disk_cache.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/service_worker/service_worker_version.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/common/content_export.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/common/service_worker/service_worker_status_code.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/common/service_worker/service_worker_types.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/resource_type.h" 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/url_request/url_request.h" 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/url_request/url_request_job.h" 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace content { 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ServiceWorkerContextCore; 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ServiceWorkerResponseWriter; 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ServiceWorkerVersions; 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// A URLRequestJob derivative used to cache the main script 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// and its imports during the initial install of a new version. 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Another separate URLRequest is started which will perform 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// a network fetch. The response produced for that separate 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// request is written to the service worker script cache and piped 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// to the consumer of the ServiceWorkerWriteToCacheJob for delivery 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// to the renderer process housing the worker. 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class CONTENT_EXPORT ServiceWorkerWriteToCacheJob 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : public net::URLRequestJob, 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public net::URLRequest::Delegate { 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ServiceWorkerWriteToCacheJob( 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::URLRequest* request, 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::NetworkDelegate* network_delegate, 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ResourceType resource_type, 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::WeakPtr<ServiceWorkerContextCore> context, 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ServiceWorkerVersion* version, 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int extra_load_flags, 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int64 response_id); 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ServiceWorkerContextRequestHandlerTest, 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) UpdateBefore24Hours); 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ServiceWorkerContextRequestHandlerTest, 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) UpdateAfter24Hours); 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~ServiceWorkerWriteToCacheJob(); 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // net::URLRequestJob overrides 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void Start() OVERRIDE; 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void Kill() OVERRIDE; 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual net::LoadState GetLoadState() const OVERRIDE; 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool GetCharset(std::string* charset) OVERRIDE; 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool GetMimeType(std::string* mime_type) const OVERRIDE; 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void GetResponseInfo(net::HttpResponseInfo* info) OVERRIDE; 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual int GetResponseCode() const OVERRIDE; 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void SetExtraRequestHeaders( 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const net::HttpRequestHeaders& headers) OVERRIDE; 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool ReadRawData(net::IOBuffer* buf, 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int buf_size, 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int *bytes_read) OVERRIDE; 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const net::HttpResponseInfo* http_info() const; 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Methods to drive the net request forward and 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // write data to the disk cache. 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void InitNetRequest(int extra_load_flags); 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void StartNetRequest(); 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::URLRequestStatus ReadNetData( 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::IOBuffer* buf, 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int buf_size, 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int *bytes_read); 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void WriteHeadersToCache(); 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnWriteHeadersComplete(int result); 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void WriteDataToCache(int bytes_to_write); 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnWriteDataComplete(int result); 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // net::URLRequest::Delegate overrides that observe the net request. 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnReceivedRedirect( 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::URLRequest* request, 866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const net::RedirectInfo& redirect_info, 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool* defer_redirect) OVERRIDE; 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnAuthRequired( 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::URLRequest* request, 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::AuthChallengeInfo* auth_info) OVERRIDE; 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnCertificateRequested( 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::URLRequest* request, 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::SSLCertRequestInfo* cert_request_info) OVERRIDE; 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnSSLCertificateError( 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::URLRequest* request, 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const net::SSLInfo& ssl_info, 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool fatal) OVERRIDE; 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnBeforeNetworkStart( 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::URLRequest* request, 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool* defer) OVERRIDE; 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnResponseStarted(net::URLRequest* request) OVERRIDE; 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void OnReadCompleted( 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::URLRequest* request, 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int bytes_read) OVERRIDE; 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void AsyncNotifyDoneHelper(const net::URLRequestStatus& status); 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ResourceType resource_type_; // Differentiate main script and imports 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<net::IOBuffer> io_buffer_; 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<HttpResponseInfoIOBuffer> info_buffer_; 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::WeakPtr<ServiceWorkerContextCore> context_; 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL url_; 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int64 response_id_; 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<net::URLRequest> net_request_; 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<net::HttpResponseInfo> http_info_; 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<ServiceWorkerResponseWriter> writer_; 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<ServiceWorkerVersion> version_; 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool has_been_killed_; 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool did_notify_started_; 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool did_notify_finished_; 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::WeakPtrFactory<ServiceWorkerWriteToCacheJob> weak_factory_; 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ServiceWorkerWriteToCacheJob); 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace content 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_WRITE_TO_CACHE_JOB_H_ 129