| 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 #include "chrome/browser/renderer_host/chrome_resource_dispatcher_host_observer.
h" | 5 #include "chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.
h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "chrome/browser/browser_process.h" | 8 #include "chrome/browser/browser_process.h" |
| 9 #include "chrome/browser/external_protocol/external_protocol_handler.h" |
| 9 #include "chrome/browser/prerender/prerender_manager.h" | 10 #include "chrome/browser/prerender/prerender_manager.h" |
| 10 #include "chrome/browser/prerender/prerender_tracker.h" | 11 #include "chrome/browser/prerender/prerender_tracker.h" |
| 11 #include "chrome/browser/renderer_host/safe_browsing_resource_handler.h" | 12 #include "chrome/browser/renderer_host/safe_browsing_resource_handler.h" |
| 12 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 13 #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
| 14 #include "chrome/browser/ui/login/login_prompt.h" |
| 13 #include "content/browser/browser_thread.h" | 15 #include "content/browser/browser_thread.h" |
| 14 #include "content/browser/resource_context.h" | 16 #include "content/browser/resource_context.h" |
| 17 #include "content/browser/renderer_host/resource_dispatcher_host.h" |
| 15 #include "content/browser/renderer_host/resource_dispatcher_host_request_info.h" | 18 #include "content/browser/renderer_host/resource_dispatcher_host_request_info.h" |
| 16 #include "content/common/resource_messages.h" | 19 #include "content/common/resource_messages.h" |
| 17 #include "net/base/load_flags.h" | 20 #include "net/base/load_flags.h" |
| 18 | 21 |
| 19 // TODO(oshima): Enable this for other platforms. | 22 // TODO(oshima): Enable this for other platforms. |
| 20 #if defined(OS_CHROMEOS) | 23 #if defined(OS_CHROMEOS) |
| 21 #include "chrome/browser/renderer_host/offline_resource_handler.h" | 24 #include "chrome/browser/renderer_host/offline_resource_handler.h" |
| 22 #endif | 25 #endif |
| 23 | 26 |
| 24 ChromeResourceDispatcherHostObserver::ChromeResourceDispatcherHostObserver( | 27 ChromeResourceDispatcherHostDelegate::ChromeResourceDispatcherHostDelegate( |
| 25 ResourceDispatcherHost* resource_dispatcher_host, | 28 ResourceDispatcherHost* resource_dispatcher_host, |
| 26 prerender::PrerenderTracker* prerender_tracker) | 29 prerender::PrerenderTracker* prerender_tracker) |
| 27 : resource_dispatcher_host_(resource_dispatcher_host), | 30 : resource_dispatcher_host_(resource_dispatcher_host), |
| 28 safe_browsing_(g_browser_process->safe_browsing_service()), | 31 safe_browsing_(g_browser_process->safe_browsing_service()), |
| 29 prerender_tracker_(prerender_tracker) { | 32 prerender_tracker_(prerender_tracker) { |
| 30 } | 33 } |
| 31 | 34 |
| 32 ChromeResourceDispatcherHostObserver::~ChromeResourceDispatcherHostObserver() { | 35 ChromeResourceDispatcherHostDelegate::~ChromeResourceDispatcherHostDelegate() { |
| 33 } | 36 } |
| 34 | 37 |
| 35 bool ChromeResourceDispatcherHostObserver::ShouldBeginRequest( | 38 bool ChromeResourceDispatcherHostDelegate::ShouldBeginRequest( |
| 36 int child_id, int route_id, | 39 int child_id, int route_id, |
| 37 const ResourceHostMsg_Request& request_data, | 40 const ResourceHostMsg_Request& request_data, |
| 38 const content::ResourceContext& resource_context, | 41 const content::ResourceContext& resource_context, |
| 39 const GURL& referrer) { | 42 const GURL& referrer) { |
| 40 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 43 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 41 | 44 |
| 42 // Handle a PREFETCH resource type. If prefetch is disabled, squelch the | 45 // Handle a PREFETCH resource type. If prefetch is disabled, squelch the |
| 43 // request. Otherwise, do a normal request to warm the cache. | 46 // request. Otherwise, do a normal request to warm the cache. |
| 44 if (request_data.resource_type == ResourceType::PREFETCH) { | 47 if (request_data.resource_type == ResourceType::PREFETCH) { |
| 45 // All PREFETCH requests should be GETs, but be defensive about it. | 48 // All PREFETCH requests should be GETs, but be defensive about it. |
| (...skipping 26 matching lines...) Expand all Loading... |
| 72 !prerender::PrerenderManager::IsValidHttpMethod(request_data.method)) { | 75 !prerender::PrerenderManager::IsValidHttpMethod(request_data.method)) { |
| 73 prerender_tracker_->TryCancelOnIOThread( | 76 prerender_tracker_->TryCancelOnIOThread( |
| 74 child_id, route_id, | 77 child_id, route_id, |
| 75 prerender::FINAL_STATUS_INVALID_HTTP_METHOD); | 78 prerender::FINAL_STATUS_INVALID_HTTP_METHOD); |
| 76 return false; | 79 return false; |
| 77 } | 80 } |
| 78 | 81 |
| 79 return true; | 82 return true; |
| 80 } | 83 } |
| 81 | 84 |
| 82 void ChromeResourceDispatcherHostObserver::RequestBeginning( | 85 ResourceHandler* ChromeResourceDispatcherHostDelegate::RequestBeginning( |
| 83 ResourceHandler** handler, | 86 ResourceHandler* handler, |
| 84 net::URLRequest* request, | 87 net::URLRequest* request, |
| 85 bool is_subresource, | 88 bool is_subresource, |
| 86 int child_id, | 89 int child_id, |
| 87 int route_id) { | 90 int route_id) { |
| 88 if (prerender_tracker_->IsPrerenderingOnIOThread(child_id, route_id)) | 91 if (prerender_tracker_->IsPrerenderingOnIOThread(child_id, route_id)) |
| 89 request->set_load_flags(request->load_flags() | net::LOAD_PRERENDERING); | 92 request->set_load_flags(request->load_flags() | net::LOAD_PRERENDERING); |
| 90 | 93 |
| 91 // Insert safe browsing at the front of the chain, so it gets to decide | 94 // Insert safe browsing at the front of the chain, so it gets to decide |
| 92 // on policies first. | 95 // on policies first. |
| 93 if (safe_browsing_->enabled()) { | 96 if (safe_browsing_->enabled()) { |
| 94 *handler = CreateSafeBrowsingResourceHandler( | 97 handler = CreateSafeBrowsingResourceHandler( |
| 95 *handler, child_id, route_id, is_subresource); | 98 handler, child_id, route_id, is_subresource); |
| 96 } | 99 } |
| 97 | 100 |
| 98 #if defined(OS_CHROMEOS) | 101 #if defined(OS_CHROMEOS) |
| 99 // We check offline first, then check safe browsing so that we still can block | 102 // We check offline first, then check safe browsing so that we still can block |
| 100 // unsafe site after we remove offline page. | 103 // unsafe site after we remove offline page. |
| 101 *handler = new OfflineResourceHandler( | 104 handler = new OfflineResourceHandler( |
| 102 *handler, child_id, route_id, resource_dispatcher_host_, request); | 105 handler, child_id, route_id, resource_dispatcher_host_, request); |
| 103 #endif | 106 #endif |
| 107 return handler; |
| 104 } | 108 } |
| 105 | 109 |
| 106 void ChromeResourceDispatcherHostObserver::DownloadStarting( | 110 ResourceHandler* ChromeResourceDispatcherHostDelegate::DownloadStarting( |
| 107 ResourceHandler** handler, | 111 ResourceHandler* handler, |
| 108 int child_id, | 112 int child_id, |
| 109 int route_id) { | 113 int route_id) { |
| 110 if (safe_browsing_->enabled()) { | 114 if (!safe_browsing_->enabled()) |
| 111 *handler = CreateSafeBrowsingResourceHandler( | 115 return handler; |
| 112 *handler, child_id, route_id, false); | 116 |
| 113 } | 117 return CreateSafeBrowsingResourceHandler(handler, child_id, route_id, false); |
| 114 } | 118 } |
| 115 | 119 |
| 116 bool ChromeResourceDispatcherHostObserver::ShouldDeferStart( | 120 bool ChromeResourceDispatcherHostDelegate::ShouldDeferStart( |
| 117 net::URLRequest* request, | 121 net::URLRequest* request, |
| 118 const content::ResourceContext& resource_context) { | 122 const content::ResourceContext& resource_context) { |
| 119 ResourceDispatcherHostRequestInfo* info = | 123 ResourceDispatcherHostRequestInfo* info = |
| 120 resource_dispatcher_host_->InfoForRequest(request); | 124 resource_dispatcher_host_->InfoForRequest(request); |
| 121 return prerender_tracker_->PotentiallyDelayRequestOnIOThread( | 125 return prerender_tracker_->PotentiallyDelayRequestOnIOThread( |
| 122 request->url(), resource_context.prerender_manager(), | 126 request->url(), resource_context.prerender_manager(), |
| 123 info->child_id(), info->route_id(), info->request_id()); | 127 info->child_id(), info->route_id(), info->request_id()); |
| 124 } | 128 } |
| 125 | 129 |
| 126 bool ChromeResourceDispatcherHostObserver::AcceptSSLClientCertificateRequest( | 130 bool ChromeResourceDispatcherHostDelegate::AcceptSSLClientCertificateRequest( |
| 127 net::URLRequest* request, net::SSLCertRequestInfo* cert_request_info) { | 131 net::URLRequest* request, net::SSLCertRequestInfo* cert_request_info) { |
| 128 if (request->load_flags() & net::LOAD_PREFETCH) | 132 if (request->load_flags() & net::LOAD_PREFETCH) |
| 129 return false; | 133 return false; |
| 130 | 134 |
| 131 if (request->load_flags() & net::LOAD_PRERENDERING) { | 135 if (request->load_flags() & net::LOAD_PRERENDERING) { |
| 132 int child_id, route_id; | 136 int child_id, route_id; |
| 133 if (ResourceDispatcherHost::RenderViewForRequest( | 137 if (ResourceDispatcherHost::RenderViewForRequest( |
| 134 request, &child_id, &route_id)) { | 138 request, &child_id, &route_id)) { |
| 135 if (prerender_tracker_->TryCancel( | 139 if (prerender_tracker_->TryCancel( |
| 136 child_id, route_id, | 140 child_id, route_id, |
| 137 prerender::FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED)) { | 141 prerender::FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED)) { |
| 138 return false; | 142 return false; |
| 139 } | 143 } |
| 140 } | 144 } |
| 141 } | 145 } |
| 142 | 146 |
| 143 return true; | 147 return true; |
| 144 } | 148 } |
| 145 | 149 |
| 146 bool ChromeResourceDispatcherHostObserver::AcceptAuthRequest( | 150 bool ChromeResourceDispatcherHostDelegate::AcceptAuthRequest( |
| 147 net::URLRequest* request, | 151 net::URLRequest* request, |
| 148 net::AuthChallengeInfo* auth_info) { | 152 net::AuthChallengeInfo* auth_info) { |
| 149 if (!(request->load_flags() & net::LOAD_PRERENDERING)) | 153 if (!(request->load_flags() & net::LOAD_PRERENDERING)) |
| 150 return true; | 154 return true; |
| 151 | 155 |
| 152 int child_id, route_id; | 156 int child_id, route_id; |
| 153 if (!ResourceDispatcherHost::RenderViewForRequest( | 157 if (!ResourceDispatcherHost::RenderViewForRequest( |
| 154 request, &child_id, &route_id)) { | 158 request, &child_id, &route_id)) { |
| 155 NOTREACHED(); | 159 NOTREACHED(); |
| 156 return true; | 160 return true; |
| 157 } | 161 } |
| 158 | 162 |
| 159 if (!prerender_tracker_->TryCancelOnIOThread( | 163 if (!prerender_tracker_->TryCancelOnIOThread( |
| 160 child_id, route_id, prerender::FINAL_STATUS_AUTH_NEEDED)) { | 164 child_id, route_id, prerender::FINAL_STATUS_AUTH_NEEDED)) { |
| 161 return true; | 165 return true; |
| 162 } | 166 } |
| 163 | 167 |
| 164 return false; | 168 return false; |
| 165 } | 169 } |
| 166 | 170 |
| 171 ResourceDispatcherHostLoginDelegate* |
| 172 ChromeResourceDispatcherHostDelegate::CreateLoginDelegate( |
| 173 net::AuthChallengeInfo* auth_info, net::URLRequest* request) { |
| 174 return CreateLoginPrompt(auth_info, request); |
| 175 } |
| 176 |
| 177 void ChromeResourceDispatcherHostDelegate::HandleExternalProtocol( |
| 178 const GURL& url, int child_id, int route_id) { |
| 179 BrowserThread::PostTask( |
| 180 BrowserThread::UI, FROM_HERE, |
| 181 NewRunnableFunction( |
| 182 &ExternalProtocolHandler::LaunchUrl, url, child_id, route_id)); |
| 183 } |
| 184 |
| 167 ResourceHandler* | 185 ResourceHandler* |
| 168 ChromeResourceDispatcherHostObserver::CreateSafeBrowsingResourceHandler( | 186 ChromeResourceDispatcherHostDelegate::CreateSafeBrowsingResourceHandler( |
| 169 ResourceHandler* handler, int child_id, int route_id, | 187 ResourceHandler* handler, int child_id, int route_id, |
| 170 bool subresource) { | 188 bool subresource) { |
| 171 return SafeBrowsingResourceHandler::Create( | 189 return SafeBrowsingResourceHandler::Create( |
| 172 handler, child_id, route_id, subresource, safe_browsing_, | 190 handler, child_id, route_id, subresource, safe_browsing_, |
| 173 resource_dispatcher_host_); | 191 resource_dispatcher_host_); |
| 174 } | 192 } |
| OLD | NEW |