Skip to content

Commit

Permalink
refactor: Enable network service (Part 1) (#17431)
Browse files Browse the repository at this point in the history
* Convert InspectableWebContentsImpl::LoadNetworkResource to SimpleURLLoader

https://bugs.chromium.org/p/chromium/issues/detail?id=721408

* Plumb creation of network context with the service
  • Loading branch information
deepak1556 authored and Cheng Zhao committed Mar 26, 2019
1 parent 4ec2f8b commit 6c20c6e
Show file tree
Hide file tree
Showing 18 changed files with 463 additions and 166 deletions.
22 changes: 20 additions & 2 deletions atom/browser/atom_browser_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
#include "atom/browser/io_thread.h"
#include "atom/browser/media/media_capture_devices_dispatcher.h"
#include "atom/browser/native_window.h"
#include "atom/browser/net/network_context_service.h"
#include "atom/browser/net/network_context_service_factory.h"
#include "atom/browser/notifications/notification_presenter.h"
#include "atom/browser/notifications/platform_notification_service.h"
#include "atom/browser/session_preferences.h"
Expand Down Expand Up @@ -72,6 +74,7 @@
#include "ppapi/host/ppapi_host.h"
#include "printing/buildflags/buildflags.h"
#include "services/device/public/cpp/geolocation/location_provider.h"
#include "services/network/public/cpp/features.h"
#include "services/network/public/cpp/resource_request_body.h"
#include "services/proxy_resolver/public/mojom/proxy_resolver.mojom.h"
#include "ui/base/l10n/l10n_util.h"
Expand Down Expand Up @@ -686,7 +689,20 @@ network::mojom::NetworkContextPtr AtomBrowserClient::CreateNetworkContext(
const base::FilePath& /*relative_partition_path*/) {
if (!browser_context)
return nullptr;
return static_cast<AtomBrowserContext*>(browser_context)->GetNetworkContext();

if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
return NetworkContextServiceFactory::GetForContext(browser_context)
->CreateNetworkContext();
} else {
return static_cast<AtomBrowserContext*>(browser_context)
->GetNetworkContext();
}
}

network::mojom::NetworkContext* AtomBrowserClient::GetSystemNetworkContext() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
DCHECK(g_browser_process->system_network_context_manager());
return g_browser_process->system_network_context_manager()->GetContext();
}

void AtomBrowserClient::RegisterOutOfProcessServices(
Expand Down Expand Up @@ -872,8 +888,10 @@ AtomBrowserClient::GetSystemSharedURLLoaderFactory() {

void AtomBrowserClient::OnNetworkServiceCreated(
network::mojom::NetworkService* network_service) {
if (!g_browser_process)
if (!g_browser_process ||
!base::FeatureList::IsEnabled(network::features::kNetworkService))
return;

g_browser_process->system_network_context_manager()->OnNetworkServiceCreated(
network_service);
}
Expand Down
1 change: 1 addition & 0 deletions atom/browser/atom_browser_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ class AtomBrowserClient : public content::ContentBrowserClient,
content::BrowserContext* browser_context,
bool in_memory,
const base::FilePath& relative_partition_path) override;
network::mojom::NetworkContext* GetSystemNetworkContext() override;
void RegisterOutOfProcessServices(OutOfProcessServiceMap* services) override;
base::Optional<service_manager::Manifest> GetServiceManifestOverlay(
base::StringPiece name) override;
Expand Down
59 changes: 48 additions & 11 deletions atom/browser/atom_browser_context.cc
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/storage_partition.h"
#include "net/base/escape.h"
#include "services/network/public/cpp/features.h"

using content::BrowserThread;

Expand Down Expand Up @@ -92,8 +93,12 @@ AtomBrowserContext::AtomBrowserContext(const std::string& partition,
// Initialize Pref Registry.
InitPrefs();

proxy_config_monitor_ = std::make_unique<ProxyConfigMonitor>(prefs_.get());
io_handle_ = new URLRequestContextGetter::Handle(weak_factory_.GetWeakPtr());
if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) {
proxy_config_monitor_ = std::make_unique<ProxyConfigMonitor>(prefs_.get());
io_handle_ =
new URLRequestContextGetter::Handle(weak_factory_.GetWeakPtr());
}

cookie_change_notifier_ = std::make_unique<CookieChangeNotifier>(this);

BrowserContextDependencyManager::GetInstance()->MarkBrowserContextLive(this);
Expand All @@ -103,7 +108,13 @@ AtomBrowserContext::~AtomBrowserContext() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
NotifyWillBeDestroyed(this);
ShutdownStoragePartitions();
io_handle_->ShutdownOnUIThread();

BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE,
std::move(resource_context_));

