mirror of
https://github.com/electron/electron.git
synced 2026-01-10 16:08:06 -05:00
* chore: bump chromium in DEPS to 142.0.7401.0
* 6911185: Reland "Send touch moves async immediately after scroll starts."
https://chromium-review.googlesource.com/c/chromium/src/+/6911185
* 6906887: mac: click through content area in main window
https://chromium-review.googlesource.com/c/chromium/src/+/6906887
* 6916667: Expose helper to eliminate duplicate recipes.
https://chromium-review.googlesource.com/c/chromium/src/+/6916667
* 6909842: Switch LegacyRenderWidgetHostHWND from atlcrack.h to msg_util.h.
https://chromium-review.googlesource.com/c/chromium/src/+/6909842
* 6884056: Remove the SecKeychain implementation for the Keychain interface
https://chromium-review.googlesource.com/c/chromium/src/+/6884056
* 6904906: Remove `WTF::` in renderer/core/[p-x].*/
https://chromium-review.googlesource.com/c/chromium/src/+/6904906
* 6556585: [persistent_cache]: PersistentCache for CodeCache
https://chromium-review.googlesource.com/c/chromium/src/+/6556585
* 6904864: Layout: Support abort on the text placeholder layout
https://chromium-review.googlesource.com/c/chromium/src/+/6904864
* chore: fixup patch indices
* chore: bump chromium in DEPS to 142.0.7402.0
* fixup! 6556585: [persistent_cache]: PersistentCache for CodeCache
* chore: fixup patch indices
* 6905244: [api] Remove deprecated `GetIsolate`
https://chromium-review.googlesource.com/c/v8/v8/+/6905244
* 6897694: Remove NativeTheme::UserHasContrastPreference().
https://chromium-review.googlesource.com/c/chromium/src/+/6897694
* 6897477: Remove GetPlatformHighContrastColorScheme() and enum.
https://chromium-review.googlesource.com/c/chromium/src/+/6897477
* 6918198: Reland "Rename display::Screen::GetScreen() to display::Screen::Get()"
https://chromium-review.googlesource.com/c/chromium/src/+/6918198
* 6907147: [LNA] add use counter for websocket mixed-content issues
https://chromium-review.googlesource.com/c/chromium/src/+/6907147
* 6914538: Replace WTF::String with blink::String
https://chromium-review.googlesource.com/c/website/+/6914538
* 6892538: [video pip] Allow touchscreen users to toggle live caption
https://chromium-review.googlesource.com/c/chromium/src/+/6892538
* chore: fix patch
* chore: bump chromium in DEPS to 142.0.7403.0
* build: remove ninja logs
* chore: fixup patch indices
* 6920670: [PDF] Change pdf_extension_util to return dictionaries
https://chromium-review.googlesource.com/c/chromium/src/+/6920670
* 6917864: Devirtualize and inline various NativeTheme getters.
https://chromium-review.googlesource.com/c/chromium/src/+/6917864
* 6920873: [PDF] Simplify PDFDocumentHelperClient::OnSaveURL()
https://chromium-review.googlesource.com/c/chromium/src/+/6920873
* build: don't kill blink/web_tests
* 6923655: Roll libc++ from 954086abf121 to b87b2bb112f8 (4 revisions)
https://chromium-review.googlesource.com/c/chromium/src/+/6923655
* 6905242: Reland "[CSP] Clarify report-only console messages."
https://chromium-review.googlesource.com/c/chromium/src/+/6905242
* fixup! 6897694: Remove NativeTheme::UserHasContrastPreference().
* chore: bump chromium in DEPS to 142.0.7405.0
* 6910012: [LNA] Enable LNA enforcement by default
https://chromium-review.googlesource.com/c/chromium/src/+/6910012
* 6929444: Combine GetInstanceForXXX() implementations.
https://chromium-review.googlesource.com/c/chromium/src/+/6929444
* 6927873: Rename native_widget_types.h -> native_ui_types.h
https://chromium-review.googlesource.com/c/chromium/src/+/6927873
* 6853978: Init perfetto really early in WebView
https://chromium-review.googlesource.com/c/chromium/src/+/6853978
* 6874886: Use only one picker observer to avoid getting duplicate notifications
https://chromium-review.googlesource.com/c/chromium/src/+/6874886
* chore: fixup patch indices
* fix: Protocol complex inline dtor
* chore: bump chromium in DEPS to 142.0.7407.0
* chore: bump chromium in DEPS to 142.0.7409.0
* chore: bump chromium in DEPS to 142.0.7411.0
* chore: bump chromium in DEPS to 142.0.7413.0
* fixup! 6905242: Reland "[CSP] Clarify report-only console messages."
* 6927233: Remove NativeTheme "use dark colors" bit.
https://chromium-review.googlesource.com/c/chromium/src/+/6927233
* chore: fixup patch indices
* 6899206: [PermissionOptions] Multi-state permission subscriptions & setting changes
https://chromium-review.googlesource.com/c/chromium/src/+/6899206
* chore: bump chromium in DEPS to 142.0.7415.0
* 6936895: [headless] Remove headless flag from views::Widget class
https://chromium-review.googlesource.com/c/chromium/src/+/6936895
We should probably followup on this to see if there is a way to do this without reverting this CL.
* 6937023: Reland "Use new DBus type system in dbus_xdg::Request"
https://chromium-review.googlesource.com/c/chromium/src/+/6937023
* chore: update patches
* 6944749: Add GN visibility list to //components/os_crypt/sync
https://chromium-review.googlesource.com/c/chromium/src/+/6944749
* Further replace sub_capture_target_version with CaptureVersion
https://chromium-review.googlesource.com/c/chromium/src/+/6935455
* fixup for lint
* chore: update filenames.libcxx.gni
* chore: bump chromium in DEPS to 142.0.7417.0
* 6944136: Reorder NativeTheme headers/.cc files.
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6944136
* 6939701: [DSSC][4] Make FSVCI objects aware of their capture-version-source
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6939701
* 6944404: Remove extraneous callback call
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6944404
* 6936124: [FPF-CI]: Introduce blink::NoiseToken for fingerprinting protection
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6936124
* chore: update patches
* fixup! 6927233: Remove NativeTheme "use dark colors" bit.
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6927233
* fixup! 6917864: Devirtualize and inline various NativeTheme getters.
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6917864
* 6937588: Add initial OsSettingsProvider object, supplying caret blink interval.
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6937588
* fixup! 6905242: Reland "[CSP] Clarify report-only console messages."
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6905242
* 6907515: Replace SingletonHwndObserver with a CallbackList on SingletonHwnd.
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6907515
* 6910482: [Save to Drive] Implement retry functionality
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6910482
* fixup! 6927233: Remove NativeTheme "use dark colors" bit.
Refs https://chromium-review.googlesource.com/c/chromium/src/+/6927233
* Revert "build: remove ninja logs"
This reverts commit 72874740fd.
* test: fix flakey test picked from PR 48205
---------
Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
Co-authored-by: David Sanders <dsanders11@ucsbalum.com>
Co-authored-by: Alice Zhao <alicelovescake@anthropic.com>
375 lines
14 KiB
C++
375 lines
14 KiB
C++
// Copyright (c) 2019 GitHub, Inc.
|
|
// Use of this source code is governed by the MIT license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "shell/browser/api/electron_api_protocol.h"
|
|
|
|
#include <string_view>
|
|
#include <vector>
|
|
|
|
#include "base/command_line.h"
|
|
#include "base/containers/contains.h"
|
|
#include "base/no_destructor.h"
|
|
#include "content/common/url_schemes.h"
|
|
#include "content/public/browser/child_process_security_policy.h"
|
|
#include "gin/object_template_builder.h"
|
|
#include "shell/browser/browser.h"
|
|
#include "shell/browser/javascript_environment.h"
|
|
#include "shell/browser/protocol_registry.h"
|
|
#include "shell/common/gin_converters/callback_converter.h"
|
|
#include "shell/common/gin_converters/net_converter.h"
|
|
#include "shell/common/gin_helper/dictionary.h"
|
|
#include "shell/common/gin_helper/handle.h"
|
|
#include "shell/common/gin_helper/object_template_builder.h"
|
|
#include "shell/common/gin_helper/promise.h"
|
|
#include "shell/common/node_includes.h"
|
|
#include "shell/common/node_util.h"
|
|
#include "shell/common/options_switches.h"
|
|
#include "url/url_util.h"
|
|
|
|
namespace {
|
|
|
|
struct SchemeOptions {
|
|
bool standard = false;
|
|
bool secure = false;
|
|
bool bypassCSP = false;
|
|
bool allowServiceWorkers = false;
|
|
bool supportFetchAPI = false;
|
|
bool corsEnabled = false;
|
|
bool stream = false;
|
|
bool codeCache = false;
|
|
};
|
|
|
|
struct CustomScheme {
|
|
std::string scheme;
|
|
SchemeOptions options;
|
|
};
|
|
|
|
} // namespace
|
|
|
|
namespace gin {
|
|
|
|
template <>
|
|
struct Converter<CustomScheme> {
|
|
static bool FromV8(v8::Isolate* isolate,
|
|
v8::Local<v8::Value> val,
|
|
CustomScheme* out) {
|
|
gin::Dictionary dict(isolate);
|
|
if (!ConvertFromV8(isolate, val, &dict))
|
|
return false;
|
|
if (!dict.Get("scheme", &(out->scheme)))
|
|
return false;
|
|
gin::Dictionary opt(isolate);
|
|
// options are optional. Default values specified in SchemeOptions are used
|
|
if (dict.Get("privileges", &opt)) {
|
|
opt.Get("standard", &(out->options.standard));
|
|
opt.Get("secure", &(out->options.secure));
|
|
opt.Get("bypassCSP", &(out->options.bypassCSP));
|
|
opt.Get("allowServiceWorkers", &(out->options.allowServiceWorkers));
|
|
opt.Get("supportFetchAPI", &(out->options.supportFetchAPI));
|
|
opt.Get("corsEnabled", &(out->options.corsEnabled));
|
|
opt.Get("stream", &(out->options.stream));
|
|
opt.Get("codeCache", &(out->options.codeCache));
|
|
}
|
|
return true;
|
|
}
|
|
};
|
|
|
|
} // namespace gin
|
|
|
|
namespace electron::api {
|
|
|
|
gin::DeprecatedWrapperInfo Protocol::kWrapperInfo = {gin::kEmbedderNativeGin};
|
|
|
|
std::vector<std::string>& GetStandardSchemes() {
|
|
static base::NoDestructor<std::vector<std::string>> g_standard_schemes;
|
|
return *g_standard_schemes;
|
|
}
|
|
|
|
std::vector<std::string>& GetCodeCacheSchemes() {
|
|
static base::NoDestructor<std::vector<std::string>> g_code_cache_schemes;
|
|
return *g_code_cache_schemes;
|
|
}
|
|
|
|
std::vector<std::string>& GetStreamingSchemes() {
|
|
static base::NoDestructor<std::vector<std::string>> g_streaming_schemes;
|
|
return *g_streaming_schemes;
|
|
}
|
|
|
|
void AddServiceWorkerScheme(const std::string& scheme) {
|
|
// There is no API to add service worker scheme, but there is an API to
|
|
// return const reference to the schemes vector.
|
|
// If in future the API is changed to return a copy instead of reference,
|
|
// the compilation will fail, and we should add a patch at that time.
|
|
auto& mutable_schemes =
|
|
const_cast<std::vector<std::string>&>(content::GetServiceWorkerSchemes());
|
|
mutable_schemes.push_back(scheme);
|
|
}
|
|
|
|
void RegisterSchemesAsPrivileged(gin_helper::ErrorThrower thrower,
|
|
v8::Local<v8::Value> val) {
|
|
std::vector<CustomScheme> custom_schemes;
|
|
if (!gin::ConvertFromV8(thrower.isolate(), val, &custom_schemes)) {
|
|
thrower.ThrowError("Argument must be an array of custom schemes.");
|
|
return;
|
|
}
|
|
|
|
for (const auto& custom_scheme : custom_schemes) {
|
|
if (custom_scheme.options.codeCache && !custom_scheme.options.standard) {
|
|
thrower.ThrowError(
|
|
"Code cache can only be enabled when the custom scheme is registered "
|
|
"as standard scheme.");
|
|
return;
|
|
}
|
|
}
|
|
|
|
std::vector<std::string> secure_schemes, cspbypassing_schemes, fetch_schemes,
|
|
service_worker_schemes, cors_schemes;
|
|
for (const auto& custom_scheme : custom_schemes) {
|
|
// Register scheme to privileged list (https, wss, data, chrome-extension)
|
|
if (custom_scheme.options.standard) {
|
|
auto* policy = content::ChildProcessSecurityPolicy::GetInstance();
|
|
url::AddStandardScheme(custom_scheme.scheme.c_str(),
|
|
url::SCHEME_WITH_HOST);
|
|
GetStandardSchemes().push_back(custom_scheme.scheme);
|
|
policy->RegisterWebSafeScheme(custom_scheme.scheme);
|
|
}
|
|
if (custom_scheme.options.secure) {
|
|
secure_schemes.push_back(custom_scheme.scheme);
|
|
url::AddSecureScheme(custom_scheme.scheme.c_str());
|
|
}
|
|
if (custom_scheme.options.bypassCSP) {
|
|
cspbypassing_schemes.push_back(custom_scheme.scheme);
|
|
url::AddCSPBypassingScheme(custom_scheme.scheme.c_str());
|
|
}
|
|
if (custom_scheme.options.corsEnabled) {
|
|
cors_schemes.push_back(custom_scheme.scheme);
|
|
url::AddCorsEnabledScheme(custom_scheme.scheme.c_str());
|
|
}
|
|
if (custom_scheme.options.supportFetchAPI) {
|
|
fetch_schemes.push_back(custom_scheme.scheme);
|
|
}
|
|
if (custom_scheme.options.allowServiceWorkers) {
|
|
service_worker_schemes.push_back(custom_scheme.scheme);
|
|
AddServiceWorkerScheme(custom_scheme.scheme);
|
|
}
|
|
if (custom_scheme.options.stream) {
|
|
GetStreamingSchemes().push_back(custom_scheme.scheme);
|
|
}
|
|
if (custom_scheme.options.codeCache) {
|
|
GetCodeCacheSchemes().push_back(custom_scheme.scheme);
|
|
url::AddCodeCacheScheme(custom_scheme.scheme.c_str());
|
|
}
|
|
}
|
|
|
|
const auto AppendSchemesToCmdLine = [](const std::string_view switch_name,
|
|
std::vector<std::string> schemes) {
|
|
if (schemes.empty())
|
|
return;
|
|
// Add the schemes to command line switches, so child processes can also
|
|
// register them.
|
|
base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
|
|
switch_name, base::JoinString(schemes, ","));
|
|
};
|
|
|
|
AppendSchemesToCmdLine(electron::switches::kSecureSchemes, secure_schemes);
|
|
AppendSchemesToCmdLine(electron::switches::kBypassCSPSchemes,
|
|
cspbypassing_schemes);
|
|
AppendSchemesToCmdLine(electron::switches::kCORSSchemes, cors_schemes);
|
|
AppendSchemesToCmdLine(electron::switches::kFetchSchemes, fetch_schemes);
|
|
AppendSchemesToCmdLine(electron::switches::kServiceWorkerSchemes,
|
|
service_worker_schemes);
|
|
AppendSchemesToCmdLine(electron::switches::kStandardSchemes,
|
|
GetStandardSchemes());
|
|
AppendSchemesToCmdLine(electron::switches::kStreamingSchemes,
|
|
GetStreamingSchemes());
|
|
AppendSchemesToCmdLine(electron::switches::kCodeCacheSchemes,
|
|
GetCodeCacheSchemes());
|
|
}
|
|
|
|
namespace {
|
|
|
|
const char* const kBuiltinSchemes[] = {
|
|
"about", "file", "http", "https", "data", "filesystem",
|
|
};
|
|
|
|
} // namespace
|
|
|
|
Protocol::Protocol(ProtocolRegistry* protocol_registry)
|
|
: protocol_registry_{protocol_registry} {}
|
|
|
|
Protocol::~Protocol() = default;
|
|
|
|
// Convert error code to string.
|
|
// static
|
|
std::string_view Protocol::ErrorCodeToString(Error error) {
|
|
switch (error) {
|
|
case Error::kRegistered:
|
|
return "The scheme has been registered";
|
|
case Error::kNotRegistered:
|
|
return "The scheme has not been registered";
|
|
case Error::kIntercepted:
|
|
return "The scheme has been intercepted";
|
|
case Error::kNotIntercepted:
|
|
return "The scheme has not been intercepted";
|
|
default:
|
|
return "Unexpected error";
|
|
}
|
|
}
|
|
|
|
Protocol::Error Protocol::RegisterProtocol(ProtocolType type,
|
|
const std::string& scheme,
|
|
const ProtocolHandler& handler) {
|
|
bool added = protocol_registry_->RegisterProtocol(type, scheme, handler);
|
|
return added ? Error::kOK : Error::kRegistered;
|
|
}
|
|
|
|
bool Protocol::UnregisterProtocol(const std::string& scheme,
|
|
gin::Arguments* args) {
|
|
bool removed = protocol_registry_->UnregisterProtocol(scheme);
|
|
HandleOptionalCallback(args, removed ? Error::kOK : Error::kNotRegistered);
|
|
return removed;
|
|
}
|
|
|
|
bool Protocol::IsProtocolRegistered(const std::string& scheme) {
|
|
return protocol_registry_->FindRegistered(scheme) != nullptr;
|
|
}
|
|
|
|
Protocol::Error Protocol::InterceptProtocol(ProtocolType type,
|
|
const std::string& scheme,
|
|
const ProtocolHandler& handler) {
|
|
bool added = protocol_registry_->InterceptProtocol(type, scheme, handler);
|
|
return added ? Error::kOK : Error::kIntercepted;
|
|
}
|
|
|
|
bool Protocol::UninterceptProtocol(const std::string& scheme,
|
|
gin::Arguments* args) {
|
|
bool removed = protocol_registry_->UninterceptProtocol(scheme);
|
|
HandleOptionalCallback(args, removed ? Error::kOK : Error::kNotIntercepted);
|
|
return removed;
|
|
}
|
|
|
|
bool Protocol::IsProtocolIntercepted(const std::string& scheme) {
|
|
return protocol_registry_->FindIntercepted(scheme) != nullptr;
|
|
}
|
|
|
|
v8::Local<v8::Promise> Protocol::IsProtocolHandled(v8::Isolate* const isolate,
|
|
const std::string& scheme) {
|
|
util::EmitWarning(isolate,
|
|
"The protocol.isProtocolHandled API is deprecated, "
|
|
"use protocol.isProtocolRegistered "
|
|
"or protocol.isProtocolIntercepted instead.",
|
|
"ProtocolDeprecateIsProtocolHandled");
|
|
return gin_helper::Promise<bool>::ResolvedPromise(
|
|
isolate, IsProtocolRegistered(scheme) || IsProtocolIntercepted(scheme) ||
|
|
// The |isProtocolHandled| should return true for builtin
|
|
// schemes, however with NetworkService it is impossible to
|
|
// know which schemes are registered until a real network
|
|
// request is sent.
|
|
// So we have to test against a hard-coded builtin schemes
|
|
// list make it work with old code. We should deprecate
|
|
// this API with the new |isProtocolRegistered| API.
|
|
base::Contains(kBuiltinSchemes, scheme));
|
|
}
|
|
|
|
void Protocol::HandleOptionalCallback(gin::Arguments* args, Error error) {
|
|
base::RepeatingCallback<void(v8::Local<v8::Value>)> callback;
|
|
if (args->GetNext(&callback)) {
|
|
util::EmitWarning(
|
|
args->isolate(),
|
|
"The callback argument of protocol module APIs is no longer needed.",
|
|
"ProtocolDeprecateCallback");
|
|
if (error == Error::kOK)
|
|
callback.Run(v8::Null(args->isolate()));
|
|
else
|
|
callback.Run(v8::Exception::Error(
|
|
gin::StringToV8(args->isolate(), ErrorCodeToString(error))));
|
|
}
|
|
}
|
|
|
|
// static
|
|
gin_helper::Handle<Protocol> Protocol::Create(
|
|
v8::Isolate* isolate,
|
|
ProtocolRegistry* protocol_registry) {
|
|
return gin_helper::CreateHandle(isolate, new Protocol{protocol_registry});
|
|
}
|
|
|
|
// static
|
|
gin_helper::Handle<Protocol> Protocol::New(gin_helper::ErrorThrower thrower) {
|
|
thrower.ThrowError("Protocol cannot be created from JS");
|
|
return {};
|
|
}
|
|
|
|
// static
|
|
v8::Local<v8::ObjectTemplate> Protocol::FillObjectTemplate(
|
|
v8::Isolate* isolate,
|
|
v8::Local<v8::ObjectTemplate> tmpl) {
|
|
return gin::ObjectTemplateBuilder(isolate, GetClassName(), tmpl)
|
|
.SetMethod("registerStringProtocol",
|
|
&Protocol::RegisterProtocolFor<ProtocolType::kString>)
|
|
.SetMethod("registerBufferProtocol",
|
|
&Protocol::RegisterProtocolFor<ProtocolType::kBuffer>)
|
|
.SetMethod("registerFileProtocol",
|
|
&Protocol::RegisterProtocolFor<ProtocolType::kFile>)
|
|
.SetMethod("registerHttpProtocol",
|
|
&Protocol::RegisterProtocolFor<ProtocolType::kHttp>)
|
|
.SetMethod("registerStreamProtocol",
|
|
&Protocol::RegisterProtocolFor<ProtocolType::kStream>)
|
|
.SetMethod("registerProtocol",
|
|
&Protocol::RegisterProtocolFor<ProtocolType::kFree>)
|
|
.SetMethod("unregisterProtocol", &Protocol::UnregisterProtocol)
|
|
.SetMethod("isProtocolRegistered", &Protocol::IsProtocolRegistered)
|
|
.SetMethod("isProtocolHandled", &Protocol::IsProtocolHandled)
|
|
.SetMethod("interceptStringProtocol",
|
|
&Protocol::InterceptProtocolFor<ProtocolType::kString>)
|
|
.SetMethod("interceptBufferProtocol",
|
|
&Protocol::InterceptProtocolFor<ProtocolType::kBuffer>)
|
|
.SetMethod("interceptFileProtocol",
|
|
&Protocol::InterceptProtocolFor<ProtocolType::kFile>)
|
|
.SetMethod("interceptHttpProtocol",
|
|
&Protocol::InterceptProtocolFor<ProtocolType::kHttp>)
|
|
.SetMethod("interceptStreamProtocol",
|
|
&Protocol::InterceptProtocolFor<ProtocolType::kStream>)
|
|
.SetMethod("interceptProtocol",
|
|
&Protocol::InterceptProtocolFor<ProtocolType::kFree>)
|
|
.SetMethod("uninterceptProtocol", &Protocol::UninterceptProtocol)
|
|
.SetMethod("isProtocolIntercepted", &Protocol::IsProtocolIntercepted)
|
|
.Build();
|
|
}
|
|
|
|
const char* Protocol::GetTypeName() {
|
|
return GetClassName();
|
|
}
|
|
|
|
} // namespace electron::api
|
|
|
|
namespace {
|
|
|
|
void RegisterSchemesAsPrivileged(gin_helper::ErrorThrower thrower,
|
|
v8::Local<v8::Value> val) {
|
|
if (electron::Browser::Get()->is_ready()) {
|
|
thrower.ThrowError(
|
|
"protocol.registerSchemesAsPrivileged should be called before "
|
|
"app is ready");
|
|
return;
|
|
}
|
|
|
|
electron::api::RegisterSchemesAsPrivileged(thrower, val);
|
|
}
|
|
|
|
void Initialize(v8::Local<v8::Object> exports,
|
|
v8::Local<v8::Value> unused,
|
|
v8::Local<v8::Context> context,
|
|
void* priv) {
|
|
v8::Isolate* const isolate = electron::JavascriptEnvironment::GetIsolate();
|
|
gin_helper::Dictionary dict{isolate, exports};
|
|
dict.Set("Protocol",
|
|
electron::api::Protocol::GetConstructor(isolate, context));
|
|
dict.SetMethod("registerSchemesAsPrivileged", &RegisterSchemesAsPrivileged);
|
|
dict.SetMethod("getStandardSchemes", &electron::api::GetStandardSchemes);
|
|
}
|
|
|
|
} // namespace
|
|
|
|
NODE_LINKED_BINDING_CONTEXT_AWARE(electron_browser_protocol, Initialize)
|