| // 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/browser/network_service_client.h" |
| #include "content/network/network_service_impl.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/browser/content_browser_client.h" |
| #include "content/public/common/content_features.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 { |
| |
| namespace { |
| |
| mojom::NetworkServicePtr* g_network_service_ptr = nullptr; |
| NetworkServiceImpl* g_network_service; |
| |
| void CreateNetworkServiceOnIO(mojom::NetworkServiceRequest request) { |
| if (g_network_service) { |
| // GetNetworkServiceImpl() was already called and created the object, so |
| // just bind it. |
| g_network_service->Bind(std::move(request)); |
| return; |
| } |
| |
| g_network_service = new NetworkServiceImpl( |
| nullptr, std::move(request), GetContentClient()->browser()->GetNetLog()); |
| } |
| |
| } // namespace |
| |
| mojom::NetworkService* GetNetworkService() { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| |
| if (!g_network_service_ptr) |
| g_network_service_ptr = new mojom::NetworkServicePtr; |
| static NetworkServiceClient* g_client; |
| if (!g_network_service_ptr->is_bound() || |
| g_network_service_ptr->encountered_error()) { |
| if (base::FeatureList::IsEnabled(features::kNetworkService)) { |
| ServiceManagerConnection::GetForProcess()->GetConnector()->BindInterface( |
| mojom::kNetworkServiceName, g_network_service_ptr); |
| } else { |
| DCHECK(!g_network_service_ptr->is_bound()); |
| BrowserThread::PostTask( |
| BrowserThread::IO, FROM_HERE, |
| base::BindOnce(CreateNetworkServiceOnIO, |
| mojo::MakeRequest(g_network_service_ptr))); |
| } |
| |
| mojom::NetworkServiceClientPtr client_ptr; |
| delete g_client; // In case we're recreating the network service. |
| g_client = new NetworkServiceClient(mojo::MakeRequest(&client_ptr)); |
| (*g_network_service_ptr)->SetClient(std::move(client_ptr)); |
| } |
| return g_network_service_ptr->get(); |
| } |
| |
| NetworkService* GetNetworkServiceImpl() { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| DCHECK(!base::FeatureList::IsEnabled(features::kNetworkService)); |
| if (!g_network_service) { |
| g_network_service = new NetworkServiceImpl( |
| nullptr, nullptr, GetContentClient()->browser()->GetNetLog()); |
| } |
| |
| return g_network_service; |
| } |
| |
| void FlushNetworkServiceInstanceForTesting() { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| DCHECK(base::FeatureList::IsEnabled(features::kNetworkService)); |
| |
| if (g_network_service_ptr) |
| g_network_service_ptr->FlushForTesting(); |
| } |
| |
| } // namespace content |