From 663a48ee3823443852956c110903ed73f8be49db Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Fri, 12 Jun 2015 13:28:23 +0530 Subject: [PATCH] protocol: api to register custom schemes to standard schemes --- atom/app/atom_content_client.cc | 10 ++++++++++ atom/browser/api/atom_api_protocol.cc | 7 +++++++ atom/browser/api/atom_api_protocol.h | 4 ++++ atom/browser/atom_browser_client.cc | 13 +++++++++++++ atom/browser/atom_browser_client.h | 3 +++ atom/common/options_switches.cc | 3 +++ atom/common/options_switches.h | 1 + docs/api/protocol.md | 6 ++++++ 8 files changed, 47 insertions(+) diff --git a/atom/app/atom_content_client.cc b/atom/app/atom_content_client.cc index 74f88db0b9b2..1ba1f2031564 100644 --- a/atom/app/atom_content_client.cc +++ b/atom/app/atom_content_client.cc @@ -75,6 +75,16 @@ std::string AtomContentClient::GetProduct() const { void AtomContentClient::AddAdditionalSchemes( std::vector* standard_schemes, std::vector* savable_schemes) { + auto command_line = base::CommandLine::ForCurrentProcess(); + auto custom_schemes = command_line->GetSwitchValueASCII( + switches::kRegisterStandardSchemes); + if (!custom_schemes.empty()) { + std::vector schemes; + base::SplitString(custom_schemes, ',', &schemes); + standard_schemes->insert(standard_schemes->end(), + schemes.begin(), + schemes.end()); + } standard_schemes->push_back("chrome-extension"); } diff --git a/atom/browser/api/atom_api_protocol.cc b/atom/browser/api/atom_api_protocol.cc index 9bc2de4b42a9..db7252ec95b9 100644 --- a/atom/browser/api/atom_api_protocol.cc +++ b/atom/browser/api/atom_api_protocol.cc @@ -4,6 +4,7 @@ #include "atom/browser/api/atom_api_protocol.h" +#include "atom/browser/atom_browser_client.h" #include "atom/browser/atom_browser_context.h" #include "atom/browser/net/adapter_request_job.h" #include "atom/browser/net/atom_url_request_job_factory.h" @@ -205,6 +206,7 @@ mate::ObjectTemplateBuilder Protocol::GetObjectTemplateBuilder( return mate::ObjectTemplateBuilder(isolate) .SetMethod("registerProtocol", &Protocol::RegisterProtocol) .SetMethod("unregisterProtocol", &Protocol::UnregisterProtocol) + .SetMethod("registerStandardSchemes", &Protocol::RegisterStandardSchemes) .SetMethod("isHandledProtocol", &Protocol::IsHandledProtocol) .SetMethod("interceptProtocol", &Protocol::InterceptProtocol) .SetMethod("uninterceptProtocol", &Protocol::UninterceptProtocol); @@ -237,6 +239,11 @@ void Protocol::UnregisterProtocol(v8::Isolate* isolate, base::Unretained(this), scheme)); } +void Protocol::RegisterStandardSchemes( + const std::vector& schemes) { + atom::AtomBrowserClient::SetCustomSchemes(schemes); +} + bool Protocol::IsHandledProtocol(const std::string& scheme) { return job_factory_->IsHandledProtocol(scheme); } diff --git a/atom/browser/api/atom_api_protocol.h b/atom/browser/api/atom_api_protocol.h index 34725cecc925..b059440f2927 100644 --- a/atom/browser/api/atom_api_protocol.h +++ b/atom/browser/api/atom_api_protocol.h @@ -7,6 +7,7 @@ #include #include +#include #include "atom/browser/api/event_emitter.h" #include "base/callback.h" @@ -41,6 +42,9 @@ class Protocol : public mate::EventEmitter { private: typedef std::map ProtocolHandlersMap; + // Register schemes to standard scheme list. + void RegisterStandardSchemes(const std::vector& schemes); + // Register/unregister an networking |scheme| which would be handled by // |callback|. void RegisterProtocol(v8::Isolate* isolate, diff --git a/atom/browser/atom_browser_client.cc b/atom/browser/atom_browser_client.cc index ec519fa4f822..c62bc6436ddd 100644 --- a/atom/browser/atom_browser_client.cc +++ b/atom/browser/atom_browser_client.cc @@ -16,6 +16,7 @@ #include "base/command_line.h" #include "base/files/file_util.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" #include "chrome/browser/printing/printing_message_filter.h" #include "chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h" #include "chrome/browser/speech/tts_message_filter.h" @@ -43,6 +44,9 @@ int kDefaultRoutingID = 2; // Next navigation should not restart renderer process. bool g_suppress_renderer_process_restart = false; +// Custom schemes to be registered to standard. +std::string g_custom_schemes = ""; + // Find out the owner of the child process according to |process_id|. enum ProcessOwner { OWNER_NATIVE_WINDOW, @@ -95,6 +99,11 @@ void AtomBrowserClient::SuppressRendererProcessRestartForOnce() { g_suppress_renderer_process_restart = true; } +void AtomBrowserClient::SetCustomSchemes( + const std::vector& schemes) { + g_custom_schemes = JoinString(schemes, ','); +} + AtomBrowserClient::AtomBrowserClient() { } @@ -174,9 +183,13 @@ void AtomBrowserClient::AppendExtraCommandLineSwitches( base::CommandLine* command_line, int process_id) { std::string process_type = command_line->GetSwitchValueASCII("type"); + if (process_type != "renderer") return; + command_line->AppendSwitchASCII(switches::kRegisterStandardSchemes, + g_custom_schemes); + NativeWindow* window; WebViewManager::WebViewInfo info; ProcessOwner owner = GetProcessOwner(process_id, &window, &info); diff --git a/atom/browser/atom_browser_client.h b/atom/browser/atom_browser_client.h index c8a26da7099f..8cbdb3f2e199 100644 --- a/atom/browser/atom_browser_client.h +++ b/atom/browser/atom_browser_client.h @@ -6,6 +6,7 @@ #define ATOM_BROWSER_ATOM_BROWSER_CLIENT_H_ #include +#include #include "brightray/browser/browser_client.h" @@ -27,6 +28,8 @@ class AtomBrowserClient : public brightray::BrowserClient { // Don't force renderer process to restart for once. static void SuppressRendererProcessRestartForOnce(); + // Custom schemes to be registered to standard. + static void SetCustomSchemes(const std::vector& schemes); protected: // content::ContentBrowserClient: diff --git a/atom/common/options_switches.cc b/atom/common/options_switches.cc index 2764f86a5fcf..71469b9601b6 100644 --- a/atom/common/options_switches.cc +++ b/atom/common/options_switches.cc @@ -104,6 +104,9 @@ const char kPageVisibility[] = "page-visibility"; // Disable HTTP cache. const char kDisableHttpCache[] = "disable-http-cache"; +// Register schemes to standard. +const char kRegisterStandardSchemes[] = "register-standard-schemes"; + } // namespace switches } // namespace atom diff --git a/atom/common/options_switches.h b/atom/common/options_switches.h index e6d85063341a..fc25208a60ac 100644 --- a/atom/common/options_switches.h +++ b/atom/common/options_switches.h @@ -56,6 +56,7 @@ extern const char kSharedWorker[]; extern const char kPageVisibility[]; extern const char kDisableHttpCache[]; +extern const char kRegisterStandardSchemes[]; } // namespace switches diff --git a/docs/api/protocol.md b/docs/api/protocol.md index ba62bf301f41..c6dd373b586c 100644 --- a/docs/api/protocol.md +++ b/docs/api/protocol.md @@ -39,6 +39,12 @@ response you would like to send. Unregisters the custom protocol of `scheme`. +## protocol.registerStandardSchemes(value) + +* `value` Array + +`value` is an array of custom schemes to be registered to the standard. + ## protocol.isHandledProtocol(scheme) * `scheme` String