if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
io_handle_->ShutdownOnUIThread();

// Notify any keyed services of browser context destruction.
BrowserContextDependencyManager::GetInstance()->DestroyBrowserContextServices(
this);
Expand Down Expand Up @@ -145,22 +156,42 @@ void AtomBrowserContext::SetUserAgent(const std::string& user_agent) {
net::URLRequestContextGetter* AtomBrowserContext::CreateRequestContext(
content::ProtocolHandlerMap* protocol_handlers,
content::URLRequestInterceptorScopedVector protocol_interceptors) {
return io_handle_
->CreateMainRequestContextGetter(protocol_handlers,
std::move(protocol_interceptors))
.get();
if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) {
return io_handle_
->CreateMainRequestContextGetter(protocol_handlers,
std::move(protocol_interceptors))
.get();
} else {
NOTREACHED();
return nullptr;
}
}

net::URLRequestContextGetter* AtomBrowserContext::CreateMediaRequestContext() {
return io_handle_->GetMainRequestContextGetter().get();
if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) {
return io_handle_->GetMainRequestContextGetter().get();
} else {
NOTREACHED();
return nullptr;
}
}

net::URLRequestContextGetter* AtomBrowserContext::GetRequestContext() {
return GetDefaultStoragePartition(this)->GetURLRequestContext();
if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) {
return GetDefaultStoragePartition(this)->GetURLRequestContext();
} else {
NOTREACHED();
return nullptr;
}
}

network::mojom::NetworkContextPtr AtomBrowserContext::GetNetworkContext() {
return io_handle_->GetNetworkContext();
if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) {
return io_handle_->GetNetworkContext();
} else {
NOTREACHED();
return nullptr;
}
}

base::FilePath AtomBrowserContext::GetPath() const {
Expand All @@ -180,7 +211,13 @@ int AtomBrowserContext::GetMaxCacheSize() const {
}

content::ResourceContext* AtomBrowserContext::GetResourceContext() {
return io_handle_->GetResourceContext();
if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) {
return io_handle_->GetResourceContext();
} else {
if (!resource_context_)
resource_context_.reset(new content::ResourceContext);
return resource_context_.get();
}
}

std::string AtomBrowserContext::GetMediaDeviceIDSalt() {
Expand Down
2 changes: 2 additions & 0 deletions atom/browser/atom_browser_context.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include "base/memory/weak_ptr.h"
#include "chrome/browser/net/proxy_config_monitor.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/resource_context.h"

class PrefRegistrySimple;
class PrefService;
Expand Down Expand Up @@ -148,6 +149,7 @@ class AtomBrowserContext
URLRequestContextGetter::Handle* io_handle_;
ValueMapPrefStore* in_memory_pref_store_;

std::unique_ptr<content::ResourceContext> resource_context_;
std::unique_ptr<CookieChangeNotifier> cookie_change_notifier_;
std::unique_ptr<PrefService> prefs_;
std::unique_ptr<AtomDownloadManagerDelegate> download_manager_delegate_;
Expand Down
17 changes: 10 additions & 7 deletions atom/browser/browser_process_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,8 @@ void BrowserProcessImpl::PreCreateThreads(
// Must be created before the IOThread.
// Once IOThread class is no longer needed,
// this can be created on first use.
system_network_context_manager_ =
std::make_unique<SystemNetworkContextManager>();
if (!SystemNetworkContextManager::GetInstance())
SystemNetworkContextManager::CreateInstance(local_state_.get());

net_log_ = std::make_unique<net_log::ChromeNetLog>();
// start net log trace if --log-net-log is passed in the command line.
Expand All @@ -110,20 +110,23 @@ void BrowserProcessImpl::PreCreateThreads(
}
}
// Initialize net log file exporter.
system_network_context_manager_->GetNetExportFileWriter()->Initialize();
system_network_context_manager()->GetNetExportFileWriter()->Initialize();

// Manage global state of net and other IO thread related.
io_thread_ = std::make_unique<IOThread>(
net_log_.get(), system_network_context_manager_.get());
net_log_.get(), SystemNetworkContextManager::GetInstance());
}

