| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // This is the browser side of the resource dispatcher, it receives requests | 5 // This is the browser side of the resource dispatcher, it receives requests |
| 6 // from the child process (i.e. [Renderer, Plugin, Worker]ProcessHost), and | 6 // from the child process (i.e. [Renderer, Plugin, Worker]ProcessHost), and |
| 7 // dispatches them to URLRequests. It then forwards the messages from the | 7 // dispatches them to URLRequests. It then forwards the messages from the |
| 8 // URLRequests back to the correct process for handling. | 8 // URLRequests back to the correct process for handling. |
| 9 // | 9 // |
| 10 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc
e-loading | 10 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc
e-loading |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 #include "net/url_request/url_request.h" | 28 #include "net/url_request/url_request.h" |
| 29 #include "webkit/glue/resource_type.h" | 29 #include "webkit/glue/resource_type.h" |
| 30 | 30 |
| 31 class CrossSiteResourceHandler; | 31 class CrossSiteResourceHandler; |
| 32 class DownloadFileManager; | 32 class DownloadFileManager; |
| 33 class DownloadRequestLimiter; | 33 class DownloadRequestLimiter; |
| 34 class LoginHandler; | 34 class LoginHandler; |
| 35 class PluginService; | 35 class PluginService; |
| 36 class ResourceDispatcherHostRequestInfo; | 36 class ResourceDispatcherHostRequestInfo; |
| 37 class ResourceHandler; | 37 class ResourceHandler; |
| 38 class ResourceMessageFilter; |
| 38 class SafeBrowsingService; | 39 class SafeBrowsingService; |
| 39 class SaveFileManager; | 40 class SaveFileManager; |
| 40 class SSLClientAuthHandler; | 41 class SSLClientAuthHandler; |
| 41 class UserScriptListener; | 42 class UserScriptListener; |
| 42 class URLRequestContext; | 43 class URLRequestContext; |
| 43 class WebKitThread; | 44 class WebKitThread; |
| 44 struct DownloadSaveInfo; | 45 struct DownloadSaveInfo; |
| 45 struct GlobalRequestID; | 46 struct GlobalRequestID; |
| 46 struct ViewHostMsg_Resource_Request; | 47 struct ViewHostMsg_Resource_Request; |
| 47 struct ViewMsg_ClosePage_Params; | 48 struct ViewMsg_ClosePage_Params; |
| 48 | 49 |
| 49 namespace webkit_blob { | 50 namespace webkit_blob { |
| 50 class DeletableFileReference; | 51 class DeletableFileReference; |
| 51 } | 52 } |
| 52 | 53 |
| 53 class ResourceDispatcherHost : public net::URLRequest::Delegate { | 54 class ResourceDispatcherHost : public net::URLRequest::Delegate { |
| 54 public: | 55 public: |
| 55 // Implemented by the client of ResourceDispatcherHost to receive messages in | |
| 56 // response to a resource load. The messages are intended to be forwarded to | |
| 57 // the ResourceDispatcher in the child process via an IPC channel that the | |
| 58 // client manages. | |
| 59 // | |
| 60 // NOTE: This class unfortunately cannot be named 'Delegate' because that | |
| 61 // conflicts with the name of ResourceDispatcherHost's base class. | |
| 62 // | |
| 63 // If the receiver is unable to send a given message (i.e., if Send returns | |
| 64 // false), then the ResourceDispatcherHost assumes the receiver has failed, | |
| 65 // and the given request will be dropped. (This happens, for example, when a | |
| 66 // renderer crashes and the channel dies). | |
| 67 class Receiver : public IPC::Message::Sender, | |
| 68 public ChildProcessInfo { | |
| 69 public: | |
| 70 // Returns the URLRequestContext for the given request. | |
| 71 // If NULL is returned, the default context for the profile is used. | |
| 72 virtual URLRequestContext* GetRequestContext( | |
| 73 uint32 request_id, | |
| 74 const ViewHostMsg_Resource_Request& request_data) = 0; | |
| 75 | |
| 76 protected: | |
| 77 explicit Receiver(ChildProcessInfo::ProcessType type, int child_id); | |
| 78 virtual ~Receiver(); | |
| 79 }; | |
| 80 | |
| 81 class Observer { | 56 class Observer { |
| 82 public: | 57 public: |
| 83 virtual ~Observer() {} | 58 virtual ~Observer() {} |
| 84 virtual void OnRequestStarted(ResourceDispatcherHost* resource_dispatcher, | 59 virtual void OnRequestStarted(ResourceDispatcherHost* resource_dispatcher, |
| 85 net::URLRequest* request) = 0; | 60 net::URLRequest* request) = 0; |
| 86 virtual void OnResponseCompleted( | 61 virtual void OnResponseCompleted( |
| 87 ResourceDispatcherHost* resource_dispatcher, | 62 ResourceDispatcherHost* resource_dispatcher, |
| 88 net::URLRequest* request) = 0; | 63 net::URLRequest* request) = 0; |
| 89 virtual void OnReceivedRedirect(ResourceDispatcherHost* resource_dispatcher, | 64 virtual void OnReceivedRedirect(ResourceDispatcherHost* resource_dispatcher, |
| 90 net::URLRequest* request, | 65 net::URLRequest* request, |
| 91 const GURL& new_url) = 0; | 66 const GURL& new_url) = 0; |
| 92 }; | 67 }; |
| 93 | 68 |
| 94 ResourceDispatcherHost(); | 69 ResourceDispatcherHost(); |
| 95 ~ResourceDispatcherHost(); | 70 ~ResourceDispatcherHost(); |
| 96 | 71 |
| 97 void Initialize(); | 72 void Initialize(); |
| 98 | 73 |
| 99 // Puts the resource dispatcher host in an inactive state (unable to begin | 74 // Puts the resource dispatcher host in an inactive state (unable to begin |
| 100 // new requests). Cancels all pending requests. | 75 // new requests). Cancels all pending requests. |
| 101 void Shutdown(); | 76 void Shutdown(); |
| 102 | 77 |
| 103 // Returns true if the message was a resource message that was processed. | 78 // Returns true if the message was a resource message that was processed. |
| 104 // If it was, message_was_ok will be false iff the message was corrupt. | 79 // If it was, message_was_ok will be false iff the message was corrupt. |
| 105 bool OnMessageReceived(const IPC::Message& message, | 80 bool OnMessageReceived(const IPC::Message& message, |
| 106 Receiver* receiver, | 81 ResourceMessageFilter* filter, |
| 107 bool* message_was_ok); | 82 bool* message_was_ok); |
| 108 | 83 |
| 109 // Initiates a download from the browser process (as opposed to a resource | 84 // Initiates a download from the browser process (as opposed to a resource |
| 110 // request from the renderer or another child process). | 85 // request from the renderer or another child process). |
| 111 void BeginDownload(const GURL& url, | 86 void BeginDownload(const GURL& url, |
| 112 const GURL& referrer, | 87 const GURL& referrer, |
| 113 const DownloadSaveInfo& save_info, | 88 const DownloadSaveInfo& save_info, |
| 114 bool prompt_for_save_location, | 89 bool prompt_for_save_location, |
| 115 int process_unique_id, | 90 int process_unique_id, |
| 116 int route_id, | 91 int route_id, |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 // Decrements the pending_data_count for the request and resumes | 244 // Decrements the pending_data_count for the request and resumes |
| 270 // the request if it was paused due to too many pending data | 245 // the request if it was paused due to too many pending data |
| 271 // messages sent. | 246 // messages sent. |
| 272 void DataReceivedACK(int process_unique_id, int request_id); | 247 void DataReceivedACK(int process_unique_id, int request_id); |
| 273 | 248 |
| 274 // Maintains a collection of temp files created in support of | 249 // Maintains a collection of temp files created in support of |
| 275 // the download_to_file capability. Used to grant access to the | 250 // the download_to_file capability. Used to grant access to the |
| 276 // child process and to defer deletion of the file until it's | 251 // child process and to defer deletion of the file until it's |
| 277 // no longer needed. | 252 // no longer needed. |
| 278 void RegisterDownloadedTempFile( | 253 void RegisterDownloadedTempFile( |
| 279 int receiver_id, int request_id, | 254 int child_id, int request_id, |
| 280 webkit_blob::DeletableFileReference* reference); | 255 webkit_blob::DeletableFileReference* reference); |
| 281 void UnregisterDownloadedTempFile(int receiver_id, int request_id); | 256 void UnregisterDownloadedTempFile(int child_id, int request_id); |
| 282 | 257 |
| 283 // Needed for the sync IPC message dispatcher macros. | 258 // Needed for the sync IPC message dispatcher macros. |
| 284 bool Send(IPC::Message* message); | 259 bool Send(IPC::Message* message); |
| 285 | 260 |
| 286 // Controls if we launch or squash prefetch requests as they arrive | 261 // Controls if we launch or squash prefetch requests as they arrive |
| 287 // from renderers. | 262 // from renderers. |
| 288 static bool is_prefetch_enabled(); | 263 static bool is_prefetch_enabled(); |
| 289 static void set_is_prefetch_enabled(bool value); | 264 static void set_is_prefetch_enabled(bool value); |
| 290 | 265 |
| 291 private: | 266 private: |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 415 void OnDataReceivedACK(int request_id); | 390 void OnDataReceivedACK(int request_id); |
| 416 void OnDataDownloadedACK(int request_id); | 391 void OnDataDownloadedACK(int request_id); |
| 417 void OnUploadProgressACK(int request_id); | 392 void OnUploadProgressACK(int request_id); |
| 418 void OnCancelRequest(int request_id); | 393 void OnCancelRequest(int request_id); |
| 419 void OnFollowRedirect(int request_id, | 394 void OnFollowRedirect(int request_id, |
| 420 bool has_new_first_party_for_cookies, | 395 bool has_new_first_party_for_cookies, |
| 421 const GURL& new_first_party_for_cookies); | 396 const GURL& new_first_party_for_cookies); |
| 422 void OnReleaseDownloadedFile(int request_id); | 397 void OnReleaseDownloadedFile(int request_id); |
| 423 | 398 |
| 424 ResourceHandler* CreateSafeBrowsingResourceHandler( | 399 ResourceHandler* CreateSafeBrowsingResourceHandler( |
| 425 ResourceHandler* handler, int child_id, int route_id, | 400 ResourceHandler* handler, int route_id, ResourceType::Type resource_type); |
| 426 ResourceType::Type resource_type); | |
| 427 | 401 |
| 428 // Creates ResourceDispatcherHostRequestInfo for a browser-initiated request | 402 // Creates ResourceDispatcherHostRequestInfo for a browser-initiated request |
| 429 // (a download or a page save). |download| should be true if the request | 403 // (a download or a page save). |download| should be true if the request |
| 430 // is a file download. | 404 // is a file download. |
| 431 ResourceDispatcherHostRequestInfo* CreateRequestInfoForBrowserRequest( | 405 ResourceDispatcherHostRequestInfo* CreateRequestInfoForBrowserRequest( |
| 432 ResourceHandler* handler, int child_id, int route_id, bool download); | 406 ResourceHandler* handler, int child_id, int route_id, bool download); |
| 433 | 407 |
| 434 // Returns true if |request| is in |pending_requests_|. | 408 // Returns true if |request| is in |pending_requests_|. |
| 435 bool IsValidRequest(net::URLRequest* request); | 409 bool IsValidRequest(net::URLRequest* request); |
| 436 | 410 |
| 437 // Returns true if the message passed in is a resource related message. | |
| 438 static bool IsResourceDispatcherHostMessage(const IPC::Message&); | |
| 439 | |
| 440 // Sets replace_extension_localization_templates on all text/css requests that | 411 // Sets replace_extension_localization_templates on all text/css requests that |
| 441 // have "chrome-extension://" scheme. | 412 // have "chrome-extension://" scheme. |
| 442 static void ApplyExtensionLocalizationFilter( | 413 static void ApplyExtensionLocalizationFilter( |
| 443 const GURL& url, | 414 const GURL& url, |
| 444 const ResourceType::Type& resource_type, | 415 const ResourceType::Type& resource_type, |
| 445 ResourceDispatcherHostRequestInfo* request_info); | 416 ResourceDispatcherHostRequestInfo* request_info); |
| 446 | 417 |
| 447 // Determine request priority based on how critical this resource typically | 418 // Determine request priority based on how critical this resource typically |
| 448 // is to user-perceived page load performance. | 419 // is to user-perceived page load performance. |
| 449 static net::RequestPriority DetermineRequestPriority(ResourceType::Type type); | 420 static net::RequestPriority DetermineRequestPriority(ResourceType::Type type); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 514 // many outstanding requests can be issued per child process host. | 485 // many outstanding requests can be issued per child process host. |
| 515 // The constraint is expressed in terms of bytes (where the cost of | 486 // The constraint is expressed in terms of bytes (where the cost of |
| 516 // individual requests is given by CalculateApproximateMemoryCost). | 487 // individual requests is given by CalculateApproximateMemoryCost). |
| 517 // The total number of outstanding requests is roughly: | 488 // The total number of outstanding requests is roughly: |
| 518 // (max_outstanding_requests_cost_per_process_ / | 489 // (max_outstanding_requests_cost_per_process_ / |
| 519 // kAvgBytesPerOutstandingRequest) | 490 // kAvgBytesPerOutstandingRequest) |
| 520 int max_outstanding_requests_cost_per_process_; | 491 int max_outstanding_requests_cost_per_process_; |
| 521 | 492 |
| 522 // Used during IPC message dispatching so that the handlers can get a pointer | 493 // Used during IPC message dispatching so that the handlers can get a pointer |
| 523 // to the source of the message. | 494 // to the source of the message. |
| 524 Receiver* receiver_; | 495 ResourceMessageFilter* filter_; |
| 525 | 496 |
| 526 static bool is_prefetch_enabled_; | 497 static bool is_prefetch_enabled_; |
| 527 | 498 |
| 528 DISALLOW_COPY_AND_ASSIGN(ResourceDispatcherHost); | 499 DISALLOW_COPY_AND_ASSIGN(ResourceDispatcherHost); |
| 529 }; | 500 }; |
| 530 | 501 |
| 531 #endif // CHROME_BROWSER_RENDERER_HOST_RESOURCE_DISPATCHER_HOST_H_ | 502 #endif // CHROME_BROWSER_RENDERER_HOST_RESOURCE_DISPATCHER_HOST_H_ |
| OLD | NEW |