1 // Copyright (c) 2012 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.
5 #ifndef WEBKIT_BROWSER_APPCACHE_APPCACHE_URL_REQUEST_JOB_H_
6 #define WEBKIT_BROWSER_APPCACHE_APPCACHE_URL_REQUEST_JOB_H_
10 #include "base/memory/weak_ptr.h"
11 #include "net/http/http_byte_range.h"
12 #include "net/url_request/url_request_job.h"
13 #include "webkit/browser/appcache/appcache_entry.h"
14 #include "webkit/browser/appcache/appcache_executable_handler.h"
15 #include "webkit/browser/appcache/appcache_response.h"
16 #include "webkit/browser/appcache/appcache_storage.h"
17 #include "webkit/browser/webkit_storage_browser_export.h"
20 class AppCacheRequestHandlerTest
;
21 class AppCacheURLRequestJobTest
;
25 class GrowableIOBuffer
;
32 // A net::URLRequestJob derivative that knows how to return a response stored
34 class WEBKIT_STORAGE_BROWSER_EXPORT AppCacheURLRequestJob
35 : public net::URLRequestJob
,
36 public AppCacheStorage::Delegate
{
38 AppCacheURLRequestJob(net::URLRequest
* request
,
39 net::NetworkDelegate
* network_delegate
,
40 AppCacheStorage
* storage
,
42 bool is_main_resource
);
44 // Informs the job of what response it should deliver. Only one of these
45 // methods should be called, and only once per job. A job will sit idle and
46 // wait indefinitely until one of the deliver methods is called.
47 void DeliverAppCachedResponse(const GURL
& manifest_url
, int64 group_id
,
48 int64 cache_id
, const AppCacheEntry
& entry
,
50 void DeliverNetworkResponse();
51 void DeliverErrorResponse();
53 bool is_waiting() const {
54 return delivery_type_
== AWAITING_DELIVERY_ORDERS
;
57 bool is_delivering_appcache_response() const {
58 return delivery_type_
== APPCACHED_DELIVERY
;
61 bool is_delivering_network_response() const {
62 return delivery_type_
== NETWORK_DELIVERY
;
65 bool is_delivering_error_response() const {
66 return delivery_type_
== ERROR_DELIVERY
;
69 // Accessors for the info about the appcached response, if any,
70 // that this job has been instructed to deliver. These are only
71 // valid to call if is_delivering_appcache_response.
72 const GURL
& manifest_url() const { return manifest_url_
; }
73 int64
group_id() const { return group_id_
; }
74 int64
cache_id() const { return cache_id_
; }
75 const AppCacheEntry
& entry() const { return entry_
; }
77 // net::URLRequestJob's Kill method is made public so the users of this
78 // class in the appcache namespace can call it.
79 virtual void Kill() OVERRIDE
;
81 // Returns true if the job has been started by the net library.
82 bool has_been_started() const {
83 return has_been_started_
;
86 // Returns true if the job has been killed.
87 bool has_been_killed() const {
88 return has_been_killed_
;
91 // Returns true if the cache entry was not found in the disk cache.
92 bool cache_entry_not_found() const {
93 return cache_entry_not_found_
;
97 virtual ~AppCacheURLRequestJob();
100 friend class content::AppCacheRequestHandlerTest
;
101 friend class content::AppCacheURLRequestJobTest
;
104 AWAITING_DELIVERY_ORDERS
,
110 // Returns true if one of the Deliver methods has been called.
111 bool has_delivery_orders() const {
112 return !is_waiting();
115 void MaybeBeginDelivery();
116 void BeginDelivery();
118 // For executable response handling.
119 void BeginExecutableHandlerDelivery();
120 void OnExecutableSourceLoaded(int result
);
121 void InvokeExecutableHandler(AppCacheExecutableHandler
* handler
);
122 void OnExecutableResponseCallback(
123 const AppCacheExecutableHandler::Response
& response
);
124 void BeginErrorDelivery(const char* message
);
126 // AppCacheStorage::Delegate methods
127 virtual void OnResponseInfoLoaded(
128 AppCacheResponseInfo
* response_info
, int64 response_id
) OVERRIDE
;
129 virtual void OnCacheLoaded(AppCache
* cache
, int64 cache_id
) OVERRIDE
;
131 const net::HttpResponseInfo
* http_info() const;
132 bool is_range_request() const { return range_requested_
.IsValid(); }
133 void SetupRangeResponse();
135 // AppCacheResponseReader completion callback
136 void OnReadComplete(int result
);
138 // net::URLRequestJob methods, see url_request_job.h for doc comments
139 virtual void Start() OVERRIDE
;
140 virtual net::LoadState
GetLoadState() const OVERRIDE
;
141 virtual bool GetCharset(std::string
* charset
) OVERRIDE
;
142 virtual void GetResponseInfo(net::HttpResponseInfo
* info
) OVERRIDE
;
143 virtual bool ReadRawData(net::IOBuffer
* buf
,
145 int *bytes_read
) OVERRIDE
;
147 // Sets extra request headers for Job types that support request headers.
148 // This is how we get informed of range-requests.
149 virtual void SetExtraRequestHeaders(
150 const net::HttpRequestHeaders
& headers
) OVERRIDE
;
152 // FilterContext methods
153 virtual bool GetMimeType(std::string
* mime_type
) const OVERRIDE
;
154 virtual int GetResponseCode() const OVERRIDE
;
157 AppCacheStorage
* storage_
;
158 base::TimeTicks start_time_tick_
;
159 bool has_been_started_
;
160 bool has_been_killed_
;
161 DeliveryType delivery_type_
;
165 AppCacheEntry entry_
;
167 bool is_main_resource_
; // Used for histogram logging.
168 bool cache_entry_not_found_
;
169 scoped_refptr
<AppCacheResponseInfo
> info_
;
170 scoped_refptr
<net::GrowableIOBuffer
> handler_source_buffer_
;
171 scoped_ptr
<AppCacheResponseReader
> handler_source_reader_
;
172 net::HttpByteRange range_requested_
;
173 scoped_ptr
<net::HttpResponseInfo
> range_response_info_
;
174 scoped_ptr
<AppCacheResponseReader
> reader_
;
175 scoped_refptr
<AppCache
> cache_
;
176 scoped_refptr
<AppCacheGroup
> group_
;
177 base::WeakPtrFactory
<AppCacheURLRequestJob
> weak_factory_
;
180 } // namespace appcache
182 #endif // WEBKIT_BROWSER_APPCACHE_APPCACHE_REQUEST_HANDLER_H_