Merge pull request #2933 from deepak1556/external_protocol_patch
protocol: allowing default clients to handle external unhandled protocols
This commit is contained in:
commit
fd2bc76bc9
5 changed files with 100 additions and 0 deletions
|
@ -11,6 +11,7 @@
|
||||||
#include "atom/browser/atom_access_token_store.h"
|
#include "atom/browser/atom_access_token_store.h"
|
||||||
#include "atom/browser/atom_browser_context.h"
|
#include "atom/browser/atom_browser_context.h"
|
||||||
#include "atom/browser/atom_browser_main_parts.h"
|
#include "atom/browser/atom_browser_main_parts.h"
|
||||||
|
#include "atom/browser/atom_browser_resource_dispatcher_host_delegate.h"
|
||||||
#include "atom/browser/atom_quota_permission_context.h"
|
#include "atom/browser/atom_quota_permission_context.h"
|
||||||
#include "atom/browser/atom_speech_recognition_manager_delegate.h"
|
#include "atom/browser/atom_speech_recognition_manager_delegate.h"
|
||||||
#include "atom/browser/browser.h"
|
#include "atom/browser/browser.h"
|
||||||
|
@ -30,6 +31,7 @@
|
||||||
#include "content/public/browser/client_certificate_delegate.h"
|
#include "content/public/browser/client_certificate_delegate.h"
|
||||||
#include "content/public/browser/render_process_host.h"
|
#include "content/public/browser/render_process_host.h"
|
||||||
#include "content/public/browser/render_view_host.h"
|
#include "content/public/browser/render_view_host.h"
|
||||||
|
#include "content/public/browser/resource_dispatcher_host.h"
|
||||||
#include "content/public/browser/site_instance.h"
|
#include "content/public/browser/site_instance.h"
|
||||||
#include "content/public/browser/web_contents.h"
|
#include "content/public/browser/web_contents.h"
|
||||||
#include "content/public/common/web_preferences.h"
|
#include "content/public/common/web_preferences.h"
|
||||||
|
@ -226,6 +228,13 @@ void AtomBrowserClient::SelectClientCertificate(
|
||||||
delegate.Pass());
|
delegate.Pass());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AtomBrowserClient::ResourceDispatcherHostCreated() {
|
||||||
|
resource_dispatcher_host_delegate_.reset(
|
||||||
|
new AtomResourceDispatcherHostDelegate);
|
||||||
|
content::ResourceDispatcherHost::Get()->SetDelegate(
|
||||||
|
resource_dispatcher_host_delegate_.get());
|
||||||
|
}
|
||||||
|
|
||||||
brightray::BrowserMainParts* AtomBrowserClient::OverrideCreateBrowserMainParts(
|
brightray::BrowserMainParts* AtomBrowserClient::OverrideCreateBrowserMainParts(
|
||||||
const content::MainFunctionParams&) {
|
const content::MainFunctionParams&) {
|
||||||
v8::V8::Initialize(); // Init V8 before creating main parts.
|
v8::V8::Initialize(); // Init V8 before creating main parts.
|
||||||
|
|
|
@ -23,6 +23,8 @@ class SSLCertRequestInfo;
|
||||||
|
|
||||||
namespace atom {
|
namespace atom {
|
||||||
|
|
||||||
|
class AtomResourceDispatcherHostDelegate;
|
||||||
|
|
||||||
class AtomBrowserClient : public brightray::BrowserClient,
|
class AtomBrowserClient : public brightray::BrowserClient,
|
||||||
public content::RenderProcessHostObserver {
|
public content::RenderProcessHostObserver {
|
||||||
public:
|
public:
|
||||||
|
@ -56,6 +58,7 @@ class AtomBrowserClient : public brightray::BrowserClient,
|
||||||
content::WebContents* web_contents,
|
content::WebContents* web_contents,
|
||||||
net::SSLCertRequestInfo* cert_request_info,
|
net::SSLCertRequestInfo* cert_request_info,
|
||||||
scoped_ptr<content::ClientCertificateDelegate> delegate) override;
|
scoped_ptr<content::ClientCertificateDelegate> delegate) override;
|
||||||
|
void ResourceDispatcherHostCreated() override;
|
||||||
|
|
||||||
// brightray::BrowserClient:
|
// brightray::BrowserClient:
|
||||||
brightray::BrowserMainParts* OverrideCreateBrowserMainParts(
|
brightray::BrowserMainParts* OverrideCreateBrowserMainParts(
|
||||||
|
@ -68,6 +71,9 @@ class AtomBrowserClient : public brightray::BrowserClient,
|
||||||
// pending_render_process => current_render_process.
|
// pending_render_process => current_render_process.
|
||||||
std::map<int, int> pending_processes_;
|
std::map<int, int> pending_processes_;
|
||||||
|
|
||||||
|
scoped_ptr<AtomResourceDispatcherHostDelegate>
|
||||||
|
resource_dispatcher_host_delegate_;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(AtomBrowserClient);
|
DISALLOW_COPY_AND_ASSIGN(AtomBrowserClient);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
// 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_browser_resource_dispatcher_host_delegate.h"
|
||||||
|
|
||||||
|
#include "atom/common/platform_util.h"
|
||||||
|
#include "content/public/browser/browser_thread.h"
|
||||||
|
#include "content/public/browser/web_contents.h"
|
||||||
|
#include "content/public/browser/render_view_host.h"
|
||||||
|
#include "net/base/escape.h"
|
||||||
|
|
||||||
|
using content::BrowserThread;
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
void HandleExternalProtocolInUI(const GURL& url,
|
||||||
|
int render_process_id,
|
||||||
|
int render_view_id) {
|
||||||
|
auto web_contents = content::WebContents::FromRenderViewHost(
|
||||||
|
content::RenderViewHost::FromID(render_process_id, render_view_id));
|
||||||
|
if (!web_contents)
|
||||||
|
return;
|
||||||
|
|
||||||
|
GURL escaped_url(net::EscapeExternalHandlerValue(url.spec()));
|
||||||
|
platform_util::OpenExternal(escaped_url);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
AtomResourceDispatcherHostDelegate::AtomResourceDispatcherHostDelegate() {
|
||||||
|
}
|
||||||
|
|
||||||
|
AtomResourceDispatcherHostDelegate::~AtomResourceDispatcherHostDelegate() {
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AtomResourceDispatcherHostDelegate::HandleExternalProtocol(
|
||||||
|
const GURL& url,
|
||||||
|
int render_process_id,
|
||||||
|
int render_view_id,
|
||||||
|
bool is_main_frame,
|
||||||
|
ui::PageTransition transition,
|
||||||
|
bool has_user_gesture) {
|
||||||
|
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
||||||
|
base::Bind(&HandleExternalProtocolInUI,
|
||||||
|
url,
|
||||||
|
render_process_id,
|
||||||
|
render_view_id));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace atom
|
|
@ -0,0 +1,29 @@
|
||||||
|
// Copyright (c) 2015 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#ifndef ATOM_BROWSER_ATOM_BROWSER_RESOURCE_DISPATCHER_HOST_DELEGATE_H_
|
||||||
|
#define ATOM_BROWSER_ATOM_BROWSER_RESOURCE_DISPATCHER_HOST_DELEGATE_H_
|
||||||
|
|
||||||
|
#include "content/public/browser/resource_dispatcher_host_delegate.h"
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
class AtomResourceDispatcherHostDelegate
|
||||||
|
: public content::ResourceDispatcherHostDelegate {
|
||||||
|
public:
|
||||||
|
AtomResourceDispatcherHostDelegate();
|
||||||
|
~AtomResourceDispatcherHostDelegate();
|
||||||
|
|
||||||
|
// content::ResourceDispatcherHostDelegate:
|
||||||
|
bool HandleExternalProtocol(const GURL& url,
|
||||||
|
int render_process_id,
|
||||||
|
int render_view_id,
|
||||||
|
bool is_main_frame,
|
||||||
|
ui::PageTransition transition,
|
||||||
|
bool has_user_gesture) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace atom
|
||||||
|
|
||||||
|
#endif // ATOM_BROWSER_ATOM_BROWSER_RESOURCE_DISPATCHER_HOST_DELEGATE_H_
|
|
@ -125,6 +125,8 @@
|
||||||
'atom/browser/atom_browser_main_parts.h',
|
'atom/browser/atom_browser_main_parts.h',
|
||||||
'atom/browser/atom_browser_main_parts_linux.cc',
|
'atom/browser/atom_browser_main_parts_linux.cc',
|
||||||
'atom/browser/atom_browser_main_parts_mac.mm',
|
'atom/browser/atom_browser_main_parts_mac.mm',
|
||||||
|
'atom/browser/atom_browser_resource_dispatcher_host_delegate.cc',
|
||||||
|
'atom/browser/atom_browser_resource_dispatcher_host_delegate.h',
|
||||||
'atom/browser/atom_javascript_dialog_manager.cc',
|
'atom/browser/atom_javascript_dialog_manager.cc',
|
||||||
'atom/browser/atom_javascript_dialog_manager.h',
|
'atom/browser/atom_javascript_dialog_manager.h',
|
||||||
'atom/browser/atom_quota_permission_context.cc',
|
'atom/browser/atom_quota_permission_context.cc',
|
||||||
|
|
Loading…
Reference in a new issue