78 lines
		
	
	
	
		
			2.3 KiB
			
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
	
		
			2.3 KiB
			
		
	
	
	
		
			C++
		
	
	
	
	
	
// Copyright (c) 2015 GitHub, Inc.
 | 
						|
// Use of this source code is governed by the MIT license that can be
 | 
						|
// found in the LICENSE file.
 | 
						|
 | 
						|
#include "atom/browser/atom_resource_dispatcher_host_delegate.h"
 | 
						|
 | 
						|
#include "atom/browser/login_handler.h"
 | 
						|
#include "atom/browser/web_contents_permission_helper.h"
 | 
						|
#include "atom/common/platform_util.h"
 | 
						|
#include "base/strings/utf_string_conversions.h"
 | 
						|
#include "content/public/browser/browser_thread.h"
 | 
						|
#include "net/base/escape.h"
 | 
						|
#include "url/gurl.h"
 | 
						|
 | 
						|
using content::BrowserThread;
 | 
						|
 | 
						|
namespace atom {
 | 
						|
 | 
						|
namespace {
 | 
						|
 | 
						|
void OnOpenExternal(const GURL& escaped_url,
 | 
						|
                    bool allowed) {
 | 
						|
  if (allowed)
 | 
						|
    platform_util::OpenExternal(
 | 
						|
#if defined(OS_WIN)
 | 
						|
        base::UTF8ToUTF16(escaped_url.spec()),
 | 
						|
#else
 | 
						|
        escaped_url,
 | 
						|
#endif
 | 
						|
        true);
 | 
						|
}
 | 
						|
 | 
						|
void HandleExternalProtocolInUI(
 | 
						|
    const GURL& url,
 | 
						|
    const content::ResourceRequestInfo::WebContentsGetter& web_contents_getter,
 | 
						|
    bool has_user_gesture) {
 | 
						|
  content::WebContents* web_contents = web_contents_getter.Run();
 | 
						|
  if (!web_contents)
 | 
						|
    return;
 | 
						|
 | 
						|
  auto permission_helper =
 | 
						|
      WebContentsPermissionHelper::FromWebContents(web_contents);
 | 
						|
  if (!permission_helper)
 | 
						|
    return;
 | 
						|
 | 
						|
  GURL escaped_url(net::EscapeExternalHandlerValue(url.spec()));
 | 
						|
  auto callback = base::Bind(&OnOpenExternal, escaped_url);
 | 
						|
  permission_helper->RequestOpenExternalPermission(callback, has_user_gesture);
 | 
						|
}
 | 
						|
 | 
						|
}  // namespace
 | 
						|
 | 
						|
AtomResourceDispatcherHostDelegate::AtomResourceDispatcherHostDelegate() {
 | 
						|
}
 | 
						|
 | 
						|
bool AtomResourceDispatcherHostDelegate::HandleExternalProtocol(
 | 
						|
    const GURL& url,
 | 
						|
    int child_id,
 | 
						|
    const content::ResourceRequestInfo::WebContentsGetter& web_contents_getter,
 | 
						|
    bool is_main_frame,
 | 
						|
    ui::PageTransition transition,
 | 
						|
    bool has_user_gesture) {
 | 
						|
  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
 | 
						|
                          base::Bind(&HandleExternalProtocolInUI,
 | 
						|
                                     url,
 | 
						|
                                     web_contents_getter,
 | 
						|
                                     has_user_gesture));
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
content::ResourceDispatcherHostLoginDelegate*
 | 
						|
AtomResourceDispatcherHostDelegate::CreateLoginDelegate(
 | 
						|
    net::AuthChallengeInfo* auth_info,
 | 
						|
    net::URLRequest* request) {
 | 
						|
  return new LoginHandler(auth_info, request);
 | 
						|
}
 | 
						|
 | 
						|
}  // namespace atom
 |