| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_delegate.
h" | 5 #include "chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.
h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/base64.h" | 9 #include "base/base64.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "chrome/browser/browser_process.h" | 11 #include "chrome/browser/browser_process.h" |
| 12 #include "chrome/browser/content_settings/host_content_settings_map.h" | 12 #include "chrome/browser/content_settings/host_content_settings_map.h" |
| 13 #include "chrome/browser/download/download_request_limiter.h" | 13 #include "chrome/browser/download/download_request_limiter.h" |
| 14 #include "chrome/browser/download/download_resource_throttle.h" | 14 #include "chrome/browser/download/download_resource_throttle.h" |
| 15 #include "chrome/browser/download/download_util.h" | 15 #include "chrome/browser/download/download_util.h" |
| 16 #include "chrome/browser/extensions/user_script_listener.h" | 16 #include "chrome/browser/extensions/user_script_listener.h" |
| 17 #include "chrome/browser/external_protocol/external_protocol_handler.h" | 17 #include "chrome/browser/external_protocol/external_protocol_handler.h" |
| 18 #include "chrome/browser/google/google_util.h" | 18 #include "chrome/browser/google/google_util.h" |
| 19 #include "chrome/browser/instant/instant_loader.h" | 19 #include "chrome/browser/instant/instant_loader.h" |
| 20 #include "chrome/browser/net/load_timing_observer.h" | 20 #include "chrome/browser/net/load_timing_observer.h" |
| 21 #include "chrome/browser/prerender/prerender_manager.h" | 21 #include "chrome/browser/prerender/prerender_manager.h" |
| 22 #include "chrome/browser/prerender/prerender_tracker.h" | 22 #include "chrome/browser/prerender/prerender_render_view_tracker.h" |
| 23 #include "chrome/browser/profiles/profile_io_data.h" | 23 #include "chrome/browser/profiles/profile_io_data.h" |
| 24 #include "chrome/browser/renderer_host/chrome_url_request_user_data.h" | 24 #include "chrome/browser/renderer_host/chrome_url_request_user_data.h" |
| 25 #include "chrome/browser/renderer_host/safe_browsing_resource_throttle.h" | 25 #include "chrome/browser/renderer_host/safe_browsing_resource_throttle.h" |
| 26 #include "chrome/browser/renderer_host/transfer_navigation_resource_throttle.h" | 26 #include "chrome/browser/renderer_host/transfer_navigation_resource_throttle.h" |
| 27 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 27 #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
| 28 #include "chrome/browser/ui/auto_login_prompter.h" | 28 #include "chrome/browser/ui/auto_login_prompter.h" |
| 29 #include "chrome/browser/ui/login/login_prompt.h" | 29 #include "chrome/browser/ui/login/login_prompt.h" |
| 30 #include "chrome/browser/ui/sync/one_click_signin_helper.h" | 30 #include "chrome/browser/ui/sync/one_click_signin_helper.h" |
| 31 #include "chrome/common/chrome_notification_types.h" | 31 #include "chrome/common/chrome_notification_types.h" |
| 32 #include "chrome/common/extensions/user_script.h" | 32 #include "chrome/common/extensions/user_script.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 | 64 |
| 65 content::NotificationService::current()->Notify( | 65 content::NotificationService::current()->Notify( |
| 66 chrome::NOTIFICATION_DOWNLOAD_INITIATED, | 66 chrome::NOTIFICATION_DOWNLOAD_INITIATED, |
| 67 content::Source<RenderViewHost>(rvh), | 67 content::Source<RenderViewHost>(rvh), |
| 68 content::NotificationService::NoDetails()); | 68 content::NotificationService::NoDetails()); |
| 69 } | 69 } |
| 70 | 70 |
| 71 } // end namespace | 71 } // end namespace |
| 72 | 72 |
| 73 ChromeResourceDispatcherHostDelegate::ChromeResourceDispatcherHostDelegate( | 73 ChromeResourceDispatcherHostDelegate::ChromeResourceDispatcherHostDelegate( |
| 74 prerender::PrerenderTracker* prerender_tracker) | 74 prerender::PrerenderRenderViewTracker* prerender_render_view_tracker) |
| 75 : download_request_limiter_(g_browser_process->download_request_limiter()), | 75 : download_request_limiter_(g_browser_process->download_request_limiter()), |
| 76 safe_browsing_(g_browser_process->safe_browsing_service()), | 76 safe_browsing_(g_browser_process->safe_browsing_service()), |
| 77 user_script_listener_(new UserScriptListener()), | 77 user_script_listener_(new UserScriptListener()), |
| 78 prerender_tracker_(prerender_tracker), | 78 prerender_render_view_tracker_(prerender_render_view_tracker), |
| 79 variation_ids_cache_initialized_(false) { | 79 variation_ids_cache_initialized_(false) { |
| 80 } | 80 } |
| 81 | 81 |
| 82 ChromeResourceDispatcherHostDelegate::~ChromeResourceDispatcherHostDelegate() { | 82 ChromeResourceDispatcherHostDelegate::~ChromeResourceDispatcherHostDelegate() { |
| 83 } | 83 } |
| 84 | 84 |
| 85 bool ChromeResourceDispatcherHostDelegate::ShouldBeginRequest( | 85 bool ChromeResourceDispatcherHostDelegate::ShouldBeginRequest( |
| 86 int child_id, | 86 int child_id, |
| 87 int route_id, | 87 int route_id, |
| 88 const std::string& method, | 88 const std::string& method, |
| 89 const GURL& url, | 89 const GURL& url, |
| 90 ResourceType::Type resource_type, | 90 ResourceType::Type resource_type, |
| 91 content::ResourceContext* resource_context, | 91 content::ResourceContext* resource_context, |
| 92 const content::Referrer& referrer) { | 92 const content::Referrer& referrer) { |
| 93 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 93 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 94 | 94 |
| 95 // Handle a PREFETCH resource type. If prefetch is disabled, squelch the | 95 // Handle a PREFETCH resource type. If prefetch is disabled, squelch the |
| 96 // request. Otherwise, do a normal request to warm the cache. | 96 // request. Otherwise, do a normal request to warm the cache. |
| 97 if (resource_type == ResourceType::PREFETCH) { | 97 if (resource_type == ResourceType::PREFETCH) { |
| 98 // All PREFETCH requests should be GETs, but be defensive about it. | 98 // All PREFETCH requests should be GETs, but be defensive about it. |
| 99 if (method != "GET") | 99 if (method != "GET") |
| 100 return false; | 100 return false; |
| 101 | 101 |
| 102 // If prefetch is disabled, kill the request. | 102 // If prefetch is disabled, kill the request. |
| 103 if (!prerender::PrerenderManager::IsPrefetchEnabled()) | 103 if (!prerender::PrerenderManager::IsPrefetchEnabled()) |
| 104 return false; | 104 return false; |
| 105 } | 105 } |
| 106 | 106 |
| 107 // Abort any prerenders that spawn requests that use invalid HTTP methods. | 107 // Abort any prerenders that spawn requests that use invalid HTTP methods. |
| 108 if (prerender_tracker_->IsPrerenderingOnIOThread(child_id, route_id) && | 108 if (prerender_render_view_tracker_->IsPrerenderingOnIOThread(child_id, |
| 109 route_id) && |
| 109 !prerender::PrerenderManager::IsValidHttpMethod(method)) { | 110 !prerender::PrerenderManager::IsValidHttpMethod(method)) { |
| 110 prerender_tracker_->TryCancelOnIOThread( | 111 prerender_render_view_tracker_->TryCancelOnIOThread( |
| 111 child_id, route_id, prerender::FINAL_STATUS_INVALID_HTTP_METHOD); | 112 child_id, route_id, prerender::FINAL_STATUS_INVALID_HTTP_METHOD); |
| 112 return false; | 113 return false; |
| 113 } | 114 } |
| 114 | 115 |
| 115 return true; | 116 return true; |
| 116 } | 117 } |
| 117 | 118 |
| 118 void ChromeResourceDispatcherHostDelegate::RequestBeginning( | 119 void ChromeResourceDispatcherHostDelegate::RequestBeginning( |
| 119 net::URLRequest* request, | 120 net::URLRequest* request, |
| 120 content::ResourceContext* resource_context, | 121 content::ResourceContext* resource_context, |
| 121 ResourceType::Type resource_type, | 122 ResourceType::Type resource_type, |
| 122 int child_id, | 123 int child_id, |
| 123 int route_id, | 124 int route_id, |
| 124 bool is_continuation_of_transferred_request, | 125 bool is_continuation_of_transferred_request, |
| 125 ScopedVector<content::ResourceThrottle>* throttles) { | 126 ScopedVector<content::ResourceThrottle>* throttles) { |
| 126 if (is_continuation_of_transferred_request) | 127 if (is_continuation_of_transferred_request) |
| 127 ChromeURLRequestUserData::Delete(request); | 128 ChromeURLRequestUserData::Delete(request); |
| 128 | 129 |
| 129 ChromeURLRequestUserData* user_data = | 130 ChromeURLRequestUserData* user_data = |
| 130 ChromeURLRequestUserData::Create(request); | 131 ChromeURLRequestUserData::Create(request); |
| 131 if (prerender_tracker_->IsPrerenderingOnIOThread(child_id, route_id)) { | 132 if (prerender_render_view_tracker_->IsPrerenderingOnIOThread(child_id, |
| 133 route_id)) { |
| 132 user_data->set_is_prerender(true); | 134 user_data->set_is_prerender(true); |
| 133 request->set_priority(net::IDLE); | 135 request->set_priority(net::IDLE); |
| 134 } | 136 } |
| 135 | 137 |
| 136 if (resource_type == ResourceType::MAIN_FRAME) { | 138 if (resource_type == ResourceType::MAIN_FRAME) { |
| 137 throttles->push_back(new TransferNavigationResourceThrottle(request)); | 139 throttles->push_back(new TransferNavigationResourceThrottle(request)); |
| 138 | 140 |
| 139 #if defined(OS_CHROMEOS) | 141 #if defined(OS_CHROMEOS) |
| 140 // We check offline first, then check safe browsing so that we still can | 142 // We check offline first, then check safe browsing so that we still can |
| 141 // block unsafe site after we remove offline page. | 143 // block unsafe site after we remove offline page. |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 bool ChromeResourceDispatcherHostDelegate::AcceptSSLClientCertificateRequest( | 190 bool ChromeResourceDispatcherHostDelegate::AcceptSSLClientCertificateRequest( |
| 189 net::URLRequest* request, net::SSLCertRequestInfo* cert_request_info) { | 191 net::URLRequest* request, net::SSLCertRequestInfo* cert_request_info) { |
| 190 if (request->load_flags() & net::LOAD_PREFETCH) | 192 if (request->load_flags() & net::LOAD_PREFETCH) |
| 191 return false; | 193 return false; |
| 192 | 194 |
| 193 ChromeURLRequestUserData* user_data = ChromeURLRequestUserData::Get(request); | 195 ChromeURLRequestUserData* user_data = ChromeURLRequestUserData::Get(request); |
| 194 if (user_data && user_data->is_prerender()) { | 196 if (user_data && user_data->is_prerender()) { |
| 195 int child_id, route_id; | 197 int child_id, route_id; |
| 196 if (ResourceRequestInfo::ForRequest(request)->GetAssociatedRenderView( | 198 if (ResourceRequestInfo::ForRequest(request)->GetAssociatedRenderView( |
| 197 &child_id, &route_id)) { | 199 &child_id, &route_id)) { |
| 198 if (prerender_tracker_->TryCancel( | 200 if (prerender_render_view_tracker_->TryCancel( |
| 199 child_id, route_id, | 201 child_id, route_id, |
| 200 prerender::FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED)) { | 202 prerender::FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED)) { |
| 201 return false; | 203 return false; |
| 202 } | 204 } |
| 203 } | 205 } |
| 204 } | 206 } |
| 205 | 207 |
| 206 return true; | 208 return true; |
| 207 } | 209 } |
| 208 | 210 |
| 209 bool ChromeResourceDispatcherHostDelegate::AcceptAuthRequest( | 211 bool ChromeResourceDispatcherHostDelegate::AcceptAuthRequest( |
| 210 net::URLRequest* request, | 212 net::URLRequest* request, |
| 211 net::AuthChallengeInfo* auth_info) { | 213 net::AuthChallengeInfo* auth_info) { |
| 212 ChromeURLRequestUserData* user_data = ChromeURLRequestUserData::Get(request); | 214 ChromeURLRequestUserData* user_data = ChromeURLRequestUserData::Get(request); |
| 213 if (!user_data || !user_data->is_prerender()) | 215 if (!user_data || !user_data->is_prerender()) |
| 214 return true; | 216 return true; |
| 215 | 217 |
| 216 int child_id, route_id; | 218 int child_id, route_id; |
| 217 if (!ResourceRequestInfo::ForRequest(request)->GetAssociatedRenderView( | 219 if (!ResourceRequestInfo::ForRequest(request)->GetAssociatedRenderView( |
| 218 &child_id, &route_id)) { | 220 &child_id, &route_id)) { |
| 219 NOTREACHED(); | 221 NOTREACHED(); |
| 220 return true; | 222 return true; |
| 221 } | 223 } |
| 222 | 224 |
| 223 if (!prerender_tracker_->TryCancelOnIOThread( | 225 if (!prerender_render_view_tracker_->TryCancelOnIOThread( |
| 224 child_id, route_id, prerender::FINAL_STATUS_AUTH_NEEDED)) { | 226 child_id, route_id, prerender::FINAL_STATUS_AUTH_NEEDED)) { |
| 225 return true; | 227 return true; |
| 226 } | 228 } |
| 227 | 229 |
| 228 return false; | 230 return false; |
| 229 } | 231 } |
| 230 | 232 |
| 231 ResourceDispatcherHostLoginDelegate* | 233 ResourceDispatcherHostLoginDelegate* |
| 232 ChromeResourceDispatcherHostDelegate::CreateLoginDelegate( | 234 ChromeResourceDispatcherHostDelegate::CreateLoginDelegate( |
| 233 net::AuthChallengeInfo* auth_info, net::URLRequest* request) { | 235 net::AuthChallengeInfo* auth_info, net::URLRequest* request) { |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 413 if (base::Base64Encode(serialized, &hashed)) { | 415 if (base::Base64Encode(serialized, &hashed)) { |
| 414 // If successful, swap the header value with the new one. | 416 // If successful, swap the header value with the new one. |
| 415 // Note that the list of IDs and the header could be temporarily out of sync | 417 // Note that the list of IDs and the header could be temporarily out of sync |
| 416 // if IDs are added as we are recreating the header, but we're OK with those | 418 // if IDs are added as we are recreating the header, but we're OK with those |
| 417 // descrepancies. | 419 // descrepancies. |
| 418 variation_ids_header_ = hashed; | 420 variation_ids_header_ = hashed; |
| 419 } else { | 421 } else { |
| 420 DVLOG(1) << "Failed to base64 encode Variation IDs value: " << serialized; | 422 DVLOG(1) << "Failed to base64 encode Variation IDs value: " << serialized; |
| 421 } | 423 } |
| 422 } | 424 } |
| OLD | NEW |