0

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:
btolsch
2020-04-08 07:27:25 +00:00
committed by Commit Bot
parent 9caea10d85
commit 4bdffd977c
8 changed files with 103 additions and 31 deletions

@ -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",

@ -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

@ -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));