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