Index: content/network/network_service.cc |
diff --git a/content/network/network_service.cc b/content/network/network_service.cc |
index 28d947b6adf5db1639efec3138b5dfdef1ce2620..a133884b0251b8fe163c130f2c1922c39734b6e1 100644 |
--- a/content/network/network_service.cc |
+++ b/content/network/network_service.cc |
@@ -55,11 +55,44 @@ class NetworkService::MojoNetLog : public net::NetLog { |
NetworkService::NetworkService( |
std::unique_ptr<service_manager::BinderRegistry> registry) |
: net_log_(new MojoNetLog), registry_(std::move(registry)), binding_(this) { |
- registry_->AddInterface<mojom::NetworkService>( |
- base::Bind(&NetworkService::Create, base::Unretained(this))); |
+ // |registry_| may be nullptr in tests. |
+ if (registry_) { |
+ registry_->AddInterface<mojom::NetworkService>( |
+ base::Bind(&NetworkService::Create, base::Unretained(this))); |
+ } |
+} |
+ |
+NetworkService::~NetworkService() { |
+ // Call each Network and ask it to release its net::URLRequestContext, as they |
+ // may have references to shared objects owned by the NetworkService. The |
+ // NetworkContexts deregister themselves in Cleanup(), so have to be careful. |
+ while (!network_contexts_.empty()) |
+ (*network_contexts_.begin())->Cleanup(); |
+} |
+ |
+std::unique_ptr<NetworkService> NetworkService::CreateForTesting() { |
+ return base::WrapUnique(new NetworkService()); |
} |
-NetworkService::~NetworkService() = default; |
+void NetworkService::RegisterNetworkContext(NetworkContext* network_context) { |
+ DCHECK_EQ(0u, network_contexts_.count(network_context)); |
+ network_contexts_.insert(network_context); |
+} |
+ |
+void NetworkService::DeregisterNetworkContext(NetworkContext* network_context) { |
+ DCHECK_EQ(1u, network_contexts_.count(network_context)); |
+ network_contexts_.erase(network_context); |
+} |
+ |
+void NetworkService::CreateNetworkContext( |
+ mojom::NetworkContextRequest request, |
+ mojom::NetworkContextParamsPtr params) { |
+ // The NetworkContext will destroy itself on connection error, or when the |
+ // service is destroyed. |
+ new NetworkContext(this, std::move(request), std::move(params)); |
+} |
+ |
+NetworkService::NetworkService() : NetworkService(nullptr) {} |
void NetworkService::OnBindInterface( |
const service_manager::BindSourceInfo& source_info, |
@@ -75,12 +108,4 @@ void NetworkService::Create(const service_manager::BindSourceInfo& source_info, |
binding_.Bind(std::move(request)); |
} |
-void NetworkService::CreateNetworkContext( |
- mojom::NetworkContextRequest request, |
- mojom::NetworkContextParamsPtr params) { |
- mojo::MakeStrongBinding( |
- base::MakeUnique<NetworkContext>(std::move(request), std::move(params)), |
- std::move(request)); |
-} |
- |
} // namespace content |