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

Side by Side Diff: content/browser/renderer_host/resource_dispatcher_host.cc

Issue 7038012: Safely cancel prerenders on threads other than the UI thread (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Response to Dominic's comments, part 3 Created 9 years, 7 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 // 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
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
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
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;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698