| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/renderer_host/chrome_resource_dispatcher_host_observer.
h" | |
| 6 | |
| 7 #include "base/logging.h" | |
| 8 #include "chrome/browser/browser_process.h" | |
| 9 #include "chrome/browser/prerender/prerender_manager.h" | |
| 10 #include "chrome/browser/prerender/prerender_tracker.h" | |
| 11 #include "chrome/browser/renderer_host/safe_browsing_resource_handler.h" | |
| 12 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | |
| 13 #include "content/browser/browser_thread.h" | |
| 14 #include "content/browser/resource_context.h" | |
| 15 #include "content/browser/renderer_host/resource_dispatcher_host_request_info.h" | |
| 16 #include "content/common/resource_messages.h" | |
| 17 #include "net/base/load_flags.h" | |
| 18 | |
| 19 // TODO(oshima): Enable this for other platforms. | |
| 20 #if defined(OS_CHROMEOS) | |
| 21 #include "chrome/browser/renderer_host/offline_resource_handler.h" | |
| 22 #endif | |
| 23 | |
| 24 ChromeResourceDispatcherHostObserver::ChromeResourceDispatcherHostObserver( | |
| 25 ResourceDispatcherHost* resource_dispatcher_host, | |
| 26 prerender::PrerenderTracker* prerender_tracker) | |
| 27 : resource_dispatcher_host_(resource_dispatcher_host), | |
| 28 safe_browsing_(g_browser_process->safe_browsing_service()), | |
| 29 prerender_tracker_(prerender_tracker) { | |
| 30 } | |
| 31 | |
| 32 ChromeResourceDispatcherHostObserver::~ChromeResourceDispatcherHostObserver() { | |
| 33 } | |
| 34 | |
| 35 bool ChromeResourceDispatcherHostObserver::ShouldBeginRequest( | |
| 36 int child_id, int route_id, | |
| 37 const ResourceHostMsg_Request& request_data, | |
| 38 const content::ResourceContext& resource_context, | |
| 39 const GURL& referrer) { | |
| 40 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
| 41 | |
| 42 // Handle a PREFETCH resource type. If prefetch is disabled, squelch the | |
| 43 // request. Otherwise, do a normal request to warm the cache. | |
| 44 if (request_data.resource_type == ResourceType::PREFETCH) { | |
| 45 // All PREFETCH requests should be GETs, but be defensive about it. | |
| 46 if (request_data.method != "GET") | |
| 47 return false; | |
| 48 | |
| 49 // If prefetch is disabled, kill the request. | |
| 50 if (!ResourceDispatcherHost::is_prefetch_enabled()) | |
| 51 return false; | |
| 52 } | |
| 53 | |
| 54 // Handle a PRERENDER motivated request. Very similar to rel=prefetch, these | |
| 55 // rel=prerender requests instead launch an early render of the entire page. | |
| 56 if (request_data.resource_type == ResourceType::PRERENDER) { | |
| 57 if (prerender::PrerenderManager::IsPrerenderingPossible()) { | |
| 58 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | |
| 59 NewRunnableFunction(prerender::HandleTag, | |
| 60 resource_context.prerender_manager(), | |
| 61 child_id, | |
| 62 route_id, | |
| 63 request_data.url, | |
| 64 referrer)); | |
| 65 } | |
| 66 // Prerendering or not, this request should be aborted. | |
| 67 return false; | |
| 68 } | |
| 69 | |
| 70 // Abort any prerenders that spawn requests that use invalid HTTP methods. | |
| 71 if (prerender_tracker_->IsPrerenderingOnIOThread(child_id, route_id) && | |
| 72 !prerender::PrerenderManager::IsValidHttpMethod(request_data.method)) { | |
| 73 prerender_tracker_->TryCancelOnIOThread( | |
| 74 child_id, route_id, | |
| 75 prerender::FINAL_STATUS_INVALID_HTTP_METHOD); | |
| 76 return false; | |
| 77 } | |
| 78 | |
| 79 return true; | |
| 80 } | |
| 81 | |
| 82 void ChromeResourceDispatcherHostObserver::RequestBeginning( | |
| 83 ResourceHandler** handler, | |
| 84 net::URLRequest* request, | |
| 85 bool is_subresource, | |
| 86 int child_id, | |
| 87 int route_id) { | |
| 88 if (prerender_tracker_->IsPrerenderingOnIOThread(child_id, route_id)) | |
| 89 request->set_load_flags(request->load_flags() | net::LOAD_PRERENDERING); | |
| 90 | |
| 91 // Insert safe browsing at the front of the chain, so it gets to decide | |
| 92 // on policies first. | |
| 93 if (safe_browsing_->enabled()) { | |
| 94 *handler = CreateSafeBrowsingResourceHandler( | |
| 95 *handler, child_id, route_id, is_subresource); | |
| 96 } | |
| 97 | |
| 98 #if defined(OS_CHROMEOS) | |
| 99 // We check offline first, then check safe browsing so that we still can block | |
| 100 // unsafe site after we remove offline page. | |
| 101 *handler = new OfflineResourceHandler( | |
| 102 *handler, child_id, route_id, resource_dispatcher_host_, request); | |
| 103 #endif | |
| 104 } | |
| 105 | |
| 106 void ChromeResourceDispatcherHostObserver::DownloadStarting( | |
| 107 ResourceHandler** handler, | |
| 108 int child_id, | |
| 109 int route_id) { | |
| 110 if (safe_browsing_->enabled()) { | |
| 111 *handler = CreateSafeBrowsingResourceHandler( | |
| 112 *handler, child_id, route_id, false); | |
| 113 } | |
| 114 } | |
| 115 | |
| 116 bool ChromeResourceDispatcherHostObserver::ShouldDeferStart( | |
| 117 net::URLRequest* request, | |
| 118 const content::ResourceContext& resource_context) { | |
| 119 ResourceDispatcherHostRequestInfo* info = | |
| 120 resource_dispatcher_host_->InfoForRequest(request); | |
| 121 return prerender_tracker_->PotentiallyDelayRequestOnIOThread( | |
| 122 request->url(), resource_context.prerender_manager(), | |
| 123 info->child_id(), info->route_id(), info->request_id()); | |
| 124 } | |
| 125 | |
| 126 bool ChromeResourceDispatcherHostObserver::AcceptSSLClientCertificateRequest( | |
| 127 net::URLRequest* request, net::SSLCertRequestInfo* cert_request_info) { | |
| 128 if (request->load_flags() & net::LOAD_PREFETCH) | |
| 129 return false; | |
| 130 | |
| 131 if (request->load_flags() & net::LOAD_PRERENDERING) { | |
| 132 int child_id, route_id; | |
| 133 if (ResourceDispatcherHost::RenderViewForRequest( | |
| 134 request, &child_id, &route_id)) { | |
| 135 if (prerender_tracker_->TryCancel( | |
| 136 child_id, route_id, | |
| 137 prerender::FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED)) { | |
| 138 return false; | |
| 139 } | |
| 140 } | |
| 141 } | |
| 142 | |
| 143 return true; | |
| 144 } | |
| 145 | |
| 146 bool ChromeResourceDispatcherHostObserver::AcceptAuthRequest( | |
| 147 net::URLRequest* request, | |
| 148 net::AuthChallengeInfo* auth_info) { | |
| 149 if (!(request->load_flags() & net::LOAD_PRERENDERING)) | |
| 150 return true; | |
| 151 | |
| 152 int child_id, route_id; | |
| 153 if (!ResourceDispatcherHost::RenderViewForRequest( | |
| 154 request, &child_id, &route_id)) { | |
| 155 NOTREACHED(); | |
| 156 return true; | |
| 157 } | |
| 158 | |
| 159 if (!prerender_tracker_->TryCancelOnIOThread( | |
| 160 child_id, route_id, prerender::FINAL_STATUS_AUTH_NEEDED)) { | |
| 161 return true; | |
| 162 } | |
| 163 | |
| 164 return false; | |
| 165 } | |
| 166 | |
| 167 ResourceHandler* | |
| 168 ChromeResourceDispatcherHostObserver::CreateSafeBrowsingResourceHandler( | |
| 169 ResourceHandler* handler, int child_id, int route_id, | |
| 170 bool subresource) { | |
| 171 return SafeBrowsingResourceHandler::Create( | |
| 172 handler, child_id, route_id, subresource, safe_browsing_, | |
| 173 resource_dispatcher_host_); | |
| 174 } | |
| OLD | NEW |