Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(36)

Side by Side Diff: chrome/browser/renderer_host/resource_dispatcher_host.h

Issue 6532073: Move core pieces of browser\renderer_host to src\content. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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
6 // from the child process (i.e. [Renderer, Plugin, Worker]ProcessHost), and
7 // dispatches them to URLRequests. It then forwards the messages from the
8 // URLRequests back to the correct process for handling.
9 //
10 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc e-loading
11
12 #ifndef CHROME_BROWSER_RENDERER_HOST_RESOURCE_DISPATCHER_HOST_H_ 5 #ifndef CHROME_BROWSER_RENDERER_HOST_RESOURCE_DISPATCHER_HOST_H_
13 #define CHROME_BROWSER_RENDERER_HOST_RESOURCE_DISPATCHER_HOST_H_ 6 #define CHROME_BROWSER_RENDERER_HOST_RESOURCE_DISPATCHER_HOST_H_
14 #pragma once 7 #pragma once
15 8
16 #include <map> 9 // TODO(jam): remove this file when all files have been converted.
17 #include <string> 10 #include "content/browser/renderer_host/resource_dispatcher_host.h"
18 #include <vector>
19
20 #include "base/basictypes.h"
21 #include "base/gtest_prod_util.h"
22 #include "base/observer_list.h"
23 #include "base/scoped_ptr.h"
24 #include "base/timer.h"
25 #include "chrome/common/child_process_info.h"
26 #include "chrome/common/notification_type.h"
27 #include "chrome/browser/renderer_host/resource_queue.h"
28 #include "ipc/ipc_message.h"
29 #include "net/url_request/url_request.h"
30 #include "webkit/glue/resource_type.h"
31
32 class CrossSiteResourceHandler;
33 class DownloadFileManager;
34 class DownloadRequestLimiter;
35 class LoginHandler;
36 class NotificationDetails;
37 class PluginService;
38 class ResourceDispatcherHostRequestInfo;
39 class ResourceHandler;
40 class ResourceMessageFilter;
41 class SafeBrowsingService;
42 class SaveFileManager;
43 class SSLClientAuthHandler;
44 class UserScriptListener;
45 class WebKitThread;
46 struct DownloadSaveInfo;
47 struct GlobalRequestID;
48 struct ViewHostMsg_Resource_Request;
49 struct ViewMsg_ClosePage_Params;
50
51 namespace net {
52 class URLRequestContext;
53 } // namespace net
54
55 namespace webkit_blob {
56 class DeletableFileReference;
57 }
58
59 class ResourceDispatcherHost : public net::URLRequest::Delegate {
60 public:
61 class Observer {
62 public:
63 virtual ~Observer() {}
64 virtual void OnRequestStarted(ResourceDispatcherHost* resource_dispatcher,
65 net::URLRequest* request) = 0;
66 virtual void OnResponseCompleted(
67 ResourceDispatcherHost* resource_dispatcher,
68 net::URLRequest* request) = 0;
69 virtual void OnReceivedRedirect(ResourceDispatcherHost* resource_dispatcher,
70 net::URLRequest* request,
71 const GURL& new_url) = 0;
72 };
73
74 ResourceDispatcherHost();
75 ~ResourceDispatcherHost();
76
77 void Initialize();
78
79 // Puts the resource dispatcher host in an inactive state (unable to begin
80 // new requests). Cancels all pending requests.
81 void Shutdown();
82
83 // Returns true if the message was a resource message that was processed.
84 // If it was, message_was_ok will be false iff the message was corrupt.
85 bool OnMessageReceived(const IPC::Message& message,
86 ResourceMessageFilter* filter,
87 bool* message_was_ok);
88
89 // Initiates a download from the browser process (as opposed to a resource
90 // request from the renderer or another child process).
91 void BeginDownload(const GURL& url,
92 const GURL& referrer,
93 const DownloadSaveInfo& save_info,
94 bool prompt_for_save_location,
95 int process_unique_id,
96 int route_id,
97 net::URLRequestContext* request_context);
98
99 // Initiates a save file from the browser process (as opposed to a resource
100 // request from the renderer or another child process).
101 void BeginSaveFile(const GURL& url,
102 const GURL& referrer,
103 int process_unique_id,
104 int route_id,
105 net::URLRequestContext* request_context);
106
107 // Cancels the given request if it still exists. We ignore cancels from the
108 // renderer in the event of a download.
109 void CancelRequest(int process_unique_id,
110 int request_id,
111 bool from_renderer);
112
113 // Follows a deferred redirect for the given request.
114 // new_first_party_for_cookies, if non-empty, is the new cookie policy URL
115 // for the redirected URL. If the cookie policy URL needs changing, pass
116 // true as has_new_first_party_for_cookies and the new cookie policy URL as
117 // new_first_party_for_cookies. Otherwise, pass false as
118 // has_new_first_party_for_cookies, and new_first_party_for_cookies will not
119 // be used.
120 void FollowDeferredRedirect(int process_unique_id,
121 int request_id,
122 bool has_new_first_party_for_cookies,
123 const GURL& new_first_party_for_cookies);
124
125 // Starts a request that was deferred during ResourceHandler::OnWillStart().
126 void StartDeferredRequest(int process_unique_id, int request_id);
127
128 // Returns true if it's ok to send the data. If there are already too many
129 // data messages pending, it pauses the request and returns false. In this
130 // case the caller should not send the data.
131 bool WillSendData(int process_unique_id, int request_id);
132
133 // Pauses or resumes network activity for a particular request.
134 void PauseRequest(int process_unique_id, int request_id, bool pause);
135
136 // Returns the number of pending requests. This is designed for the unittests
137 int pending_requests() const {
138 return static_cast<int>(pending_requests_.size());
139 }
140
141 // Intended for unit-tests only. Returns the memory cost of all the
142 // outstanding requests (pending and blocked) for |process_unique_id|.
143 int GetOutstandingRequestsMemoryCost(int process_unique_id) const;
144
145 // Intended for unit-tests only. Overrides the outstanding requests bound.
146 void set_max_outstanding_requests_cost_per_process(int limit) {
147 max_outstanding_requests_cost_per_process_ = limit;
148 }
149
150 // The average private bytes increase of the browser for each new pending
151 // request. Experimentally obtained.
152 static const int kAvgBytesPerOutstandingRequest = 4400;
153
154 DownloadFileManager* download_file_manager() const {
155 return download_file_manager_;
156 }
157
158 DownloadRequestLimiter* download_request_limiter() const {
159 return download_request_limiter_.get();
160 }
161
162 SaveFileManager* save_file_manager() const {
163 return save_file_manager_;
164 }
165
166 SafeBrowsingService* safe_browsing_service() const {
167 return safe_browsing_;
168 }
169
170 WebKitThread* webkit_thread() const {
171 return webkit_thread_.get();
172 }
173
174 // Called when the onunload handler for a cross-site request has finished.
175 void OnClosePageACK(const ViewMsg_ClosePage_Params& params);
176
177 // Force cancels any pending requests for the given process.
178 void CancelRequestsForProcess(int process_unique_id);
179
180 // Force cancels any pending requests for the given route id. This method
181 // acts like CancelRequestsForProcess when route_id is -1.
182 void CancelRequestsForRoute(int process_unique_id, int route_id);
183
184 // net::URLRequest::Delegate
185 virtual void OnReceivedRedirect(net::URLRequest* request,
186 const GURL& new_url,
187 bool* defer_redirect);
188 virtual void OnAuthRequired(net::URLRequest* request,
189 net::AuthChallengeInfo* auth_info);
190 virtual void OnCertificateRequested(
191 net::URLRequest* request,
192 net::SSLCertRequestInfo* cert_request_info);
193 virtual void OnSSLCertificateError(net::URLRequest* request,
194 int cert_error,
195 net::X509Certificate* cert);
196 virtual void OnGetCookies(net::URLRequest* request,
197 bool blocked_by_policy);
198 virtual void OnSetCookie(net::URLRequest* request,
199 const std::string& cookie_line,
200 const net::CookieOptions& options,
201 bool blocked_by_policy);
202 virtual void OnResponseStarted(net::URLRequest* request);
203 virtual void OnReadCompleted(net::URLRequest* request, int bytes_read);
204 void OnResponseCompleted(net::URLRequest* request);
205
206 // Helper functions to get our extra data out of a request. The given request
207 // must have been one we created so that it has the proper extra data pointer.
208 static ResourceDispatcherHostRequestInfo* InfoForRequest(
209 net::URLRequest* request);
210 static const ResourceDispatcherHostRequestInfo* InfoForRequest(
211 const net::URLRequest* request);
212
213 // Extracts the render view/process host's identifiers from the given request
214 // and places them in the given out params (both required). If there are no
215 // such IDs associated with the request (such as non-page-related requests),
216 // this function will return false and both out params will be -1.
217 static bool RenderViewForRequest(const net::URLRequest* request,
218 int* render_process_host_id,
219 int* render_view_host_id);
220
221 // Adds an observer. The observer will be called on the IO thread. To
222 // observe resource events on the UI thread, subscribe to the
223 // NOTIFY_RESOURCE_* notifications of the notification service.
224 void AddObserver(Observer* obs);
225
226 // Removes an observer.
227 void RemoveObserver(Observer* obs);
228
229 // Retrieves a net::URLRequest. Must be called from the IO thread.
230 net::URLRequest* GetURLRequest(const GlobalRequestID& request_id) const;
231
232 // Notifies our observers that a request has been cancelled.
233 void NotifyResponseCompleted(net::URLRequest* request, int process_unique_id);
234
235 void RemovePendingRequest(int process_unique_id, int request_id);
236
237 // Causes all new requests for the route identified by
238 // |process_unique_id| and |route_id| to be blocked (not being
239 // started) until ResumeBlockedRequestsForRoute or
240 // CancelBlockedRequestsForRoute is called.
241 void BlockRequestsForRoute(int process_unique_id, int route_id);
242
243 // Resumes any blocked request for the specified route id.
244 void ResumeBlockedRequestsForRoute(int process_unique_id, int route_id);
245
246 // Cancels any blocked request for the specified route id.
247 void CancelBlockedRequestsForRoute(int process_unique_id, int route_id);
248
249 // Decrements the pending_data_count for the request and resumes
250 // the request if it was paused due to too many pending data
251 // messages sent.
252 void DataReceivedACK(int process_unique_id, int request_id);
253
254 // Maintains a collection of temp files created in support of
255 // the download_to_file capability. Used to grant access to the
256 // child process and to defer deletion of the file until it's
257 // no longer needed.
258 void RegisterDownloadedTempFile(
259 int child_id, int request_id,
260 webkit_blob::DeletableFileReference* reference);
261 void UnregisterDownloadedTempFile(int child_id, int request_id);
262
263 // Needed for the sync IPC message dispatcher macros.
264 bool Send(IPC::Message* message);
265
266 // Controls if we launch or squash prefetch requests as they arrive
267 // from renderers.
268 static bool is_prefetch_enabled();
269 static void set_is_prefetch_enabled(bool value);
270
271 private:
272 FRIEND_TEST_ALL_PREFIXES(ResourceDispatcherHostTest,
273 TestBlockedRequestsProcessDies);
274 FRIEND_TEST_ALL_PREFIXES(ResourceDispatcherHostTest,
275 IncrementOutstandingRequestsMemoryCost);
276 FRIEND_TEST_ALL_PREFIXES(ResourceDispatcherHostTest,
277 CalculateApproximateMemoryCost);
278 FRIEND_TEST_ALL_PREFIXES(ApplyExtensionLocalizationFilterTest, WrongScheme);
279 FRIEND_TEST_ALL_PREFIXES(ApplyExtensionLocalizationFilterTest, GoodScheme);
280 FRIEND_TEST_ALL_PREFIXES(ApplyExtensionLocalizationFilterTest,
281 GoodSchemeWrongResourceType);
282
283 class ShutdownTask;
284
285 friend class ShutdownTask;
286
287 // Associates the given info with the given request. The info will then be
288 // owned by the request.
289 void SetRequestInfo(net::URLRequest* request,
290 ResourceDispatcherHostRequestInfo* info);
291
292 // A shutdown helper that runs on the IO thread.
293 void OnShutdown();
294
295 // Returns true if the request is paused.
296 bool PauseRequestIfNeeded(ResourceDispatcherHostRequestInfo* info);
297
298 // Resumes the given request by calling OnResponseStarted or OnReadCompleted.
299 void ResumeRequest(const GlobalRequestID& request_id);
300
301 // Internal function to start reading for the first time.
302 void StartReading(net::URLRequest* request);
303
304 // Reads data from the response using our internal buffer as async IO.
305 // Returns true if data is available immediately, false otherwise. If the
306 // return value is false, we will receive a OnReadComplete() callback later.
307 bool Read(net::URLRequest* request, int* bytes_read);
308
309 // Internal function to finish an async IO which has completed. Returns
310 // true if there is more data to read (e.g. we haven't read EOF yet and
311 // no errors have occurred).
312 bool CompleteRead(net::URLRequest*, int* bytes_read);
313
314 // Internal function to finish handling the ResponseStarted message. Returns
315 // true on success.
316 bool CompleteResponseStarted(net::URLRequest* request);
317
318 // Helper function for regular and download requests.
319 void BeginRequestInternal(net::URLRequest* request);
320
321 // Helper function that cancels |request|.
322 void CancelRequestInternal(net::URLRequest* request, bool from_renderer);
323
324 // Helper function that inserts |request| into the resource queue.
325 void InsertIntoResourceQueue(
326 net::URLRequest* request,
327 const ResourceDispatcherHostRequestInfo& request_info);
328
329 // Updates the "cost" of outstanding requests for |process_unique_id|.
330 // The "cost" approximates how many bytes are consumed by all the in-memory
331 // data structures supporting this request (net::URLRequest object,
332 // HttpNetworkTransaction, etc...).
333 // The value of |cost| is added to the running total, and the resulting
334 // sum is returned.
335 int IncrementOutstandingRequestsMemoryCost(int cost,
336 int process_unique_id);
337
338 // Estimate how much heap space |request| will consume to run.
339 static int CalculateApproximateMemoryCost(net::URLRequest* request);
340
341 // The list of all requests that we have pending. This list is not really
342 // optimized, and assumes that we have relatively few requests pending at once
343 // since some operations require brute-force searching of the list.
344 //
345 // It may be enhanced in the future to provide some kind of prioritization
346 // mechanism. We should also consider a hashtable or binary tree if it turns
347 // out we have a lot of things here.
348 typedef std::map<GlobalRequestID, net::URLRequest*> PendingRequestList;
349
350 // Deletes the pending request identified by the iterator passed in.
351 // This function will invalidate the iterator passed in. Callers should
352 // not rely on this iterator being valid on return.
353 void RemovePendingRequest(const PendingRequestList::iterator& iter);
354
355 // Notify our observers that we started receiving a response for a request.
356 void NotifyResponseStarted(net::URLRequest* request, int process_unique_id);
357
358 // Notify our observers that a request has been redirected.
359 void NotifyReceivedRedirect(net::URLRequest* request,
360 int process_unique_id,
361 const GURL& new_url);
362
363 // Tries to handle the url with an external protocol. If the request is
364 // handled, the function returns true. False otherwise.
365 bool HandleExternalProtocol(int request_id,
366 int process_unique_id,
367 int route_id,
368 const GURL& url,
369 ResourceType::Type resource_type,
370 ResourceHandler* handler);
371
372 // Checks all pending requests and updates the load states and upload
373 // progress if necessary.
374 void UpdateLoadStates();
375
376 // Checks the upload state and sends an update if one is necessary.
377 bool MaybeUpdateUploadProgress(ResourceDispatcherHostRequestInfo *info,
378 net::URLRequest *request);
379
380 // Resumes or cancels (if |cancel_requests| is true) any blocked requests.
381 void ProcessBlockedRequestsForRoute(int process_unique_id,
382 int route_id,
383 bool cancel_requests);
384
385 void OnRequestResource(const IPC::Message& msg,
386 int request_id,
387 const ViewHostMsg_Resource_Request& request_data);
388 void OnSyncLoad(int request_id,
389 const ViewHostMsg_Resource_Request& request_data,
390 IPC::Message* sync_result);
391 void BeginRequest(int request_id,
392 const ViewHostMsg_Resource_Request& request_data,
393 IPC::Message* sync_result, // only valid for sync
394 int route_id); // only valid for async
395 void OnDataReceivedACK(int request_id);
396 void OnDataDownloadedACK(int request_id);
397 void OnUploadProgressACK(int request_id);
398 void OnCancelRequest(int request_id);
399 void OnFollowRedirect(int request_id,
400 bool has_new_first_party_for_cookies,
401 const GURL& new_first_party_for_cookies);
402 void OnReleaseDownloadedFile(int request_id);
403
404 ResourceHandler* CreateSafeBrowsingResourceHandler(
405 ResourceHandler* handler, int child_id, int route_id,
406 ResourceType::Type resource_type);
407
408 // Creates ResourceDispatcherHostRequestInfo for a browser-initiated request
409 // (a download or a page save). |download| should be true if the request
410 // is a file download.
411 ResourceDispatcherHostRequestInfo* CreateRequestInfoForBrowserRequest(
412 ResourceHandler* handler, int child_id, int route_id, bool download);
413
414 // Returns true if |request| is in |pending_requests_|.
415 bool IsValidRequest(net::URLRequest* request);
416
417 // Sets replace_extension_localization_templates on all text/css requests that
418 // have "chrome-extension://" scheme.
419 static void ApplyExtensionLocalizationFilter(
420 const GURL& url,
421 const ResourceType::Type& resource_type,
422 ResourceDispatcherHostRequestInfo* request_info);
423
424 // Determine request priority based on how critical this resource typically
425 // is to user-perceived page load performance.
426 static net::RequestPriority DetermineRequestPriority(ResourceType::Type type);
427
428 // Sends the given notification on the UI thread. The RenderViewHost's
429 // controller is used as the source.
430 template <class T>
431 static void NotifyOnUI(NotificationType type,
432 int render_process_id,
433 int render_view_id,
434 T* detail);
435
436 PendingRequestList pending_requests_;
437
438 // Collection of temp files downloaded for child processes via
439 // the download_to_file mechanism. We avoid deleting them until
440 // the client no longer needs them.
441 typedef std::map<int, scoped_refptr<webkit_blob::DeletableFileReference> >
442 DeletableFilesMap; // key is request id
443 typedef std::map<int, DeletableFilesMap>
444 RegisteredTempFiles; // key is child process id
445 RegisteredTempFiles registered_temp_files_;
446
447 // A timer that periodically calls UpdateLoadStates while pending_requests_
448 // is not empty.
449 base::RepeatingTimer<ResourceDispatcherHost> update_load_states_timer_;
450
451 // Handles the resource requests from the moment we want to start them.
452 ResourceQueue resource_queue_;
453
454 // We own the download file writing thread and manager
455 scoped_refptr<DownloadFileManager> download_file_manager_;
456
457 // Determines whether a download is allowed.
458 scoped_refptr<DownloadRequestLimiter> download_request_limiter_;
459
460 // We own the save file manager.
461 scoped_refptr<SaveFileManager> save_file_manager_;
462
463 scoped_refptr<UserScriptListener> user_script_listener_;
464
465 scoped_refptr<SafeBrowsingService> safe_browsing_;
466
467 // We own the WebKit thread and see to its destruction.
468 scoped_ptr<WebKitThread> webkit_thread_;
469
470 // Request ID for browser initiated requests. request_ids generated by
471 // child processes are counted up from 0, while browser created requests
472 // start at -2 and go down from there. (We need to start at -2 because -1 is
473 // used as a special value all over the resource_dispatcher_host for
474 // uninitialized variables.) This way, we no longer have the unlikely (but
475 // observed in the real world!) event where we have two requests with the same
476 // request_id_.
477 int request_id_;
478
479 // List of objects observing resource dispatching.
480 ObserverList<Observer> observer_list_;
481
482 // For running tasks.
483 ScopedRunnableMethodFactory<ResourceDispatcherHost> method_runner_;
484
485 // True if the resource dispatcher host has been shut down.
486 bool is_shutdown_;
487
488 typedef std::vector<net::URLRequest*> BlockedRequestsList;
489 typedef std::pair<int, int> ProcessRouteIDs;
490 typedef std::map<ProcessRouteIDs, BlockedRequestsList*> BlockedRequestMap;
491 BlockedRequestMap blocked_requests_map_;
492
493 // Maps the process_unique_ids to the approximate number of bytes
494 // being used to service its resource requests. No entry implies 0 cost.
495 typedef std::map<int, int> OutstandingRequestsMemoryCostMap;
496 OutstandingRequestsMemoryCostMap outstanding_requests_memory_cost_map_;
497
498 // |max_outstanding_requests_cost_per_process_| is the upper bound on how
499 // many outstanding requests can be issued per child process host.
500 // The constraint is expressed in terms of bytes (where the cost of
501 // individual requests is given by CalculateApproximateMemoryCost).
502 // The total number of outstanding requests is roughly:
503 // (max_outstanding_requests_cost_per_process_ /
504 // kAvgBytesPerOutstandingRequest)
505 int max_outstanding_requests_cost_per_process_;
506
507 // Used during IPC message dispatching so that the handlers can get a pointer
508 // to the source of the message.
509 ResourceMessageFilter* filter_;
510
511 static bool is_prefetch_enabled_;
512
513 DISALLOW_COPY_AND_ASSIGN(ResourceDispatcherHost);
514 };
515 11
516 #endif // CHROME_BROWSER_RENDERER_HOST_RESOURCE_DISPATCHER_HOST_H_ 12 #endif // CHROME_BROWSER_RENDERER_HOST_RESOURCE_DISPATCHER_HOST_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698