Introduce SystemNetworkContextManager.
The new class provides access to the SystemURLRequestContext via
an in-process NetworkService and the NetworkContext Mojo API.
Eventually, we should remove IOThread entirely, and have the
SystemNetworkContextManager perform all configuration of the
SystemRequestContext, and provide access to it as well.
The in-process network service currently just takes a
URLRequestContextBuilder from IOThread and uses that to create the
URLRequestContext, but this gives us a path to switch over
configuration so that it goes through the NetworkService API. It also
lets us switch consumers over to using the NetworkContext API without
having to create a wrapper that supports both the shiny new Mojo API
the legacy one.
When network service is enabled, the SystemNetworkContextManager will
use an out-of-process URLRequestContext instead of an in-process one,
while the IOThread will continue to use an in-process ones.
BUG=715695
Review-Url: https://codereview.chromium.org/2968293002
Cr-Commit-Position: refs/heads/master@{#486527}
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index ab5cd02..0572d5be 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -750,6 +750,8 @@
"net/spdyproxy/data_reduction_proxy_chrome_settings_factory.h",
"net/sth_distributor_provider.cc",
"net/sth_distributor_provider.h",
+ "net/system_network_context_manager.cc",
+ "net/system_network_context_manager.h",
"net/timed_cache.cc",
"net/timed_cache.h",
"net/url_info.cc",
@@ -1624,6 +1626,7 @@
"//content/public/common:feature_h264_with_openh264_ffmpeg",
"//content/public/common:features",
"//content/public/common:service_names",
+ "//content/public/network",
"//courgette:courgette_lib",
"//crypto",
"//crypto:platform",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index 9a8a65d6..3a9c7de 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -88,6 +88,10 @@
# sending synchronous IPC messages on non-UI threads.
"-ipc/ipc_sync_message_filter.h",
+ # Allows in-process use of NetworkService for URLRequestContext configuration.
+ # Should be removed once the actual network service ships.
+ "+content/public/network",
+
# Other libraries.
"+libxml",
"+third_party/google_toolbox_for_mac/src",
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc
index 41cfd40..9dcd7f0 100644
--- a/chrome/browser/io_thread.cc
+++ b/chrome/browser/io_thread.cc
@@ -264,9 +264,9 @@
net::URLRequestContext* SystemURLRequestContextGetter::GetURLRequestContext() {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
- DCHECK(io_thread_->globals()->system_request_context.get());
+ DCHECK(io_thread_->globals()->system_request_context);
- return io_thread_->globals()->system_request_context.get();
+ return io_thread_->globals()->system_request_context;
}
scoped_refptr<base::SingleThreadTaskRunner>
@@ -283,12 +283,14 @@
IOThread::Globals::
SystemRequestContextLeakChecker::~SystemRequestContextLeakChecker() {
- if (globals_->system_request_context.get())
+ if (globals_->system_request_context)
globals_->system_request_context->AssertNoURLRequests();
}
-IOThread::Globals::Globals() : system_request_context_leak_checker(this),
- enable_brotli(false) {}
+IOThread::Globals::Globals()
+ : system_request_context(nullptr),
+ system_request_context_leak_checker(this),
+ enable_brotli(false) {}
IOThread::Globals::~Globals() {}
@@ -398,6 +400,9 @@
std::unique_ptr<net::ct::STHDistributor>(new net::ct::STHDistributor()));
BrowserThread::SetIOThreadDelegate(this);
+
+ SystemNetworkContextManager::SetUp(&network_context_request_,
+ &network_context_params_);
}
IOThread::~IOThread() {
@@ -785,14 +790,15 @@
void IOThread::ConstructSystemRequestContext() {
const base::CommandLine& command_line =
*base::CommandLine::ForCurrentProcess();
- net::URLRequestContextBuilderMojo builder;
+ std::unique_ptr<net::URLRequestContextBuilderMojo> builder =
+ base::MakeUnique<net::URLRequestContextBuilderMojo>();
- builder.set_network_quality_estimator(
+ builder->set_network_quality_estimator(
globals_->network_quality_estimator.get());
- builder.set_enable_brotli(globals_->enable_brotli);
- builder.set_name("system");
+ builder->set_enable_brotli(globals_->enable_brotli);
+ builder->set_name("system");
- builder.set_user_agent(GetUserAgent());
+ builder->set_user_agent(GetUserAgent());
std::unique_ptr<ChromeNetworkDelegate> chrome_network_delegate(
new ChromeNetworkDelegate(extension_event_router_forwarder(),
&system_enable_referrers_));
@@ -800,26 +806,26 @@
chrome_network_delegate->set_data_use_aggregator(
globals_->data_use_aggregator.get(),
true /* is_data_usage_off_the_record */);
- builder.set_network_delegate(
+ builder->set_network_delegate(
globals_->data_use_ascriber->CreateNetworkDelegate(
std::move(chrome_network_delegate), GetMetricsDataUseForwarder()));
- builder.set_net_log(net_log_);
+ builder->set_net_log(net_log_);
std::unique_ptr<net::HostResolver> host_resolver(
CreateGlobalHostResolver(net_log_));
- builder.set_ssl_config_service(GetSSLConfigService());
- builder.SetHttpAuthHandlerFactory(
+ builder->set_ssl_config_service(GetSSLConfigService());
+ builder->SetHttpAuthHandlerFactory(
CreateDefaultAuthHandlerFactory(host_resolver.get()));
- builder.set_host_resolver(std::move(host_resolver));
+ builder->set_host_resolver(std::move(host_resolver));
#if defined(OS_CHROMEOS)
// Creates a CertVerifyProc that doesn't allow any profile-provided certs.
- builder.SetCertVerifier(base::MakeUnique<net::CachingCertVerifier>(
+ builder->SetCertVerifier(base::MakeUnique<net::CachingCertVerifier>(
base::MakeUnique<net::MultiThreadedCertVerifier>(
new chromeos::CertVerifyProcChromeOS())));
#else
- builder.SetCertVerifier(IgnoreErrorsCertVerifier::MaybeWrapCertVerifier(
+ builder->SetCertVerifier(IgnoreErrorsCertVerifier::MaybeWrapCertVerifier(
command_line, net::CertVerifier::CreateDefault()));
UMA_HISTOGRAM_BOOLEAN(
"Net.Certificate.IgnoreCertificateErrorsSPKIListPresent",
@@ -834,7 +840,7 @@
// Register the ct_tree_tracker_ as observer for verified SCTs.
ct_verifier->SetObserver(ct_tree_tracker_.get());
- builder.set_ct_verifier(std::move(ct_verifier));
+ builder->set_ct_verifier(std::move(ct_verifier));
// TODO(eroman): Figure out why this doesn't work in single-process mode.
// Should be possible now that a private isolate is used.
@@ -843,40 +849,45 @@
if (command_line.HasSwitch(switches::kSingleProcess)) {
LOG(ERROR) << "Cannot use V8 Proxy resolver in single process mode.";
} else {
- builder.set_mojo_proxy_resolver_factory(
+ builder->set_mojo_proxy_resolver_factory(
ChromeMojoProxyResolverFactory::GetInstance());
}
}
- builder.set_pac_quick_check_enabled(WpadQuickCheckEnabled());
- builder.set_pac_sanitize_url_policy(
+ builder->set_pac_quick_check_enabled(WpadQuickCheckEnabled());
+ builder->set_pac_sanitize_url_policy(
PacHttpsUrlStrippingEnabled()
? net::ProxyService::SanitizeUrlPolicy::SAFE
: net::ProxyService::SanitizeUrlPolicy::UNSAFE);
#if defined(OS_CHROMEOS)
- builder.set_dhcp_fetcher_factory(
+ builder->set_dhcp_fetcher_factory(
base::MakeUnique<chromeos::DhcpProxyScriptFetcherFactoryChromeos>());
#endif
- builder.set_proxy_config_service(std::move(system_proxy_config_service_));
+ builder->set_proxy_config_service(std::move(system_proxy_config_service_));
- builder.set_http_network_session_params(session_params_);
+ builder->set_http_network_session_params(session_params_);
- builder.set_data_enabled(true);
- builder.set_file_enabled(true);
+ builder->set_data_enabled(true);
+ builder->set_file_enabled(true);
#if !BUILDFLAG(DISABLE_FTP_SUPPORT)
- builder.set_ftp_enabled(true);
+ builder->set_ftp_enabled(true);
#endif
- builder.DisableHttpCache();
+ builder->DisableHttpCache();
- globals_->system_request_context = builder.Build();
+ globals_->network_service = content::NetworkService::Create();
+ globals_->system_network_context =
+ globals_->network_service->CreateNetworkContextWithBuilder(
+ std::move(network_context_request_),
+ std::move(network_context_params_), std::move(builder),
+ &globals_->system_request_context);
#if defined(USE_NSS_CERTS)
- net::SetURLRequestContextForNSSHttpIO(globals_->system_request_context.get());
+ net::SetURLRequestContextForNSSHttpIO(globals_->system_request_context);
#endif
#if defined(OS_ANDROID)
net::CertVerifyProcAndroid::SetCertNetFetcher(
- net::CreateCertNetFetcher(globals_->system_request_context.get()));
+ net::CreateCertNetFetcher(globals_->system_request_context));
#endif
}
diff --git a/chrome/browser/io_thread.h b/chrome/browser/io_thread.h
index e250176..593491b 100644
--- a/chrome/browser/io_thread.h
+++ b/chrome/browser/io_thread.h
@@ -23,12 +23,15 @@
#include "base/time/time.h"
#include "build/build_config.h"
#include "chrome/browser/net/chrome_network_delegate.h"
+#include "chrome/browser/net/system_network_context_manager.h"
#include "chrome/common/features.h"
#include "components/metrics/data_use_tracker.h"
#include "components/prefs/pref_member.h"
#include "components/ssl_config/ssl_config_service_manager.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/browser_thread_delegate.h"
+#include "content/public/common/network_service.mojom.h"
+#include "content/public/network/network_service.h"
#include "extensions/features/features.h"
#include "net/base/network_change_notifier.h"
#include "net/http/http_network_session.h"
@@ -127,6 +130,11 @@
Globals();
~Globals();
+ // In-process NetworkService for use in URLRequestContext configuration when
+ // the network service created through the ServiceManager is disabled. See
+ // SystemNetworkContextManager's header comment for more details
+ std::unique_ptr<content::NetworkService> network_service;
+
// Ascribes all data use in Chrome to a source, such as page loads.
std::unique_ptr<data_use_measurement::ChromeDataUseAscriber>
data_use_ascriber;
@@ -140,7 +148,8 @@
#endif // defined(OS_ANDROID)
std::vector<scoped_refptr<const net::CTLogVerifier>> ct_logs;
std::unique_ptr<net::HttpAuthPreferences> http_auth_preferences;
- std::unique_ptr<net::URLRequestContext> system_request_context;
+ std::unique_ptr<content::mojom::NetworkContext> system_network_context;
+ net::URLRequestContext* system_request_context;
SystemRequestContextLeakChecker system_request_context_leak_checker;
#if BUILDFLAG(ENABLE_EXTENSIONS)
scoped_refptr<extensions::EventRouterForwarder>
@@ -323,6 +332,11 @@
bool allow_gssapi_library_load_;
#endif
+ // These are set on the UI thread, and then consumed during initialization on
+ // the IO thread.
+ content::mojom::NetworkContextRequest network_context_request_;
+ content::mojom::NetworkContextParamsPtr network_context_params_;
+
// This is an instance of the default SSLConfigServiceManager for the current
// platform and it gets SSL preferences from local_state object.
std::unique_ptr<ssl_config::SSLConfigServiceManager>
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc
new file mode 100644
index 0000000..4b940b1c1
--- /dev/null
+++ b/chrome/browser/net/system_network_context_manager.cc
@@ -0,0 +1,63 @@
+// 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 "chrome/browser/net/system_network_context_manager.h"
+
+#include "base/feature_list.h"
+#include "base/logging.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/network_service_instance.h"
+#include "content/public/common/content_features.h"
+#include "content/public/common/service_names.mojom.h"
+#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
+
+namespace {
+
+content::mojom::NetworkContextParamsPtr CreateNetworkContextParams() {
+ // TODO(mmenke): Set up parameters here (No cache, in memory cookie store,
+ // etc).
+ return content::mojom::NetworkContextParams::New();
+}
+
+} // namespace
+
+base::LazyInstance<SystemNetworkContextManager>::Leaky
+ g_system_network_context_manager = LAZY_INSTANCE_INITIALIZER;
+
+content::mojom::NetworkContext* SystemNetworkContextManager::Context() {
+ return GetInstance()->GetContext();
+}
+
+void SystemNetworkContextManager::SetUp(
+ content::mojom::NetworkContextRequest* network_context_request,
+ content::mojom::NetworkContextParamsPtr* network_context_params) {
+ DCHECK(!GetInstance()->io_thread_network_context_);
+ *network_context_request =
+ mojo::MakeRequest(&GetInstance()->io_thread_network_context_);
+ *network_context_params = CreateNetworkContextParams();
+}
+
+SystemNetworkContextManager* SystemNetworkContextManager::GetInstance() {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ return g_system_network_context_manager.Pointer();
+}
+
+SystemNetworkContextManager::SystemNetworkContextManager() {}
+
+SystemNetworkContextManager::~SystemNetworkContextManager() {}
+
+content::mojom::NetworkContext* SystemNetworkContextManager::GetContext() {
+ if (!base::FeatureList::IsEnabled(features::kNetworkService)) {
+ // SetUp should already have been called.
+ DCHECK(io_thread_network_context_);
+ return io_thread_network_context_.get();
+ }
+
+ if (!network_service_network_context_) {
+ content::GetNetworkService()->CreateNetworkContext(
+ MakeRequest(&network_service_network_context_),
+ CreateNetworkContextParams());
+ }
+ return network_service_network_context_.get();
+}
diff --git a/chrome/browser/net/system_network_context_manager.h b/chrome/browser/net/system_network_context_manager.h
new file mode 100644
index 0000000..b3003c2
--- /dev/null
+++ b/chrome/browser/net/system_network_context_manager.h
@@ -0,0 +1,72 @@
+// 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.
+
+#ifndef CHROME_BROWSER_NET_SYSTEM_NETWORK_CONTEXT_MANAGER_H_
+#define CHROME_BROWSER_NET_SYSTEM_NETWORK_CONTEXT_MANAGER_H_
+
+#include <memory>
+
+#include "base/lazy_instance.h"
+#include "base/macros.h"
+#include "content/public/common/network_service.mojom.h"
+
+// Global object that lives on the UI thread. Responsible for creating and
+// managing access to the system NetworkContext. This NetworkContext is intended
+// for requests not associated with a profile. It stores no data on disk, and
+// has no HTTP cache, but it does have ephemeral cookie and channel ID stores.
+// It also does not have access to HTTP proxy auth information the user has
+// entered or that comes from extensions, and similarly, has no
+// extension-provided per-profile proxy configuration information.
+//
+// The "system" NetworkContext will either share a URLRequestContext with
+// IOThread's SystemURLRequestContext and be part of IOThread's NetworkService
+// (If the network service is disabled) or be an independent NetworkContext
+// using the actual network service.
+//
+// This class is intended to eventually replace IOThread. Handling the two cases
+// differently allows this to be used in production without breaking anything or
+// requiring two separate paths, while IOThread consumers slowly transition over
+// to being compatible with the network service.
+class SystemNetworkContextManager {
+ public:
+ // Initializes |network_context_params| as needed to set up a system
+ // NetworkContext. If the network service is disabled,
+ // |network_context_request| will be for the NetworkContext used by the
+ // SystemNetworkContextManager. Otherwise, this method can still be used to
+ // help set up the IOThread's in-process URLRequestContext, and
+ // |network_context_request| will still be populated, but the associated
+ // NetworkContext will not be used by the SystemNetworkContextManager.
+ //
+ // Must be called before the system NetworkContext is first used.
+ static void SetUp(
+ content::mojom::NetworkContextRequest* network_context_request,
+ content::mojom::NetworkContextParamsPtr* network_context_params);
+
+ // Returns the System NetworkContext. May only be called after SetUp().
+ static content::mojom::NetworkContext* Context();
+
+ private:
+ static SystemNetworkContextManager* GetInstance();
+
+ friend struct base::LazyInstanceTraitsBase<SystemNetworkContextManager>;
+
+ SystemNetworkContextManager();
+ ~SystemNetworkContextManager();
+
+ // Gets the system NetworkContext, creating it if needed.
+ content::mojom::NetworkContext* GetContext();
+
+ // NetworkContext using the network service, if the/ network service is
+ // enabled. nullptr, otherwise.
+ content::mojom::NetworkContextPtr network_service_network_context_;
+
+ // This is a NetworkContext that wraps the IOThread's SystemURLRequestContext.
+ // Always initialized in SetUp, but it's only returned by Context() when the
+ // network service is disabled.
+ content::mojom::NetworkContextPtr io_thread_network_context_;
+
+ DISALLOW_COPY_AND_ASSIGN(SystemNetworkContextManager);
+};
+
+#endif // CHROME_BROWSER_NET_SYSTEM_NETWORK_CONTEXT_MANAGER_H_
diff --git a/chrome/browser/net/system_network_context_manager_browsertest.cc b/chrome/browser/net/system_network_context_manager_browsertest.cc
new file mode 100644
index 0000000..607bd658
--- /dev/null
+++ b/chrome/browser/net/system_network_context_manager_browsertest.cc
@@ -0,0 +1,91 @@
+// 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 "chrome/browser/net/system_network_context_manager.h"
+
+#include "base/test/scoped_feature_list.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "content/public/common/content_features.h"
+#include "content/public/common/content_switches.h"
+#include "content/public/common/network_service.mojom.h"
+#include "content/public/common/resource_response.h"
+#include "content/public/common/resource_response_info.h"
+#include "content/public/common/url_loader.mojom.h"
+#include "content/public/common/url_loader_factory.mojom.h"
+#include "content/public/test/test_url_loader_client.h"
+#include "mojo/common/data_pipe_utils.h"
+#include "net/base/net_errors.h"
+#include "net/http/http_response_headers.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
+
+namespace {
+
+enum class NetworkServiceState {
+ kDisabled,
+ kEnabled,
+};
+
+class SystemNetworkContextManagerTest
+ : public InProcessBrowserTest,
+ public testing::WithParamInterface<NetworkServiceState> {
+ public:
+ SystemNetworkContextManagerTest() {
+ EXPECT_TRUE(embedded_test_server()->Start());
+ }
+
+ ~SystemNetworkContextManagerTest() override {}
+
+ void SetUpInProcessBrowserTestFixture() override {
+ feature_list_.InitAndEnableFeature(features::kNetworkService);
+ }
+
+ void SetUpOnMainThread() override {
+ SystemNetworkContextManager::Context()->CreateURLLoaderFactory(
+ MakeRequest(&loader_factory_), 0);
+ }
+
+ content::mojom::URLLoaderFactory* loader_factory() {
+ return loader_factory_.get();
+ }
+
+ private:
+ content::mojom::URLLoaderFactoryPtr loader_factory_;
+ base::test::ScopedFeatureList feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_P(SystemNetworkContextManagerTest, BasicRequest) {
+ content::mojom::URLLoaderAssociatedPtr loader;
+ content::ResourceRequest request;
+ content::TestURLLoaderClient client;
+ request.url = embedded_test_server()->GetURL("/echo");
+ request.method = "GET";
+ request.request_initiator = url::Origin();
+ loader_factory()->CreateLoaderAndStart(
+ mojo::MakeRequest(&loader), 2, 1, content::mojom::kURLLoadOptionNone,
+ request, client.CreateInterfacePtr(),
+ net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
+ client.RunUntilResponseReceived();
+ ASSERT_TRUE(client.response_head().headers);
+ EXPECT_EQ(200, client.response_head().headers->response_code());
+
+ client.RunUntilResponseBodyArrived();
+ // TODO(mmenke): Is blocking the UI Thread while reading the response really
+ // the best way to test requests in a browser test?
+ std::string response_body;
+ EXPECT_TRUE(mojo::common::BlockingCopyToString(client.response_body_release(),
+ &response_body));
+ EXPECT_EQ("Echo", response_body);
+
+ client.RunUntilComplete();
+ EXPECT_EQ(net::OK, client.completion_status().error_code);
+}
+
+INSTANTIATE_TEST_CASE_P(
+ /* no prefix */,
+ SystemNetworkContextManagerTest,
+ ::testing::Values(NetworkServiceState::kDisabled,
+ NetworkServiceState::kEnabled));
+
+} // namespace
diff --git a/chrome/browser/ui/webui/net_internals/net_internals_ui.cc b/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
index c22f0c3..8c6cd04eb 100644
--- a/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
+++ b/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
@@ -1026,7 +1026,7 @@
std::set<net::URLRequestContext*> contexts;
for (const auto& getter : context_getters_)
contexts.insert(getter->GetURLRequestContext());
- contexts.insert(io_thread_->globals()->system_request_context.get());
+ contexts.insert(io_thread_->globals()->system_request_context);
// Add entries for ongoing network objects.
CreateNetLogEntriesForActiveObjects(contexts, this);
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 3b950ab..38a0778f 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1355,6 +1355,7 @@
"../browser/net/predictor_browsertest.cc",
"../browser/net/proxy_browsertest.cc",
"../browser/net/sdch_browsertest.cc",
+ "../browser/net/system_network_context_manager_browsertest.cc",
"../browser/net/websocket_browsertest.cc",
"../browser/ntp_snippets/content_suggestions_service_factory_browsertest.cc",
"../browser/ntp_tiles/ntp_tiles_browsertest.cc",
diff --git a/content/BUILD.gn b/content/BUILD.gn
index 05c3876..5a0d26f 100644
--- a/content/BUILD.gn
+++ b/content/BUILD.gn
@@ -63,8 +63,9 @@
"//content/network:network_sources",
"//content/public/browser:browser_sources",
"//content/public/child:child_sources",
- "//content/public/gpu:gpu_sources",
"//content/public/common:common_sources",
+ "//content/public/gpu:gpu_sources",
+ "//content/public/network:network_sources",
"//content/public/renderer:renderer_sources",
"//content/public/utility:utility_sources",
]
diff --git a/content/browser/blob_storage/blob_url_unittest.cc b/content/browser/blob_storage/blob_url_unittest.cc
index 32b4837..a59b631 100644
--- a/content/browser/blob_storage/blob_url_unittest.cc
+++ b/content/browser/blob_storage/blob_url_unittest.cc
@@ -20,9 +20,9 @@
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
#include "content/browser/blob_storage/blob_url_loader_factory.h"
-#include "content/browser/loader/test_url_loader_client.h"
#include "content/browser/url_loader_factory_getter.h"
#include "content/public/test/test_browser_thread_bundle.h"
+#include "content/public/test/test_url_loader_client.h"
#include "mojo/common/data_pipe_utils.h"
#include "net/base/net_errors.h"
#include "net/base/request_priority.h"
diff --git a/content/browser/loader/DEPS b/content/browser/loader/DEPS
index 33ce038..28ae582 100644
--- a/content/browser/loader/DEPS
+++ b/content/browser/loader/DEPS
@@ -77,7 +77,6 @@
"-content",
"+content/browser/loader/mock_resource_loader.h",
"+content/browser/loader/mojo_async_resource_handler.h",
- "+content/browser/loader/test_url_loader_client.h",
"+content/browser/loader/resource_controller.h",
"+content/browser/loader/resource_dispatcher_host_impl.h",
"+content/browser/loader/resource_request_info_impl.h",
@@ -97,6 +96,7 @@
"+content/public/common/url_loader_factory.mojom.h",
"+content/public/test/test_browser_context.h",
"+content/public/test/test_browser_thread_bundle.h",
+ "+content/public/test/test_url_loader_client.h",
],
"netlog_observer\.(cc|h)": [
"-content",
@@ -301,14 +301,6 @@
# TODO: To be replaced by mojo.
"+content/common/resource_messages.h",
],
- "test_url_loader_client\.(cc|h)": [
- "-content",
- "+content/browser/loader/test_url_loader_client.h",
- "+content/public/common/resource_request_completion_status.h",
- "+content/public/common/resource_response.h",
- "+content/public/common/url_loader.mojom.h",
- "+content/public/common/url_loader_factory.mojom.h",
- ],
"upload_progress_tracker\.(cc|h)": [
"-content",
"+content/browser/loader/upload_progress_tracker.h",
@@ -328,7 +320,6 @@
"-content",
"+content/browser/child_process_security_policy_impl.h",
"+content/browser/loader/mojo_async_resource_handler.h",
- "+content/browser/loader/test_url_loader_client.h",
"+content/browser/loader/resource_dispatcher_host_impl.h",
"+content/browser/loader/resource_message_filter.h",
"+content/browser/loader/resource_request_info_impl.h",
@@ -343,6 +334,7 @@
"+content/public/common/url_loader_factory.mojom.h",
"+content/public/test/test_browser_context.h",
"+content/public/test/test_browser_thread_bundle.h",
+ "+content/public/test/test_url_loader_client.h",
#TODO: To be removed when PlzNavigate lands.
"+content/browser/loader/navigation_resource_throttle.h"
diff --git a/content/browser/loader/mojo_async_resource_handler_unittest.cc b/content/browser/loader/mojo_async_resource_handler_unittest.cc
index c05fe38..d6bf4cba 100644
--- a/content/browser/loader/mojo_async_resource_handler_unittest.cc
+++ b/content/browser/loader/mojo_async_resource_handler_unittest.cc
@@ -23,7 +23,6 @@
#include "content/browser/loader/resource_dispatcher_host_impl.h"
#include "content/browser/loader/resource_request_info_impl.h"
#include "content/browser/loader/resource_scheduler.h"
-#include "content/browser/loader/test_url_loader_client.h"
#include "content/public/browser/appcache_service.h"
#include "content/public/browser/navigation_data.h"
#include "content/public/browser/resource_context.h"
@@ -38,6 +37,7 @@
#include "content/public/common/url_loader_factory.mojom.h"
#include "content/public/test/test_browser_context.h"
#include "content/public/test/test_browser_thread_bundle.h"
+#include "content/public/test/test_url_loader_client.h"
#include "mojo/public/c/system/data_pipe.h"
#include "mojo/public/c/system/types.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
diff --git a/content/browser/loader/url_loader_factory_impl_unittest.cc b/content/browser/loader/url_loader_factory_impl_unittest.cc
index ab9dd1fc..c477cf6 100644
--- a/content/browser/loader/url_loader_factory_impl_unittest.cc
+++ b/content/browser/loader/url_loader_factory_impl_unittest.cc
@@ -26,7 +26,6 @@
#include "content/browser/loader/resource_dispatcher_host_impl.h"
#include "content/browser/loader/resource_message_filter.h"
#include "content/browser/loader/resource_request_info_impl.h"
-#include "content/browser/loader/test_url_loader_client.h"
#include "content/browser/loader_delegate_impl.h"
#include "content/public/browser/resource_context.h"
#include "content/public/browser/resource_dispatcher_host_delegate.h"
@@ -37,6 +36,7 @@
#include "content/public/common/url_loader_factory.mojom.h"
#include "content/public/test/test_browser_context.h"
#include "content/public/test/test_browser_thread_bundle.h"
+#include "content/public/test/test_url_loader_client.h"
#include "mojo/public/c/system/data_pipe.h"
#include "mojo/public/c/system/types.h"
#include "mojo/public/cpp/bindings/binding.h"
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
index 2ad03f4..9b1e53ea 100644
--- a/content/browser/storage_partition_impl.cc
+++ b/content/browser/storage_partition_impl.cc
@@ -31,12 +31,11 @@
#include "content/public/browser/dom_storage_context.h"
#include "content/public/browser/indexed_db_context.h"
#include "content/public/browser/local_storage_usage_info.h"
+#include "content/public/browser/network_service_instance.h"
#include "content/public/browser/session_storage_usage_info.h"
#include "content/public/common/content_client.h"
#include "content/public/common/content_features.h"
#include "content/public/common/content_switches.h"
-#include "content/public/common/service_manager_connection.h"
-#include "content/public/common/service_names.mojom.h"
#include "net/base/completion_callback.h"
#include "net/base/net_errors.h"
#include "net/cookies/canonical_cookie.h"
@@ -532,20 +531,13 @@
ChromeBlobStorageContext::GetFor(context);
if (base::FeatureList::IsEnabled(features::kNetworkService)) {
- static mojom::NetworkServicePtr* g_network_service =
- new mojom::NetworkServicePtr;
- if (!g_network_service->is_bound()) {
- ServiceManagerConnection::GetForProcess()->GetConnector()->BindInterface(
- mojom::kNetworkServiceName, g_network_service);
- }
mojom::NetworkContextParamsPtr context_params =
mojom::NetworkContextParams::New();
// TODO: fill this
// context_params->cache_dir =
// context_params->cookie_path =
- (*g_network_service)
- ->CreateNetworkContext(MakeRequest(&partition->network_context_),
- std::move(context_params));
+ GetNetworkService()->CreateNetworkContext(
+ MakeRequest(&partition->network_context_), std::move(context_params));
BlobURLLoaderFactory::BlobContextGetter blob_getter =
base::BindOnce(&BlobStorageContextGetter, blob_context);
diff --git a/content/network/BUILD.gn b/content/network/BUILD.gn
index 5eb1ad28..ffe4988a 100644
--- a/content/network/BUILD.gn
+++ b/content/network/BUILD.gn
@@ -24,6 +24,7 @@
":network",
"//content", # For the component build.
"//content/app:*",
+ "//content/public/network/*",
"//content/utility:utility",
]
@@ -32,8 +33,8 @@
"cache_url_loader.h",
"network_context.cc",
"network_context.h",
- "network_service.cc",
- "network_service.h",
+ "network_service_impl.cc",
+ "network_service_impl.h",
"network_service_url_loader_factory_impl.cc",
"network_service_url_loader_factory_impl.h",
"url_loader_impl.cc",
diff --git a/content/network/DEPS b/content/network/DEPS
index ac2ce4d..1105ee1e 100644
--- a/content/network/DEPS
+++ b/content/network/DEPS
@@ -14,12 +14,13 @@
"+content/public/common/url_constants.h",
"+content/public/common/url_loader.mojom.h",
"+content/public/common/url_loader_factory.mojom.h",
+ "+content/public/network",
"+services/service_manager/public",
]
specific_include_rules = {
'.*_[a-z]*test.*': [
- "+content/browser/loader/test_url_loader_client.h",
"+content/public/common/content_paths.h",
+ "+content/public/test/test_url_loader_client.h",
],
}
diff --git a/content/network/network_context.cc b/content/network/network_context.cc
index ea81b5c..4dde5fda 100644
--- a/content/network/network_context.cc
+++ b/content/network/network_context.cc
@@ -9,7 +9,7 @@
#include "base/strings/string_number_conversions.h"
#include "components/network_session_configurator/common/network_switches.h"
#include "content/network/cache_url_loader.h"
-#include "content/network/network_service.h"
+#include "content/network/network_service_impl.h"
#include "content/network/network_service_url_loader_factory_impl.h"
#include "content/network/url_loader_impl.h"
#include "content/public/common/content_client.h"
@@ -87,7 +87,7 @@
} // namespace
-NetworkContext::NetworkContext(NetworkService* network_service,
+NetworkContext::NetworkContext(NetworkServiceImpl* network_service,
mojom::NetworkContextRequest request,
mojom::NetworkContextParamsPtr params)
: network_service_(network_service),
@@ -99,6 +99,18 @@
base::Bind(&NetworkContext::OnConnectionError, base::Unretained(this)));
}
+// TODO(mmenke): Share URLRequestContextBulder configuration between two
+// constructors. Can only share them once consumer code is ready for its
+// corresponding options to be overwritten.
+NetworkContext::NetworkContext(
+ mojom::NetworkContextRequest request,
+ mojom::NetworkContextParamsPtr params,
+ std::unique_ptr<net::URLRequestContextBuilder> builder)
+ : network_service_(nullptr),
+ url_request_context_(builder->Build()),
+ params_(std::move(params)),
+ binding_(this, std::move(request)) {}
+
NetworkContext::~NetworkContext() {
// Call each URLLoaderImpl and ask it to release its net::URLRequest, as the
// corresponding net::URLRequestContext is going away with this
diff --git a/content/network/network_context.h b/content/network/network_context.h
index 278923f..c50fc033 100644
--- a/content/network/network_context.h
+++ b/content/network/network_context.h
@@ -19,17 +19,25 @@
namespace net {
class URLRequestContext;
+class URLRequestContextBuilder;
}
namespace content {
-class NetworkService;
+class NetworkServiceImpl;
class URLLoaderImpl;
class NetworkContext : public mojom::NetworkContext {
public:
- NetworkContext(NetworkService* network_service,
+ NetworkContext(NetworkServiceImpl* network_service,
mojom::NetworkContextRequest request,
mojom::NetworkContextParamsPtr params);
+
+ // Temporary constructor that allows creating an in-process NetworkContext
+ // with a pre-populated URLRequestContextBuilder.
+ NetworkContext(mojom::NetworkContextRequest request,
+ mojom::NetworkContextParamsPtr params,
+ std::unique_ptr<net::URLRequestContextBuilder> builder);
+
~NetworkContext() override;
CONTENT_EXPORT static std::unique_ptr<NetworkContext> CreateForTesting();
@@ -49,7 +57,7 @@
void HandleViewCacheRequest(const GURL& url,
mojom::URLLoaderClientPtr client) override;
- // Called when the associated NetworkService is going away. Guaranteed to
+ // Called when the associated NetworkServiceImpl is going away. Guaranteed to
// destroy NetworkContext's URLRequestContext.
void Cleanup();
@@ -59,7 +67,7 @@
// On connection errors the NetworkContext destroys itself.
void OnConnectionError();
- NetworkService* const network_service_;
+ NetworkServiceImpl* const network_service_;
std::unique_ptr<net::URLRequestContext> url_request_context_;
diff --git a/content/network/network_service.cc b/content/network/network_service_impl.cc
similarity index 61%
rename from content/network/network_service.cc
rename to content/network/network_service_impl.cc
index a9a8845..d2b53be 100644
--- a/content/network/network_service.cc
+++ b/content/network/network_service_impl.cc
@@ -2,22 +2,28 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "content/network/network_service.h"
+#include "content/network/network_service_impl.h"
#include "base/command_line.h"
#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "base/values.h"
+#include "build/build_config.h"
#include "content/network/network_context.h"
#include "content/public/common/content_switches.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
#include "net/log/file_net_log_observer.h"
#include "net/log/net_log_util.h"
+#include "net/url_request/url_request_context_builder.h"
#include "services/service_manager/public/cpp/bind_source_info.h"
namespace content {
-class NetworkService::MojoNetLog : public net::NetLog {
+std::unique_ptr<NetworkService> NetworkService::Create() {
+ return base::MakeUnique<NetworkServiceImpl>(nullptr);
+}
+
+class NetworkServiceImpl::MojoNetLog : public net::NetLog {
public:
MojoNetLog() {
const base::CommandLine* command_line =
@@ -46,17 +52,20 @@
DISALLOW_COPY_AND_ASSIGN(MojoNetLog);
};
-NetworkService::NetworkService(
+NetworkServiceImpl::NetworkServiceImpl(
std::unique_ptr<service_manager::BinderRegistry> registry)
: net_log_(new MojoNetLog), registry_(std::move(registry)), binding_(this) {
- // |registry_| may be nullptr in tests.
+ // |registry_| is nullptr in tests and when an in-process NetworkService is
+ // created directly. The latter is done in concert with using
+ // CreateNetworkContextWithBuilder to ease the transition to using the network
+ // service.
if (registry_) {
registry_->AddInterface<mojom::NetworkService>(
- base::Bind(&NetworkService::Create, base::Unretained(this)));
+ base::Bind(&NetworkServiceImpl::Create, base::Unretained(this)));
}
}
-NetworkService::~NetworkService() {
+NetworkServiceImpl::~NetworkServiceImpl() {
// Call each Network and ask it to release its net::URLRequestContext, as they
// may have references to shared objects owned by the NetworkService. The
// NetworkContexts deregister themselves in Cleanup(), so have to be careful.
@@ -64,21 +73,36 @@
(*network_contexts_.begin())->Cleanup();
}
-std::unique_ptr<NetworkService> NetworkService::CreateForTesting() {
- return base::WrapUnique(new NetworkService());
+std::unique_ptr<mojom::NetworkContext>
+NetworkServiceImpl::CreateNetworkContextWithBuilder(
+ content::mojom::NetworkContextRequest request,
+ content::mojom::NetworkContextParamsPtr params,
+ std::unique_ptr<net::URLRequestContextBuilder> builder,
+ net::URLRequestContext** url_request_context) {
+ std::unique_ptr<NetworkContext> network_context =
+ base::MakeUnique<NetworkContext>(std::move(request), std::move(params),
+ std::move(builder));
+ *url_request_context = network_context->url_request_context();
+ return network_context;
}
-void NetworkService::RegisterNetworkContext(NetworkContext* network_context) {
+std::unique_ptr<NetworkService> NetworkServiceImpl::CreateForTesting() {
+ return base::WrapUnique(new NetworkServiceImpl(nullptr));
+}
+
+void NetworkServiceImpl::RegisterNetworkContext(
+ NetworkContext* network_context) {
DCHECK_EQ(0u, network_contexts_.count(network_context));
network_contexts_.insert(network_context);
}
-void NetworkService::DeregisterNetworkContext(NetworkContext* network_context) {
+void NetworkServiceImpl::DeregisterNetworkContext(
+ NetworkContext* network_context) {
DCHECK_EQ(1u, network_contexts_.count(network_context));
network_contexts_.erase(network_context);
}
-void NetworkService::CreateNetworkContext(
+void NetworkServiceImpl::CreateNetworkContext(
mojom::NetworkContextRequest request,
mojom::NetworkContextParamsPtr params) {
// The NetworkContext will destroy itself on connection error, or when the
@@ -86,9 +110,7 @@
new NetworkContext(this, std::move(request), std::move(params));
}
-NetworkService::NetworkService() : NetworkService(nullptr) {}
-
-void NetworkService::OnBindInterface(
+void NetworkServiceImpl::OnBindInterface(
const service_manager::BindSourceInfo& source_info,
const std::string& interface_name,
mojo::ScopedMessagePipeHandle interface_pipe) {
@@ -96,8 +118,9 @@
std::move(interface_pipe));
}
-void NetworkService::Create(const service_manager::BindSourceInfo& source_info,
- mojom::NetworkServiceRequest request) {
+void NetworkServiceImpl::Create(
+ const service_manager::BindSourceInfo& source_info,
+ mojom::NetworkServiceRequest request) {
DCHECK(!binding_.is_bound());
binding_.Bind(std::move(request));
}
diff --git a/content/network/network_service.h b/content/network/network_service_impl.h
similarity index 67%
rename from content/network/network_service.h
rename to content/network/network_service_impl.h
index 703ffc2..74e86910 100644
--- a/content/network/network_service.h
+++ b/content/network/network_service_impl.h
@@ -2,30 +2,43 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CONTENT_NETWORK_NETWORK_SERVICE_H_
-#define CONTENT_NETWORK_NETWORK_SERVICE_H_
+#ifndef CONTENT_NETWORK_NETWORK_SERVICE_IMPL_H_
+#define CONTENT_NETWORK_NETWORK_SERVICE_IMPL_H_
#include <memory>
#include "base/macros.h"
#include "content/common/content_export.h"
#include "content/public/common/network_service.mojom.h"
+#include "content/public/network/network_service.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "services/service_manager/public/cpp/binder_registry.h"
#include "services/service_manager/public/cpp/service.h"
+namespace net {
+class URLRequestContext;
+class URLRequestContextBuilder;
+} // namespace net
+
namespace content {
class NetworkContext;
-class NetworkService : public service_manager::Service,
- public mojom::NetworkService {
+class CONTENT_EXPORT NetworkServiceImpl : public service_manager::Service,
+ public NetworkService {
public:
- explicit NetworkService(
+ explicit NetworkServiceImpl(
std::unique_ptr<service_manager::BinderRegistry> registry);
- ~NetworkService() override;
- CONTENT_EXPORT static std::unique_ptr<NetworkService> CreateForTesting();
+ ~NetworkServiceImpl() override;
+
+ std::unique_ptr<mojom::NetworkContext> CreateNetworkContextWithBuilder(
+ content::mojom::NetworkContextRequest request,
+ content::mojom::NetworkContextParamsPtr params,
+ std::unique_ptr<net::URLRequestContextBuilder> builder,
+ net::URLRequestContext** url_request_context) override;
+
+ static std::unique_ptr<NetworkService> CreateForTesting();
// These are called by NetworkContexts as they are being created and
// destroyed.
@@ -39,9 +52,6 @@
private:
class MojoNetLog;
- // Used for tests.
- NetworkService();
-
// service_manager::Service implementation.
void OnBindInterface(const service_manager::BindSourceInfo& source_info,
const std::string& interface_name,
@@ -62,9 +72,9 @@
// destroyed first.
std::set<NetworkContext*> network_contexts_;
- DISALLOW_COPY_AND_ASSIGN(NetworkService);
+ DISALLOW_COPY_AND_ASSIGN(NetworkServiceImpl);
};
} // namespace content
-#endif // CONTENT_NETWORK_NETWORK_SERVICE_H_
+#endif // CONTENT_NETWORK_NETWORK_SERVICE_IMPL_H_
diff --git a/content/network/network_service_unittest.cc b/content/network/network_service_unittest.cc
index 29aa109..5a31c8e 100644
--- a/content/network/network_service_unittest.cc
+++ b/content/network/network_service_unittest.cc
@@ -8,7 +8,7 @@
#include "base/test/scoped_task_environment.h"
#include "base/threading/thread_task_runner_handle.h"
#include "content/network/network_context.h"
-#include "content/network/network_service.h"
+#include "content/network/network_service_impl.h"
#include "content/public/common/network_service.mojom.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -21,7 +21,7 @@
NetworkServiceTest()
: scoped_task_environment_(
base::test::ScopedTaskEnvironment::MainThreadType::IO),
- service_(NetworkService::CreateForTesting()) {}
+ service_(NetworkServiceImpl::CreateForTesting()) {}
~NetworkServiceTest() override {}
NetworkService* service() const { return service_.get(); }
diff --git a/content/network/url_loader_unittest.cc b/content/network/url_loader_unittest.cc
index e9486c5..5af30a7e 100644
--- a/content/network/url_loader_unittest.cc
+++ b/content/network/url_loader_unittest.cc
@@ -7,10 +7,10 @@
#include "base/run_loop.h"
#include "base/test/scoped_task_environment.h"
#include "base/threading/thread_task_runner_handle.h"
-#include "content/browser/loader/test_url_loader_client.h"
#include "content/network/network_context.h"
#include "content/network/url_loader_impl.h"
#include "content/public/common/content_paths.h"
+#include "content/public/test/test_url_loader_client.h"
#include "mojo/public/c/system/data_pipe.h"
#include "mojo/public/cpp/system/wait.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn
index df45385..2cf71897 100644
--- a/content/public/browser/BUILD.gn
+++ b/content/public/browser/BUILD.gn
@@ -169,6 +169,8 @@
"navigation_type.h",
"navigation_ui_data.h",
"network_quality_observer_factory.h",
+ "network_service_instance.cc",
+ "network_service_instance.h",
"notification_database_data.cc",
"notification_database_data.h",
"notification_details.h",
@@ -323,12 +325,12 @@
"//net",
"//ppapi/c",
"//services/device/public/interfaces",
+ "//third_party/webrtc/modules/desktop_capture",
"//ui/accessibility",
"//ui/base",
"//ui/events",
"//ui/gl",
"//ui/surface",
- "//third_party/webrtc/modules/desktop_capture",
]
allow_circular_includes_from = [
diff --git a/content/public/browser/network_service_instance.cc b/content/public/browser/network_service_instance.cc
new file mode 100644
index 0000000..5cf2970
--- /dev/null
+++ b/content/public/browser/network_service_instance.cc
@@ -0,0 +1,30 @@
+// 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/public/browser/network_service_instance.h"
+
+#include "base/feature_list.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/common/content_features.h"
+#include "content/public/common/network_service.mojom.h"
+#include "content/public/common/service_manager_connection.h"
+#include "content/public/common/service_names.mojom.h"
+#include "services/service_manager/public/cpp/connector.h"
+
+namespace content {
+
+mojom::NetworkService* GetNetworkService() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK(base::FeatureList::IsEnabled(features::kNetworkService));
+
+ static mojom::NetworkServicePtr* g_network_service =
+ new mojom::NetworkServicePtr;
+ if (!g_network_service->is_bound()) {
+ ServiceManagerConnection::GetForProcess()->GetConnector()->BindInterface(
+ mojom::kNetworkServiceName, g_network_service);
+ }
+ return g_network_service->get();
+}
+
+} // namespace content
diff --git a/content/public/browser/network_service_instance.h b/content/public/browser/network_service_instance.h
new file mode 100644
index 0000000..0de5b4d
--- /dev/null
+++ b/content/public/browser/network_service_instance.h
@@ -0,0 +1,23 @@
+// 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.
+
+#ifndef CONTENT_PUBLIC_BROWSER_NETWORK_SERVICE_INSTANCE_H_
+#define CONTENT_PUBLIC_BROWSER_NETWORK_SERVICE_INSTANCE_H_
+
+#include "content/common/content_export.h"
+
+namespace content {
+
+namespace mojom {
+class NetworkService;
+}
+
+// Returns a pointer to the NetworkService, creating / re-creating it as needed.
+// Must only be called on the UI thread. Must not be called if the network
+// service is disabled.
+CONTENT_EXPORT mojom::NetworkService* GetNetworkService();
+
+} // namespace content
+
+#endif // CONTENT_PUBLIC_BROWSER_NETWORK_SERVICE_INSTANCE_H_
\ No newline at end of file
diff --git a/content/public/network/BUILD.gn b/content/public/network/BUILD.gn
new file mode 100644
index 0000000..3e44f5108
--- /dev/null
+++ b/content/public/network/BUILD.gn
@@ -0,0 +1,35 @@
+# 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.
+
+# See //content/BUILD.gn for how this works.
+group("network") {
+ if (is_component_build) {
+ public_deps = [
+ "//content",
+ ]
+ } else {
+ public_deps = [
+ ":network_sources",
+ ]
+ }
+}
+
+target("source_set", "network_sources") {
+ visibility = [ "//content/*" ]
+
+ configs += [ "//content:content_implementation" ]
+
+ sources = [
+ "network_service.h",
+ ]
+
+ deps = [
+ "//base",
+ "//content:export",
+ "//content/common:mojo_bindings",
+ "//content/network:network_sources",
+ ]
+
+ allow_circular_includes_from = [ "//content/network:network_sources" ]
+}
diff --git a/content/public/network/DEPS b/content/public/network/DEPS
new file mode 100644
index 0000000..31545d0
--- /dev/null
+++ b/content/public/network/DEPS
@@ -0,0 +1,5 @@
+specific_include_rules = {
+ ".*\.cc": [
+ "+content/network",
+ ],
+}
diff --git a/content/public/network/network_service.h b/content/public/network/network_service.h
new file mode 100644
index 0000000..a4bb4de
--- /dev/null
+++ b/content/public/network/network_service.h
@@ -0,0 +1,50 @@
+// 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.
+
+#ifndef CONTENT_PUBLIC_NETWORK_NETWORK_SERVICE_H_
+#define CONTENT_PUBLIC_NETWORK_NETWORK_SERVICE_H_
+
+#include <memory>
+
+#include "content/common/content_export.h"
+#include "content/public/common/network_service.mojom.h"
+
+namespace net {
+class URLRequestContext;
+class URLRequestContextBuilder;
+} // namespace net
+
+namespace content {
+
+// Allows an in-process NetworkService to be set up.
+class CONTENT_EXPORT NetworkService : public mojom::NetworkService {
+ public:
+ // TODO(mmenke): Take in a NetworkServiceRequest.
+ static std::unique_ptr<NetworkService> Create();
+
+ // Can be used to seed a NetworkContext with a consumer-configured
+ // URLRequestContextBuilder, which |params| will then be applied to. The
+ // results URLRequestContext will be written to |url_request_context|, which
+ // is owned by the NetworkContext, and can be further modified before first
+ // use. The returned NetworkContext must be destroyed before the
+ // NetworkService.
+ //
+ // This method is intended to ease the transition to an out-of-process
+ // NetworkService, and will be removed once that ships.
+ virtual std::unique_ptr<mojom::NetworkContext>
+ CreateNetworkContextWithBuilder(
+ content::mojom::NetworkContextRequest request,
+ content::mojom::NetworkContextParamsPtr params,
+ std::unique_ptr<net::URLRequestContextBuilder> builder,
+ net::URLRequestContext** url_request_context) = 0;
+
+ ~NetworkService() override {}
+
+ protected:
+ NetworkService() {}
+};
+
+} // namespace content
+
+#endif // CONTENT_PUBLIC_NETWORK_NETWORK_SERVICE_H_
diff --git a/content/browser/loader/test_url_loader_client.cc b/content/public/test/test_url_loader_client.cc
similarity index 98%
rename from content/browser/loader/test_url_loader_client.cc
rename to content/public/test/test_url_loader_client.cc
index 5695002..36a2700 100644
--- a/content/browser/loader/test_url_loader_client.cc
+++ b/content/public/test/test_url_loader_client.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "content/browser/loader/test_url_loader_client.h"
+#include "content/public/test/test_url_loader_client.h"
#include "base/memory/ref_counted.h"
#include "base/run_loop.h"
diff --git a/content/browser/loader/test_url_loader_client.h b/content/public/test/test_url_loader_client.h
similarity index 94%
rename from content/browser/loader/test_url_loader_client.h
rename to content/public/test/test_url_loader_client.h
index bb5e249..c5d5a705 100644
--- a/content/browser/loader/test_url_loader_client.h
+++ b/content/public/test/test_url_loader_client.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CONTENT_BROWSER_LOADER_TEST_URL_LOADER_CLIENT_H_
-#define CONTENT_BROWSER_LOADER_TEST_URL_LOADER_CLIENT_H_
+#ifndef CONTENT_PUBLIC_TEST_TEST_URL_LOADER_CLIENT_H_
+#define CONTENT_PUBLIC_TEST_TEST_URL_LOADER_CLIENT_H_
#include <stdint.h>
#include <vector>
@@ -57,9 +57,7 @@
const ResourceResponseHead& response_head() const { return response_head_; }
const base::Optional<net::SSLInfo>& ssl_info() const { return ssl_info_; }
const net::RedirectInfo& redirect_info() const { return redirect_info_; }
- const std::string& cached_metadata() const {
- return cached_metadata_;
- }
+ const std::string& cached_metadata() const { return cached_metadata_; }
mojo::DataPipeConsumerHandle response_body() { return response_body_.get(); }
mojo::ScopedDataPipeConsumerHandle response_body_release() {
return std::move(response_body_);
@@ -131,4 +129,4 @@
} // namespace content
-#endif // CONTENT_BROWSER_LOADER_TEST_URL_LOADER_CLIENT_H_
+#endif // CONTENT_PUBLIC_TEST_TEST_URL_LOADER_CLIENT_H_
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 58a736a3..f9e323f 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -132,6 +132,8 @@
"../public/test/test_service_manager_context.h",
"../public/test/test_synchronous_compositor_android.cc",
"../public/test/test_synchronous_compositor_android.h",
+ "../public/test/test_url_loader_client.cc",
+ "../public/test/test_url_loader_client.h",
"../public/test/test_utils.cc",
"../public/test/test_utils.h",
"../public/test/test_web_contents_factory.h",
@@ -1204,8 +1206,6 @@
"../browser/loader/temporary_file_stream_unittest.cc",
"../browser/loader/test_resource_handler.cc",
"../browser/loader/test_resource_handler.h",
- "../browser/loader/test_url_loader_client.cc",
- "../browser/loader/test_url_loader_client.h",
"../browser/loader/throttling_resource_handler_unittest.cc",
"../browser/loader/upload_data_stream_builder_unittest.cc",
"../browser/loader/upload_progress_tracker_unittest.cc",
diff --git a/content/utility/utility_service_factory.cc b/content/utility/utility_service_factory.cc
index abe5f28..74ffbf52 100644
--- a/content/utility/utility_service_factory.cc
+++ b/content/utility/utility_service_factory.cc
@@ -7,7 +7,7 @@
#include "base/bind.h"
#include "base/command_line.h"
#include "content/child/child_process.h"
-#include "content/network/network_service.h"
+#include "content/network/network_service_impl.h"
#include "content/public/common/content_client.h"
#include "content/public/common/content_features.h"
#include "content/public/common/content_switches.h"
@@ -134,7 +134,7 @@
std::unique_ptr<service_manager::Service>
UtilityServiceFactory::CreateNetworkService() {
- return base::MakeUnique<NetworkService>(std::move(network_registry_));
+ return base::MakeUnique<NetworkServiceImpl>(std::move(network_registry_));
}
} // namespace content