From dd6c8f770693fa01df6d6f7a2681b31383ee942d Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Fri, 27 Mar 2020 03:48:51 -0700 Subject: [PATCH] fix: ensure standard schemes are registered in nw service process Refs https://github.com/electron/electron/pull/20546 --- shell/app/electron_content_client.cc | 28 ++++++++++++++++++-------- shell/renderer/renderer_client_base.cc | 5 +++++ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/shell/app/electron_content_client.cc b/shell/app/electron_content_client.cc index 431a493d3235b..da1c40767e189 100644 --- a/shell/app/electron_content_client.cc +++ b/shell/app/electron_content_client.cc @@ -15,6 +15,7 @@ #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "content/public/common/content_constants.h" +#include "content/public/common/content_switches.h" #include "electron/buildflags/buildflags.h" #include "extensions/common/constants.h" #include "ppapi/buildflags/buildflags.h" @@ -231,14 +232,25 @@ base::RefCountedMemory* ElectronContentClient::GetDataResourceBytes( } void ElectronContentClient::AddAdditionalSchemes(Schemes* schemes) { - AppendDelimitedSwitchToVector(switches::kServiceWorkerSchemes, - &schemes->service_worker_schemes); - AppendDelimitedSwitchToVector(switches::kSecureSchemes, - &schemes->secure_schemes); - AppendDelimitedSwitchToVector(switches::kBypassCSPSchemes, - &schemes->csp_bypassing_schemes); - AppendDelimitedSwitchToVector(switches::kCORSSchemes, - &schemes->cors_enabled_schemes); + auto* command_line = base::CommandLine::ForCurrentProcess(); + std::string process_type = + command_line->GetSwitchValueASCII(::switches::kProcessType); + // Browser Process registration happens in + // `api::Protocol::RegisterSchemesAsPrivileged` Renderer Process registration + // happens in `RendererClientBase` We use this for registration to network + // utility process + if (process_type == ::switches::kUtilityProcess) { + AppendDelimitedSwitchToVector(switches::kServiceWorkerSchemes, + &schemes->service_worker_schemes); + AppendDelimitedSwitchToVector(switches::kStandardSchemes, + &schemes->standard_schemes); + AppendDelimitedSwitchToVector(switches::kSecureSchemes, + &schemes->secure_schemes); + AppendDelimitedSwitchToVector(switches::kBypassCSPSchemes, + &schemes->csp_bypassing_schemes); + AppendDelimitedSwitchToVector(switches::kCORSSchemes, + &schemes->cors_enabled_schemes); + } schemes->service_worker_schemes.emplace_back(url::kFileScheme); schemes->standard_schemes.emplace_back(extensions::kExtensionScheme); diff --git a/shell/renderer/renderer_client_base.cc b/shell/renderer/renderer_client_base.cc index 20a0b11fcf769..1daf3dd511ac1 100644 --- a/shell/renderer/renderer_client_base.cc +++ b/shell/renderer/renderer_client_base.cc @@ -102,6 +102,11 @@ RendererClientBase::RendererClientBase() { ParseSchemesCLISwitch(command_line, switches::kStandardSchemes); for (const std::string& scheme : standard_schemes_list) url::AddStandardScheme(scheme.c_str(), url::SCHEME_WITH_HOST); + // Parse --cors-schemes=scheme1,scheme2 + std::vector cors_schemes_list = + ParseSchemesCLISwitch(command_line, switches::kCORSSchemes); + for (const std::string& scheme : cors_schemes_list) + url::AddCorsEnabledScheme(scheme.c_str()); isolated_world_ = base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kContextIsolation); // We rely on the unique process host id which is notified to the