OLD | NEW |
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 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc
e-loading | 5 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc
e-loading |
6 | 6 |
7 #include "content/browser/renderer_host/resource_dispatcher_host.h" | 7 #include "content/browser/renderer_host/resource_dispatcher_host.h" |
8 | 8 |
9 #include <set> | 9 #include <set> |
10 #include <vector> | 10 #include <vector> |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 #include "content/browser/renderer_host/redirect_to_file_resource_handler.h" | 54 #include "content/browser/renderer_host/redirect_to_file_resource_handler.h" |
55 #include "content/browser/renderer_host/render_view_host.h" | 55 #include "content/browser/renderer_host/render_view_host.h" |
56 #include "content/browser/renderer_host/render_view_host_delegate.h" | 56 #include "content/browser/renderer_host/render_view_host_delegate.h" |
57 #include "content/browser/renderer_host/render_view_host_notification_task.h" | 57 #include "content/browser/renderer_host/render_view_host_notification_task.h" |
58 #include "content/browser/renderer_host/resource_dispatcher_host_request_info.h" | 58 #include "content/browser/renderer_host/resource_dispatcher_host_request_info.h" |
59 #include "content/browser/renderer_host/resource_message_filter.h" | 59 #include "content/browser/renderer_host/resource_message_filter.h" |
60 #include "content/browser/renderer_host/resource_queue.h" | 60 #include "content/browser/renderer_host/resource_queue.h" |
61 #include "content/browser/renderer_host/resource_request_details.h" | 61 #include "content/browser/renderer_host/resource_request_details.h" |
62 #include "content/browser/renderer_host/sync_resource_handler.h" | 62 #include "content/browser/renderer_host/sync_resource_handler.h" |
63 #include "content/browser/worker_host/worker_service.h" | 63 #include "content/browser/worker_host/worker_service.h" |
| 64 #include "content/common/resource_messages.h" |
64 #include "net/base/auth.h" | 65 #include "net/base/auth.h" |
65 #include "net/base/cert_status_flags.h" | 66 #include "net/base/cert_status_flags.h" |
66 #include "net/base/cookie_monster.h" | 67 #include "net/base/cookie_monster.h" |
67 #include "net/base/load_flags.h" | 68 #include "net/base/load_flags.h" |
68 #include "net/base/mime_util.h" | 69 #include "net/base/mime_util.h" |
69 #include "net/base/net_errors.h" | 70 #include "net/base/net_errors.h" |
70 #include "net/base/request_priority.h" | 71 #include "net/base/request_priority.h" |
71 #include "net/base/ssl_cert_request_info.h" | 72 #include "net/base/ssl_cert_request_info.h" |
72 #include "net/base/upload_data.h" | 73 #include "net/base/upload_data.h" |
73 #include "net/http/http_response_headers.h" | 74 #include "net/http/http_response_headers.h" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 // See delcaration of |max_outstanding_requests_cost_per_process_| for details. | 120 // See delcaration of |max_outstanding_requests_cost_per_process_| for details. |
120 // This bound is 25MB, which allows for around 6000 outstanding requests. | 121 // This bound is 25MB, which allows for around 6000 outstanding requests. |
121 const int kMaxOutstandingRequestsCostPerProcess = 26214400; | 122 const int kMaxOutstandingRequestsCostPerProcess = 26214400; |
122 | 123 |
123 // Consults the RendererSecurity policy to determine whether the | 124 // Consults the RendererSecurity policy to determine whether the |
124 // ResourceDispatcherHost should service this request. A request might be | 125 // ResourceDispatcherHost should service this request. A request might be |
125 // disallowed if the renderer is not authorized to retrieve the request URL or | 126 // disallowed if the renderer is not authorized to retrieve the request URL or |
126 // if the renderer is attempting to upload an unauthorized file. | 127 // if the renderer is attempting to upload an unauthorized file. |
127 bool ShouldServiceRequest(ChildProcessInfo::ProcessType process_type, | 128 bool ShouldServiceRequest(ChildProcessInfo::ProcessType process_type, |
128 int child_id, | 129 int child_id, |
129 const ViewHostMsg_Resource_Request& request_data) { | 130 const ResourceHostMsg_Request& request_data) { |
130 if (process_type == ChildProcessInfo::PLUGIN_PROCESS) | 131 if (process_type == ChildProcessInfo::PLUGIN_PROCESS) |
131 return true; | 132 return true; |
132 | 133 |
133 if (request_data.resource_type == ResourceType::PREFETCH) { | 134 if (request_data.resource_type == ResourceType::PREFETCH) { |
134 prerender::PrerenderManager::RecordPrefetchTagObserved(); | 135 prerender::PrerenderManager::RecordPrefetchTagObserved(); |
135 if (!ResourceDispatcherHost::is_prefetch_enabled()) | 136 if (!ResourceDispatcherHost::is_prefetch_enabled()) |
136 return false; | 137 return false; |
137 } | 138 } |
138 | 139 |
139 ChildProcessSecurityPolicy* policy = | 140 ChildProcessSecurityPolicy* policy = |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 std::string()); // No security info necessary. | 306 std::string()); // No security info necessary. |
306 return true; | 307 return true; |
307 } | 308 } |
308 | 309 |
309 bool ResourceDispatcherHost::OnMessageReceived(const IPC::Message& message, | 310 bool ResourceDispatcherHost::OnMessageReceived(const IPC::Message& message, |
310 ResourceMessageFilter* filter, | 311 ResourceMessageFilter* filter, |
311 bool* message_was_ok) { | 312 bool* message_was_ok) { |
312 filter_ = filter; | 313 filter_ = filter; |
313 bool handled = true; | 314 bool handled = true; |
314 IPC_BEGIN_MESSAGE_MAP_EX(ResourceDispatcherHost, message, *message_was_ok) | 315 IPC_BEGIN_MESSAGE_MAP_EX(ResourceDispatcherHost, message, *message_was_ok) |
315 IPC_MESSAGE_HANDLER(ViewHostMsg_RequestResource, OnRequestResource) | 316 IPC_MESSAGE_HANDLER(ResourceHostMsg_RequestResource, OnRequestResource) |
316 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_SyncLoad, OnSyncLoad) | 317 IPC_MESSAGE_HANDLER_DELAY_REPLY(ResourceHostMsg_SyncLoad, OnSyncLoad) |
317 IPC_MESSAGE_HANDLER(ViewHostMsg_ReleaseDownloadedFile, | 318 IPC_MESSAGE_HANDLER(ResourceHostMsg_ReleaseDownloadedFile, |
318 OnReleaseDownloadedFile) | 319 OnReleaseDownloadedFile) |
319 IPC_MESSAGE_HANDLER(ViewHostMsg_DataReceived_ACK, OnDataReceivedACK) | 320 IPC_MESSAGE_HANDLER(ResourceHostMsg_DataReceived_ACK, OnDataReceivedACK) |
320 IPC_MESSAGE_HANDLER(ViewHostMsg_DataDownloaded_ACK, OnDataDownloadedACK) | 321 IPC_MESSAGE_HANDLER(ResourceHostMsg_DataDownloaded_ACK, OnDataDownloadedACK) |
321 IPC_MESSAGE_HANDLER(ViewHostMsg_UploadProgress_ACK, OnUploadProgressACK) | 322 IPC_MESSAGE_HANDLER(ResourceHostMsg_UploadProgress_ACK, OnUploadProgressACK) |
322 IPC_MESSAGE_HANDLER(ViewHostMsg_CancelRequest, OnCancelRequest) | 323 IPC_MESSAGE_HANDLER(ResourceHostMsg_CancelRequest, OnCancelRequest) |
323 IPC_MESSAGE_HANDLER(ViewHostMsg_FollowRedirect, OnFollowRedirect) | 324 IPC_MESSAGE_HANDLER(ResourceHostMsg_FollowRedirect, OnFollowRedirect) |
324 IPC_MESSAGE_HANDLER(ViewHostMsg_ClosePage_ACK, OnClosePageACK) | 325 IPC_MESSAGE_HANDLER(ViewHostMsg_ClosePage_ACK, OnClosePageACK) |
325 IPC_MESSAGE_UNHANDLED(handled = false) | 326 IPC_MESSAGE_UNHANDLED(handled = false) |
326 IPC_END_MESSAGE_MAP_EX() | 327 IPC_END_MESSAGE_MAP_EX() |
327 | 328 |
328 filter_ = NULL; | 329 filter_ = NULL; |
329 return handled; | 330 return handled; |
330 } | 331 } |
331 | 332 |
332 void ResourceDispatcherHost::OnRequestResource( | 333 void ResourceDispatcherHost::OnRequestResource( |
333 const IPC::Message& message, | 334 const IPC::Message& message, |
334 int request_id, | 335 int request_id, |
335 const ViewHostMsg_Resource_Request& request_data) { | 336 const ResourceHostMsg_Request& request_data) { |
336 BeginRequest(request_id, request_data, NULL, message.routing_id()); | 337 BeginRequest(request_id, request_data, NULL, message.routing_id()); |
337 } | 338 } |
338 | 339 |
339 // Begins a resource request with the given params on behalf of the specified | 340 // Begins a resource request with the given params on behalf of the specified |
340 // child process. Responses will be dispatched through the given receiver. The | 341 // child process. Responses will be dispatched through the given receiver. The |
341 // process ID is used to lookup TabContents from routing_id's in the case of a | 342 // process ID is used to lookup TabContents from routing_id's in the case of a |
342 // request from a renderer. request_context is the cookie/cache context to be | 343 // request from a renderer. request_context is the cookie/cache context to be |
343 // used for this request. | 344 // used for this request. |
344 // | 345 // |
345 // If sync_result is non-null, then a SyncLoad reply will be generated, else | 346 // If sync_result is non-null, then a SyncLoad reply will be generated, else |
346 // a normal asynchronous set of response messages will be generated. | 347 // a normal asynchronous set of response messages will be generated. |
347 void ResourceDispatcherHost::OnSyncLoad( | 348 void ResourceDispatcherHost::OnSyncLoad( |
348 int request_id, | 349 int request_id, |
349 const ViewHostMsg_Resource_Request& request_data, | 350 const ResourceHostMsg_Request& request_data, |
350 IPC::Message* sync_result) { | 351 IPC::Message* sync_result) { |
351 BeginRequest(request_id, request_data, sync_result, | 352 BeginRequest(request_id, request_data, sync_result, |
352 sync_result->routing_id()); | 353 sync_result->routing_id()); |
353 } | 354 } |
354 | 355 |
355 void ResourceDispatcherHost::BeginRequest( | 356 void ResourceDispatcherHost::BeginRequest( |
356 int request_id, | 357 int request_id, |
357 const ViewHostMsg_Resource_Request& request_data, | 358 const ResourceHostMsg_Request& request_data, |
358 IPC::Message* sync_result, // only valid for sync | 359 IPC::Message* sync_result, // only valid for sync |
359 int route_id) { | 360 int route_id) { |
360 ChildProcessInfo::ProcessType process_type = filter_->process_type(); | 361 ChildProcessInfo::ProcessType process_type = filter_->process_type(); |
361 int child_id = filter_->child_id(); | 362 int child_id = filter_->child_id(); |
362 | 363 |
363 ChromeURLRequestContext* context = filter_->GetURLRequestContext( | 364 ChromeURLRequestContext* context = filter_->GetURLRequestContext( |
364 request_data); | 365 request_data); |
365 | 366 |
366 // Might need to resolve the blob references in the upload data. | 367 // Might need to resolve the blob references in the upload data. |
367 if (request_data.upload_data && context) { | 368 if (request_data.upload_data && context) { |
368 context->blob_storage_context()->controller()-> | 369 context->blob_storage_context()->controller()-> |
369 ResolveBlobReferencesInUploadData(request_data.upload_data.get()); | 370 ResolveBlobReferencesInUploadData(request_data.upload_data.get()); |
370 } | 371 } |
371 | 372 |
372 if (is_shutdown_ || | 373 if (is_shutdown_ || |
373 !ShouldServiceRequest(process_type, child_id, request_data)) { | 374 !ShouldServiceRequest(process_type, child_id, request_data)) { |
374 net::URLRequestStatus status(net::URLRequestStatus::FAILED, | 375 net::URLRequestStatus status(net::URLRequestStatus::FAILED, |
375 net::ERR_ABORTED); | 376 net::ERR_ABORTED); |
376 if (sync_result) { | 377 if (sync_result) { |
377 SyncLoadResult result; | 378 SyncLoadResult result; |
378 result.status = status; | 379 result.status = status; |
379 ViewHostMsg_SyncLoad::WriteReplyParams(sync_result, result); | 380 ResourceHostMsg_SyncLoad::WriteReplyParams(sync_result, result); |
380 filter_->Send(sync_result); | 381 filter_->Send(sync_result); |
381 } else { | 382 } else { |
382 // Tell the renderer that this request was disallowed. | 383 // Tell the renderer that this request was disallowed. |
383 filter_->Send(new ViewMsg_Resource_RequestComplete( | 384 filter_->Send(new ResourceMsg_RequestComplete( |
384 route_id, | 385 route_id, |
385 request_id, | 386 request_id, |
386 status, | 387 status, |
387 std::string(), // No security info needed, connection was not | 388 std::string(), // No security info needed, connection was not |
388 base::Time())); // established. | 389 base::Time())); // established. |
389 } | 390 } |
390 return; | 391 return; |
391 } | 392 } |
392 | 393 |
393 // Ensure the Chrome plugins are loaded, as they may intercept network | 394 // Ensure the Chrome plugins are loaded, as they may intercept network |
(...skipping 1532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1926 return is_prefetch_enabled_; | 1927 return is_prefetch_enabled_; |
1927 } | 1928 } |
1928 | 1929 |
1929 // static | 1930 // static |
1930 void ResourceDispatcherHost::set_is_prefetch_enabled(bool value) { | 1931 void ResourceDispatcherHost::set_is_prefetch_enabled(bool value) { |
1931 is_prefetch_enabled_ = value; | 1932 is_prefetch_enabled_ = value; |
1932 } | 1933 } |
1933 | 1934 |
1934 // static | 1935 // static |
1935 bool ResourceDispatcherHost::is_prefetch_enabled_ = false; | 1936 bool ResourceDispatcherHost::is_prefetch_enabled_ = false; |
OLD | NEW |