15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is the browser side of the resource dispatcher, it receives requests
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from the child process (i.e. [Renderer, Plugin, Worker]ProcessHost), and
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dispatches them to URLRequests. It then forwards the messages from the
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLRequests back to the correct process for handling.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://dev.chromium.org/developers/design-documents/multi-process-resource-loading
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CONTENT_BROWSER_LOADER_RESOURCE_DISPATCHER_HOST_IMPL_H_
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CONTENT_BROWSER_LOADER_RESOURCE_DISPATCHER_HOST_IMPL_H_
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/observer_list.h"
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/download/download_resource_handler.h"
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/loader/global_routing_id.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_loader.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_loader_delegate.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/resource_scheduler.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h"
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/common/resource_request_body.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/child_process_data.h"
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/browser/download_item.h"
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/browser/download_url_parameters.h"
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/global_request_id.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_dispatcher_host.h"
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/resource_type.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/canonical_cookie.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceHandler;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ResourceHostMsg_Request;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestJobFactory;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShareableFileReference;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceContext;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceDispatcherHostDelegate;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceMessageDelegate;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceMessageFilter;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceRequestInfoImpl;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SaveFileManager;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContentsImpl;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct DownloadSaveInfo;
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstruct NavigationRequestInfo;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Referrer;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT ResourceDispatcherHostImpl
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public ResourceDispatcherHost,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public ResourceLoaderDelegate {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceDispatcherHostImpl();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ResourceDispatcherHostImpl();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the current ResourceDispatcherHostImpl. May return NULL if it
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hasn't been created yet.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ResourceDispatcherHostImpl* Get();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ResourceDispatcherHost implementation:
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetDelegate(ResourceDispatcherHostDelegate* delegate) OVERRIDE;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetAllowCrossOriginAuthPrompt(bool value) OVERRIDE;
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual DownloadInterruptReason BeginDownload(
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<net::URLRequest> request,
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const Referrer& referrer,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool is_content_initiated,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResourceContext* context,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int child_id,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int route_id,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool prefer_cache,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<DownloadSaveInfo> save_info,
917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      uint32 download_id,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const DownloadStartedCallback& started_callback) OVERRIDE;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ClearLoginDelegateForRequest(net::URLRequest* request) OVERRIDE;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BlockRequestsForRoute(int child_id, int route_id) OVERRIDE;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ResumeBlockedRequestsForRoute(
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int child_id, int route_id) OVERRIDE;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Puts the resource dispatcher host in an inactive state (unable to begin
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // new requests).  Cancels all pending requests.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Shutdown();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify the ResourceDispatcherHostImpl of a new resource context.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddResourceContext(ResourceContext* context);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify the ResourceDispatcherHostImpl of a resource context destruction.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveResourceContext(ResourceContext* context);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Resumes a request that deferred at response start.
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void ResumeResponseDeferredAtStart(const GlobalRequestID& id);
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Force cancels any pending requests for the given |context|. This is
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // necessary to ensure that before |context| goes away, all requests
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for it are dead.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CancelRequestsForContext(ResourceContext* context);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the message was a resource message that was processed.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool OnMessageReceived(const IPC::Message& message,
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         ResourceMessageFilter* filter);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initiates a save file from the browser process (as opposed to a resource
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request from the renderer or another child process).
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BeginSaveFile(const GURL& url,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const Referrer& referrer,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     int child_id,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     int route_id,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     ResourceContext* context);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Cancels the given request if it still exists.
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void CancelRequest(int child_id, int request_id);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Marks the request as "parked". This happens if a request is
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // redirected cross-site and needs to be resumed by a new render view.
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void MarkAsTransferredNavigation(const GlobalRequestID& id);
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Cancels a request previously marked as being transferred, for use when a
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // navigation was cancelled.
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void CancelTransferringNavigation(const GlobalRequestID& id);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Resumes the request without transferring it to a new render view.
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void ResumeDeferredNavigation(const GlobalRequestID& id);
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the number of pending requests. This is designed for the unittests
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pending_requests() const {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<int>(pending_loaders_.size());
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Intended for unit-tests only. Overrides the outstanding requests bound.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_max_outstanding_requests_cost_per_process(int limit) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    max_outstanding_requests_cost_per_process_ = limit;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
151b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  void set_max_num_in_flight_requests_per_process(int limit) {
152b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    max_num_in_flight_requests_per_process_ = limit;
153b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  void set_max_num_in_flight_requests(int limit) {
155b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    max_num_in_flight_requests_ = limit;
156b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The average private bytes increase of the browser for each new pending
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request. Experimentally obtained.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kAvgBytesPerOutstandingRequest = 4400;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SaveFileManager* save_file_manager() const {
163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return save_file_manager_.get();
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called when a RenderViewHost is created.
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnRenderViewHostCreated(int child_id, int route_id, bool is_visible);
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called when a RenderViewHost is deleted.
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnRenderViewHostDeleted(int child_id, int route_id);
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Called when a RenderViewHost starts or stops loading.
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnRenderViewHostSetIsLoading(int child_id,
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    int route_id,
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    bool is_loading);
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Called when a RenderViewHost is hidden.
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnRenderViewHostWasHidden(int child_id, int route_id);
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Called when a RenderViewHost is shown.
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnRenderViewHostWasShown(int child_id, int route_id);
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Force cancels any pending requests for the given process.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CancelRequestsForProcess(int child_id);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnUserGesture(WebContentsImpl* contents);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieves a net::URLRequest.  Must be called from the IO thread.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLRequest* GetURLRequest(const GlobalRequestID& request_id);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemovePendingRequest(int child_id, int request_id);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancels any blocked request for the specified route id.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CancelBlockedRequestsForRoute(int child_id, int route_id);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maintains a collection of temp files created in support of
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the download_to_file capability. Used to grant access to the
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // child process and to defer deletion of the file until it's
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // no longer needed.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RegisterDownloadedTempFile(
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int child_id, int request_id,
202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const base::FilePath& file_path);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UnregisterDownloadedTempFile(int child_id, int request_id);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Needed for the sync IPC message dispatcher macros.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Send(IPC::Message* message);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Indicates whether third-party sub-content can pop-up HTTP basic auth
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dialog boxes.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool allow_cross_origin_auth_prompt();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceDispatcherHostDelegate* delegate() {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return delegate_;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Must be called after the ResourceRequestInfo has been created
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and associated with the request.
2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // |id| should be |content::DownloadItem::kInvalidId| to request automatic
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // assignment.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ResourceHandler> CreateResourceHandlerForDownload(
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::URLRequest* request,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool is_content_initiated,
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool must_download,
2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      uint32 id,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<DownloadSaveInfo> save_info,
2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const DownloadUrlParameters::OnStartedCallback& started_cb);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Must be called after the ResourceRequestInfo has been created
229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // and associated with the request.  If |payload| is set to a non-empty value,
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // the value will be sent to the old resource handler instead of canceling
231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // it, except on HTTP errors.
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ResourceHandler> MaybeInterceptAsStream(
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      net::URLRequest* request,
234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ResourceResponse* response,
235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      std::string* payload);
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearSSLClientAuthHandlerForRequest(net::URLRequest* request);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceScheduler* scheduler() { return scheduler_.get(); }
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
241b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Called by a ResourceHandler when it's ready to start reading data and
242b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // sending it to the renderer. Returns true if there are enough file
243b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // descriptors available for the shared memory buffer. If false is returned,
244b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // the request should cancel.
245b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool HasSufficientResourcesForRequest(const net::URLRequest* request_);
246b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
247b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Called by a ResourceHandler after it has finished its request and is done
248b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // using its shared memory buffer. Frees up that file descriptor to be used
249b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // elsewhere.
250b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  void FinishedWithResourcesForRequest(const net::URLRequest* request_);
251b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // PlzNavigate
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Called by NavigationRequest to start a navigation request in the node
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // identified by |frame_node_id|.
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void StartNavigationRequest(const NavigationRequestInfo& info,
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              scoped_refptr<ResourceRequestBody> request_body,
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              int64 navigation_request_id,
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              int64 frame_node_id);
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // PlzNavigate
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Called by NavigationRequest to cancel a navigation request with the
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // provided |navigation_request_id| in the node identified by
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |frame_node_id|.
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void CancelNavigationRequest(int64 navigation_request_id,
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               int64 frame_node_id);
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  friend class ResourceDispatcherHostTest;
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ResourceDispatcherHostTest,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           TestBlockedRequestsProcessDies);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ResourceDispatcherHostTest,
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           CalculateApproximateMemoryCost);
274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ResourceDispatcherHostTest,
275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           DetachableResourceTimesOut);
276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ResourceDispatcherHostTest,
277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           TestProcessCancelDetachableTimesOut);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class ShutdownTask;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
281b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  struct OustandingRequestsStats {
282b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    int memory_cost;
283b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    int num_requests;
284b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  };
285b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class ShutdownTask;
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class ResourceMessageDelegate;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ResourceLoaderDelegate implementation:
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ResourceDispatcherHostLoginDelegate* CreateLoginDelegate(
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResourceLoader* loader,
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::AuthChallengeInfo* auth_info) OVERRIDE;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HandleExternalProtocol(ResourceLoader* loader,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const GURL& url) OVERRIDE;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidStartRequest(ResourceLoader* loader) OVERRIDE;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidReceiveRedirect(ResourceLoader* loader,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const GURL& new_url) OVERRIDE;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidReceiveResponse(ResourceLoader* loader) OVERRIDE;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidFinishLoading(ResourceLoader* loader) OVERRIDE;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // An init helper that runs on the IO thread.
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnInit();
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A shutdown helper that runs on the IO thread.
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnShutdown();
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper function for regular and download requests.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BeginRequestInternal(scoped_ptr<net::URLRequest> request,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            scoped_ptr<ResourceHandler> handler);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartLoading(ResourceRequestInfoImpl* info,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const linked_ptr<ResourceLoader>& loader);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
314b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // We keep track of how much memory each request needs and how many requests
315b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // are issued by each renderer. These are known as OustandingRequestStats.
316b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Memory limits apply to all requests sent to us by the renderers. There is a
317b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // limit for each renderer. File descriptor limits apply to requests that are
318b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // receiving their body. These are known as in-flight requests. There is a
319b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // global limit that applies for the browser process. Each render is allowed
320b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // to use up to a fraction of that.
321b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
322b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Returns the OustandingRequestsStats for |info|'s renderer, or an empty
323b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // struct if that renderer has no outstanding requests.
324b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  OustandingRequestsStats GetOutstandingRequestsStats(
325b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      const ResourceRequestInfoImpl& info);
326b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
327b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Updates |outstanding_requests_stats_map_| with the specified |stats| for
328b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // the renderer that made the request in |info|.
329b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  void UpdateOutstandingRequestsStats(const ResourceRequestInfoImpl& info,
330b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                      const OustandingRequestsStats& stats);
331b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
332b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Called every time an outstanding request is created or deleted. |count|
333b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // indicates whether the request is new or deleted. |count| must be 1 or -1.
334b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  OustandingRequestsStats IncrementOutstandingRequestsMemory(
335b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      int count,
336b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      const ResourceRequestInfoImpl& info);
337b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
338b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Called every time an in flight request is issued or finished. |count|
339b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // indicates whether the request is issuing or finishing. |count| must be 1
340b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // or -1.
341b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  OustandingRequestsStats IncrementOutstandingRequestsCount(
342b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      int count,
343b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      const ResourceRequestInfoImpl& info);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Estimate how much heap space |request| will consume to run.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int CalculateApproximateMemoryCost(net::URLRequest* request);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Force cancels any pending requests for the given route id.  This method
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // acts like CancelRequestsForProcess when route_id is -1.
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CancelRequestsForRoute(int child_id, int route_id);
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The list of all requests that we have pending. This list is not really
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // optimized, and assumes that we have relatively few requests pending at once
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // since some operations require brute-force searching of the list.
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It may be enhanced in the future to provide some kind of prioritization
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mechanism. We should also consider a hashtable or binary tree if it turns
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // out we have a lot of things here.
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<GlobalRequestID, linked_ptr<ResourceLoader> > LoaderMap;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deletes the pending request identified by the iterator passed in.
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function will invalidate the iterator passed in. Callers should
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not rely on this iterator being valid on return.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemovePendingLoader(const LoaderMap::iterator& iter);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks all pending requests and updates the load states and upload
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // progress if necessary.
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateLoadStates();
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resumes or cancels (if |cancel_requests| is true) any blocked requests.
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ProcessBlockedRequestsForRoute(int child_id,
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int route_id,
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      bool cancel_requests);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void OnRequestResource(int routing_id,
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int request_id,
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const ResourceHostMsg_Request& request_data);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSyncLoad(int request_id,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const ResourceHostMsg_Request& request_data,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  IPC::Message* sync_result);
38168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
38268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Update the ResourceRequestInfo and internal maps when a request is
38368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // transferred from one process to another.
38468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void UpdateRequestForTransfer(int child_id,
38568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                int route_id,
38668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                int request_id,
38768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                const ResourceHostMsg_Request& request_data,
38868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                const linked_ptr<ResourceLoader>& loader);
38968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BeginRequest(int request_id,
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const ResourceHostMsg_Request& request_data,
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    IPC::Message* sync_result,  // only valid for sync
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    int route_id);  // only valid for async
394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Creates a ResourceHandler to be used by BeginRequest() for normal resource
396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // loading.
397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<ResourceHandler> CreateResourceHandler(
398a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      net::URLRequest* request,
399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const ResourceHostMsg_Request& request_data,
400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      IPC::Message* sync_result,
401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      int route_id,
402a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      int process_type,
403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      int child_id,
404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      ResourceContext* resource_context);
405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDataDownloadedACK(int request_id);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnUploadProgressACK(int request_id);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCancelRequest(int request_id);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnReleaseDownloadedFile(int request_id);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates ResourceRequestInfoImpl for a download or page save.
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |download| should be true if the request is a file download.
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceRequestInfoImpl* CreateRequestInfo(
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int child_id,
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int route_id,
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool download,
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResourceContext* context);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Relationship of resource being authenticated with the top level page.
420eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  enum HttpAuthRelationType {
421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    HTTP_AUTH_RELATION_TOP,            // Top-level page itself
422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    HTTP_AUTH_RELATION_SAME_DOMAIN,    // Sub-content from same domain
423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    HTTP_AUTH_RELATION_BLOCKED_CROSS,  // Blocked Sub-content from cross domain
424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    HTTP_AUTH_RELATION_ALLOWED_CROSS,  // Allowed Sub-content per command line
425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    HTTP_AUTH_RELATION_LAST
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  HttpAuthRelationType HttpAuthRelationTypeOf(const GURL& request_url,
429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                              const GURL& first_party);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns whether the URLRequest identified by |transferred_request_id| is
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // currently in the process of being transferred to a different renderer.
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This happens if a request is redirected cross-site and needs to be resumed
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // by a new render view.
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsTransferredNavigation(
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GlobalRequestID& transferred_request_id) const;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceLoader* GetLoader(const GlobalRequestID& id) const;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceLoader* GetLoader(int child_id, int request_id) const;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Registers |delegate| to receive resource IPC messages targeted to the
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // specified |id|.
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RegisterResourceMessageDelegate(const GlobalRequestID& id,
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       ResourceMessageDelegate* delegate);
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UnregisterResourceMessageDelegate(const GlobalRequestID& id,
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         ResourceMessageDelegate* delegate);
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int BuildLoadFlagsForRequest(const ResourceHostMsg_Request& request_data,
449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               int child_id,
450eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               bool is_sync_load);
451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoaderMap pending_loaders_;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Collection of temp files downloaded for child processes via
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the download_to_file mechanism. We avoid deleting them until
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the client no longer needs them.
45703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  typedef std::map<int, scoped_refptr<storage::ShareableFileReference> >
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DeletableFilesMap;  // key is request id
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<int, DeletableFilesMap>
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RegisteredTempFiles;  // key is child process id
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisteredTempFiles registered_temp_files_;
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A timer that periodically calls UpdateLoadStates while pending_requests_
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is not empty.
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::RepeatingTimer<ResourceDispatcherHostImpl> >
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      update_load_states_timer_;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We own the save file manager.
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SaveFileManager> save_file_manager_;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Request ID for browser initiated requests. request_ids generated by
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // child processes are counted up from 0, while browser created requests
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // start at -2 and go down from there. (We need to start at -2 because -1 is
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // used as a special value all over the resource_dispatcher_host for
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // uninitialized variables.) This way, we no longer have the unlikely (but
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // observed in the real world!) event where we have two requests with the same
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request_id_.
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int request_id_;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if the resource dispatcher host has been shut down.
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_shutdown_;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<linked_ptr<ResourceLoader> > BlockedLoadersList;
484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef std::map<GlobalRoutingID, BlockedLoadersList*> BlockedLoadersMap;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockedLoadersMap blocked_loaders_map_;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maps the child_ids to the approximate number of bytes
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // being used to service its resource requests. No entry implies 0 cost.
489b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  typedef std::map<int, OustandingRequestsStats> OutstandingRequestsStatsMap;
490b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  OutstandingRequestsStatsMap outstanding_requests_stats_map_;
491b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
492b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // |num_in_flight_requests_| is the total number of requests currently issued
493b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // summed across all renderers.
494b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  int num_in_flight_requests_;
495b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
496b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // |max_num_in_flight_requests_| is the upper bound on how many requests
497b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // can be in flight at once. It's based on the maximum number of file
498b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // descriptors open per process. We need a global limit for the browser
499b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // process.
500b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  int max_num_in_flight_requests_;
501b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
502b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // |max_num_in_flight_requests_| is the upper bound on how many requests
503b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // can be issued at once. It's based on the maximum number of file
504b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // descriptors open per process. We need a per-renderer limit so that no
505b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // single renderer can hog the browser's limit.
506b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  int max_num_in_flight_requests_per_process_;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |max_outstanding_requests_cost_per_process_| is the upper bound on how
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // many outstanding requests can be issued per child process host.
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The constraint is expressed in terms of bytes (where the cost of
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // individual requests is given by CalculateApproximateMemoryCost).
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The total number of outstanding requests is roughly:
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   (max_outstanding_requests_cost_per_process_ /
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //       kAvgBytesPerOutstandingRequest)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_outstanding_requests_cost_per_process_;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Time of the last user gesture. Stored so that we can add a load
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // flag to requests occurring soon after a gesture to indicate they
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // may be because of explicit user action.
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeTicks last_user_gesture_time_;
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used during IPC message dispatching so that the handlers can get a pointer
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to the source of the message.
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceMessageFilter* filter_;
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceDispatcherHostDelegate* delegate_;
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool allow_cross_origin_auth_prompt_;
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://crbug.com/90971 - Assists in tracking down use-after-frees on
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // shutdown.
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<const ResourceContext*> active_resource_contexts_;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::map<GlobalRequestID,
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ObserverList<ResourceMessageDelegate>*> DelegateMap;
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DelegateMap delegate_map_;
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ResourceScheduler> scheduler_;
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ResourceDispatcherHostImpl);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CONTENT_BROWSER_LOADER_RESOURCE_DISPATCHER_HOST_IMPL_H_
546