| Index: chrome/browser/net/utility_process_mojo_proxy_resolver_factory.cc
|
| diff --git a/chrome/browser/net/utility_process_mojo_proxy_resolver_factory.cc b/chrome/browser/net/utility_process_mojo_proxy_resolver_factory.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..501d44a9ca7384fd3d482b1caf5544cd4371c481
|
| --- /dev/null
|
| +++ b/chrome/browser/net/utility_process_mojo_proxy_resolver_factory.cc
|
| @@ -0,0 +1,70 @@
|
| +// Copyright 2015 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 "chrome/browser/net/utility_process_mojo_proxy_resolver_factory.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/memory/singleton.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| +#include "content/public/browser/utility_process_host.h"
|
| +#include "content/public/browser/utility_process_host_client.h"
|
| +#include "content/public/common/service_registry.h"
|
| +#include "net/proxy/mojo_proxy_resolver_factory.h"
|
| +
|
| +// static
|
| +UtilityProcessMojoProxyResolverFactory*
|
| +UtilityProcessMojoProxyResolverFactory::GetInstance() {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| + return Singleton<
|
| + UtilityProcessMojoProxyResolverFactory,
|
| + LeakySingletonTraits<UtilityProcessMojoProxyResolverFactory>>::get();
|
| +}
|
| +
|
| +UtilityProcessMojoProxyResolverFactory::
|
| + UtilityProcessMojoProxyResolverFactory() {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| +}
|
| +
|
| +UtilityProcessMojoProxyResolverFactory::
|
| + ~UtilityProcessMojoProxyResolverFactory() {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| +}
|
| +
|
| +void UtilityProcessMojoProxyResolverFactory::CreateProcessAndConnect() {
|
| + DVLOG(1) << "Attempting to create utility process for proxy resolver";
|
| + content::UtilityProcessHost* utility_process_host =
|
| + content::UtilityProcessHost::Create(
|
| + scoped_refptr<content::UtilityProcessHostClient>(),
|
| + base::MessageLoopProxy::current().get());
|
| + bool process_started = utility_process_host->StartMojoMode();
|
| + if (process_started) {
|
| + content::ServiceRegistry* service_registry =
|
| + utility_process_host->GetServiceRegistry();
|
| + service_registry->ConnectToRemoteService(&resolver_factory_);
|
| + resolver_factory_.set_error_handler(this);
|
| + } else {
|
| + LOG(ERROR) << "Unable to connect to utility process";
|
| + }
|
| +}
|
| +
|
| +void UtilityProcessMojoProxyResolverFactory::Create(
|
| + mojo::InterfaceRequest<net::interfaces::ProxyResolver> req,
|
| + net::interfaces::HostResolverPtr host_resolver) {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| + if (!resolver_factory_)
|
| + CreateProcessAndConnect();
|
| +
|
| + if (!resolver_factory_) {
|
| + // If there's still no factory, then utility process creation failed so
|
| + // close |req|'s message pipe, which should cause a connection error.
|
| + req = nullptr;
|
| + return;
|
| + }
|
| + resolver_factory_->CreateResolver(req.Pass(), host_resolver.Pass());
|
| +}
|
| +
|
| +void UtilityProcessMojoProxyResolverFactory::OnConnectionError() {
|
| + DVLOG(1) << "Disconnection from utility process detected";
|
| + resolver_factory_.reset();
|
| +}
|
|
|