appcache_request_handler.h revision 116680a4aac90f2aa7413d9095a592090648e557
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef CONTENT_BROWSER_APPCACHE_APPCACHE_REQUEST_HANDLER_H_ 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define CONTENT_BROWSER_APPCACHE_APPCACHE_REQUEST_HANDLER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/supports_user_data.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache_entry.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache_host.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/common/content_export.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/resource_type.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkDelegate; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequest; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestJob; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace content { 22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass AppCacheRequestHandlerTest; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AppCacheURLRequestJob; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An instance is created for each net::URLRequest. The instance survives all 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http transactions involved in the processing of its net::URLRequest, and is 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// given the opportunity to hijack the request along the way. Callers 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// should use AppCacheHost::CreateRequestHandler to manufacture instances 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that can retrieve resources for a particular host. 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass CONTENT_EXPORT AppCacheRequestHandler 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::SupportsUserData::Data, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public AppCacheHost::Observer, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public AppCacheStorage::Delegate { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~AppCacheRequestHandler(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These are called on each request intercept opportunity. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheURLRequestJob* MaybeLoadResource( 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, net::NetworkDelegate* network_delegate); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheURLRequestJob* MaybeLoadFallbackForRedirect( 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetworkDelegate* network_delegate, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& location); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheURLRequestJob* MaybeLoadFallbackForResponse( 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, net::NetworkDelegate* network_delegate); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetExtraResponseInfo(int64* cache_id, GURL* manifest_url); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Methods to support cross site navigations. 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void PrepareForCrossSiteTransfer(int old_process_id); 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void CompleteCrossSiteTransfer(int new_process_id, int new_host_id); 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool IsMainResourceType(ResourceType::Type type) { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ResourceType::IsFrame(type) || 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceType::IsSharedWorker(type); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class AppCacheHost; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callers should use AppCacheHost::CreateRequestHandler. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheRequestHandler(AppCacheHost* host, ResourceType::Type resource_type); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AppCacheHost::Observer override 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnDestructionImminent(AppCacheHost* host) OVERRIDE; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helpers to instruct a waiting job with what response to 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // deliver for the request we're handling. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeliverAppCachedResponse(const AppCacheEntry& entry, int64 cache_id, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 group_id, const GURL& manifest_url, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fallback, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& namespace_entry_url); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeliverNetworkResponse(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeliverErrorResponse(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper to retrieve a pointer to the storage object. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheStorage* storage() const; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_resource() const { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IsMainResourceType(resource_type_); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Main-resource loading ------------------------------------- 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Frame and SharedWorker main resources are handled here. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MaybeLoadMainResource(net::URLRequest* request, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetworkDelegate* network_delegate); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AppCacheStorage::Delegate methods 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnMainResponseFound( 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, const AppCacheEntry& entry, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& fallback_url, const AppCacheEntry& fallback_entry, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 cache_id, int64 group_id, const GURL& mainfest_url) OVERRIDE; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sub-resource loading ------------------------------------- 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dedicated worker and all manner of sub-resources are handled here. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MaybeLoadSubResource(net::URLRequest* request, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetworkDelegate* network_delegate); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ContinueMaybeLoadSubResource(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AppCacheHost::Observer override 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCacheSelectionComplete(AppCacheHost* host) OVERRIDE; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Data members ----------------------------------------------- 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // What host we're servicing a request for. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheHost* host_; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Frame vs subresource vs sharedworker loads are somewhat different. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceType::Type resource_type_; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Subresource requests wait until after cache selection completes. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_waiting_for_cache_selection_; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Info about the type of response we found for delivery. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These are relevant for both main and subresource requests. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 found_group_id_; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 found_cache_id_; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheEntry found_entry_; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppCacheEntry found_fallback_entry_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL found_namespace_entry_url_; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL found_manifest_url_; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool found_network_namespace_; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if a cache entry this handler attempted to return was 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not found in the disk cache. Once set, the handler will take 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // no action on all subsequent intercept opportunities, so the 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // request and any redirects will be handled by the network library. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool cache_entry_not_found_; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if this->MaybeLoadResource(...) has been called in the past. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool maybe_load_resource_executed_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The job we use to deliver a response. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<AppCacheURLRequestJob> job_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // During a cross site navigation, we transfer ownership the AppcacheHost 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // from the old processes structures over to the new structures. 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<AppCacheHost> host_for_cross_site_transfer_; 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 142c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch friend class content::AppCacheRequestHandlerTest; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AppCacheRequestHandler); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace content 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif // CONTENT_BROWSER_APPCACHE_APPCACHE_REQUEST_HANDLER_H_ 149