proxy_resolver_factory_impl.cc 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. // Copyright 2015 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 "services/proxy_resolver/proxy_resolver_factory_impl.h"
  5. #include <string>
  6. #include <utility>
  7. #include "base/bind.h"
  8. #include "base/memory/raw_ptr.h"
  9. #include "mojo/public/cpp/bindings/pending_receiver.h"
  10. #include "mojo/public/cpp/bindings/pending_remote.h"
  11. #include "net/base/net_errors.h"
  12. #include "net/proxy_resolution/proxy_resolver_factory.h"
  13. #include "services/proxy_resolver/mojo_proxy_resolver_v8_tracing_bindings.h"
  14. #include "services/proxy_resolver/proxy_resolver_impl.h"
  15. #include "services/proxy_resolver/proxy_resolver_v8_tracing.h"
  16. namespace proxy_resolver {
  17. class ProxyResolverFactoryImpl::Job {
  18. public:
  19. Job(ProxyResolverFactoryImpl* parent,
  20. const scoped_refptr<net::PacFileData>& pac_script,
  21. ProxyResolverV8TracingFactory* proxy_resolver_factory,
  22. mojo::PendingReceiver<mojom::ProxyResolver> receiver,
  23. mojo::PendingRemote<mojom::ProxyResolverFactoryRequestClient> client);
  24. Job(const Job&) = delete;
  25. Job& operator=(const Job&) = delete;
  26. ~Job();
  27. private:
  28. void OnDisconnect();
  29. void OnProxyResolverCreated(int error);
  30. const raw_ptr<ProxyResolverFactoryImpl> parent_;
  31. std::unique_ptr<ProxyResolverV8Tracing> proxy_resolver_impl_;
  32. mojo::PendingReceiver<mojom::ProxyResolver> proxy_receiver_;
  33. raw_ptr<ProxyResolverV8TracingFactory> factory_;
  34. std::unique_ptr<net::ProxyResolverFactory::Request> request_;
  35. mojo::Remote<mojom::ProxyResolverFactoryRequestClient> remote_client_;
  36. };
  37. ProxyResolverFactoryImpl::Job::Job(
  38. ProxyResolverFactoryImpl* factory,
  39. const scoped_refptr<net::PacFileData>& pac_script,
  40. ProxyResolverV8TracingFactory* proxy_resolver_factory,
  41. mojo::PendingReceiver<mojom::ProxyResolver> receiver,
  42. mojo::PendingRemote<mojom::ProxyResolverFactoryRequestClient> client)
  43. : parent_(factory),
  44. proxy_receiver_(std::move(receiver)),
  45. factory_(proxy_resolver_factory),
  46. remote_client_(std::move(client)) {
  47. remote_client_.set_disconnect_handler(base::BindOnce(
  48. &ProxyResolverFactoryImpl::Job::OnDisconnect, base::Unretained(this)));
  49. factory_->CreateProxyResolverV8Tracing(
  50. pac_script,
  51. std::make_unique<MojoProxyResolverV8TracingBindings<
  52. mojom::ProxyResolverFactoryRequestClient>>(remote_client_.get()),
  53. &proxy_resolver_impl_,
  54. base::BindOnce(&ProxyResolverFactoryImpl::Job::OnProxyResolverCreated,
  55. base::Unretained(this)),
  56. &request_);
  57. }
  58. ProxyResolverFactoryImpl::Job::~Job() = default;
  59. void ProxyResolverFactoryImpl::Job::OnDisconnect() {
  60. remote_client_->ReportResult(net::ERR_PAC_SCRIPT_TERMINATED);
  61. parent_->RemoveJob(this);
  62. }
  63. void ProxyResolverFactoryImpl::Job::OnProxyResolverCreated(int error) {
  64. if (error == net::OK) {
  65. parent_->AddResolver(
  66. std::make_unique<ProxyResolverImpl>(std::move(proxy_resolver_impl_)),
  67. std::move(proxy_receiver_));
  68. }
  69. remote_client_->ReportResult(error);
  70. parent_->RemoveJob(this);
  71. }
  72. ProxyResolverFactoryImpl::ProxyResolverFactoryImpl(
  73. mojo::PendingReceiver<mojom::ProxyResolverFactory> receiver)
  74. : ProxyResolverFactoryImpl(std::move(receiver),
  75. ProxyResolverV8TracingFactory::Create()) {}
  76. void ProxyResolverFactoryImpl::AddResolver(
  77. std::unique_ptr<mojom::ProxyResolver> resolver,
  78. mojo::PendingReceiver<mojom::ProxyResolver> receiver) {
  79. resolvers_.Add(std::move(resolver), std::move(receiver));
  80. }
  81. ProxyResolverFactoryImpl::ProxyResolverFactoryImpl(
  82. mojo::PendingReceiver<mojom::ProxyResolverFactory> receiver,
  83. std::unique_ptr<ProxyResolverV8TracingFactory> proxy_resolver_factory)
  84. : proxy_resolver_impl_factory_(std::move(proxy_resolver_factory)),
  85. receiver_(this, std::move(receiver)) {}
  86. ProxyResolverFactoryImpl::~ProxyResolverFactoryImpl() = default;
  87. void ProxyResolverFactoryImpl::CreateResolver(
  88. const std::string& pac_script,
  89. mojo::PendingReceiver<mojom::ProxyResolver> receiver,
  90. mojo::PendingRemote<mojom::ProxyResolverFactoryRequestClient> client) {
  91. // The Job will call RemoveJob on |this| when either the create request
  92. // finishes or |receiver| or |client| encounters a connection error.
  93. std::unique_ptr<Job> job =
  94. std::make_unique<Job>(this, net::PacFileData::FromUTF8(pac_script),
  95. proxy_resolver_impl_factory_.get(),
  96. std::move(receiver), std::move(client));
  97. Job* job_ptr = job.get();
  98. jobs_[job_ptr] = std::move(job);
  99. }
  100. void ProxyResolverFactoryImpl::RemoveJob(Job* job) {
  101. size_t erased_count = jobs_.erase(job);
  102. DCHECK_EQ(1U, erased_count);
  103. }
  104. } // namespace proxy_resolver