
This CL integrates WebSocket with the network service if it's enabled. Before this CL, blink used WebSocket in content/browser even when the network service is enabled. As a result, cookies were not shared between the usual requests and WebSockets. This CL fixes the test failures. On the other hand, the WebSocket implementation living in /services/network still lacks some functionalities, which results in new test failures. - http/tests/security/cookies/websocket/third-party-cookie... I guess these failures share the same cause with http/tests/security/cookies/third-party... failures, and will be fixed altogether. - http/tests/websocket/multiple-connections-throttled.html This will be fixed the the throttling is implemented. - http/tests/devtools/websocket/websocket-handshake.js I don't know why this test fails. I will investigate. - Browser tests This is caused by the lack of WebRequest API support. I will work on it. Bug: 721400 Cq-Include-Trybots: master.tryserver.chromium.linux:linux_mojo Change-Id: I8553be467e88f34929f5585376bdadd31b043e17 Reviewed-on: https://chromium-review.googlesource.com/964105 Commit-Queue: Yutaka Hirano <yhirano@chromium.org> Reviewed-by: Kinuko Yasuda <kinuko@chromium.org> Reviewed-by: Yuri Wiitala <miu@chromium.org> Reviewed-by: Adam Rice <ricea@chromium.org> Cr-Commit-Position: refs/heads/master@{#545390}
224 lines
10 KiB
C++
224 lines
10 KiB
C++
// Copyright 2017 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "content/browser/renderer_interface_binders.h"
|
|
|
|
#include <utility>
|
|
|
|
#include "base/bind.h"
|
|
#include "base/feature_list.h"
|
|
#include "content/browser/background_fetch/background_fetch_service_impl.h"
|
|
#include "content/browser/dedicated_worker/dedicated_worker_host.h"
|
|
#include "content/browser/locks/lock_manager.h"
|
|
#include "content/browser/notifications/platform_notification_context_impl.h"
|
|
#include "content/browser/payments/payment_manager.h"
|
|
#include "content/browser/permissions/permission_service_context.h"
|
|
#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_manager.h"
|
|
#include "content/public/browser/browser_context.h"
|
|
#include "content/public/browser/browser_thread.h"
|
|
#include "content/public/browser/content_browser_client.h"
|
|
#include "content/public/browser/render_frame_host.h"
|
|
#include "content/public/browser/render_process_host.h"
|
|
#include "content/public/common/content_switches.h"
|
|
#include "services/device/public/mojom/constants.mojom.h"
|
|
#include "services/device/public/mojom/vibration_manager.mojom.h"
|
|
#include "services/network/public/cpp/features.h"
|
|
#include "services/network/restricted_cookie_manager.h"
|
|
#include "services/service_manager/public/cpp/binder_registry.h"
|
|
#include "services/service_manager/public/cpp/connector.h"
|
|
#include "services/shape_detection/public/mojom/barcodedetection.mojom.h"
|
|
#include "services/shape_detection/public/mojom/constants.mojom.h"
|
|
#include "services/shape_detection/public/mojom/facedetection_provider.mojom.h"
|
|
#include "services/shape_detection/public/mojom/textdetection.mojom.h"
|
|
#include "third_party/WebKit/public/platform/modules/cache_storage/cache_storage.mojom.h"
|
|
#include "third_party/WebKit/public/platform/modules/notifications/notification_service.mojom.h"
|
|
#include "url/origin.h"
|
|
|
|
namespace content {
|
|
namespace {
|
|
|
|
// A holder for a parameterized BinderRegistry for content-layer interfaces
|
|
// exposed to web workers.
|
|
class RendererInterfaceBinders {
|
|
public:
|
|
RendererInterfaceBinders() { InitializeParameterizedBinderRegistry(); }
|
|
|
|
// Bind an interface request |interface_pipe| for |interface_name| received
|
|
// from a web worker with origin |origin| hosted in the renderer |host|.
|
|
void BindInterface(const std::string& interface_name,
|
|
mojo::ScopedMessagePipeHandle interface_pipe,
|
|
RenderProcessHost* host,
|
|
const url::Origin& origin) {
|
|
if (parameterized_binder_registry_.TryBindInterface(
|
|
interface_name, &interface_pipe, host, origin)) {
|
|
return;
|
|
}
|
|
|
|
GetContentClient()->browser()->BindInterfaceRequestFromWorker(
|
|
host, origin, interface_name, std::move(interface_pipe));
|
|
}
|
|
|
|
// Try binding an interface request |interface_pipe| for |interface_name|
|
|
// received from |frame|.
|
|
bool TryBindInterface(const std::string& interface_name,
|
|
mojo::ScopedMessagePipeHandle* interface_pipe,
|
|
RenderFrameHost* frame) {
|
|
return parameterized_binder_registry_.TryBindInterface(
|
|
interface_name, interface_pipe, frame->GetProcess(),
|
|
frame->GetLastCommittedOrigin());
|
|
}
|
|
|
|
private:
|
|
void InitializeParameterizedBinderRegistry();
|
|
|
|
static void CreateWebSocket(network::mojom::WebSocketRequest request,
|
|
RenderProcessHost* host,
|
|
const url::Origin& origin);
|
|
|
|
service_manager::BinderRegistryWithArgs<RenderProcessHost*,
|
|
const url::Origin&>
|
|
parameterized_binder_registry_;
|
|
};
|
|
|
|
// Forwards service requests to Service Manager since the renderer cannot launch
|
|
// out-of-process services on is own.
|
|
template <typename Interface>
|
|
void ForwardServiceRequest(const char* service_name,
|
|
mojo::InterfaceRequest<Interface> request,
|
|
RenderProcessHost* host,
|
|
const url::Origin& origin) {
|
|
auto* connector = BrowserContext::GetConnectorFor(host->GetBrowserContext());
|
|
connector->BindInterface(service_name, std::move(request));
|
|
}
|
|
|
|
void GetRestrictedCookieManagerForWorker(
|
|
network::mojom::RestrictedCookieManagerRequest request,
|
|
RenderProcessHost* render_process_host,
|
|
const url::Origin& origin) {
|
|
if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
|
|
switches::kEnableExperimentalWebPlatformFeatures)) {
|
|
return;
|
|
}
|
|
|
|
StoragePartition* storage_partition =
|
|
render_process_host->GetStoragePartition();
|
|
network::mojom::NetworkContext* network_context =
|
|
storage_partition->GetNetworkContext();
|
|
uint32_t render_process_id = render_process_host->GetID();
|
|
network_context->GetRestrictedCookieManager(
|
|
std::move(request), render_process_id, MSG_ROUTING_NONE);
|
|
}
|
|
|
|
// Register renderer-exposed interfaces. Each registered interface binder is
|
|
// exposed to all renderer-hosted execution context types (document/frame,
|
|
// dedicated worker, shared worker and service worker) where the appropriate
|
|
// capability spec in the content_browser manifest includes the interface. For
|
|
// interface requests from frames, binders registered on the frame itself
|
|
// override binders registered here.
|
|
void RendererInterfaceBinders::InitializeParameterizedBinderRegistry() {
|
|
parameterized_binder_registry_.AddInterface(base::Bind(
|
|
&ForwardServiceRequest<shape_detection::mojom::BarcodeDetection>,
|
|
shape_detection::mojom::kServiceName));
|
|
parameterized_binder_registry_.AddInterface(base::Bind(
|
|
&ForwardServiceRequest<shape_detection::mojom::FaceDetectionProvider>,
|
|
shape_detection::mojom::kServiceName));
|
|
parameterized_binder_registry_.AddInterface(
|
|
base::Bind(&ForwardServiceRequest<shape_detection::mojom::TextDetection>,
|
|
shape_detection::mojom::kServiceName));
|
|
parameterized_binder_registry_.AddInterface(
|
|
base::Bind(&ForwardServiceRequest<device::mojom::VibrationManager>,
|
|
device::mojom::kServiceName));
|
|
parameterized_binder_registry_.AddInterface(
|
|
base::BindRepeating(CreateWebSocket));
|
|
parameterized_binder_registry_.AddInterface(
|
|
base::Bind([](payments::mojom::PaymentManagerRequest request,
|
|
RenderProcessHost* host, const url::Origin& origin) {
|
|
static_cast<StoragePartitionImpl*>(host->GetStoragePartition())
|
|
->GetPaymentAppContext()
|
|
->CreatePaymentManager(std::move(request));
|
|
}));
|
|
parameterized_binder_registry_.AddInterface(base::BindRepeating(
|
|
[](blink::mojom::CacheStorageRequest request, RenderProcessHost* host,
|
|
const url::Origin& origin) {
|
|
static_cast<RenderProcessHostImpl*>(host)->BindCacheStorage(
|
|
std::move(request), origin);
|
|
}));
|
|
parameterized_binder_registry_.AddInterface(
|
|
base::Bind([](blink::mojom::PermissionServiceRequest request,
|
|
RenderProcessHost* host, const url::Origin& origin) {
|
|
static_cast<RenderProcessHostImpl*>(host)
|
|
->permission_service_context()
|
|
.CreateServiceForWorker(std::move(request), origin);
|
|
}));
|
|
parameterized_binder_registry_.AddInterface(base::BindRepeating(
|
|
[](blink::mojom::LockManagerRequest request, RenderProcessHost* host,
|
|
const url::Origin& origin) {
|
|
static_cast<StoragePartitionImpl*>(host->GetStoragePartition())
|
|
->GetLockManager()
|
|
->CreateService(std::move(request), origin);
|
|
}));
|
|
parameterized_binder_registry_.AddInterface(
|
|
base::Bind(&CreateDedicatedWorkerHostFactory));
|
|
parameterized_binder_registry_.AddInterface(
|
|
base::Bind([](blink::mojom::NotificationServiceRequest request,
|
|
RenderProcessHost* host, const url::Origin& origin) {
|
|
static_cast<StoragePartitionImpl*>(host->GetStoragePartition())
|
|
->GetPlatformNotificationContext()
|
|
->CreateService(host->GetID(), origin, std::move(request));
|
|
}));
|
|
parameterized_binder_registry_.AddInterface(
|
|
base::BindRepeating(&BackgroundFetchServiceImpl::Create));
|
|
parameterized_binder_registry_.AddInterface(
|
|
base::BindRepeating(GetRestrictedCookieManagerForWorker));
|
|
parameterized_binder_registry_.AddInterface(
|
|
base::BindRepeating(&QuotaDispatcherHost::CreateForWorker));
|
|
}
|
|
|
|
RendererInterfaceBinders& GetRendererInterfaceBinders() {
|
|
CR_DEFINE_STATIC_LOCAL(RendererInterfaceBinders, binders, ());
|
|
return binders;
|
|
}
|
|
|
|
void RendererInterfaceBinders::CreateWebSocket(
|
|
network::mojom::WebSocketRequest request,
|
|
RenderProcessHost* host,
|
|
const url::Origin& origin) {
|
|
if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
|
|
StoragePartition* storage_partition = host->GetStoragePartition();
|
|
network::mojom::NetworkContext* network_context =
|
|
storage_partition->GetNetworkContext();
|
|
network_context->CreateWebSocket(std::move(request), host->GetID(),
|
|
MSG_ROUTING_NONE, origin);
|
|
} else {
|
|
WebSocketManager::CreateWebSocketWithOrigin(
|
|
host->GetID(), origin, std::move(request), MSG_ROUTING_NONE);
|
|
}
|
|
}
|
|
|
|
} // namespace
|
|
|
|
void BindWorkerInterface(const std::string& interface_name,
|
|
mojo::ScopedMessagePipeHandle interface_pipe,
|
|
RenderProcessHost* host,
|
|
const url::Origin& origin) {
|
|
DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
|
|
|
GetRendererInterfaceBinders().BindInterface(
|
|
interface_name, std::move(interface_pipe), host, origin);
|
|
}
|
|
|
|
bool TryBindFrameInterface(const std::string& interface_name,
|
|
mojo::ScopedMessagePipeHandle* interface_pipe,
|
|
RenderFrameHost* frame) {
|
|
DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
|
|
|
return GetRendererInterfaceBinders().TryBindInterface(interface_name,
|
|
interface_pipe, frame);
|
|
}
|
|
|
|
} // namespace content
|