void BrowserProcessImpl::PostDestroyThreads() {
io_thread_.reset();
}

void BrowserProcessImpl::PostMainMessageLoopRun() {
if (local_state_)
local_state_->CommitPendingWrite();

// This expects to be destroyed before the task scheduler is torn down.
system_network_context_manager_.reset();
SystemNetworkContextManager::DeleteInstance();
}

bool BrowserProcessImpl::IsShuttingDown() {
Expand Down Expand Up @@ -189,8 +192,8 @@ IOThread* BrowserProcessImpl::io_thread() {

SystemNetworkContextManager*
BrowserProcessImpl::system_network_context_manager() {
DCHECK(system_network_context_manager_.get());
return system_network_context_manager_.get();
DCHECK(SystemNetworkContextManager::GetInstance());
return SystemNetworkContextManager::GetInstance();
}

network::NetworkQualityTracker* BrowserProcessImpl::network_quality_tracker() {
Expand Down
1 change: 0 additions & 1 deletion atom/browser/browser_process_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,6 @@ class BrowserProcessImpl : public BrowserProcess {
std::unique_ptr<PrefService> local_state_;
std::unique_ptr<IOThread> io_thread_;
std::unique_ptr<net_log::ChromeNetLog> net_log_;
std::unique_ptr<SystemNetworkContextManager> system_network_context_manager_;
std::string locale_;

DISALLOW_COPY_AND_ASSIGN(BrowserProcessImpl);
Expand Down
43 changes: 24 additions & 19 deletions atom/browser/io_thread.cc
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include "net/proxy_resolution/proxy_resolution_service.h"
#include "net/url_request/url_request_context.h"
#include "services/network/network_service.h"
#include "services/network/public/cpp/features.h"
#include "services/network/url_request_context_builder_mojo.h"

using content::BrowserThread;
Expand All @@ -35,31 +36,35 @@ IOThread::~IOThread() {
}

void IOThread::Init() {
std::unique_ptr<network::URLRequestContextBuilderMojo> builder =
std::make_unique<network::URLRequestContextBuilderMojo>();
if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) {
std::unique_ptr<network::URLRequestContextBuilderMojo> builder =
std::make_unique<network::URLRequestContextBuilderMojo>();

auto cert_verifier = std::make_unique<net::CachingCertVerifier>(
std::make_unique<net::MultiThreadedCertVerifier>(
net::CertVerifyProc::CreateDefault()));
builder->SetCertVerifier(std::move(cert_verifier));
auto cert_verifier = std::make_unique<net::CachingCertVerifier>(
std::make_unique<net::MultiThreadedCertVerifier>(
net::CertVerifyProc::CreateDefault()));
builder->SetCertVerifier(std::move(cert_verifier));

// Create the network service, so that shared host resolver
// gets created which is required to set the auth preferences below.
network::NetworkService* network_service = content::GetNetworkServiceImpl();
network_service->SetUpHttpAuth(std::move(http_auth_static_params_));
network_service->ConfigureHttpAuthPrefs(std::move(http_auth_dynamic_params_));
// Create the network service, so that shared host resolver
// gets created which is required to set the auth preferences below.
network::NetworkService* network_service = content::GetNetworkServiceImpl();
network_service->SetUpHttpAuth(std::move(http_auth_static_params_));
network_service->ConfigureHttpAuthPrefs(
std::move(http_auth_dynamic_params_));

system_network_context_ =
network_service
->CreateNetworkContextWithBuilder(std::move(network_context_request_),
std::move(network_context_params_),
std::move(builder),
&system_request_context_)
.release();
system_network_context_ =
network_service
->CreateNetworkContextWithBuilder(
std::move(network_context_request_),
std::move(network_context_params_), std::move(builder),
&system_request_context_)
.release();
}
}

void IOThread::CleanUp() {
system_request_context_->proxy_resolution_service()->OnShutdown();
if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
system_request_context_->proxy_resolution_service()->OnShutdown();

if (net_log_)
net_log_->ShutDownBeforeTaskScheduler();
Expand Down
94 changes: 94 additions & 0 deletions atom/browser/net/network_context_service.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
// Copyright (c) 2019 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.

#include "atom/browser/net/network_context_service.h"

#include "atom/browser/atom_browser_client.h"
#include "atom/browser/browser_process_impl.h"
#include "atom/browser/net/system_network_context_manager.h"
#include "chrome/common/chrome_constants.h"
#include "content/public/browser/network_service_instance.h"
#include "services/network/network_service.h"

namespace atom {

NetworkContextService::NetworkContextService(content::BrowserContext* context)
: browser_context_(static_cast<AtomBrowserContext*>(context)),
proxy_config_monitor_(browser_context_->prefs()) {}

NetworkContextService::~NetworkContextService() = default;

network::mojom::NetworkContextPtr
NetworkContextService::CreateNetworkContext() {
network::mojom::NetworkContextPtr network_context;

content::GetNetworkService()->CreateNetworkContext(
MakeRequest(&network_context),
CreateNetworkContextParams(browser_context_->IsOffTheRecord(),
browser_context_->GetPath()));

return network_context;
}

network::mojom::NetworkContextParamsPtr
NetworkContextService::CreateNetworkContextParams(bool in_memory,
const base::FilePath& path) {
network::mojom::NetworkContextParamsPtr network_context_params =
g_browser_process->system_network_context_manager()
->CreateDefaultNetworkContextParams();

network_context_params->user_agent = browser_context_->GetUserAgent();

network_context_params->accept_language =
net::HttpUtil::GenerateAcceptLanguageHeader(
AtomBrowserClient::Get()->GetApplicationLocale());

// Enable the HTTP cache.
network_context_params->http_cache_enabled =
browser_context_->CanUseHttpCache();

network_context_params->cookie_manager_params =
network::mojom::CookieManagerParams::New();

// Configure on-disk storage for persistent sessions.
if (!in_memory) {
// Configure the HTTP cache path and size.
network_context_params->http_cache_path =
path.Append(chrome::kCacheDirname);
network_context_params->http_cache_max_size =
browser_context_->GetMaxCacheSize();

// Currently this just contains HttpServerProperties
network_context_params->http_server_properties_path =
path.Append(chrome::kNetworkPersistentStateFilename);

// Configure persistent cookie path.
network_context_params->cookie_path = path.Append(chrome::kCookieFilename);

network_context_params->restore_old_session_cookies = false;
network_context_params->persist_session_cookies = false;

// TODO(deepak1556): Matches the existing behavior https://git.io/fxHMl,
// enable encryption as a followup.
network_context_params->enable_encrypted_cookies = false;

network_context_params->transport_security_persister_path = path;
}

#if !BUILDFLAG(DISABLE_FTP_SUPPORT)
network_context_params->enable_ftp_url_support = true;
#endif // !BUILDFLAG(DISABLE_FTP_SUPPORT)

// Needed for PAC scripts that use data URLs.
network_context_params->enable_data_url_support = true;

proxy_config_monitor_.AddToNetworkContextParams(network_context_params.get());

BrowserProcessImpl::ApplyProxyModeFromCommandLine(
browser_context_->in_memory_pref_store());

return network_context_params;
}

} // namespace atom

0 comments on commit 6c20c6e

Please sign in to comment.