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