| 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> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
| 14 #include "base/logging.h" | 14 #include "base/logging.h" |
| 15 #include "base/memory/scoped_ptr.h" | 15 #include "base/memory/scoped_ptr.h" |
| 16 #include "base/message_loop.h" | 16 #include "base/message_loop.h" |
| 17 #include "base/metrics/histogram.h" | 17 #include "base/metrics/histogram.h" |
| 18 #include "base/shared_memory.h" | 18 #include "base/shared_memory.h" |
| 19 #include "base/stl_util-inl.h" | 19 #include "base/stl_util-inl.h" |
| 20 #include "base/time.h" | 20 #include "base/time.h" |
| 21 #include "chrome/browser/download/download_file_manager.h" | 21 #include "chrome/browser/download/download_file_manager.h" |
| 22 #include "chrome/browser/download/download_manager.h" | 22 #include "chrome/browser/download/download_manager.h" |
| 23 #include "chrome/browser/download/download_request_limiter.h" | 23 #include "chrome/browser/download/download_request_limiter.h" |
| 24 #include "chrome/browser/download/download_util.h" | 24 #include "chrome/browser/download/download_util.h" |
| 25 #include "chrome/browser/download/save_file_manager.h" | 25 #include "chrome/browser/download/save_file_manager.h" |
| 26 #include "chrome/browser/external_protocol_handler.h" | 26 #include "chrome/browser/external_protocol_handler.h" |
| 27 #include "chrome/browser/net/url_request_tracking.h" | 27 #include "chrome/browser/net/url_request_tracking.h" |
| 28 #include "chrome/browser/prerender/prerender_manager.h" | 28 #include "chrome/browser/prerender/prerender_manager.h" |
| 29 #include "chrome/browser/prerender/prerender_tracker.h" |
| 29 #include "chrome/browser/profiles/profile.h" | 30 #include "chrome/browser/profiles/profile.h" |
| 30 #include "chrome/browser/renderer_host/download_resource_handler.h" | 31 #include "chrome/browser/renderer_host/download_resource_handler.h" |
| 31 #include "chrome/browser/renderer_host/safe_browsing_resource_handler.h" | 32 #include "chrome/browser/renderer_host/safe_browsing_resource_handler.h" |
| 32 #include "chrome/browser/renderer_host/save_file_resource_handler.h" | 33 #include "chrome/browser/renderer_host/save_file_resource_handler.h" |
| 33 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 34 #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
| 34 #include "chrome/browser/ssl/ssl_client_auth_handler.h" | 35 #include "chrome/browser/ssl/ssl_client_auth_handler.h" |
| 35 #include "chrome/browser/ssl/ssl_manager.h" | 36 #include "chrome/browser/ssl/ssl_manager.h" |
| 36 #include "chrome/browser/ui/login/login_prompt.h" | 37 #include "chrome/browser/ui/login/login_prompt.h" |
| 37 #include "chrome/common/chrome_switches.h" | 38 #include "chrome/common/chrome_switches.h" |
| 38 #include "chrome/common/url_constants.h" | 39 #include "chrome/common/url_constants.h" |
| (...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 425 ResolveBlobReferencesInUploadData(request_data.upload_data.get()); | 426 ResolveBlobReferencesInUploadData(request_data.upload_data.get()); |
| 426 } | 427 } |
| 427 | 428 |
| 428 if (is_shutdown_ || | 429 if (is_shutdown_ || |
| 429 !ShouldServiceRequest(process_type, child_id, request_data)) { | 430 !ShouldServiceRequest(process_type, child_id, request_data)) { |
| 430 AbortRequestBeforeItStarts(filter_, sync_result, route_id, request_id); | 431 AbortRequestBeforeItStarts(filter_, sync_result, route_id, request_id); |
| 431 return; | 432 return; |
| 432 } | 433 } |
| 433 | 434 |
| 434 const GURL referrer = MaybeStripReferrer(request_data.referrer); | 435 const GURL referrer = MaybeStripReferrer(request_data.referrer); |
| 435 const bool is_prerendering = IsPrerenderingChildRoutePair(child_id, route_id); | 436 const bool is_prerendering = |
| 437 prerender::PrerenderTracker::GetInstance()->IsPrerenderingOnIOThread( |
| 438 child_id, route_id); |
| 436 | 439 |
| 437 // Handle a PREFETCH resource type. If prefetch is disabled, squelch the | 440 // Handle a PREFETCH resource type. If prefetch is disabled, squelch the |
| 438 // request. If prerendering is enabled, trigger a prerender for the URL | 441 // request. If prerendering is enabled, trigger a prerender for the URL |
| 439 // and abort the request, to prevent double-gets. Otherwise, do a normal | 442 // and abort the request, to prevent double-gets. Otherwise, do a normal |
| 440 // prefetch. | 443 // prefetch. |
| 441 if (request_data.resource_type == ResourceType::PREFETCH) { | 444 if (request_data.resource_type == ResourceType::PREFETCH) { |
| 442 // All PREFETCH requests should be GETs, but be defensive about it. | 445 // All PREFETCH requests should be GETs, but be defensive about it. |
| 443 if (request_data.method != "GET") { | 446 if (request_data.method != "GET") { |
| 444 AbortRequestBeforeItStarts(filter_, sync_result, route_id, request_id); | 447 AbortRequestBeforeItStarts(filter_, sync_result, route_id, request_id); |
| 445 return; | 448 return; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 460 is_prerendering)); | 463 is_prerendering)); |
| 461 AbortRequestBeforeItStarts(filter_, sync_result, route_id, request_id); | 464 AbortRequestBeforeItStarts(filter_, sync_result, route_id, request_id); |
| 462 return; | 465 return; |
| 463 } | 466 } |
| 464 // Otherwise, treat like a normal request, and fall-through. | 467 // Otherwise, treat like a normal request, and fall-through. |
| 465 } | 468 } |
| 466 | 469 |
| 467 // Abort any prerenders that spawn requests that use invalid HTTP methods. | 470 // Abort any prerenders that spawn requests that use invalid HTTP methods. |
| 468 if (is_prerendering && | 471 if (is_prerendering && |
| 469 !prerender::PrerenderManager::IsValidHttpMethod(request_data.method)) { | 472 !prerender::PrerenderManager::IsValidHttpMethod(request_data.method)) { |
| 470 BrowserThread::PostTask( | 473 if (prerender::PrerenderTracker::GetInstance()->TryCancelOnIOThread( |
| 471 BrowserThread::UI, FROM_HERE, | 474 child_id, route_id, prerender::FINAL_STATUS_INVALID_HTTP_METHOD)) { |
| 472 NewRunnableFunction( | 475 AbortRequestBeforeItStarts(filter_, sync_result, route_id, request_id); |
| 473 prerender::DestroyPreloadForRenderView, | 476 return; |
| 474 resource_context.prerender_manager(), | 477 } |
| 475 child_id, | |
| 476 route_id, | |
| 477 prerender::FINAL_STATUS_INVALID_HTTP_METHOD)); | |
| 478 AbortRequestBeforeItStarts(filter_, sync_result, route_id, request_id); | |
| 479 return; | |
| 480 } | 478 } |
| 481 | 479 |
| 482 // Construct the event handler. | 480 // Construct the event handler. |
| 483 scoped_refptr<ResourceHandler> handler; | 481 scoped_refptr<ResourceHandler> handler; |
| 484 if (sync_result) { | 482 if (sync_result) { |
| 485 handler = new SyncResourceHandler( | 483 handler = new SyncResourceHandler( |
| 486 filter_, request_data.url, sync_result, this); | 484 filter_, request_data.url, sync_result, this); |
| 487 } else { | 485 } else { |
| 488 handler = new AsyncResourceHandler( | 486 handler = new AsyncResourceHandler( |
| 489 filter_, route_id, request_data.url, resource_context.host_zoom_map(), | 487 filter_, route_id, request_data.url, resource_context.host_zoom_map(), |
| (...skipping 1539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2029 case ResourceType::PREFETCH: | 2027 case ResourceType::PREFETCH: |
| 2030 return net::IDLE; | 2028 return net::IDLE; |
| 2031 | 2029 |
| 2032 default: | 2030 default: |
| 2033 // When new resource types are added, their priority must be considered. | 2031 // When new resource types are added, their priority must be considered. |
| 2034 NOTREACHED(); | 2032 NOTREACHED(); |
| 2035 return net::LOW; | 2033 return net::LOW; |
| 2036 } | 2034 } |
| 2037 } | 2035 } |
| 2038 | 2036 |
| 2039 void ResourceDispatcherHost::AddPrerenderChildRoutePair(int child_id, | |
| 2040 int route_id) { | |
| 2041 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
| 2042 DCHECK(!IsPrerenderingChildRoutePair(child_id, route_id)); | |
| 2043 prerender_child_route_pairs_.insert(std::make_pair(child_id, route_id)); | |
| 2044 } | |
| 2045 | |
| 2046 void ResourceDispatcherHost::RemovePrerenderChildRoutePair(int child_id, | |
| 2047 int route_id) { | |
| 2048 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
| 2049 DCHECK(IsPrerenderingChildRoutePair(child_id, route_id)); | |
| 2050 prerender_child_route_pairs_.erase(std::make_pair(child_id, route_id)); | |
| 2051 } | |
| 2052 | |
| 2053 bool ResourceDispatcherHost::IsPrerenderingChildRoutePair(int child_id, | |
| 2054 int route_id) const { | |
| 2055 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
| 2056 std::pair<int, int> c_r_pair = std::make_pair(child_id, route_id); | |
| 2057 return (prerender_child_route_pairs_.find(c_r_pair) != | |
| 2058 prerender_child_route_pairs_.end()); | |
| 2059 } | |
| 2060 | |
| 2061 | 2037 |
| 2062 // static | 2038 // static |
| 2063 bool ResourceDispatcherHost::is_prefetch_enabled() { | 2039 bool ResourceDispatcherHost::is_prefetch_enabled() { |
| 2064 return is_prefetch_enabled_; | 2040 return is_prefetch_enabled_; |
| 2065 } | 2041 } |
| 2066 | 2042 |
| 2067 // static | 2043 // static |
| 2068 void ResourceDispatcherHost::set_is_prefetch_enabled(bool value) { | 2044 void ResourceDispatcherHost::set_is_prefetch_enabled(bool value) { |
| 2069 is_prefetch_enabled_ = value; | 2045 is_prefetch_enabled_ = value; |
| 2070 } | 2046 } |
| 2071 | 2047 |
| 2072 // static | 2048 // static |
| 2073 bool ResourceDispatcherHost::is_prefetch_enabled_ = false; | 2049 bool ResourceDispatcherHost::is_prefetch_enabled_ = false; |
| OLD | NEW |