blob: edd112d7fdc63ab905afa4d61581c8f7534c5776 [file] [log] [blame]
John Abd-El-Malekdeec0082017-12-20 20:47:471// Copyright 2017 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
5#include "content/public/browser/network_service_instance.h"
6
7#include "base/feature_list.h"
8#include "content/browser/network_service_client.h"
John Abd-El-Malekdeec0082017-12-20 20:47:479#include "content/public/browser/browser_thread.h"
10#include "content/public/browser/content_browser_client.h"
John Abd-El-Malekdeec0082017-12-20 20:47:4711#include "content/public/common/service_manager_connection.h"
12#include "content/public/common/service_names.mojom.h"
John Abd-El-Malek8e82a322018-01-31 20:30:4713#include "services/network/network_service.h"
Yutaka Hiranod8789f92018-01-30 09:59:5114#include "services/network/public/cpp/features.h"
John Abd-El-Malekdeec0082017-12-20 20:47:4715#include "services/service_manager/public/cpp/connector.h"
16
17namespace content {
18
19namespace {
20
John Abd-El-Malek53670dd2018-01-18 22:07:2121network::mojom::NetworkServicePtr* g_network_service_ptr = nullptr;
John Abd-El-Malek8e82a322018-01-31 20:30:4722network::NetworkService* g_network_service;
John Abd-El-Malekdeec0082017-12-20 20:47:4723
John Abd-El-Malek53670dd2018-01-18 22:07:2124void CreateNetworkServiceOnIO(network::mojom::NetworkServiceRequest request) {
John Abd-El-Malekdeec0082017-12-20 20:47:4725 if (g_network_service) {
26 // GetNetworkServiceImpl() was already called and created the object, so
27 // just bind it.
28 g_network_service->Bind(std::move(request));
29 return;
30 }
31
John Abd-El-Malek8e82a322018-01-31 20:30:4732 g_network_service = new network::NetworkService(
John Abd-El-Malekdeec0082017-12-20 20:47:4733 nullptr, std::move(request), GetContentClient()->browser()->GetNetLog());
34}
35
36} // namespace
37
John Abd-El-Malek53670dd2018-01-18 22:07:2138network::mojom::NetworkService* GetNetworkService() {
John Abd-El-Malekdeec0082017-12-20 20:47:4739 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
40
41 if (!g_network_service_ptr)
John Abd-El-Malek53670dd2018-01-18 22:07:2142 g_network_service_ptr = new network::mojom::NetworkServicePtr;
John Abd-El-Malekdeec0082017-12-20 20:47:4743 static NetworkServiceClient* g_client;
44 if (!g_network_service_ptr->is_bound() ||
45 g_network_service_ptr->encountered_error()) {
Yutaka Hiranod8789f92018-01-30 09:59:5146 if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
John Abd-El-Malekdeec0082017-12-20 20:47:4747 ServiceManagerConnection::GetForProcess()->GetConnector()->BindInterface(
48 mojom::kNetworkServiceName, g_network_service_ptr);
49 } else {
50 DCHECK(!g_network_service_ptr->is_bound());
51 BrowserThread::PostTask(
52 BrowserThread::IO, FROM_HERE,
53 base::BindOnce(CreateNetworkServiceOnIO,
54 mojo::MakeRequest(g_network_service_ptr)));
55 }
56
John Abd-El-Malek53670dd2018-01-18 22:07:2157 network::mojom::NetworkServiceClientPtr client_ptr;
John Abd-El-Malekdeec0082017-12-20 20:47:4758 delete g_client; // In case we're recreating the network service.
59 g_client = new NetworkServiceClient(mojo::MakeRequest(&client_ptr));
60 (*g_network_service_ptr)->SetClient(std::move(client_ptr));
61 }
62 return g_network_service_ptr->get();
63}
64
John Abd-El-Malek3bbbdf92018-01-30 03:27:3565network::NetworkService* GetNetworkServiceImpl() {
John Abd-El-Malekdeec0082017-12-20 20:47:4766 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
Yutaka Hiranod8789f92018-01-30 09:59:5167 DCHECK(!base::FeatureList::IsEnabled(network::features::kNetworkService));
John Abd-El-Malekdeec0082017-12-20 20:47:4768 if (!g_network_service) {
John Abd-El-Malek8e82a322018-01-31 20:30:4769 g_network_service = new network::NetworkService(
John Abd-El-Malekdeec0082017-12-20 20:47:4770 nullptr, nullptr, GetContentClient()->browser()->GetNetLog());
71 }
72
73 return g_network_service;
74}
75
76void FlushNetworkServiceInstanceForTesting() {
77 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
Yutaka Hiranod8789f92018-01-30 09:59:5178 DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
John Abd-El-Malekdeec0082017-12-20 20:47:4779
80 if (g_network_service_ptr)
81 g_network_service_ptr->FlushForTesting();
82}
83
84} // namespace content