| 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 <stdint.h> | 7 #include <stdint.h> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 extension_id, web_contents, std::move(stream), view_id, | 212 extension_id, web_contents, std::move(stream), view_id, |
| 213 expected_content_size, embedded, render_process_id, render_frame_id); | 213 expected_content_size, embedded, render_process_id, render_frame_id); |
| 214 } | 214 } |
| 215 #endif // !defined(ENABLE_EXTENSIONS) | 215 #endif // !defined(ENABLE_EXTENSIONS) |
| 216 | 216 |
| 217 void LaunchURL( | 217 void LaunchURL( |
| 218 const GURL& url, | 218 const GURL& url, |
| 219 int render_process_id, | 219 int render_process_id, |
| 220 const content::ResourceRequestInfo::WebContentsGetter& web_contents_getter, | 220 const content::ResourceRequestInfo::WebContentsGetter& web_contents_getter, |
| 221 ui::PageTransition page_transition, | 221 ui::PageTransition page_transition, |
| 222 bool has_user_gesture) { | 222 bool has_user_gesture, |
| 223 bool is_whitelisted) { |
| 223 // If there is no longer a WebContents, the request may have raced with tab | 224 // If there is no longer a WebContents, the request may have raced with tab |
| 224 // closing. Don't fire the external request. (It may have been a prerender.) | 225 // closing. Don't fire the external request. (It may have been a prerender.) |
| 225 content::WebContents* web_contents = web_contents_getter.Run(); | 226 content::WebContents* web_contents = web_contents_getter.Run(); |
| 226 if (!web_contents) | 227 if (!web_contents) |
| 227 return; | 228 return; |
| 228 | 229 |
| 229 // Do not launch external requests attached to unswapped prerenders. | 230 // Do not launch external requests attached to unswapped prerenders. |
| 230 prerender::PrerenderContents* prerender_contents = | 231 prerender::PrerenderContents* prerender_contents = |
| 231 prerender::PrerenderContents::FromWebContents(web_contents); | 232 prerender::PrerenderContents::FromWebContents(web_contents); |
| 232 if (prerender_contents) { | 233 if (prerender_contents) { |
| 233 prerender_contents->Destroy(prerender::FINAL_STATUS_UNSUPPORTED_SCHEME); | 234 prerender_contents->Destroy(prerender::FINAL_STATUS_UNSUPPORTED_SCHEME); |
| 234 prerender::ReportPrerenderExternalURL(); | 235 prerender::ReportPrerenderExternalURL(); |
| 235 return; | 236 return; |
| 236 } | 237 } |
| 237 | 238 |
| 238 ExternalProtocolHandler::LaunchUrlWithDelegate( | 239 // If the URL is in whitelist, we launch it without asking the user and |
| 239 url, render_process_id, web_contents->GetRoutingID(), page_transition, | 240 // without any additional security checks. Since the URL is whitelisted, |
| 240 has_user_gesture, g_external_protocol_handler_delegate); | 241 // we assume it can be executed. |
| 242 if (is_whitelisted) { |
| 243 ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck( |
| 244 url, render_process_id, web_contents->GetRoutingID()); |
| 245 } else { |
| 246 ExternalProtocolHandler::LaunchUrlWithDelegate( |
| 247 url, render_process_id, web_contents->GetRoutingID(), page_transition, |
| 248 has_user_gesture, g_external_protocol_handler_delegate); |
| 249 } |
| 241 } | 250 } |
| 242 | 251 |
| 243 #if !defined(DISABLE_NACL) | 252 #if !defined(DISABLE_NACL) |
| 244 void AppendComponentUpdaterThrottles( | 253 void AppendComponentUpdaterThrottles( |
| 245 net::URLRequest* request, | 254 net::URLRequest* request, |
| 246 content::ResourceContext* resource_context, | 255 content::ResourceContext* resource_context, |
| 247 ResourceType resource_type, | 256 ResourceType resource_type, |
| 248 ScopedVector<content::ResourceThrottle>* throttles) { | 257 ScopedVector<content::ResourceThrottle>* throttles) { |
| 249 const char* crx_id = NULL; | 258 const char* crx_id = NULL; |
| 250 component_updater::ComponentUpdateService* cus = | 259 component_updater::ComponentUpdateService* cus = |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 net::AuthChallengeInfo* auth_info, net::URLRequest* request) { | 515 net::AuthChallengeInfo* auth_info, net::URLRequest* request) { |
| 507 return CreateLoginPrompt(auth_info, request); | 516 return CreateLoginPrompt(auth_info, request); |
| 508 } | 517 } |
| 509 | 518 |
| 510 bool ChromeResourceDispatcherHostDelegate::HandleExternalProtocol( | 519 bool ChromeResourceDispatcherHostDelegate::HandleExternalProtocol( |
| 511 const GURL& url, | 520 const GURL& url, |
| 512 int child_id, | 521 int child_id, |
| 513 const content::ResourceRequestInfo::WebContentsGetter& web_contents_getter, | 522 const content::ResourceRequestInfo::WebContentsGetter& web_contents_getter, |
| 514 bool is_main_frame, | 523 bool is_main_frame, |
| 515 ui::PageTransition page_transition, | 524 ui::PageTransition page_transition, |
| 516 bool has_user_gesture) { | 525 bool has_user_gesture, |
| 526 content::ResourceContext* resource_context) { |
| 527 // Get the state, if |url| is in blacklist, whitelist or in none of those. |
| 528 ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context); |
| 529 const policy::URLBlacklist::URLBlacklistState url_state = |
| 530 io_data->GetURLBlacklistState(url); |
| 531 if (url_state == policy::URLBlacklist::URLBlacklistState::URL_IN_BLACKLIST) { |
| 532 // It's a link with custom scheme and it's blacklisted. We return false here |
| 533 // and let it process as a normal URL. Eventually chrome_network_delegate |
| 534 // will see it's in the blacklist and the user will be shown the blocked |
| 535 // content page. |
| 536 return false; |
| 537 } |
| 517 #if defined(ENABLE_EXTENSIONS) | 538 #if defined(ENABLE_EXTENSIONS) |
| 518 // External protocols are disabled for guests. An exception is made for the | 539 // External protocols are disabled for guests. An exception is made for the |
| 519 // "mailto" protocol, so that pages that utilize it work properly in a | 540 // "mailto" protocol, so that pages that utilize it work properly in a |
| 520 // WebView. | 541 // WebView. |
| 521 if (extensions::WebViewRendererState::GetInstance()->IsGuest(child_id) && | 542 if (extensions::WebViewRendererState::GetInstance()->IsGuest(child_id) && |
| 522 !url.SchemeIs(url::kMailToScheme)) { | 543 !url.SchemeIs(url::kMailToScheme)) { |
| 523 return false; | 544 return false; |
| 524 } | 545 } |
| 525 #endif // defined(ENABLE_EXTENSIONS) | 546 #endif // defined(ENABLE_EXTENSIONS) |
| 526 | 547 |
| 527 #if defined(OS_ANDROID) | 548 #if defined(OS_ANDROID) |
| 528 // Main frame external protocols are handled by | 549 // Main frame external protocols are handled by |
| 529 // InterceptNavigationResourceThrottle. | 550 // InterceptNavigationResourceThrottle. |
| 530 if (is_main_frame) | 551 if (is_main_frame) |
| 531 return false; | 552 return false; |
| 532 #endif // defined(ANDROID) | 553 #endif // defined(ANDROID) |
| 533 | 554 |
| 555 const bool is_whitelisted = |
| 556 url_state == policy::URLBlacklist::URLBlacklistState::URL_IN_WHITELIST; |
| 534 BrowserThread::PostTask( | 557 BrowserThread::PostTask( |
| 535 BrowserThread::UI, FROM_HERE, | 558 BrowserThread::UI, FROM_HERE, |
| 536 base::Bind(&LaunchURL, url, child_id, web_contents_getter, | 559 base::Bind(&LaunchURL, url, child_id, web_contents_getter, |
| 537 page_transition, has_user_gesture)); | 560 page_transition, has_user_gesture, is_whitelisted)); |
| 538 return true; | 561 return true; |
| 539 } | 562 } |
| 540 | 563 |
| 541 void ChromeResourceDispatcherHostDelegate::AppendStandardResourceThrottles( | 564 void ChromeResourceDispatcherHostDelegate::AppendStandardResourceThrottles( |
| 542 net::URLRequest* request, | 565 net::URLRequest* request, |
| 543 content::ResourceContext* resource_context, | 566 content::ResourceContext* resource_context, |
| 544 ResourceType resource_type, | 567 ResourceType resource_type, |
| 545 ScopedVector<content::ResourceThrottle>* throttles) { | 568 ScopedVector<content::ResourceThrottle>* throttles) { |
| 546 ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context); | 569 ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context); |
| 547 | 570 |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 data_reduction_proxy::DataReductionProxyData* data_reduction_proxy_data = | 837 data_reduction_proxy::DataReductionProxyData* data_reduction_proxy_data = |
| 815 data_reduction_proxy::DataReductionProxyData::GetData(*request); | 838 data_reduction_proxy::DataReductionProxyData::GetData(*request); |
| 816 // DeepCopy the DataReductionProxyData from the URLRequest to prevent the | 839 // DeepCopy the DataReductionProxyData from the URLRequest to prevent the |
| 817 // URLRequest and DataReductionProxyData from both having ownership of the | 840 // URLRequest and DataReductionProxyData from both having ownership of the |
| 818 // same object. This copy will be shortlived as it will be deep copied again | 841 // same object. This copy will be shortlived as it will be deep copied again |
| 819 // when content makes a clone of NavigationData for the UI thread. | 842 // when content makes a clone of NavigationData for the UI thread. |
| 820 if (data_reduction_proxy_data) | 843 if (data_reduction_proxy_data) |
| 821 data->SetDataReductionProxyData(data_reduction_proxy_data->DeepCopy()); | 844 data->SetDataReductionProxyData(data_reduction_proxy_data->DeepCopy()); |
| 822 return data; | 845 return data; |
| 823 } | 846 } |
| OLD | NEW |