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:
parent
4ec2f8b67b
commit
6c20c6e668
18 changed files with 469 additions and 172 deletions
94
atom/browser/net/network_context_service.cc
Normal file
94
atom/browser/net/network_context_service.cc
Normal 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
|
41
atom/browser/net/network_context_service.h
Normal file
41
atom/browser/net/network_context_service.h
Normal 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_
|
34
atom/browser/net/network_context_service_factory.cc
Normal file
34
atom/browser/net/network_context_service_factory.cc
Normal 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
|
48
atom/browser/net/network_context_service_factory.h
Normal file
48
atom/browser/net/network_context_service_factory.h
Normal 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_
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue