Commit e5cb8f10 authored by Miyoung Shin's avatar Miyoung Shin Committed by Commit Bot

Convert WebSocketConnector client to use BrowserInterfaceBroker

This CL converts WebSocketConnector mojom interface client in
content and blink to use BrowserInterfaceBroker.

Bug: 936482
Change-Id: I4177c048fa87cc18bffbcd31b1cd9d74825fc267
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1935291
Commit-Queue: Dave Tapuska <dtapuska@chromium.org>
Reviewed-by: default avatarMatt Falkenhagen <falken@chromium.org>
Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Reviewed-by: default avatarDave Tapuska <dtapuska@chromium.org>
Cr-Commit-Position: refs/heads/master@{#719627}
parent 0bb16ee6
......@@ -83,6 +83,7 @@
#include "third_party/blink/public/mojom/webaudio/audio_context_manager.mojom.h"
#include "third_party/blink/public/mojom/webauthn/authenticator.mojom.h"
#include "third_party/blink/public/mojom/webauthn/virtual_authenticator.mojom.h"
#include "third_party/blink/public/mojom/websockets/websocket_connector.mojom.h"
#include "third_party/blink/public/mojom/webtransport/quic_transport_connector.mojom.h"
#if !defined(OS_ANDROID)
......@@ -480,6 +481,9 @@ void PopulateFrameBinders(RenderFrameHostImpl* host,
map->Add<blink::mojom::WebUsbService>(base::BindRepeating(
&RenderFrameHostImpl::CreateWebUsbService, base::Unretained(host)));
map->Add<blink::mojom::WebSocketConnector>(base::BindRepeating(
&RenderFrameHostImpl::CreateWebSocketConnector, base::Unretained(host)));
map->Add<blink::mojom::LockManager>(base::BindRepeating(
&RenderFrameHostImpl::CreateLockManager, base::Unretained(host)));
......@@ -649,6 +653,8 @@ void PopulateDedicatedWorkerBinders(DedicatedWorkerHost* host,
}
map->Add<blink::mojom::WebUsbService>(base::BindRepeating(
&DedicatedWorkerHost::CreateWebUsbService, base::Unretained(host)));
map->Add<blink::mojom::WebSocketConnector>(base::BindRepeating(
&DedicatedWorkerHost::CreateWebSocketConnector, base::Unretained(host)));
map->Add<blink::mojom::QuicTransportConnector>(
base::BindRepeating(&DedicatedWorkerHost::CreateQuicTransportConnector,
base::Unretained(host)));
......@@ -749,6 +755,8 @@ void PopulateBinderMapWithContext(
}
map->Add<blink::mojom::NotificationService>(BindSharedWorkerReceiverForOrigin(
&RenderProcessHost::CreateNotificationService, host));
map->Add<blink::mojom::WebSocketConnector>(BindSharedWorkerReceiverForOrigin(
&RenderProcessHost::CreateWebSocketConnector, host));
// render process host binders taking a frame id and an origin
map->Add<blink::mojom::LockManager>(
......@@ -838,6 +846,8 @@ void PopulateBinderMapWithContext(
map->Add<blink::mojom::NotificationService>(
BindServiceWorkerReceiverForOrigin(
&RenderProcessHost::CreateNotificationService, host));
map->Add<blink::mojom::WebSocketConnector>(BindServiceWorkerReceiverForOrigin(
&RenderProcessHost::CreateWebSocketConnector, host));
// render process host binders taking a frame id and an origin
map->Add<blink::mojom::IDBFactory>(
......
......@@ -4640,9 +4640,6 @@ void RenderFrameHostImpl::RegisterMojoInterfaces() {
&RenderFrameHostImpl::BindMediaInterfaceFactoryRequest,
base::Unretained(this)));
registry_->AddInterface(base::BindRepeating(
&RenderFrameHostImpl::CreateWebSocketConnector, base::Unretained(this)));
registry_->AddInterface(base::BindRepeating(
&RenderFrameHostImpl::CreateDedicatedWorkerHostFactory,
base::Unretained(this)));
......
......@@ -1157,6 +1157,9 @@ class CONTENT_EXPORT RenderFrameHostImpl
void CreateWebUsbService(
mojo::PendingReceiver<blink::mojom::WebUsbService> receiver);
void CreateWebSocketConnector(
mojo::PendingReceiver<blink::mojom::WebSocketConnector> receiver);
// https://mikewest.github.io/corpp/#initialize-embedder-policy-for-global
network::mojom::CrossOriginEmbedderPolicy cross_origin_embedder_policy()
const {
......@@ -1665,9 +1668,6 @@ class CONTENT_EXPORT RenderFrameHostImpl
void BindMediaInterfaceFactoryRequest(
mojo::PendingReceiver<media::mojom::InterfaceFactory> receiver);
void CreateWebSocketConnector(
mojo::PendingReceiver<blink::mojom::WebSocketConnector> receiver);
void CreateDedicatedWorkerHostFactory(
mojo::PendingReceiver<blink::mojom::DedicatedWorkerHostFactory> receiver);
......
......@@ -140,6 +140,7 @@
#include "content/browser/theme_helper.h"
#include "content/browser/tracing/background_tracing_manager_impl.h"
#include "content/browser/v8_snapshot_files.h"
#include "content/browser/websockets/websocket_connector_impl.h"
#include "content/browser/webui/web_ui_controller_factory_registry.h"
#include "content/common/child_process.mojom.h"
#include "content/common/child_process_host_impl.h"
......@@ -1976,6 +1977,22 @@ void RenderProcessHostImpl::CreateNotificationService(
origin, std::move(receiver));
}
void RenderProcessHostImpl::CreateWebSocketConnector(
const url::Origin& origin,
mojo::PendingReceiver<blink::mojom::WebSocketConnector> receiver) {
// TODO(jam): is it ok to not send extraHeaders for sockets created from
// shared and service workers?
//
// Shared Workers and service workers are not directly associated with a
// frame, so the concept of "top-level frame" does not exist. Can use
// (origin, origin) for the NetworkIsolationKey for requests because these
// workers can only be created when the site has cookie access.
mojo::MakeSelfOwnedReceiver(std::make_unique<WebSocketConnectorImpl>(
GetID(), MSG_ROUTING_NONE, origin,
net::NetworkIsolationKey(origin, origin)),
std::move(receiver));
}
void RenderProcessHostImpl::CancelProcessShutdownDelayForUnload() {
if (IsKeepAliveRefCountDisabled())
return;
......
......@@ -598,6 +598,16 @@ class CONTENT_EXPORT RenderProcessHostImpl
mojo::PendingReceiver<blink::mojom::NotificationService> receiver)
override;
// Used for shared workers and service workers to create a websocket.
// In other cases, RenderFrameHostImpl for documents or DedicatedWorkerHost
// for dedicated workers handles interface requests in order to associate
// websockets with a frame. Shared workers and service workers don't have to
// do it because they don't have a frame.
void CreateWebSocketConnector(
const url::Origin& origin,
mojo::PendingReceiver<blink::mojom::WebSocketConnector> receiver)
override;
// Adds a CORB (Cross-Origin Read Blocking) exception for |process_id|. The
// exception will be removed when the corresponding RenderProcessHostImpl is
// destroyed (see |cleanup_corb_exception_for_plugin_upon_destruction_|).
......
......@@ -16,7 +16,6 @@
#include "content/browser/quota_dispatcher_host.h"
#include "content/browser/renderer_host/render_process_host_impl.h"
#include "content/browser/storage_partition_impl.h"
#include "content/browser/websockets/websocket_connector_impl.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
......@@ -70,11 +69,6 @@ class RendererInterfaceBinders {
private:
void InitializeParameterizedBinderRegistry();
static void CreateWebSocketConnector(
mojo::PendingReceiver<blink::mojom::WebSocketConnector> receiver,
RenderProcessHost* host,
const url::Origin& origin);
service_manager::BinderRegistryWithArgs<RenderProcessHost*,
const url::Origin&>
parameterized_binder_registry_;
......@@ -87,16 +81,6 @@ class RendererInterfaceBinders {
// interface requests from frames, binders registered on the frame itself
// override binders registered here.
void RendererInterfaceBinders::InitializeParameterizedBinderRegistry() {
// Used for shared workers and service workers to create a websocket.
// In other cases, RenderFrameHostImpl for documents or DedicatedWorkerHost
// for dedicated workers handles interface requests in order to associate
// websockets with a frame. Shared workers and service workers don't have to
// do it because they don't have a frame.
// TODO(nhiroki): Consider moving this into SharedWorkerHost and
// ServiceWorkerProviderHost.
parameterized_binder_registry_.AddInterface(
base::BindRepeating(CreateWebSocketConnector));
parameterized_binder_registry_.AddInterface(
base::BindRepeating(&QuotaDispatcherHost::CreateForWorker));
}
......@@ -106,23 +90,6 @@ RendererInterfaceBinders& GetRendererInterfaceBinders() {
return *binders;
}
void RendererInterfaceBinders::CreateWebSocketConnector(
mojo::PendingReceiver<blink::mojom::WebSocketConnector> receiver,
RenderProcessHost* host,
const url::Origin& origin) {
// TODO(jam): is it ok to not send extraHeaders for sockets created from
// shared and service workers?
//
// Shared Workers and service workers are not directly associated with a
// frame, so the concept of "top-level frame" does not exist. Can use
// (origin, origin) for the NetworkIsolationKey for requests because these
// workers can only be created when the site has cookie access.
mojo::MakeSelfOwnedReceiver(std::make_unique<WebSocketConnectorImpl>(
host->GetID(), MSG_ROUTING_NONE, origin,
net::NetworkIsolationKey(origin, origin)),
std::move(receiver));
}
} // namespace
void BindWorkerInterface(const std::string& interface_name,
......
......@@ -227,8 +227,6 @@ void DedicatedWorkerHost::StartScriptLoad(
void DedicatedWorkerHost::RegisterMojoInterfaces() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
registry_.AddInterface(base::BindRepeating(
&DedicatedWorkerHost::CreateWebSocketConnector, base::Unretained(this)));
registry_.AddInterface(base::BindRepeating(
&DedicatedWorkerHost::CreateWebUsbService, base::Unretained(this)));
registry_.AddInterface(
......
......@@ -79,6 +79,8 @@ class DedicatedWorkerHost final
mojo::PendingReceiver<blink::mojom::SmsReceiver> receiver);
void CreateWebUsbService(
mojo::PendingReceiver<blink::mojom::WebUsbService> receiver);
void CreateWebSocketConnector(
mojo::PendingReceiver<blink::mojom::WebSocketConnector> receiver);
void CreateQuicTransportConnector(
mojo::PendingReceiver<blink::mojom::QuicTransportConnector> receiver);
......@@ -145,9 +147,6 @@ class DedicatedWorkerHost final
RenderFrameHostImpl* render_frame_host,
bool* bypass_redirect_checks);
void CreateWebSocketConnector(
mojo::PendingReceiver<blink::mojom::WebSocketConnector> receiver);
void CreateNestedDedicatedWorker(
mojo::PendingReceiver<blink::mojom::DedicatedWorkerHostFactory> receiver);
......
......@@ -166,20 +166,17 @@ const service_manager::Manifest& GetContentBrowserManifest() {
.ExposeInterfaceFilterCapability_Deprecated(
"navigation:shared_worker", "renderer",
std::set<const char*>{
"blink.mojom.QuotaDispatcherHost",
"blink.mojom.WebSocketConnector"})
"blink.mojom.QuotaDispatcherHost"})
.ExposeInterfaceFilterCapability_Deprecated(
"navigation:dedicated_worker", "renderer",
std::set<const char*>{
"blink.mojom.DedicatedWorkerHostFactory",
"blink.mojom.QuotaDispatcherHost",
"blink.mojom.WebSocketConnector"})
"blink.mojom.QuotaDispatcherHost"})
.ExposeInterfaceFilterCapability_Deprecated(
"navigation:service_worker", "renderer",
std::set<const char*>{
"blink.mojom.QuotaDispatcherHost",
"network.mojom.RestrictedCookieManager",
"blink.mojom.WebSocketConnector"})
"network.mojom.RestrictedCookieManager"})
.ExposeInterfaceFilterCapability_Deprecated(
"navigation:frame", "renderer",
std::set<const char*>{
......@@ -200,7 +197,6 @@ const service_manager::Manifest& GetContentBrowserManifest() {
"media.mojom.RemoterFactory",
"media.mojom.Renderer",
"network.mojom.RestrictedCookieManager",
"blink.mojom.WebSocketConnector",
"viz.mojom.Gpu"})
.PackageService(content::GetManifest())
.Build()};
......
......@@ -39,6 +39,7 @@
#include "third_party/blink/public/mojom/notifications/notification_service.mojom-forward.h"
#include "third_party/blink/public/mojom/payments/payment_app.mojom-forward.h"
#include "third_party/blink/public/mojom/permissions/permission.mojom-forward.h"
#include "third_party/blink/public/mojom/websockets/websocket_connector.mojom-forward.h"
#include "ui/gfx/native_widget_types.h"
#if defined(OS_ANDROID)
......@@ -525,6 +526,9 @@ class CONTENT_EXPORT RenderProcessHost : public IPC::Sender,
virtual void CreateNotificationService(
const url::Origin& origin,
mojo::PendingReceiver<blink::mojom::NotificationService> receiver) = 0;
virtual void CreateWebSocketConnector(
const url::Origin& origin,
mojo::PendingReceiver<blink::mojom::WebSocketConnector> receiver) = 0;
// Returns the current number of active views in this process. Excludes
// any RenderViewHosts that are swapped out.
......
......@@ -204,6 +204,11 @@ class MockRenderProcessHost : public RenderProcessHost {
const url::Origin& origin,
mojo::PendingReceiver<blink::mojom::NotificationService> receiver)
override {}
void CreateWebSocketConnector(
const url::Origin& origin,
mojo::PendingReceiver<blink::mojom::WebSocketConnector> receiver)
override {}
void CleanupCorbExceptionForPluginUponDestruction() override;
// IPC::Sender via RenderProcessHost.
......
......@@ -35,8 +35,7 @@
#include "base/callback.h"
#include "base/location.h"
#include "base/memory/ptr_util.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "services/service_manager/public/cpp/interface_provider.h"
#include "third_party/blink/public/common/browser_interface_broker_proxy.h"
#include "third_party/blink/public/mojom/websockets/websocket_connector.mojom-blink.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/public/platform/task_type.h"
......@@ -253,15 +252,9 @@ bool WebSocketChannelImpl::Connect(const KURL& url, const String& protocol) {
}
mojo::Remote<mojom::blink::WebSocketConnector> connector;
if (execution_context_->GetInterfaceProvider()) {
execution_context_->GetInterfaceProvider()->GetInterface(
connector.BindNewPipeAndPassReceiver(
execution_context_->GetTaskRunner(TaskType::kWebSocket)));
} else {
// Create a fake request. This will lead to a closed WebSocket due to
// a mojo connection error.
ignore_result(connector.BindNewPipeAndPassReceiver());
}
execution_context_->GetBrowserInterfaceBroker().GetInterface(
connector.BindNewPipeAndPassReceiver(
execution_context_->GetTaskRunner(TaskType::kWebSocket)));
connector->Connect(
url, protocols, GetBaseFetchContext()->GetSiteForCookies(),
......
......@@ -14,6 +14,7 @@
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/browser_interface_broker_proxy.h"
#include "third_party/blink/public/mojom/websockets/websocket_connector.mojom-blink.h"
#include "third_party/blink/public/platform/web_url.h"
#include "third_party/blink/public/platform/websocket_handshake_throttle.h"
......@@ -253,16 +254,14 @@ class WebSocketChannelImplTest : public PageTestBase {
}
void SetUp() override {
auto* local_frame_client = MakeGarbageCollected<EmptyLocalFrameClient>();
service_manager::InterfaceProvider::TestApi(
local_frame_client->GetInterfaceProvider())
.SetBinderForName(mojom::blink::WebSocketConnector::Name_,
base::BindRepeating(
&WebSocketChannelImplTest::BindWebSocketConnector,
weak_ptr_factory_.GetWeakPtr()));
local_frame_client_ = MakeGarbageCollected<EmptyLocalFrameClient>();
local_frame_client_->GetBrowserInterfaceBroker().SetBinderForTesting(
mojom::blink::WebSocketConnector::Name_,
base::BindRepeating(&WebSocketChannelImplTest::BindWebSocketConnector,
weak_ptr_factory_.GetWeakPtr()));
PageTestBase::SetupPageWithClients(nullptr /* page_clients */,
local_frame_client);
local_frame_client_.Get());
const KURL page_url("http://example.com/");
NavigateTo(page_url);
channel_ = WebSocketChannelImpl::CreateForTesting(
......@@ -270,6 +269,11 @@ class WebSocketChannelImplTest : public PageTestBase {
std::move(handshake_throttle_));
}
void TearDown() override {
local_frame_client_->GetBrowserInterfaceBroker().SetBinderForTesting(
mojom::blink::WebSocketConnector::Name_, {});
}
MockWebSocketChannelClient* ChannelClient() { return channel_client_.Get(); }
WebSocketChannelImpl* Channel() { return channel_.Get(); }
......@@ -318,6 +322,7 @@ class WebSocketChannelImplTest : public PageTestBase {
}
WebSocketConnector connector_;
Persistent<EmptyLocalFrameClient> local_frame_client_;
Persistent<MockWebSocketChannelClient> channel_client_;
std::unique_ptr<MockWebSocketHandshakeThrottle> handshake_throttle_;
MockWebSocketHandshakeThrottle* const raw_handshake_throttle_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment