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

Side by Side Diff: chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc

Issue 131783012: Fix the handling of user gestures for external protocol handler dialogs. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: joi and pkasting comments Created 6 years, 8 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) 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"
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 Profile* profile = 191 Profile* profile =
192 Profile::FromBrowserContext(web_contents->GetBrowserContext()); 192 Profile::FromBrowserContext(web_contents->GetBrowserContext());
193 193
194 StreamsPrivateAPI* streams_private = StreamsPrivateAPI::Get(profile); 194 StreamsPrivateAPI* streams_private = StreamsPrivateAPI::Get(profile);
195 if (!streams_private) 195 if (!streams_private)
196 return; 196 return;
197 streams_private->ExecuteMimeTypeHandler( 197 streams_private->ExecuteMimeTypeHandler(
198 extension_id, web_contents, stream.Pass(), expected_content_size); 198 extension_id, web_contents, stream.Pass(), expected_content_size);
199 } 199 }
200 200
201 void LaunchURL(const GURL& url, int render_process_id, int render_view_id) { 201 void LaunchURL(const GURL& url, int render_process_id, int render_view_id,
202 bool user_gesture) {
202 // If there is no longer a WebContents, the request may have raced with tab 203 // If there is no longer a WebContents, the request may have raced with tab
203 // closing. Don't fire the external request. (It may have been a prerender.) 204 // closing. Don't fire the external request. (It may have been a prerender.)
204 content::WebContents* web_contents = 205 content::WebContents* web_contents =
205 tab_util::GetWebContentsByID(render_process_id, render_view_id); 206 tab_util::GetWebContentsByID(render_process_id, render_view_id);
206 if (!web_contents) 207 if (!web_contents)
207 return; 208 return;
208 209
209 // Do not launch external requests attached to unswapped prerenders. 210 // Do not launch external requests attached to unswapped prerenders.
210 prerender::PrerenderContents* prerender_contents = 211 prerender::PrerenderContents* prerender_contents =
211 prerender::PrerenderContents::FromWebContents(web_contents); 212 prerender::PrerenderContents::FromWebContents(web_contents);
212 if (prerender_contents) { 213 if (prerender_contents) {
213 prerender_contents->Destroy(prerender::FINAL_STATUS_UNSUPPORTED_SCHEME); 214 prerender_contents->Destroy(prerender::FINAL_STATUS_UNSUPPORTED_SCHEME);
214 prerender::ReportPrerenderExternalURL(); 215 prerender::ReportPrerenderExternalURL();
215 return; 216 return;
216 } 217 }
217 218
219 scoped_ptr<ExternalProtocolHandler::ScopedUserGesture> scoped_gesture;
220 if (user_gesture)
221 scoped_gesture.reset(new ExternalProtocolHandler::ScopedUserGesture);
mmenke 2014/03/31 14:38:42 Can't this just be put this logic in ExternalProto
meacer 2014/03/31 18:32:30 Passing the user gesture bit directly to the exter
mmenke 2014/03/31 18:38:40 Do you mean putting the scoped_gesture in External
meacer 2014/03/31 19:34:00 I meant pushing the user_gesture bit all the way d
218 ExternalProtocolHandler::LaunchUrlWithDelegate( 222 ExternalProtocolHandler::LaunchUrlWithDelegate(
219 url, render_process_id, render_view_id, 223 url, render_process_id, render_view_id,
220 g_external_protocol_handler_delegate); 224 g_external_protocol_handler_delegate);
221 } 225 }
222 #endif // !defined(OS_ANDROID) 226 #endif // !defined(OS_ANDROID)
223 227
224 void AppendComponentUpdaterThrottles( 228 void AppendComponentUpdaterThrottles(
225 net::URLRequest* request, 229 net::URLRequest* request,
226 content::ResourceContext* resource_context, 230 content::ResourceContext* resource_context,
227 ResourceType::Type resource_type, 231 ResourceType::Type resource_type,
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 } 438 }
435 } 439 }
436 440
437 ResourceDispatcherHostLoginDelegate* 441 ResourceDispatcherHostLoginDelegate*
438 ChromeResourceDispatcherHostDelegate::CreateLoginDelegate( 442 ChromeResourceDispatcherHostDelegate::CreateLoginDelegate(
439 net::AuthChallengeInfo* auth_info, net::URLRequest* request) { 443 net::AuthChallengeInfo* auth_info, net::URLRequest* request) {
440 return CreateLoginPrompt(auth_info, request); 444 return CreateLoginPrompt(auth_info, request);
441 } 445 }
442 446
443 bool ChromeResourceDispatcherHostDelegate::HandleExternalProtocol( 447 bool ChromeResourceDispatcherHostDelegate::HandleExternalProtocol(
444 const GURL& url, int child_id, int route_id) { 448 const GURL& url,
449 int child_id,
450 int route_id,
451 bool initiated_by_user_gesture) {
445 #if defined(OS_ANDROID) 452 #if defined(OS_ANDROID)
446 // Android use a resource throttle to handle external as well as internal 453 // Android use a resource throttle to handle external as well as internal
447 // protocols. 454 // protocols.
448 return false; 455 return false;
449 #else 456 #else
450 457
451 ExtensionRendererState::WebViewInfo info; 458 ExtensionRendererState::WebViewInfo info;
452 if (ExtensionRendererState::GetInstance()->GetWebViewInfo(child_id, 459 if (ExtensionRendererState::GetInstance()->GetWebViewInfo(child_id,
453 route_id, 460 route_id,
454 &info)) { 461 &info)) {
455 return false; 462 return false;
456 } 463 }
457 464
458 BrowserThread::PostTask( 465 BrowserThread::PostTask(
459 BrowserThread::UI, FROM_HERE, 466 BrowserThread::UI, FROM_HERE,
460 base::Bind(&LaunchURL, url, child_id, route_id)); 467 base::Bind(&LaunchURL, url, child_id, route_id,
468 initiated_by_user_gesture));
461 return true; 469 return true;
462 #endif 470 #endif
463 } 471 }
464 472
465 void ChromeResourceDispatcherHostDelegate::AppendStandardResourceThrottles( 473 void ChromeResourceDispatcherHostDelegate::AppendStandardResourceThrottles(
466 net::URLRequest* request, 474 net::URLRequest* request,
467 content::ResourceContext* resource_context, 475 content::ResourceContext* resource_context,
468 ResourceType::Type resource_type, 476 ResourceType::Type resource_type,
469 ScopedVector<content::ResourceThrottle>* throttles) { 477 ScopedVector<content::ResourceThrottle>* throttles) {
470 ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context); 478 ProfileIOData* io_data = ProfileIOData::FromResourceContext(resource_context);
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 url_request->GetTotalReceivedBytes())); 690 url_request->GetTotalReceivedBytes()));
683 } 691 }
684 } 692 }
685 693
686 // static 694 // static
687 void ChromeResourceDispatcherHostDelegate:: 695 void ChromeResourceDispatcherHostDelegate::
688 SetExternalProtocolHandlerDelegateForTesting( 696 SetExternalProtocolHandlerDelegateForTesting(
689 ExternalProtocolHandler::Delegate* delegate) { 697 ExternalProtocolHandler::Delegate* delegate) {
690 g_external_protocol_handler_delegate = delegate; 698 g_external_protocol_handler_delegate = delegate;
691 } 699 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698