// Copyright (c) 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_APPCACHE_APPCACHE_JOB_H_ #define CONTENT_BROWSER_APPCACHE_APPCACHE_JOB_H_ #include #include "base/logging.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "base/strings/string16.h" #include "content/common/content_export.h" #include "net/http/http_byte_range.h" #include "url/gurl.h" namespace net { class HttpRequestHeaders; class HttpResponseInfo; class URLRequestJob; } namespace content { class AppCacheEntry; class AppCacheResponseInfo; class AppCacheResponseReader; class AppCacheURLLoaderJob; class AppCacheURLRequestJob; // Interface for an AppCache job. This is used to send data stored in the // AppCache to networking consumers. // Subclasses implement this interface to wrap custom job objects like // URLRequestJob, URLLoaderJob, etc to ensure that these dependencies stay out // of the AppCache code. class CONTENT_EXPORT AppCacheJob { public: enum class DeliveryType { kAwaitingDeliverCall, kAppCached, kNetwork, kError, }; virtual ~AppCacheJob(); // True if the job was started. virtual bool IsStarted() const = 0; // True if the job is waiting for instructions. bool IsWaiting() const { return delivery_type_ == DeliveryType::kAwaitingDeliverCall; } // True if the job is delivering a response from the cache. bool IsDeliveringAppCacheResponse() const { return delivery_type_ == DeliveryType::kAppCached; } // Returns true if the job is delivering a response from the network. bool IsDeliveringNetworkResponse() const { return delivery_type_ == DeliveryType::kNetwork; } // Returns true if the job is delivering an error response. bool IsDeliveringErrorResponse() const { return delivery_type_ == DeliveryType::kError; } // Returns true if the cache entry was not found in the cache. bool IsCacheEntryNotFound() const { return cache_entry_not_found_; } // Informs the job of what response it should deliver. Only one of these // methods should be called, and only once per job. A job will sit idle and // wait indefinitely until one of the deliver methods is called. virtual void DeliverAppCachedResponse(const GURL& manifest_url, int64_t cache_id, const AppCacheEntry& entry, bool is_fallback) = 0; // Informs the job that it should deliver the response from the network. This // is generally controlled by the entries in the manifest file. virtual void DeliverNetworkResponse() = 0; // Informs the job that it should deliver an error response. virtual void DeliverErrorResponse() = 0; // Returns a weak pointer reference to the job. virtual base::WeakPtr GetWeakPtr() = 0; // Returns the underlying AppCacheURLRequestJob if any. This only applies to // AppCaches loaded via the URLLoader mechanism. virtual AppCacheURLRequestJob* AsURLRequestJob(); // Returns the underlying ApppCacheURLLoaderJob if any. This only applies to // AppCaches loaded via the URLRequest mechanism. virtual AppCacheURLLoaderJob* AsURLLoaderJob(); void set_delivery_type(DeliveryType delivery_type) { delivery_type_ = delivery_type; } protected: AppCacheJob(); bool is_range_request() const { return range_requested_.IsValid(); } void InitializeRangeRequestInfo(const net::HttpRequestHeaders& headers); void SetupRangeResponse(); SEQUENCE_CHECKER(sequence_checker_); // Set to true if the AppCache entry is not found. bool cache_entry_not_found_; // The jobs delivery status. DeliveryType delivery_type_; // Byte range request if any. net::HttpByteRange range_requested_; std::unique_ptr range_response_info_; // The response details. scoped_refptr info_; // Used to read the cache. std::unique_ptr reader_; DISALLOW_COPY_AND_ASSIGN(AppCacheJob); }; } // namespace content #endif // CONTENT_BROWSER_APPCACHE_APPCACHE_JOB_H_