Plumb NetworkContext into openscreen_platform
This change adds an API for passing a NetworkContext getter function down to the openscreen_platform component, to be used when it needs to create TLS connections. Bug: 1050913 Change-Id: Ib630266b2f37bac2715a7bd8c91ba0b37f7ec6f0 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2107908 Commit-Queue: Brandon Tolsch <btolsch@chromium.org> Reviewed-by: mark a. foltz <mfoltz@chromium.org> Reviewed-by: Eric Roman <eroman@chromium.org> Cr-Commit-Position: refs/heads/master@{#757349}
This commit is contained in:
chrome/browser/media/router
components/openscreen_platform
@ -13,9 +13,9 @@ static_library("router") {
|
||||
"//chrome:strings",
|
||||
"//chrome/common:constants",
|
||||
"//components/cast_channel",
|
||||
"//components/cast_channel",
|
||||
"//components/keyed_service/content",
|
||||
"//components/keyed_service/core",
|
||||
"//components/openscreen_platform:openscreen_platform_network_service",
|
||||
"//content/public/browser",
|
||||
"//content/public/common",
|
||||
"//crypto",
|
||||
@ -165,7 +165,6 @@ static_library("router") {
|
||||
]
|
||||
|
||||
deps += [
|
||||
"//components/openscreen_platform:openscreen_platform_network_service",
|
||||
"//third_party/openscreen/src/osp/public",
|
||||
"//third_party/openscreen/src/platform",
|
||||
"//third_party/openscreen/src/util",
|
||||
@ -180,9 +179,7 @@ static_library("test_support") {
|
||||
"//chrome/test:test_support",
|
||||
"//testing/gmock",
|
||||
]
|
||||
public_deps = [
|
||||
":router",
|
||||
]
|
||||
public_deps = [ ":router" ]
|
||||
sources = [
|
||||
"test/mock_media_router.cc",
|
||||
"test/mock_media_router.h",
|
||||
@ -316,9 +313,7 @@ if (enable_openscreen) {
|
||||
}
|
||||
|
||||
fuzzer_test("dial_internal_message_fuzzer") {
|
||||
sources = [
|
||||
"providers/dial/dial_internal_message_fuzzer.cc",
|
||||
]
|
||||
sources = [ "providers/dial/dial_internal_message_fuzzer.cc" ]
|
||||
deps = [
|
||||
":router",
|
||||
"//base",
|
||||
|
@ -14,10 +14,12 @@
|
||||
#include "chrome/browser/media/router/providers/cast/cast_media_route_provider.h"
|
||||
#include "chrome/browser/media/router/providers/cast/chrome_cast_message_handler.h"
|
||||
#include "chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.h"
|
||||
#include "chrome/browser/net/system_network_context_manager.h"
|
||||
#include "chrome/browser/profiles/profile.h"
|
||||
#include "chrome/common/chrome_features.h"
|
||||
#include "chrome/common/media_router/media_source.h"
|
||||
#include "components/cast_channel/cast_socket_service.h"
|
||||
#include "components/openscreen_platform/network_context.h"
|
||||
#include "content/public/browser/browser_thread.h"
|
||||
#include "extensions/common/extension.h"
|
||||
#include "mojo/public/cpp/bindings/pending_remote.h"
|
||||
@ -208,6 +210,13 @@ void MediaRouterDesktop::ProvideSinks(
|
||||
}
|
||||
|
||||
void MediaRouterDesktop::InitializeMediaRouteProviders() {
|
||||
if (!openscreen_platform::HasNetworkContextGetter()) {
|
||||
openscreen_platform::SetNetworkContextGetter(base::BindRepeating([] {
|
||||
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
||||
return g_browser_process->system_network_context_manager()->GetContext();
|
||||
}));
|
||||
}
|
||||
|
||||
InitializeExtensionMediaRouteProviderProxy();
|
||||
InitializeWiredDisplayMediaRouteProvider();
|
||||
if (CastMediaRouteProviderEnabled())
|
||||
|
@ -15,9 +15,7 @@ source_set("openscreen_platform") {
|
||||
"trace_logging_platform.cc",
|
||||
]
|
||||
|
||||
public_deps = [
|
||||
"//third_party/openscreen/src/platform",
|
||||
]
|
||||
public_deps = [ "//third_party/openscreen/src/platform" ]
|
||||
|
||||
deps = [
|
||||
"//base",
|
||||
@ -27,6 +25,8 @@ source_set("openscreen_platform") {
|
||||
|
||||
source_set("openscreen_platform_network_service") {
|
||||
sources = [
|
||||
"network_context.cc",
|
||||
"network_context.h",
|
||||
"tls_client_connection.cc",
|
||||
"tls_client_connection.h",
|
||||
"tls_connection_factory.cc",
|
||||
|
35
components/openscreen_platform/network_context.cc
Normal file
35
components/openscreen_platform/network_context.cc
Normal file
@ -0,0 +1,35 @@
|
||||
// Copyright 2020 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 "components/openscreen_platform/network_context.h"
|
||||
|
||||
namespace openscreen_platform {
|
||||
namespace {
|
||||
|
||||
static NetworkContextGetter* GetInstance() {
|
||||
static NetworkContextGetter* getter = new NetworkContextGetter();
|
||||
return getter;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
void SetNetworkContextGetter(NetworkContextGetter network_context_getter) {
|
||||
NetworkContextGetter* getter = GetInstance();
|
||||
DCHECK(getter->is_null() || network_context_getter.is_null());
|
||||
*getter = std::move(network_context_getter);
|
||||
}
|
||||
|
||||
bool HasNetworkContextGetter() {
|
||||
return !GetInstance()->is_null();
|
||||
}
|
||||
|
||||
network::mojom::NetworkContext* GetNetworkContext() {
|
||||
NetworkContextGetter* getter = GetInstance();
|
||||
if (getter->is_null()) {
|
||||
return nullptr;
|
||||
}
|
||||
return getter->Run();
|
||||
}
|
||||
|
||||
} // namespace openscreen_platform
|
31
components/openscreen_platform/network_context.h
Normal file
31
components/openscreen_platform/network_context.h
Normal file
@ -0,0 +1,31 @@
|
||||
// Copyright 2020 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.
|
||||
|
||||
#ifndef COMPONENTS_OPENSCREEN_PLATFORM_NETWORK_CONTEXT_H_
|
||||
#define COMPONENTS_OPENSCREEN_PLATFORM_NETWORK_CONTEXT_H_
|
||||
|
||||
#include "base/bind.h"
|
||||
#include "services/network/public/mojom/network_context.mojom.h"
|
||||
|
||||
namespace openscreen_platform {
|
||||
|
||||
using NetworkContextGetter =
|
||||
base::RepeatingCallback<network::mojom::NetworkContext*()>;
|
||||
|
||||
void SetNetworkContextGetter(NetworkContextGetter network_context_getter);
|
||||
bool HasNetworkContextGetter();
|
||||
|
||||
// This and all subsequent NetworkContext calls made must obey the thread safety
|
||||
// requirements of |network_context_getter|. This must be called each time a
|
||||
// mojom::NetworkContext is needed; any returned pointer should not be stored
|
||||
// beyond the scope in which it is received.
|
||||
//
|
||||
// In Chrome, the |network_context_getter| will always return the NetworkContext
|
||||
// from the SystemNetworkContextManager; therefore, GetNetworkContext must be
|
||||
// called on the UI thread.
|
||||
network::mojom::NetworkContext* GetNetworkContext();
|
||||
|
||||
} // namespace openscreen_platform
|
||||
|
||||
#endif // COMPONENTS_OPENSCREEN_PLATFORM_NETWORK_CONTEXT_H_
|
@ -8,12 +8,14 @@
|
||||
#include <utility>
|
||||
|
||||
#include "base/logging.h"
|
||||
#include "components/openscreen_platform/network_context.h"
|
||||
#include "components/openscreen_platform/network_util.h"
|
||||
#include "components/openscreen_platform/tls_client_connection.h"
|
||||
#include "net/base/host_port_pair.h"
|
||||
#include "net/base/net_errors.h"
|
||||
#include "net/ssl/ssl_info.h"
|
||||
#include "net/traffic_annotation/network_traffic_annotation.h"
|
||||
#include "services/network/public/mojom/network_context.mojom.h"
|
||||
#include "third_party/openscreen/src/platform/api/tls_connection.h"
|
||||
#include "third_party/openscreen/src/platform/base/tls_connect_options.h"
|
||||
#include "third_party/openscreen/src/platform/base/tls_credentials.h"
|
||||
@ -25,7 +27,7 @@ std::unique_ptr<TlsConnectionFactory> TlsConnectionFactory::CreateFactory(
|
||||
Client* client,
|
||||
TaskRunner* task_runner) {
|
||||
return std::make_unique<openscreen_platform::TlsConnectionFactory>(
|
||||
client, task_runner, nullptr /* network context */);
|
||||
client, task_runner);
|
||||
}
|
||||
|
||||
} // namespace openscreen
|
||||
@ -70,8 +72,8 @@ TlsConnectionFactory::~TlsConnectionFactory() = default;
|
||||
|
||||
void TlsConnectionFactory::Connect(const IPEndpoint& remote_address,
|
||||
const TlsConnectOptions& options) {
|
||||
network::mojom::NetworkContext* network_context = network_context_;
|
||||
// TODO(btolsch): Add fall-back lookup in follow-up NetworkContext patch.
|
||||
network::mojom::NetworkContext* network_context =
|
||||
openscreen_platform::GetNetworkContext();
|
||||
if (!network_context) {
|
||||
client_->OnError(this, openscreen::Error::Code::kItemNotFound);
|
||||
return;
|
||||
@ -107,11 +109,8 @@ void TlsConnectionFactory::Listen(const IPEndpoint& local_address,
|
||||
|
||||
TlsConnectionFactory::TlsConnectionFactory(
|
||||
openscreen::TlsConnectionFactory::Client* client,
|
||||
openscreen::TaskRunner* task_runner,
|
||||
network::mojom::NetworkContext* network_context)
|
||||
: client_(client),
|
||||
task_runner_(task_runner),
|
||||
network_context_(network_context) {}
|
||||
openscreen::TaskRunner* task_runner)
|
||||
: client_(client), task_runner_(task_runner) {}
|
||||
|
||||
TlsConnectionFactory::TcpConnectRequest::TcpConnectRequest(
|
||||
openscreen::TlsConnectOptions options_in,
|
||||
|
@ -11,7 +11,6 @@
|
||||
#include "mojo/public/cpp/bindings/pending_receiver.h"
|
||||
#include "mojo/public/cpp/bindings/receiver.h"
|
||||
#include "mojo/public/cpp/bindings/remote.h"
|
||||
#include "services/network/public/mojom/network_context.mojom.h"
|
||||
#include "services/network/public/mojom/tcp_socket.mojom.h"
|
||||
#include "services/network/public/mojom/tls_socket.mojom.h"
|
||||
#include "third_party/openscreen/src/platform/api/tls_connection_factory.h"
|
||||
@ -34,11 +33,8 @@ namespace openscreen_platform {
|
||||
|
||||
class TlsConnectionFactory : public openscreen::TlsConnectionFactory {
|
||||
public:
|
||||
// If provided, the network context is stored and dereferenced when attempting
|
||||
// to connect. If not provided, the network context is dynamically looked up.
|
||||
TlsConnectionFactory(openscreen::TlsConnectionFactory::Client* client,
|
||||
openscreen::TaskRunner* task_runner,
|
||||
network::mojom::NetworkContext* network_context);
|
||||
openscreen::TaskRunner* task_runner);
|
||||
|
||||
~TlsConnectionFactory() final;
|
||||
|
||||
@ -108,7 +104,6 @@ class TlsConnectionFactory : public openscreen::TlsConnectionFactory {
|
||||
|
||||
openscreen::TlsConnectionFactory::Client* client_;
|
||||
openscreen::TaskRunner* const task_runner_;
|
||||
network::mojom::NetworkContext* const network_context_;
|
||||
base::WeakPtrFactory<TlsConnectionFactory> weak_factory_{this};
|
||||
};
|
||||
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include "base/sequenced_task_runner.h"
|
||||
#include "base/task/post_task.h"
|
||||
#include "base/test/task_environment.h"
|
||||
#include "components/openscreen_platform/network_context.h"
|
||||
#include "components/openscreen_platform/task_runner.h"
|
||||
#include "components/openscreen_platform/tls_client_connection.h"
|
||||
#include "net/base/net_errors.h"
|
||||
@ -99,19 +100,27 @@ class TlsConnectionFactoryTest : public ::testing::Test {
|
||||
task_environment_->GetMainThreadTaskRunner());
|
||||
|
||||
mock_network_context = std::make_unique<FakeNetworkContext>();
|
||||
SetNetworkContextGetter(base::BindRepeating(
|
||||
&TlsConnectionFactoryTest::GetNetworkContext, base::Unretained(this)));
|
||||
}
|
||||
|
||||
void TearDown() override {
|
||||
SetNetworkContextGetter(openscreen_platform::NetworkContextGetter());
|
||||
}
|
||||
|
||||
protected:
|
||||
network::mojom::NetworkContext* GetNetworkContext() {
|
||||
return mock_network_context.get();
|
||||
}
|
||||
|
||||
std::unique_ptr<openscreen_platform::TaskRunner> task_runner;
|
||||
std::unique_ptr<FakeNetworkContext> mock_network_context;
|
||||
|
||||
private:
|
||||
std::unique_ptr<base::test::TaskEnvironment> task_environment_;
|
||||
};
|
||||
|
||||
TEST_F(TlsConnectionFactoryTest, CallsNetworkContextCreateMethod) {
|
||||
StrictMock<MockTlsConnectionFactoryClient> mock_client;
|
||||
TlsConnectionFactory factory(&mock_client, task_runner.get(),
|
||||
mock_network_context.get());
|
||||
TlsConnectionFactory factory(&mock_client, task_runner.get());
|
||||
|
||||
factory.Connect(kValidOpenscreenEndpoint, TlsConnectOptions{});
|
||||
|
||||
@ -122,8 +131,7 @@ TEST_F(TlsConnectionFactoryTest, CallsNetworkContextCreateMethod) {
|
||||
TEST_F(TlsConnectionFactoryTest,
|
||||
CallsOnConnectionFailedWhenNetworkContextReportsError) {
|
||||
StrictMock<MockTlsConnectionFactoryClient> mock_client;
|
||||
TlsConnectionFactory factory(&mock_client, task_runner.get(),
|
||||
mock_network_context.get());
|
||||
TlsConnectionFactory factory(&mock_client, task_runner.get());
|
||||
EXPECT_CALL(mock_client,
|
||||
OnConnectionFailed(&factory, kValidOpenscreenEndpoint));
|
||||
|
||||
|
Reference in New Issue
Block a user