Commit 64687c5b authored by Oleh Lamzin's avatar Oleh Lamzin Committed by Commit Bot

Introduce wilco_dtc NetworkContext

Introduce wilco_dtc NetworkContext to be able to continue establish TLS
connection when server ask client authentication certificate.

Bug: b:144545936
TEST=browser tests
TEST=verified manually on the device that we are able to setup
     connection and receive response from the server

Change-Id: I039c683fed6859641ea42a1bb79536a7629419de
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1964071
Commit-Queue: Oleh Lamzin <lamzin@google.com>
Reviewed-by: default avatarPavol Marko <pmarko@chromium.org>
Reviewed-by: default avatarMatt Menke <mmenke@chromium.org>
Cr-Commit-Position: refs/heads/master@{#734072}
parent 990662d0
......@@ -2310,6 +2310,7 @@ source_set("chromeos") {
"wilco_dtc_supportd/wilco_dtc_supportd_manager.h",
"wilco_dtc_supportd/wilco_dtc_supportd_messaging.cc",
"wilco_dtc_supportd/wilco_dtc_supportd_messaging.h",
"wilco_dtc_supportd/wilco_dtc_supportd_network_context.cc",
"wilco_dtc_supportd/wilco_dtc_supportd_notification_controller.cc",
"wilco_dtc_supportd/wilco_dtc_supportd_notification_controller.h",
"wilco_dtc_supportd/wilco_dtc_supportd_web_request_service.cc",
......@@ -3047,6 +3048,8 @@ source_set("unit_tests") {
"usb/cros_usb_detector_unittest.cc",
"wilco_dtc_supportd/testing_wilco_dtc_supportd_bridge_wrapper.cc",
"wilco_dtc_supportd/testing_wilco_dtc_supportd_bridge_wrapper.h",
"wilco_dtc_supportd/testing_wilco_dtc_supportd_network_context.cc",
"wilco_dtc_supportd/testing_wilco_dtc_supportd_network_context.h",
"wilco_dtc_supportd/wilco_dtc_supportd_bridge_unittest.cc",
"wilco_dtc_supportd/wilco_dtc_supportd_manager_unittest.cc",
"wilco_dtc_supportd/wilco_dtc_supportd_messaging_unittest.cc",
......
......@@ -9,6 +9,7 @@
#include "base/files/file.h"
#include "base/memory/platform_shared_memory_region.h"
#include "base/memory/read_only_shared_memory_region.h"
#include "base/threading/thread_restrictions.h"
#include "base/unguessable_token.h"
#include "mojo/public/c/system/types.h"
#include "mojo/public/cpp/system/handle.h"
......@@ -27,7 +28,12 @@ base::StringPiece GetStringPieceFromMojoHandle(
return base::StringPiece();
base::File file(platform_file);
const size_t file_size = file.GetLength();
size_t file_size = 0;
{
// TODO(b/146119375): Remove blocking operation from production code.
base::ScopedAllowBlockingForTesting allow_blocking;
file_size = file.GetLength();
}
if (file_size <= 0)
return base::StringPiece();
......
......@@ -16,7 +16,9 @@
#include "base/run_loop.h"
#include "base/test/bind_test_util.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/fake_wilco_dtc_supportd_client.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_bridge.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_client.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_network_context.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile_manager.h"
#include "mojo/public/cpp/bindings/remote.h"
......@@ -144,10 +146,10 @@ std::unique_ptr<TestingWilcoDtcSupportdBridgeWrapper>
TestingWilcoDtcSupportdBridgeWrapper::Create(
wilco_dtc_supportd::mojom::WilcoDtcSupportdService*
mojo_wilco_dtc_supportd_service,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
std::unique_ptr<WilcoDtcSupportdNetworkContext> network_context,
std::unique_ptr<WilcoDtcSupportdBridge>* bridge) {
return base::WrapUnique(new TestingWilcoDtcSupportdBridgeWrapper(
mojo_wilco_dtc_supportd_service, std::move(url_loader_factory), bridge));
mojo_wilco_dtc_supportd_service, std::move(network_context), bridge));
}
TestingWilcoDtcSupportdBridgeWrapper::~TestingWilcoDtcSupportdBridgeWrapper() =
......@@ -205,7 +207,7 @@ void TestingWilcoDtcSupportdBridgeWrapper::HandleMojoGetService(
TestingWilcoDtcSupportdBridgeWrapper::TestingWilcoDtcSupportdBridgeWrapper(
wilco_dtc_supportd::mojom::WilcoDtcSupportdService*
mojo_wilco_dtc_supportd_service,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
std::unique_ptr<WilcoDtcSupportdNetworkContext> network_context,
std::unique_ptr<WilcoDtcSupportdBridge>* bridge)
: mojo_wilco_dtc_supportd_service_receiver_(
mojo_wilco_dtc_supportd_service) {
......@@ -218,7 +220,7 @@ TestingWilcoDtcSupportdBridgeWrapper::TestingWilcoDtcSupportdBridgeWrapper(
base::BindRepeating(
&TestingWilcoDtcSupportdBridgeWrapper::HandleMojoGetService,
base::Unretained(this)))),
url_loader_factory,
std::move(network_context),
std::make_unique<WilcoDtcSupportdNotificationController>(
profile_manager->profile_manager()));
}
......
......@@ -5,11 +5,11 @@
#ifndef CHROME_BROWSER_CHROMEOS_WILCO_DTC_SUPPORTD_TESTING_WILCO_DTC_SUPPORTD_BRIDGE_WRAPPER_H_
#define CHROME_BROWSER_CHROMEOS_WILCO_DTC_SUPPORTD_TESTING_WILCO_DTC_SUPPORTD_BRIDGE_WRAPPER_H_
#include <memory>
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/scoped_refptr.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_bridge.h"
#include "chrome/services/wilco_dtc_supportd/public/mojom/wilco_dtc_supportd.mojom-forward.h"
#include "chrome/services/wilco_dtc_supportd/public/mojom/wilco_dtc_supportd.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
......@@ -18,6 +18,9 @@
namespace chromeos {
class WilcoDtcSupportdBridge;
class WilcoDtcSupportdNetworkContext;
// Manages a fake instance of WilcoDtcSupportdBridge for unit tests. Mocks out
// the Mojo communication and provides tools for simulating and handling Mojo
// requests.
......@@ -31,7 +34,7 @@ class TestingWilcoDtcSupportdBridgeWrapper final {
static std::unique_ptr<TestingWilcoDtcSupportdBridgeWrapper> Create(
wilco_dtc_supportd::mojom::WilcoDtcSupportdService*
mojo_wilco_dtc_supportd_service,
scoped_refptr<network::SharedURLLoaderFactory> url_loade_factory,
std::unique_ptr<WilcoDtcSupportdNetworkContext> network_context,
std::unique_ptr<WilcoDtcSupportdBridge>* bridge);
~TestingWilcoDtcSupportdBridgeWrapper();
......@@ -57,7 +60,7 @@ class TestingWilcoDtcSupportdBridgeWrapper final {
TestingWilcoDtcSupportdBridgeWrapper(
wilco_dtc_supportd::mojom::WilcoDtcSupportdService*
mojo_wilco_dtc_supportd_service,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
std::unique_ptr<WilcoDtcSupportdNetworkContext> network_context,
std::unique_ptr<WilcoDtcSupportdBridge>* bridge);
// Implements the GetService Mojo method of the WilcoDtcSupportdServiceFactory
......
// 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 "chrome/browser/chromeos/wilco_dtc_supportd/testing_wilco_dtc_supportd_network_context.h"
#include "services/network/public/mojom/url_loader_factory.mojom.h"
namespace chromeos {
TestingWilcoDtcSupportdNetworkContext::TestingWilcoDtcSupportdNetworkContext() =
default;
TestingWilcoDtcSupportdNetworkContext::
~TestingWilcoDtcSupportdNetworkContext() = default;
network::mojom::URLLoaderFactory*
TestingWilcoDtcSupportdNetworkContext::GetURLLoaderFactory() {
return &test_url_loader_factory_;
}
network::TestURLLoaderFactory*
TestingWilcoDtcSupportdNetworkContext::test_url_loader_factory() {
return &test_url_loader_factory_;
}
} // namespace chromeos
// 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 CHROME_BROWSER_CHROMEOS_WILCO_DTC_SUPPORTD_TESTING_WILCO_DTC_SUPPORTD_NETWORK_CONTEXT_H_
#define CHROME_BROWSER_CHROMEOS_WILCO_DTC_SUPPORTD_TESTING_WILCO_DTC_SUPPORTD_NETWORK_CONTEXT_H_
#include "base/macros.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_network_context.h"
#include "services/network/test/test_url_loader_factory.h"
namespace network {
namespace mojom {
class URLLoaderFactory;
} // namespace mojom
} // namespace network
namespace chromeos {
class TestingWilcoDtcSupportdNetworkContext
: public WilcoDtcSupportdNetworkContext {
public:
TestingWilcoDtcSupportdNetworkContext();
~TestingWilcoDtcSupportdNetworkContext() override;
// WilcoDtcSupportdNetworkContext overrides:
network::mojom::URLLoaderFactory* GetURLLoaderFactory() override;
network::TestURLLoaderFactory* test_url_loader_factory();
private:
network::TestURLLoaderFactory test_url_loader_factory_;
DISALLOW_COPY_AND_ASSIGN(TestingWilcoDtcSupportdNetworkContext);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_WILCO_DTC_SUPPORTD_TESTING_WILCO_DTC_SUPPORTD_NETWORK_CONTEXT_H_
......@@ -17,6 +17,7 @@
#include "chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_client.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_network_context.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_notification_controller.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chromeos/dbus/dbus_thread_manager.h"
......@@ -27,7 +28,6 @@
#include "mojo/public/cpp/platform/platform_handle.h"
#include "mojo/public/cpp/system/invitation.h"
#include "mojo/public/cpp/system/message_pipe.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#include "third_party/cros_system_api/dbus/wilco_dtc_supportd/dbus-constants.h"
namespace chromeos {
......@@ -113,19 +113,19 @@ int WilcoDtcSupportdBridge::max_connection_attempt_count_for_testing() {
}
WilcoDtcSupportdBridge::WilcoDtcSupportdBridge(
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
std::unique_ptr<WilcoDtcSupportdNetworkContext> network_context)
: WilcoDtcSupportdBridge(
std::make_unique<WilcoDtcSupportdBridgeDelegateImpl>(),
std::move(url_loader_factory),
std::move(network_context),
std::make_unique<WilcoDtcSupportdNotificationController>()) {}
WilcoDtcSupportdBridge::WilcoDtcSupportdBridge(
std::unique_ptr<Delegate> delegate,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
std::unique_ptr<WilcoDtcSupportdNetworkContext> network_context,
std::unique_ptr<WilcoDtcSupportdNotificationController>
notification_controller)
: delegate_(std::move(delegate)),
web_request_service_(std::move(url_loader_factory)),
web_request_service_(std::move(network_context)),
notification_controller_(std::move(notification_controller)) {
DCHECK(delegate_);
DCHECK(notification_controller_);
......
......@@ -20,12 +20,10 @@
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/system/buffer.h"
namespace network {
class SharedURLLoaderFactory;
} // namespace network
namespace chromeos {
class WilcoDtcSupportdNetworkContext;
// Establishes Mojo communication to the wilco_dtc_supportd daemon. The Mojo
// pipe gets bootstrapped via D-Bus, and the class takes care of waiting until
// the wilco_dtc_supportd D-Bus service gets started and of repeating the
......@@ -56,11 +54,11 @@ class WilcoDtcSupportdBridge final
static int max_connection_attempt_count_for_testing();
explicit WilcoDtcSupportdBridge(
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
std::unique_ptr<WilcoDtcSupportdNetworkContext> network_context);
// For use in tests.
WilcoDtcSupportdBridge(
std::unique_ptr<Delegate> delegate,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
std::unique_ptr<WilcoDtcSupportdNetworkContext> network_context,
std::unique_ptr<WilcoDtcSupportdNotificationController>
notification_controller);
......
......@@ -8,12 +8,13 @@
#include "base/bind.h"
#include "base/logging.h"
#include "base/memory/scoped_refptr.h"
#include "base/optional.h"
#include "base/posix/eintr_wrapper.h"
#include "base/test/task_environment.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/fake_wilco_dtc_supportd_client.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/testing_wilco_dtc_supportd_network_context.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_bridge.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_network_context.h"
#include "chrome/services/wilco_dtc_supportd/public/mojom/wilco_dtc_supportd.mojom.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile_manager.h"
......@@ -22,8 +23,6 @@
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/system/handle.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "services/network/test/test_url_loader_factory.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
......@@ -191,8 +190,7 @@ class WilcoDtcSupportdBridgeTest : public testing::Test {
wilco_dtc_supportd_bridge_ = std::make_unique<WilcoDtcSupportdBridge>(
std::make_unique<FakeWilcoDtcSupportdBridgeDelegate>(
&mojo_wilco_dtc_supportd_service_factory_),
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
&test_url_loader_factory_),
std::make_unique<TestingWilcoDtcSupportdNetworkContext>(),
std::move(notification_controller));
}
......@@ -264,7 +262,6 @@ class WilcoDtcSupportdBridgeTest : public testing::Test {
mojo::Remote<wilco_dtc_supportd::mojom::WilcoDtcSupportdClient>
mojo_wilco_dtc_supportd_client_;
network::TestURLLoaderFactory test_url_loader_factory_;
};
} // namespace
......
......@@ -12,6 +12,7 @@
#include "base/strings/string_util.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_bridge.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_network_context.h"
#include "chrome/browser/net/system_network_context_manager.h"
#include "chromeos/dbus/upstart/upstart_client.h"
#include "components/session_manager/core/session_manager.h"
......@@ -49,8 +50,7 @@ WilcoDtcSupportdManagerDelegateImpl::~WilcoDtcSupportdManagerDelegateImpl() =
std::unique_ptr<WilcoDtcSupportdBridge>
WilcoDtcSupportdManagerDelegateImpl::CreateWilcoDtcSupportdBridge() {
return std::make_unique<WilcoDtcSupportdBridge>(
g_browser_process->system_network_context_manager()
->GetSharedURLLoaderFactory());
std::make_unique<WilcoDtcSupportdNetworkContextImpl>());
}
// Returns true if only affiliated users are logged-in.
......
......@@ -4,6 +4,8 @@
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_manager.h"
#include <memory>
#include "base/barrier_closure.h"
#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
......@@ -12,15 +14,16 @@
#include "chrome/browser/chromeos/settings/scoped_testing_cros_settings.h"
#include "chrome/browser/chromeos/settings/stub_cros_settings_provider.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/testing_wilco_dtc_supportd_bridge_wrapper.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/testing_wilco_dtc_supportd_network_context.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_bridge.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_client.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_network_context.h"
#include "chrome/services/wilco_dtc_supportd/public/mojom/wilco_dtc_supportd.mojom.h"
#include "chromeos/dbus/upstart/fake_upstart_client.h"
#include "components/session_manager/core/session_manager.h"
#include "components/session_manager/session_manager_types.h"
#include "components/user_manager/scoped_user_manager.h"
#include "components/user_manager/user_names.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "services/network/test/test_url_loader_factory.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
......@@ -77,8 +80,7 @@ class FakeWilcoDtcSupportdManagerDelegate final
testing_wilco_dtc_supportd_bridge_wrapper_ =
TestingWilcoDtcSupportdBridgeWrapper::Create(
mojo_wilco_dtc_supportd_service_,
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
&test_url_loader_factory_),
std::make_unique<TestingWilcoDtcSupportdNetworkContext>(),
&wilco_dtc_supportd_bridge);
DCHECK(wilco_dtc_supportd_bridge);
testing_wilco_dtc_supportd_bridge_wrapper_->EstablishFakeMojoConnection();
......@@ -86,7 +88,6 @@ class FakeWilcoDtcSupportdManagerDelegate final
}
private:
network::TestURLLoaderFactory test_url_loader_factory_;
std::unique_ptr<TestingWilcoDtcSupportdBridgeWrapper>
testing_wilco_dtc_supportd_bridge_wrapper_;
MockMojoWilcoDtcSupportdService* mojo_wilco_dtc_supportd_service_;
......
......@@ -9,19 +9,19 @@
#include "base/bind.h"
#include "base/callback.h"
#include "base/logging.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/shared_memory_mapping.h"
#include "base/run_loop.h"
#include "base/test/task_environment.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/testing_wilco_dtc_supportd_bridge_wrapper.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/testing_wilco_dtc_supportd_network_context.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_bridge.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_client.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_messaging.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_network_context.h"
#include "chrome/services/wilco_dtc_supportd/public/mojom/wilco_dtc_supportd.mojom.h"
#include "extensions/browser/api/messaging/native_message_host.h"
#include "mojo/public/cpp/system/handle.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "services/network/test/test_url_loader_factory.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
......@@ -130,8 +130,7 @@ class WilcoDtcSupportdMessagingOpenedByExtensionTest : public testing::Test {
testing_wilco_dtc_supportd_bridge_wrapper_ =
TestingWilcoDtcSupportdBridgeWrapper::Create(
&mojo_wilco_dtc_supportd_service_,
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
&test_url_loader_factory_),
std::make_unique<TestingWilcoDtcSupportdNetworkContext>(),
&wilco_dtc_supportd_bridge_);
}
......@@ -156,7 +155,6 @@ class WilcoDtcSupportdMessagingOpenedByExtensionTest : public testing::Test {
private:
base::test::TaskEnvironment task_environment_;
StrictMock<MockMojoWilcoDtcSupportdService> mojo_wilco_dtc_supportd_service_;
network::TestURLLoaderFactory test_url_loader_factory_;
std::unique_ptr<TestingWilcoDtcSupportdBridgeWrapper>
testing_wilco_dtc_supportd_bridge_wrapper_;
std::unique_ptr<WilcoDtcSupportdBridge> wilco_dtc_supportd_bridge_;
......
// 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 "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_network_context.h"
#include <memory>
#include "chrome/browser/browser_process.h"
#include "chrome/browser/net/system_network_context_manager.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/network_service_instance.h"
#include "services/network/network_service.h"
namespace chromeos {
WilcoDtcSupportdNetworkContextImpl::WilcoDtcSupportdNetworkContextImpl()
: proxy_config_monitor_(g_browser_process->local_state()) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
}
WilcoDtcSupportdNetworkContextImpl::~WilcoDtcSupportdNetworkContextImpl() =
default;
network::mojom::URLLoaderFactory*
WilcoDtcSupportdNetworkContextImpl::GetURLLoaderFactory() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
if (!url_loader_factory_ || !url_loader_factory_.is_connected()) {
EnsureNetworkContextExists();
network::mojom::URLLoaderFactoryParamsPtr url_loader_factory_params =
network::mojom::URLLoaderFactoryParams::New();
url_loader_factory_params->process_id = network::mojom::kBrowserProcessId;
url_loader_factory_params->is_corb_enabled = false;
url_loader_factory_params->is_trusted = true;
url_loader_factory_.reset();
network_context_->CreateURLLoaderFactory(
url_loader_factory_.BindNewPipeAndPassReceiver(),
std::move(url_loader_factory_params));
}
return url_loader_factory_.get();
}
void WilcoDtcSupportdNetworkContextImpl::FlushForTesting() {
if (network_context_) {
network_context_.FlushForTesting();
}
if (url_loader_factory_) {
url_loader_factory_.FlushForTesting();
}
}
void WilcoDtcSupportdNetworkContextImpl::EnsureNetworkContextExists() {
if (network_context_ && network_context_.is_connected()) {
return;
}
CreateNetworkContext();
}
void WilcoDtcSupportdNetworkContextImpl::CreateNetworkContext() {
network::mojom::NetworkContextParamsPtr network_context_params =
g_browser_process->system_network_context_manager()
->CreateDefaultNetworkContextParams();
network_context_params->context_name = "wilco_dtc";
network_context_params->http_cache_enabled = false;
proxy_config_monitor_.AddToNetworkContextParams(network_context_params.get());
network_context_.reset();
content::GetNetworkService()->CreateNetworkContext(
network_context_.BindNewPipeAndPassReceiver(),
std::move(network_context_params));
}
} // namespace chromeos
// 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 CHROME_BROWSER_CHROMEOS_WILCO_DTC_SUPPORTD_WILCO_DTC_SUPPORTD_NETWORK_CONTEXT_H_
#define CHROME_BROWSER_CHROMEOS_WILCO_DTC_SUPPORTD_WILCO_DTC_SUPPORTD_NETWORK_CONTEXT_H_
#include "base/macros.h"
#include "chrome/browser/net/proxy_config_monitor.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/network/public/mojom/network_context.mojom.h"
#include "services/network/public/mojom/url_loader_factory.mojom.h"
namespace chromeos {
class WilcoDtcSupportdNetworkContext {
public:
virtual ~WilcoDtcSupportdNetworkContext() = default;
virtual network::mojom::URLLoaderFactory* GetURLLoaderFactory() = 0;
};
class WilcoDtcSupportdNetworkContextImpl
: public WilcoDtcSupportdNetworkContext {
public:
WilcoDtcSupportdNetworkContextImpl();
~WilcoDtcSupportdNetworkContextImpl() override;
// WilcoDtcSupportdNetworkContext overrides:
network::mojom::URLLoaderFactory* GetURLLoaderFactory() override;
void FlushForTesting();
private:
// Ensures that Network Context created and connected to the network service.
void EnsureNetworkContextExists();
// Creates Network Context.
void CreateNetworkContext();
ProxyConfigMonitor proxy_config_monitor_;
// NetworkContext using the network service.
mojo::Remote<network::mojom::NetworkContext> network_context_;
mojo::Remote<network::mojom::URLLoaderFactory> url_loader_factory_;
DISALLOW_COPY_AND_ASSIGN(WilcoDtcSupportdNetworkContextImpl);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_WILCO_DTC_SUPPORTD_WILCO_DTC_SUPPORTD_NETWORK_CONTEXT_H_
......@@ -10,6 +10,7 @@
#include "base/callback.h"
#include "base/logging.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_network_context.h"
#include "mojo/public/cpp/system/buffer.h"
#include "net/base/load_flags.h"
#include "net/base/net_errors.h"
......@@ -17,9 +18,12 @@
#include "net/http/http_request_headers.h"
#include "net/http/http_response_headers.h"
#include "net/http/http_status_code.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
#include "services/network/network_service.h"
#include "services/network/public/cpp/resource_request.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#include "services/network/public/cpp/simple_url_loader.h"
#include "services/network/public/mojom/network_context.mojom.h"
#include "services/network/public/mojom/url_loader_factory.mojom.h"
#include "url/url_constants.h"
namespace chromeos {
......@@ -57,9 +61,9 @@ bool IsHttpOkCode(int code) {
} // namespace
WilcoDtcSupportdWebRequestService::WilcoDtcSupportdWebRequestService(
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
: url_loader_factory_(std::move(url_loader_factory)) {
DCHECK(url_loader_factory_);
std::unique_ptr<WilcoDtcSupportdNetworkContext> network_context)
: network_context_(std::move(network_context)) {
DCHECK(network_context_);
}
WilcoDtcSupportdWebRequestService::~WilcoDtcSupportdWebRequestService() {
......@@ -148,7 +152,7 @@ void WilcoDtcSupportdWebRequestService::PerformRequest(
}
// Do not allow local requests.
if (net::IsLocalhost(url)) {
if (!allow_local_requests_ && net::IsLocalhost(url)) {
LOG(ERROR) << "Local requests are not allowed.";
std::move(callback).Run(wilco_dtc_supportd::mojom::
WilcoDtcSupportdWebRequestStatus::kNetworkError,
......@@ -223,7 +227,7 @@ void WilcoDtcSupportdWebRequestService::MaybeStartNextRequest() {
// Do not retry.
url_loader_->SetRetryOptions(0, network::SimpleURLLoader::RETRY_NEVER);
url_loader_->DownloadToString(
url_loader_factory_.get(),
network_context_->GetURLLoaderFactory(),
base::BindOnce(&WilcoDtcSupportdWebRequestService::OnRequestComplete,
base::Unretained(this)),
kWilcoDtcSupportdWebResponseMaxSizeInBytes);
......
......@@ -11,7 +11,6 @@
#include "base/containers/queue.h"
#include "base/macros.h"
#include "base/memory/scoped_refptr.h"
#include "base/strings/string_piece.h"
#include "chrome/services/wilco_dtc_supportd/public/mojom/wilco_dtc_supportd.mojom.h"
#include "url/gurl.h"
......@@ -19,7 +18,6 @@
namespace network {
struct ResourceRequest;
class SharedURLLoaderFactory;
class SimpleURLLoader;
} // namespace network
......@@ -32,6 +30,8 @@ extern const int kWilcoDtcSupportdWebRequestQueueMaxSize;
// Max size of web response body in bytes.
extern const int kWilcoDtcSupportdWebResponseMaxSizeInBytes;
class WilcoDtcSupportdNetworkContext;
// This class manages and performs web requests initiated by
// wilco_dtc_supportd_processor. This service performs only one request at a
// time and queues additional incoming requests. It can handle the limited
......@@ -45,7 +45,7 @@ class WilcoDtcSupportdWebRequestService final {
mojo::ScopedHandle)>;
explicit WilcoDtcSupportdWebRequestService(
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
std::unique_ptr<WilcoDtcSupportdNetworkContext> network_context);
~WilcoDtcSupportdWebRequestService();
// Performs web request. The response is returned by |callback| which is
......@@ -62,6 +62,10 @@ class WilcoDtcSupportdWebRequestService final {
int request_queue_size_for_testing() { return request_queue_.size(); }
void set_allow_local_requests_for_testing(bool allow) {
allow_local_requests_ = allow;
}
private:
struct WebRequest {
WebRequest();
......@@ -79,7 +83,11 @@ class WilcoDtcSupportdWebRequestService final {
// Starts the next web request if there is any in the |request_queue_|.
void OnRequestComplete(std::unique_ptr<std::string> response_body);
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
// Configures whether it's allowed to perform web requests to the local host
// URL. Change only for tests.
bool allow_local_requests_ = false;
std::unique_ptr<WilcoDtcSupportdNetworkContext> network_context_;
// Should be reset for every web request.
std::unique_ptr<network::SimpleURLLoader> url_loader_;
......
......@@ -9,26 +9,25 @@
#include "base/bind.h"
#include "base/logging.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/shared_memory_mapping.h"
#include "base/run_loop.h"
#include "base/strings/string_piece.h"
#include "base/strings/stringprintf.h"
#include "base/test/task_environment.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/mojo_utils.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/testing_wilco_dtc_supportd_network_context.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service.h"
#include "chrome/services/wilco_dtc_supportd/public/mojom/wilco_dtc_supportd.mojom.h"
#include "net/base/net_errors.h"
#include "net/http/http_request_headers.h"
#include "net/http/http_status_code.h"
#include "services/network/public/cpp/resource_request.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "services/network/test/test_url_loader_factory.h"
#include "services/network/test/test_utils.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
#include "chrome/browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service.h"
namespace chromeos {
namespace {
......@@ -66,15 +65,23 @@ class WilcoDtcSupportdWebRequestServiceTest : public testing::Test {
int http_status;
std::string response_body;
};
WilcoDtcSupportdWebRequestServiceTest() {
auto testing_network_context =
std::make_unique<TestingWilcoDtcSupportdNetworkContext>();
testing_network_context_ = testing_network_context.get();
web_request_service_ = std::make_unique<WilcoDtcSupportdWebRequestService>(
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
&test_url_loader_factory_));
std::move(testing_network_context));
}
~WilcoDtcSupportdWebRequestServiceTest() override {}
void TearDown() override { test_url_loader_factory_.ClearResponses(); }
void TearDown() override {
if (testing_network_context_) {
testing_network_context_->test_url_loader_factory()->ClearResponses();
}
}
// Start new web request with the next parameters:
// * web request parameters:
......@@ -109,12 +116,16 @@ class WilcoDtcSupportdWebRequestServiceTest : public testing::Test {
auto response_head = response_status
? network::CreateURLResponseHead(*response_status)
: network::mojom::URLResponseHead::New();
test_url_loader_factory_.AddResponse(
ASSERT_TRUE(testing_network_context_);
testing_network_context_->test_url_loader_factory()->AddResponse(
GURL(url), std::move(response_head), response_body,
network::URLLoaderCompletionStatus(net_error));
}
void DestroyService() { web_request_service_.reset(); }
void DestroyService() {
testing_network_context_ = nullptr;
web_request_service_.reset();
}
WilcoDtcSupportdWebRequestService* web_request_service() {
return web_request_service_.get();
......@@ -122,8 +133,10 @@ class WilcoDtcSupportdWebRequestServiceTest : public testing::Test {
// Returns a Content-Type header value or empty string if none.
std::string GetContentTypeFromPendingRequest(const std::string& url) {
DCHECK(testing_network_context_);
const network::ResourceRequest* request;
if (!test_url_loader_factory_.IsPending(GURL(url).spec(), &request) ||
if (!testing_network_context_->test_url_loader_factory()->IsPending(
GURL(url).spec(), &request) ||
!request) {
return "";
}
......@@ -149,8 +162,10 @@ class WilcoDtcSupportdWebRequestServiceTest : public testing::Test {
}
std::unique_ptr<WilcoDtcSupportdWebRequestService> web_request_service_;
network::TestURLLoaderFactory test_url_loader_factory_;
base::test::SingleThreadTaskEnvironment task_environment_;
// Owned by |web_request_service_|.
TestingWilcoDtcSupportdNetworkContext* testing_network_context_ = nullptr;
};
} // namespace
......
......@@ -2368,6 +2368,7 @@ if (!is_android) {
"../browser/chromeos/web_applications/media_app_integration_browsertest.cc",
"../browser/chromeos/web_applications/system_web_app_integration_test.cc",
"../browser/chromeos/web_applications/system_web_app_integration_test.h",
"../browser/chromeos/wilco_dtc_supportd/wilco_dtc_supportd_web_request_service_browsertest.cc",
"../browser/download/notification/download_notification_browsertest.cc",
"../browser/drive/drive_notification_manager_factory_browsertest.cc",
"../browser/extensions/api/certificate_provider/certificate_provider_apitest.cc",
......
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