system_network_context_manager.cc 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "weblayer/browser/system_network_context_manager.h"
  5. #include "build/build_config.h"
  6. #include "build/chromeos_buildflags.h"
  7. #include "components/net_log/net_export_file_writer.h"
  8. #include "components/variations/net/variations_http_headers.h"
  9. #include "content/public/browser/network_service_instance.h"
  10. #include "services/cert_verifier/public/mojom/cert_verifier_service_factory.mojom.h"
  11. #include "services/network/public/cpp/shared_url_loader_factory.h"
  12. namespace weblayer {
  13. namespace {
  14. // The global instance of the SystemNetworkContextmanager.
  15. SystemNetworkContextManager* g_system_network_context_manager = nullptr;
  16. } // namespace
  17. // static
  18. SystemNetworkContextManager* SystemNetworkContextManager::CreateInstance(
  19. const std::string& user_agent) {
  20. DCHECK(!g_system_network_context_manager);
  21. g_system_network_context_manager =
  22. new SystemNetworkContextManager(user_agent);
  23. return g_system_network_context_manager;
  24. }
  25. // static
  26. bool SystemNetworkContextManager::HasInstance() {
  27. return !!g_system_network_context_manager;
  28. }
  29. // static
  30. SystemNetworkContextManager* SystemNetworkContextManager::GetInstance() {
  31. DCHECK(g_system_network_context_manager);
  32. return g_system_network_context_manager;
  33. }
  34. // static
  35. void SystemNetworkContextManager::DeleteInstance() {
  36. DCHECK(g_system_network_context_manager);
  37. delete g_system_network_context_manager;
  38. g_system_network_context_manager = nullptr;
  39. }
  40. // static
  41. network::mojom::NetworkContextParamsPtr
  42. SystemNetworkContextManager::CreateDefaultNetworkContextParams(
  43. const std::string& user_agent) {
  44. network::mojom::NetworkContextParamsPtr network_context_params =
  45. network::mojom::NetworkContextParams::New();
  46. network_context_params->cert_verifier_params = content::GetCertVerifierParams(
  47. cert_verifier::mojom::CertVerifierCreationParams::New());
  48. ConfigureDefaultNetworkContextParams(network_context_params.get(),
  49. user_agent);
  50. variations::UpdateCorsExemptHeaderForVariations(network_context_params.get());
  51. return network_context_params;
  52. }
  53. // static
  54. void SystemNetworkContextManager::ConfigureDefaultNetworkContextParams(
  55. network::mojom::NetworkContextParams* network_context_params,
  56. const std::string& user_agent) {
  57. network_context_params->user_agent = user_agent;
  58. // TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is
  59. // complete.
  60. #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_WIN)
  61. // We're not configuring the cookie encryption on these platforms yet.
  62. network_context_params->enable_encrypted_cookies = false;
  63. #endif // (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) ||
  64. // BUILDFLAG(IS_WIN)
  65. }
  66. SystemNetworkContextManager::SystemNetworkContextManager(
  67. const std::string& user_agent)
  68. : user_agent_(user_agent) {}
  69. SystemNetworkContextManager::~SystemNetworkContextManager() = default;
  70. network::mojom::NetworkContext*
  71. SystemNetworkContextManager::GetSystemNetworkContext() {
  72. if (!system_network_context_ || !system_network_context_.is_connected()) {
  73. // This should call into OnNetworkServiceCreated(), which will re-create
  74. // the network service, if needed. There's a chance that it won't be
  75. // invoked, if the NetworkContext has encountered an error but the
  76. // NetworkService has not yet noticed its pipe was closed. In that case,
  77. // trying to create a new NetworkContext would fail, anyways, and hopefully
  78. // a new NetworkContext will be created on the next GetContext() call.
  79. content::GetNetworkService();
  80. DCHECK(system_network_context_);
  81. }
  82. return system_network_context_.get();
  83. }
  84. void SystemNetworkContextManager::OnNetworkServiceCreated(
  85. network::mojom::NetworkService* network_service) {
  86. system_network_context_.reset();
  87. network_service->CreateNetworkContext(
  88. system_network_context_.BindNewPipeAndPassReceiver(),
  89. CreateSystemNetworkContextManagerParams());
  90. }
  91. network::mojom::NetworkContextParamsPtr
  92. SystemNetworkContextManager::CreateSystemNetworkContextManagerParams() {
  93. network::mojom::NetworkContextParamsPtr network_context_params =
  94. CreateDefaultNetworkContextParams(user_agent_);
  95. return network_context_params;
  96. }
  97. scoped_refptr<network::SharedURLLoaderFactory>
  98. SystemNetworkContextManager::GetSharedURLLoaderFactory() {
  99. if (!url_loader_factory_) {
  100. auto url_loader_factory_params =
  101. network::mojom::URLLoaderFactoryParams::New();
  102. url_loader_factory_params->process_id = network::mojom::kBrowserProcessId;
  103. url_loader_factory_params->is_corb_enabled = false;
  104. GetSystemNetworkContext()->CreateURLLoaderFactory(
  105. url_loader_factory_.BindNewPipeAndPassReceiver(),
  106. std::move(url_loader_factory_params));
  107. shared_url_loader_factory_ =
  108. base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
  109. url_loader_factory_.get());
  110. }
  111. return shared_url_loader_factory_;
  112. }
  113. net_log::NetExportFileWriter*
  114. SystemNetworkContextManager::GetNetExportFileWriter() {
  115. if (!net_export_file_writer_) {
  116. net_export_file_writer_ = std::make_unique<net_log::NetExportFileWriter>();
  117. }
  118. return net_export_file_writer_.get();
  119. }
  120. } // namespace weblayer