feat: add net module to utility process (#40017)
* chore: initial prototype of net api from utility process * chore: update url loader to work on both browser and utility processes * chore: add net files to utility process bundle * chore: re-add app ready check but only on main process * chore: replace browser thread dcheck's with sequence checker * refactor: move url loader from browser to common * refactor: move net-client-request.ts from browser to common * docs: add utility process to net api docs * refactor: move net module app ready check to browser only * refactor: switch import from main to common after moving to common * test: add basic net module test for utility process * refactor: switch browser pid with utility pid * refactor: move electron_api_net from browser to common * chore: add fetch to utility net module * chore: add isOnline and online to utility net module * refactor: move net spec helpers into helper file * refactor: break apart net module tests Adds two additional net module test files: `api-net-session-spec.ts` for tests that depend on a session being available (aka depend on running on the main process) and `api-net-custom-protocols-spec.ts` for custom protocol tests. This enables running `api-net-spec.ts` in the utility process. * test: add utility process mocha runner to run net module tests * docs: add utility process to net module classes * refactor: update imports in lib/utility to use electron/utility * chore: check browser context before using in main process Since the browser context supplied to the SimpleURLLoaderWrapper can now be null for use in the UtilityProcess, adding a null check for the main process before use to get a more sensible error if something goes wrong. Co-authored-by: Cheng Zhao <github@zcbenz.com> * chore: remove test debugging * chore: remove unnecessary header include * docs: add utility process net module limitations * test: run net module tests in utility process individually * refactor: clean up prior utility process net tests * chore: add resolveHost to utility process net module * chore: replace resolve host dcheck with sequence checker * test: add net module tests for net.resolveHost * docs: remove utility process limitation for resolveHost --------- Co-authored-by: deepak1556 <hop2deep@gmail.com> Co-authored-by: Cheng Zhao <github@zcbenz.com>
This commit is contained in:
parent
f229201f41
commit
8c71e2adc9
29 changed files with 2642 additions and 2290 deletions
|
@ -13,6 +13,7 @@
|
|||
#include "base/process/kill.h"
|
||||
#include "base/process/launch.h"
|
||||
#include "base/process/process.h"
|
||||
#include "chrome/browser/browser_process.h"
|
||||
#include "content/public/browser/child_process_host.h"
|
||||
#include "content/public/browser/service_process_host.h"
|
||||
#include "content/public/common/result_codes.h"
|
||||
|
@ -22,6 +23,7 @@
|
|||
#include "mojo/public/cpp/bindings/pending_receiver.h"
|
||||
#include "shell/browser/api/message_port.h"
|
||||
#include "shell/browser/javascript_environment.h"
|
||||
#include "shell/browser/net/system_network_context_manager.h"
|
||||
#include "shell/common/gin_converters/callback_converter.h"
|
||||
#include "shell/common/gin_converters/file_path_converter.h"
|
||||
#include "shell/common/gin_helper/dictionary.h"
|
||||
|
@ -192,6 +194,22 @@ UtilityProcessWrapper::UtilityProcessWrapper(
|
|||
connector_->set_connection_error_handler(base::BindOnce(
|
||||
&UtilityProcessWrapper::CloseConnectorPort, weak_factory_.GetWeakPtr()));
|
||||
|
||||
mojo::PendingRemote<network::mojom::URLLoaderFactory> url_loader_factory;
|
||||
network::mojom::URLLoaderFactoryParamsPtr loader_params =
|
||||
network::mojom::URLLoaderFactoryParams::New();
|
||||
loader_params->process_id = pid_;
|
||||
loader_params->is_corb_enabled = false;
|
||||
loader_params->is_trusted = true;
|
||||
network::mojom::NetworkContext* network_context =
|
||||
g_browser_process->system_network_context_manager()->GetContext();
|
||||
network_context->CreateURLLoaderFactory(
|
||||
url_loader_factory.InitWithNewPipeAndPassReceiver(),
|
||||
std::move(loader_params));
|
||||
params->url_loader_factory = std::move(url_loader_factory);
|
||||
mojo::PendingRemote<network::mojom::HostResolver> host_resolver;
|
||||
network_context->CreateHostResolver(
|
||||
{}, host_resolver.InitWithNewPipeAndPassReceiver());
|
||||
params->host_resolver = std::move(host_resolver);
|
||||
node_service_remote_->Initialize(std::move(params));
|
||||
}
|
||||
|
||||
|
|
|
@ -15,7 +15,10 @@
|
|||
#include "net/base/net_errors.h"
|
||||
#include "net/base/network_isolation_key.h"
|
||||
#include "net/dns/public/resolve_error_info.h"
|
||||
#include "services/network/public/mojom/network_context.mojom.h"
|
||||
#include "shell/browser/electron_browser_context.h"
|
||||
#include "shell/common/process_util.h"
|
||||
#include "shell/services/node/node_service.h"
|
||||
#include "url/origin.h"
|
||||
|
||||
using content::BrowserThread;
|
||||
|
@ -30,15 +33,17 @@ ResolveHostFunction::ResolveHostFunction(
|
|||
: browser_context_(browser_context),
|
||||
host_(std::move(host)),
|
||||
params_(std::move(params)),
|
||||
callback_(std::move(callback)) {}
|
||||
callback_(std::move(callback)) {
|
||||
DETACH_FROM_SEQUENCE(sequence_checker_);
|
||||
}
|
||||
|
||||
ResolveHostFunction::~ResolveHostFunction() {
|
||||
DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
||||
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
||||
DCHECK(!receiver_.is_bound());
|
||||
}
|
||||
|
||||
void ResolveHostFunction::Run() {
|
||||
DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
||||
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
||||
DCHECK(!receiver_.is_bound());
|
||||
|
||||
// Start the request.
|
||||
|
@ -50,12 +55,21 @@ void ResolveHostFunction::Run() {
|
|||
net::ResolveErrorInfo(net::ERR_FAILED),
|
||||
/*resolved_addresses=*/absl::nullopt,
|
||||
/*endpoint_results_with_metadata=*/absl::nullopt));
|
||||
browser_context_->GetDefaultStoragePartition()
|
||||
->GetNetworkContext()
|
||||
->ResolveHost(network::mojom::HostResolverHost::NewHostPortPair(
|
||||
std::move(host_port_pair)),
|
||||
net::NetworkAnonymizationKey(), std::move(params_),
|
||||
std::move(resolve_host_client));
|
||||
if (electron::IsUtilityProcess()) {
|
||||
URLLoaderBundle::GetInstance()->GetHostResolver()->ResolveHost(
|
||||
network::mojom::HostResolverHost::NewHostPortPair(
|
||||
std::move(host_port_pair)),
|
||||
net::NetworkAnonymizationKey(), std::move(params_),
|
||||
std::move(resolve_host_client));
|
||||
} else {
|
||||
DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
||||
browser_context_->GetDefaultStoragePartition()
|
||||
->GetNetworkContext()
|
||||
->ResolveHost(network::mojom::HostResolverHost::NewHostPortPair(
|
||||
std::move(host_port_pair)),
|
||||
net::NetworkAnonymizationKey(), std::move(params_),
|
||||
std::move(resolve_host_client));
|
||||
}
|
||||
}
|
||||
|
||||
void ResolveHostFunction::OnComplete(
|
||||
|
@ -64,7 +78,7 @@ void ResolveHostFunction::OnComplete(
|
|||
const absl::optional<net::AddressList>& resolved_addresses,
|
||||
const absl::optional<net::HostResolverEndpointResults>&
|
||||
endpoint_results_with_metadata) {
|
||||
DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
||||
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
||||
|
||||
// Ensure that we outlive the `receiver_.reset()` call.
|
||||
scoped_refptr<ResolveHostFunction> self(this);
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
#include "base/memory/raw_ptr.h"
|
||||
#include "base/memory/ref_counted.h"
|
||||
#include "base/sequence_checker.h"
|
||||
#include "mojo/public/cpp/bindings/receiver.h"
|
||||
#include "net/base/address_list.h"
|
||||
#include "net/dns/public/host_resolver_results.h"
|
||||
|
@ -53,6 +54,8 @@ class ResolveHostFunction
|
|||
const absl::optional<net::HostResolverEndpointResults>&
|
||||
endpoint_results_with_metadata) override;
|
||||
|
||||
SEQUENCE_CHECKER(sequence_checker_);
|
||||
|
||||
// Receiver for the currently in-progress request, if any.
|
||||
mojo::Receiver<network::mojom::ResolveHostClient> receiver_{this};
|
||||
|
||||
|
|
|
@ -9,13 +9,16 @@
|
|||
#include "net/base/network_change_notifier.h"
|
||||
#include "net/http/http_util.h"
|
||||
#include "services/network/public/cpp/features.h"
|
||||
#include "shell/browser/api/electron_api_url_loader.h"
|
||||
#include "services/network/public/mojom/host_resolver.mojom.h"
|
||||
#include "shell/browser/net/resolve_host_function.h"
|
||||
#include "shell/common/api/electron_api_url_loader.h"
|
||||
#include "shell/common/gin_converters/file_path_converter.h"
|
||||
#include "shell/common/gin_converters/gurl_converter.h"
|
||||
#include "shell/common/gin_converters/net_converter.h"
|
||||
#include "shell/common/gin_helper/dictionary.h"
|
||||
#include "shell/common/gin_helper/error_thrower.h"
|
||||
#include "shell/common/gin_helper/object_template_builder.h"
|
||||
|
||||
#include "shell/common/gin_helper/promise.h"
|
||||
#include "shell/common/node_includes.h"
|
||||
|
||||
namespace {
|
||||
|
@ -40,6 +43,37 @@ base::FilePath FileURLToFilePath(v8::Isolate* isolate, const GURL& url) {
|
|||
return path;
|
||||
}
|
||||
|
||||
v8::Local<v8::Promise> ResolveHost(
|
||||
v8::Isolate* isolate,
|
||||
std::string host,
|
||||
absl::optional<network::mojom::ResolveHostParametersPtr> params) {
|
||||
gin_helper::Promise<gin_helper::Dictionary> promise(isolate);
|
||||
v8::Local<v8::Promise> handle = promise.GetHandle();
|
||||
|
||||
auto fn = base::MakeRefCounted<electron::ResolveHostFunction>(
|
||||
nullptr, std::move(host), params ? std::move(params.value()) : nullptr,
|
||||
base::BindOnce(
|
||||
[](gin_helper::Promise<gin_helper::Dictionary> promise,
|
||||
int64_t net_error, const absl::optional<net::AddressList>& addrs) {
|
||||
if (net_error < 0) {
|
||||
promise.RejectWithErrorMessage(net::ErrorToString(net_error));
|
||||
} else {
|
||||
DCHECK(addrs.has_value() && !addrs->empty());
|
||||
|
||||
v8::HandleScope handle_scope(promise.isolate());
|
||||
auto dict =
|
||||
gin_helper::Dictionary::CreateEmpty(promise.isolate());
|
||||
dict.Set("endpoints", addrs->endpoints());
|
||||
promise.Resolve(dict);
|
||||
}
|
||||
},
|
||||
std::move(promise)));
|
||||
|
||||
fn->Run();
|
||||
|
||||
return handle;
|
||||
}
|
||||
|
||||
using electron::api::SimpleURLLoaderWrapper;
|
||||
|
||||
void Initialize(v8::Local<v8::Object> exports,
|
||||
|
@ -54,8 +88,9 @@ void Initialize(v8::Local<v8::Object> exports,
|
|||
dict.SetMethod("isValidHeaderValue", &IsValidHeaderValue);
|
||||
dict.SetMethod("createURLLoader", &SimpleURLLoaderWrapper::Create);
|
||||
dict.SetMethod("fileURLToFilePath", &FileURLToFilePath);
|
||||
dict.SetMethod("resolveHost", &ResolveHost);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
NODE_LINKED_BINDING_CONTEXT_AWARE(electron_browser_net, Initialize)
|
||||
NODE_LINKED_BINDING_CONTEXT_AWARE(electron_common_net, Initialize)
|
|
@ -2,7 +2,7 @@
|
|||
// 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_url_loader.h"
|
||||
#include "shell/common/api/electron_api_url_loader.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <memory>
|
||||
|
@ -13,6 +13,7 @@
|
|||
#include "base/containers/fixed_flat_map.h"
|
||||
#include "base/memory/raw_ptr.h"
|
||||
#include "base/no_destructor.h"
|
||||
#include "base/sequence_checker.h"
|
||||
#include "gin/handle.h"
|
||||
#include "gin/object_template_builder.h"
|
||||
#include "gin/wrappable.h"
|
||||
|
@ -39,7 +40,10 @@
|
|||
#include "shell/common/gin_converters/net_converter.h"
|
||||
#include "shell/common/gin_helper/dictionary.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/process_util.h"
|
||||
#include "shell/services/node/node_service.h"
|
||||
#include "third_party/blink/public/common/loader/referrer_utils.h"
|
||||
#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
|
||||
|
||||
|
@ -186,6 +190,7 @@ class JSChunkedDataPipeGetter : public gin::Wrappable<JSChunkedDataPipeGetter>,
|
|||
mojo::PendingReceiver<network::mojom::ChunkedDataPipeGetter>
|
||||
chunked_data_pipe_getter)
|
||||
: isolate_(isolate), body_func_(isolate, body_func) {
|
||||
DETACH_FROM_SEQUENCE(sequence_checker_);
|
||||
receiver_.Bind(std::move(chunked_data_pipe_getter));
|
||||
}
|
||||
|
||||
|
@ -195,7 +200,7 @@ class JSChunkedDataPipeGetter : public gin::Wrappable<JSChunkedDataPipeGetter>,
|
|||
}
|
||||
|
||||
void StartReading(mojo::ScopedDataPipeProducerHandle pipe) override {
|
||||
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
||||
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
||||
|
||||
if (body_func_.IsEmpty()) {
|
||||
LOG(ERROR) << "Tried to read twice from a JSChunkedDataPipeGetter";
|
||||
|
@ -251,7 +256,7 @@ class JSChunkedDataPipeGetter : public gin::Wrappable<JSChunkedDataPipeGetter>,
|
|||
|
||||
void OnWriteChunkComplete(gin_helper::Promise<void> promise,
|
||||
MojoResult result) {
|
||||
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
||||
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
||||
is_writing_ = false;
|
||||
if (result == MOJO_RESULT_OK) {
|
||||
promise.Resolve();
|
||||
|
@ -278,6 +283,7 @@ class JSChunkedDataPipeGetter : public gin::Wrappable<JSChunkedDataPipeGetter>,
|
|||
size_callback_.Reset();
|
||||
}
|
||||
|
||||
SEQUENCE_CHECKER(sequence_checker_);
|
||||
GetSizeCallback size_callback_;
|
||||
mojo::Receiver<network::mojom::ChunkedDataPipeGetter> receiver_{this};
|
||||
std::unique_ptr<mojo::DataPipeProducer> data_producer_;
|
||||
|
@ -320,6 +326,7 @@ SimpleURLLoaderWrapper::SimpleURLLoaderWrapper(
|
|||
: browser_context_(browser_context),
|
||||
request_options_(options),
|
||||
request_(std::move(request)) {
|
||||
DETACH_FROM_SEQUENCE(sequence_checker_);
|
||||
if (!request_->trusted_params)
|
||||
request_->trusted_params = network::ResourceRequest::TrustedParams();
|
||||
mojo::PendingRemote<network::mojom::URLLoaderNetworkServiceObserver>
|
||||
|
@ -393,7 +400,7 @@ void SimpleURLLoaderWrapper::OnAuthRequired(
|
|||
const scoped_refptr<net::HttpResponseHeaders>& head_headers,
|
||||
mojo::PendingRemote<network::mojom::AuthChallengeResponder>
|
||||
auth_challenge_responder) {
|
||||
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
||||
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
||||
mojo::Remote<network::mojom::AuthChallengeResponder> auth_responder(
|
||||
std::move(auth_challenge_responder));
|
||||
// WeakPtr because if we're Cancel()ed while waiting for auth, and the
|
||||
|
@ -462,6 +469,10 @@ void SimpleURLLoaderWrapper::Cancel() {
|
|||
}
|
||||
scoped_refptr<network::SharedURLLoaderFactory>
|
||||
SimpleURLLoaderWrapper::GetURLLoaderFactoryForURL(const GURL& url) {
|
||||
if (electron::IsUtilityProcess()) {
|
||||
return URLLoaderBundle::GetInstance()->GetSharedURLLoaderFactory();
|
||||
}
|
||||
CHECK(browser_context_);
|
||||
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory;
|
||||
auto* protocol_registry =
|
||||
ProtocolRegistry::FromBrowserContext(browser_context_);
|
||||
|
@ -660,18 +671,22 @@ gin::Handle<SimpleURLLoaderWrapper> SimpleURLLoaderWrapper::Create(
|
|||
}
|
||||
}
|
||||
|
||||
std::string partition;
|
||||
gin::Handle<Session> session;
|
||||
if (!opts.Get("session", &session)) {
|
||||
if (opts.Get("partition", &partition))
|
||||
session = Session::FromPartition(args->isolate(), partition);
|
||||
else // default session
|
||||
session = Session::FromPartition(args->isolate(), "");
|
||||
ElectronBrowserContext* browser_context = nullptr;
|
||||
if (electron::IsBrowserProcess()) {
|
||||
std::string partition;
|
||||
gin::Handle<Session> session;
|
||||
if (!opts.Get("session", &session)) {
|
||||
if (opts.Get("partition", &partition))
|
||||
session = Session::FromPartition(args->isolate(), partition);
|
||||
else // default session
|
||||
session = Session::FromPartition(args->isolate(), "");
|
||||
}
|
||||
browser_context = session->browser_context();
|
||||
}
|
||||
|
||||
auto ret = gin::CreateHandle(
|
||||
args->isolate(), new SimpleURLLoaderWrapper(session->browser_context(),
|
||||
std::move(request), options));
|
||||
args->isolate(),
|
||||
new SimpleURLLoaderWrapper(browser_context, std::move(request), options));
|
||||
ret->Pin();
|
||||
if (!chunk_pipe_getter.IsEmpty()) {
|
||||
ret->PinBodyGetter(chunk_pipe_getter);
|
||||
|
@ -681,7 +696,7 @@ gin::Handle<SimpleURLLoaderWrapper> SimpleURLLoaderWrapper::Create(
|
|||
|
||||
void SimpleURLLoaderWrapper::OnDataReceived(base::StringPiece string_piece,
|
||||
base::OnceClosure resume) {
|
||||
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
||||
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
||||
v8::Isolate* isolate = JavascriptEnvironment::GetIsolate();
|
||||
v8::HandleScope handle_scope(isolate);
|
||||
auto array_buffer = v8::ArrayBuffer::New(isolate, string_piece.size());
|
|
@ -11,6 +11,7 @@
|
|||
|
||||
#include "base/memory/raw_ptr.h"
|
||||
#include "base/memory/weak_ptr.h"
|
||||
#include "base/sequence_checker.h"
|
||||
#include "gin/wrappable.h"
|
||||
#include "mojo/public/cpp/bindings/receiver_set.h"
|
||||
#include "net/base/auth.h"
|
||||
|
@ -133,6 +134,7 @@ class SimpleURLLoaderWrapper
|
|||
void Pin();
|
||||
void PinBodyGetter(v8::Local<v8::Value>);
|
||||
|
||||
SEQUENCE_CHECKER(sequence_checker_);
|
||||
raw_ptr<ElectronBrowserContext> browser_context_;
|
||||
int request_options_;
|
||||
std::unique_ptr<network::ResourceRequest> request_;
|
|
@ -57,7 +57,6 @@
|
|||
V(electron_browser_menu) \
|
||||
V(electron_browser_message_port) \
|
||||
V(electron_browser_native_theme) \
|
||||
V(electron_browser_net) \
|
||||
V(electron_browser_notification) \
|
||||
V(electron_browser_power_monitor) \
|
||||
V(electron_browser_power_save_blocker) \
|
||||
|
@ -76,7 +75,8 @@
|
|||
V(electron_browser_web_contents_view) \
|
||||
V(electron_browser_web_frame_main) \
|
||||
V(electron_browser_web_view_manager) \
|
||||
V(electron_browser_window)
|
||||
V(electron_browser_window) \
|
||||
V(electron_common_net)
|
||||
|
||||
#define ELECTRON_COMMON_BINDINGS(V) \
|
||||
V(electron_common_asar) \
|
||||
|
@ -96,7 +96,10 @@
|
|||
V(electron_renderer_ipc) \
|
||||
V(electron_renderer_web_frame)
|
||||
|
||||
#define ELECTRON_UTILITY_BINDINGS(V) V(electron_utility_parent_port)
|
||||
#define ELECTRON_UTILITY_BINDINGS(V) \
|
||||
V(electron_browser_event_emitter) \
|
||||
V(electron_common_net) \
|
||||
V(electron_utility_parent_port)
|
||||
|
||||
#define ELECTRON_TESTING_BINDINGS(V) V(electron_common_testing)
|
||||
|
||||
|
|
|
@ -7,7 +7,11 @@
|
|||
#include <utility>
|
||||
|
||||
#include "base/command_line.h"
|
||||
#include "base/no_destructor.h"
|
||||
#include "base/strings/utf_string_conversions.h"
|
||||
#include "services/network/public/cpp/wrapper_shared_url_loader_factory.h"
|
||||
#include "services/network/public/mojom/host_resolver.mojom.h"
|
||||
#include "services/network/public/mojom/network_context.mojom.h"
|
||||
#include "shell/browser/javascript_environment.h"
|
||||
#include "shell/common/api/electron_bindings.h"
|
||||
#include "shell/common/gin_converters/file_path_converter.h"
|
||||
|
@ -18,6 +22,34 @@
|
|||
|
||||
namespace electron {
|
||||
|
||||
URLLoaderBundle::URLLoaderBundle() = default;
|
||||
|
||||
URLLoaderBundle::~URLLoaderBundle() = default;
|
||||
|
||||
URLLoaderBundle* URLLoaderBundle::GetInstance() {
|
||||
static base::NoDestructor<URLLoaderBundle> instance;
|
||||
return instance.get();
|
||||
}
|
||||
|
||||
void URLLoaderBundle::SetURLLoaderFactory(
|
||||
mojo::PendingRemote<network::mojom::URLLoaderFactory> pending_factory,
|
||||
mojo::Remote<network::mojom::HostResolver> host_resolver) {
|
||||
factory_ = network::SharedURLLoaderFactory::Create(
|
||||
std::make_unique<network::WrapperPendingSharedURLLoaderFactory>(
|
||||
std::move(pending_factory)));
|
||||
host_resolver_ = std::move(host_resolver);
|
||||
}
|
||||
|
||||
scoped_refptr<network::SharedURLLoaderFactory>
|
||||
URLLoaderBundle::GetSharedURLLoaderFactory() {
|
||||
return factory_;
|
||||
}
|
||||
|
||||
network::mojom::HostResolver* URLLoaderBundle::GetHostResolver() {
|
||||
DCHECK(host_resolver_);
|
||||
return host_resolver_.get();
|
||||
}
|
||||
|
||||
NodeService::NodeService(
|
||||
mojo::PendingReceiver<node::mojom::NodeService> receiver)
|
||||
: node_bindings_{NodeBindings::Create(
|
||||
|
@ -42,6 +74,10 @@ void NodeService::Initialize(node::mojom::NodeServiceParamsPtr params) {
|
|||
|
||||
ParentPort::GetInstance()->Initialize(std::move(params->port));
|
||||
|
||||
URLLoaderBundle::GetInstance()->SetURLLoaderFactory(
|
||||
std::move(params->url_loader_factory),
|
||||
mojo::Remote(std::move(params->host_resolver)));
|
||||
|
||||
js_env_ = std::make_unique<JavascriptEnvironment>(node_bindings_->uv_loop());
|
||||
|
||||
v8::HandleScope scope(js_env_->isolate());
|
||||
|
|
|
@ -8,7 +8,12 @@
|
|||
#include <memory>
|
||||
|
||||
#include "mojo/public/cpp/bindings/pending_receiver.h"
|
||||
#include "mojo/public/cpp/bindings/pending_remote.h"
|
||||
#include "mojo/public/cpp/bindings/receiver.h"
|
||||
#include "mojo/public/cpp/bindings/remote.h"
|
||||
#include "services/network/public/cpp/shared_url_loader_factory.h"
|
||||
#include "services/network/public/mojom/host_resolver.mojom.h"
|
||||
#include "services/network/public/mojom/url_loader_factory.mojom-forward.h"
|
||||
#include "shell/services/node/public/mojom/node_service.mojom.h"
|
||||
|
||||
namespace node {
|
||||
|
@ -23,6 +28,26 @@ class ElectronBindings;
|
|||
class JavascriptEnvironment;
|
||||
class NodeBindings;
|
||||
|
||||
class URLLoaderBundle {
|
||||
public:
|
||||
URLLoaderBundle();
|
||||
~URLLoaderBundle();
|
||||
|
||||
URLLoaderBundle(const URLLoaderBundle&) = delete;
|
||||
URLLoaderBundle& operator=(const URLLoaderBundle&) = delete;
|
||||
|
||||
static URLLoaderBundle* GetInstance();
|
||||
void SetURLLoaderFactory(
|
||||
mojo::PendingRemote<network::mojom::URLLoaderFactory> factory,
|
||||
mojo::Remote<network::mojom::HostResolver> host_resolver);
|
||||
scoped_refptr<network::SharedURLLoaderFactory> GetSharedURLLoaderFactory();
|
||||
network::mojom::HostResolver* GetHostResolver();
|
||||
|
||||
private:
|
||||
scoped_refptr<network::SharedURLLoaderFactory> factory_;
|
||||
mojo::Remote<network::mojom::HostResolver> host_resolver_;
|
||||
};
|
||||
|
||||
class NodeService : public node::mojom::NodeService {
|
||||
public:
|
||||
explicit NodeService(
|
||||
|
|
|
@ -6,6 +6,8 @@ module node.mojom;
|
|||
|
||||
import "mojo/public/mojom/base/file_path.mojom";
|
||||
import "sandbox/policy/mojom/sandbox.mojom";
|
||||
import "services/network/public/mojom/host_resolver.mojom";
|
||||
import "services/network/public/mojom/url_loader_factory.mojom";
|
||||
import "third_party/blink/public/mojom/messaging/message_port_descriptor.mojom";
|
||||
|
||||
struct NodeServiceParams {
|
||||
|
@ -13,6 +15,8 @@ struct NodeServiceParams {
|
|||
array<string> args;
|
||||
array<string> exec_args;
|
||||
blink.mojom.MessagePortDescriptor port;
|
||||
pending_remote<network.mojom.URLLoaderFactory> url_loader_factory;
|
||||
pending_remote<network.mojom.HostResolver> host_resolver;
|
||||
};
|
||||
|
||||
[ServiceSandbox=sandbox.mojom.Sandbox.kNoSandbox]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue