refactor: Enable network service (Part 1) (#17431)

* Convert InspectableWebContentsImpl::LoadNetworkResource to SimpleURLLoader

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

* Plumb creation of network context with the service
This commit is contained in:
Robo 2019-03-26 06:40:48 +05:30 committed by Cheng Zhao
parent 4ec2f8b67b
commit 6c20c6e668
18 changed files with 469 additions and 172 deletions

View file

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

View file

@ -0,0 +1,41 @@
// Copyright (c) 2019 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#ifndef ATOM_BROWSER_NET_NETWORK_CONTEXT_SERVICE_H_
#define ATOM_BROWSER_NET_NETWORK_CONTEXT_SERVICE_H_
#include "atom/browser/atom_browser_context.h"
#include "base/files/file_path.h"
#include "chrome/browser/net/proxy_config_monitor.h"
#include "components/keyed_service/core/keyed_service.h"
#include "services/network/public/mojom/network_context.mojom.h"
namespace atom {
// KeyedService that initializes and provides access to the NetworkContexts for
// a BrowserContext.
class NetworkContextService : public KeyedService {
public:
explicit NetworkContextService(content::BrowserContext* context);
~NetworkContextService() override;
NetworkContextService(const NetworkContextService&) = delete;
NetworkContextService& operator=(const NetworkContextService&) = delete;
// Creates a NetworkContext for the BrowserContext.
network::mojom::NetworkContextPtr CreateNetworkContext();
private:
// Creates parameters for the NetworkContext.
network::mojom::NetworkContextParamsPtr CreateNetworkContextParams(
bool in_memory,
const base::FilePath& path);
AtomBrowserContext* browser_context_;
ProxyConfigMonitor proxy_config_monitor_;
};
} // namespace atom
#endif // ATOM_BROWSER_NET_NETWORK_CONTEXT_SERVICE_H_

View file

@ -0,0 +1,34 @@
// 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_factory.h"
#include "atom/browser/net/network_context_service.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h"
namespace atom {
NetworkContextService* NetworkContextServiceFactory::GetForContext(
content::BrowserContext* browser_context) {
return static_cast<NetworkContextService*>(
GetInstance()->GetServiceForBrowserContext(browser_context, true));
}
NetworkContextServiceFactory* NetworkContextServiceFactory::GetInstance() {
return base::Singleton<NetworkContextServiceFactory>::get();
}
NetworkContextServiceFactory::NetworkContextServiceFactory()
: BrowserContextKeyedServiceFactory(
"ElectronNetworkContextService",
BrowserContextDependencyManager::GetInstance()) {}
NetworkContextServiceFactory::~NetworkContextServiceFactory() {}
KeyedService* NetworkContextServiceFactory::BuildServiceInstanceFor(
content::BrowserContext* context) const {
return new NetworkContextService(static_cast<AtomBrowserContext*>(context));
}
} // namespace atom

View file

@ -0,0 +1,48 @@
// Copyright (c) 2019 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#ifndef ATOM_BROWSER_NET_NETWORK_CONTEXT_SERVICE_FACTORY_H_
#define ATOM_BROWSER_NET_NETWORK_CONTEXT_SERVICE_FACTORY_H_
#include "base/memory/singleton.h"
#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
class KeyedService;
namespace contenet {
class BrowserContext;
}
namespace atom {
class NetworkContextService;
class NetworkContextServiceFactory : public BrowserContextKeyedServiceFactory {
public:
// Returns the NetworkContextService that supports NetworkContexts for
// |browser_context|.
static NetworkContextService* GetForContext(
content::BrowserContext* browser_context);
// Returns the NetworkContextServiceFactory singleton.
static NetworkContextServiceFactory* GetInstance();
NetworkContextServiceFactory(const NetworkContextServiceFactory&) = delete;
NetworkContextServiceFactory& operator=(const NetworkContextServiceFactory&) =
delete;
private:
friend struct base::DefaultSingletonTraits<NetworkContextServiceFactory>;
NetworkContextServiceFactory();
~NetworkContextServiceFactory() override;
// BrowserContextKeyedServiceFactory implementation:
KeyedService* BuildServiceInstanceFor(
content::BrowserContext* context) const override;
};
} // namespace atom
#endif // ATOM_BROWSER_NET_NETWORK_CONTEXT_SERVICE_FACTORY_H_

View file

@ -11,7 +11,6 @@
#include "atom/common/application_info.h"
#include "atom/common/options_switches.h"
#include "base/command_line.h"
#include "base/lazy_instance.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/net/chrome_mojo_proxy_resolver_factory.h"
#include "components/net_log/net_export_file_writer.h"
@ -27,11 +26,11 @@
#include "services/network/public/cpp/shared_url_loader_factory.h"
#include "url/gurl.h"
base::LazyInstance<SystemNetworkContextManager>::Leaky
g_system_network_context_manager = LAZY_INSTANCE_INITIALIZER;
namespace {
// The global instance of the SystemNetworkContextmanager.
SystemNetworkContextManager* g_system_network_context_manager = nullptr;
network::mojom::HttpAuthStaticParamsPtr CreateHttpAuthStaticParams() {
network::mojom::HttpAuthStaticParamsPtr auth_static_params =
network::mojom::HttpAuthStaticParams::New();
@ -63,10 +62,11 @@ class SystemNetworkContextManager::URLLoaderFactoryForSystem
: public network::SharedURLLoaderFactory {
public:
explicit URLLoaderFactoryForSystem(SystemNetworkContextManager* manager)
: manager_(manager) {}
: manager_(manager) {
DETACH_FROM_SEQUENCE(sequence_checker_);
}
// mojom::URLLoaderFactory implementation:
void CreateLoaderAndStart(network::mojom::URLLoaderRequest request,
int32_t routing_id,
int32_t request_id,
@ -75,7 +75,7 @@ class SystemNetworkContextManager::URLLoaderFactoryForSystem
network::mojom::URLLoaderClientPtr client,
const net::MutableNetworkTrafficAnnotationTag&
traffic_annotation) override {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (!manager_)
return;
manager_->GetURLLoaderFactory()->CreateLoaderAndStart(
@ -91,6 +91,7 @@ class SystemNetworkContextManager::URLLoaderFactoryForSystem
// SharedURLLoaderFactory implementation:
std::unique_ptr<network::SharedURLLoaderFactoryInfo> Clone() override {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
return std::make_unique<network::CrossThreadSharedURLLoaderFactoryInfo>(
this);
@ -102,6 +103,7 @@ class SystemNetworkContextManager::URLLoaderFactoryForSystem
friend class base::RefCounted<URLLoaderFactoryForSystem>;
~URLLoaderFactoryForSystem() override {}
SEQUENCE_CHECKER(sequence_checker_);
SystemNetworkContextManager* manager_;
DISALLOW_COPY_AND_ASSIGN(URLLoaderFactoryForSystem);
@ -157,7 +159,6 @@ SystemNetworkContextManager::GetNetExportFileWriter() {
return net_export_file_writer_.get();
}
// static
network::mojom::NetworkContextParamsPtr
SystemNetworkContextManager::CreateDefaultNetworkContextParams() {
network::mojom::NetworkContextParamsPtr network_context_params =
@ -191,8 +192,29 @@ void SystemNetworkContextManager::SetUp(
*http_auth_dynamic_params = CreateHttpAuthDynamicParams();
}
SystemNetworkContextManager::SystemNetworkContextManager()
: proxy_config_monitor_(g_browser_process->local_state()) {
// static
SystemNetworkContextManager* SystemNetworkContextManager::CreateInstance(
PrefService* pref_service) {
DCHECK(!g_system_network_context_manager);
g_system_network_context_manager =
new SystemNetworkContextManager(pref_service);
return g_system_network_context_manager;
}
// static
SystemNetworkContextManager* SystemNetworkContextManager::GetInstance() {
return g_system_network_context_manager;
}
// static
void SystemNetworkContextManager::DeleteInstance() {
DCHECK(g_system_network_context_manager);
delete g_system_network_context_manager;
}
SystemNetworkContextManager::SystemNetworkContextManager(
PrefService* pref_service)
: proxy_config_monitor_(pref_service) {
shared_url_loader_factory_ = new URLLoaderFactoryForSystem(this);
}

View file

@ -40,12 +40,20 @@ class NetExportFileWriter;
// using the actual network service.
class SystemNetworkContextManager {
public:
SystemNetworkContextManager();
~SystemNetworkContextManager();
// Creates the global instance of SystemNetworkContextManager. If an
// instance already exists, this will cause a DCHECK failure.
static SystemNetworkContextManager* CreateInstance(PrefService* pref_service);
// Gets the global SystemNetworkContextManager instance.
static SystemNetworkContextManager* GetInstance();
// Destroys the global SystemNetworkContextManager instance.
static void DeleteInstance();
// Returns default set of parameters for configuring the network service.
static network::mojom::NetworkContextParamsPtr
CreateDefaultNetworkContextParams();
network::mojom::NetworkContextParamsPtr CreateDefaultNetworkContextParams();
// Initializes |network_context_params| as needed to set up a system
// NetworkContext. If the network service is disabled,
@ -85,6 +93,8 @@ class SystemNetworkContextManager {
private:
class URLLoaderFactoryForSystem;
explicit SystemNetworkContextManager(PrefService* pref_service);
// Creates parameters for the NetworkContext. May only be called once, since
// it initializes some class members.
network::mojom::NetworkContextParamsPtr CreateNetworkContextParams();

View file

@ -31,7 +31,6 @@
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/devtools_network_transaction_factory.h"
#include "content/public/browser/network_service_instance.h"
#include "content/public/browser/resource_context.h"
#include "net/base/host_mapping_rules.h"
#include "net/cert/multi_log_ct_verifier.h"
#include "net/cookies/cookie_monster.h"
@ -102,18 +101,9 @@ void SetupAtomURLRequestJobFactory(
} // namespace
class ResourceContext : public content::ResourceContext {
public:
ResourceContext() = default;
~ResourceContext() override = default;
private:
DISALLOW_COPY_AND_ASSIGN(ResourceContext);
};
URLRequestContextGetter::Handle::Handle(
base::WeakPtr<AtomBrowserContext> browser_context)
: resource_context_(new ResourceContext),
: resource_context_(new content::ResourceContext),
browser_context_(browser_context),
initialized_(false) {}
@ -154,7 +144,8 @@ URLRequestContextGetter::Handle::GetNetworkContext() {
network::mojom::NetworkContextParamsPtr
URLRequestContextGetter::Handle::CreateNetworkContextParams() {
network::mojom::NetworkContextParamsPtr network_context_params =
SystemNetworkContextManager::CreateDefaultNetworkContextParams();
SystemNetworkContextManager::GetInstance()
->CreateDefaultNetworkContextParams();
network_context_params->user_agent = browser_context_->GetUserAgent();
@ -250,7 +241,7 @@ URLRequestContextGetter::~URLRequestContextGetter() {
}
void URLRequestContextGetter::NotifyContextShuttingDown(
std::unique_ptr<ResourceContext> resource_context) {
std::unique_ptr<content::ResourceContext> resource_context) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
// todo(brenca): remove once C70 lands

View file

@ -11,6 +11,7 @@
#include "base/files/file_path.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/resource_context.h"
#include "net/url_request/url_request_context.h"
#include "net/url_request/url_request_context_getter.h"
#include "services/network/public/mojom/network_service.mojom.h"
@ -36,7 +37,7 @@ class URLRequestContextGetter : public net::URLRequestContextGetter {
// Discard reference to URLRequestContext and inform observers to
// shutdown. Must be called only on IO thread.
void NotifyContextShuttingDown(std::unique_ptr<ResourceContext>);
void NotifyContextShuttingDown(std::unique_ptr<content::ResourceContext>);
AtomURLRequestJobFactory* job_factory() const {
return top_job_factory_.get();
@ -69,7 +70,7 @@ class URLRequestContextGetter : public net::URLRequestContextGetter {
void LazyInitialize();
scoped_refptr<URLRequestContextGetter> main_request_context_getter_;
std::unique_ptr<ResourceContext> resource_context_;
std::unique_ptr<content::ResourceContext> resource_context_;
base::WeakPtr<AtomBrowserContext> browser_context_;
// This is a NetworkContext interface that uses URLRequestContextGetter
// NetworkContext, ownership is passed to StoragePartition when