Migrate AssistRanker to SimpleURLLoader

As part of the effort to bring the new Network Service online, we are
deprecating URLFetcher in favor of SimpleURLLoader.

Background: https://docs.google.com/document/d/1YZDPeg3bf46QPU_vUotFwOEPHquww36b-UdRlO3ZpMU/edit

Bug: 844937
Change-Id: I4a00c42b481f10c03657aa52b9a3d197febdc6ed
Reviewed-on: https://chromium-review.googlesource.com/1070110
Reviewed-by: Andrew Moylan <amoylan@chromium.org>
Reviewed-by: Rachel Blum <groby@chromium.org>
Reviewed-by: Matt Menke <mmenke@chromium.org>
Commit-Queue: Mark Pilgrim <pilgrim@chromium.org>
Cr-Commit-Position: refs/heads/master@{#561845}
diff --git a/chrome/browser/assist_ranker/assist_ranker_service_factory.cc b/chrome/browser/assist_ranker/assist_ranker_service_factory.cc
index af84550c..698853e 100644
--- a/chrome/browser/assist_ranker/assist_ranker_service_factory.cc
+++ b/chrome/browser/assist_ranker/assist_ranker_service_factory.cc
@@ -5,11 +5,13 @@
 #include "chrome/browser/assist_ranker/assist_ranker_service_factory.h"
 
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/net/system_network_context_manager.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
 #include "components/assist_ranker/assist_ranker_service_impl.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "content/public/browser/browser_context.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
 
 namespace assist_ranker {
 
@@ -35,7 +37,9 @@
 KeyedService* AssistRankerServiceFactory::BuildServiceInstanceFor(
     content::BrowserContext* browser_context) const {
   return new AssistRankerServiceImpl(
-      browser_context->GetPath(), g_browser_process->system_request_context());
+      browser_context->GetPath(),
+      g_browser_process->system_network_context_manager()
+          ->GetSharedURLLoaderFactory());
 }
 
 content::BrowserContext* AssistRankerServiceFactory::GetBrowserContextToUse(
diff --git a/chrome/browser/translate/translate_service.cc b/chrome/browser/translate/translate_service.cc
index e947d3a..4e92860 100644
--- a/chrome/browser/translate/translate_service.cc
+++ b/chrome/browser/translate/translate_service.cc
@@ -11,6 +11,7 @@
 #include "base/strings/string_util.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/net/system_network_context_manager.h"
 #include "chrome/browser/translate/chrome_translate_client.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
@@ -53,6 +54,13 @@
       translate::TranslateDownloadManager::GetInstance();
   download_manager->set_request_context(
       g_browser_process->system_request_context());
+  SystemNetworkContextManager* system_network_context_manager =
+      g_browser_process->system_network_context_manager();
+  // Manager will be null if called from InitializeForTesting.
+  if (system_network_context_manager) {
+    download_manager->set_url_loader_factory(
+        system_network_context_manager->GetSharedURLLoaderFactory());
+  }
   download_manager->set_application_locale(
       g_browser_process->GetApplicationLocale());
 }
diff --git a/components/assist_ranker/BUILD.gn b/components/assist_ranker/BUILD.gn
index 130553d..f41a45f 100644
--- a/components/assist_ranker/BUILD.gn
+++ b/components/assist_ranker/BUILD.gn
@@ -39,6 +39,9 @@
     "//components/keyed_service/core",
     "//net",
     "//services/metrics/public/cpp:metrics_cpp",
+    "//services/network:network_service",
+    "//services/network/public/cpp",
+    "//services/network/public/mojom",
     "//url",
   ]
 }
@@ -62,6 +65,8 @@
     "//components/assist_ranker/proto",
     "//components/ukm:test_support",
     "//net:test_support",
+    "//services/network:test_support",
+    "//services/network/public/cpp",
     "//testing/gtest",
   ]
 }
diff --git a/components/assist_ranker/DEPS b/components/assist_ranker/DEPS
index 22c088f..f1b4b55 100644
--- a/components/assist_ranker/DEPS
+++ b/components/assist_ranker/DEPS
@@ -5,5 +5,8 @@
   "+components/ukm",
   "+net",
   "+services/metrics/public",
+  "+services/network/public/cpp",
+  "+services/network/public/mojom",
+  "+services/network/test",
   "+third_party/protobuf",
 ]
diff --git a/components/assist_ranker/assist_ranker_service_impl.cc b/components/assist_ranker/assist_ranker_service_impl.cc
index 5b870b8..04ea3ce 100644
--- a/components/assist_ranker/assist_ranker_service_impl.cc
+++ b/components/assist_ranker/assist_ranker_service_impl.cc
@@ -6,15 +6,15 @@
 #include "base/memory/weak_ptr.h"
 #include "components/assist_ranker/binary_classifier_predictor.h"
 #include "components/assist_ranker/ranker_model_loader_impl.h"
-#include "net/url_request/url_request_context_getter.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "url/gurl.h"
 
 namespace assist_ranker {
 
 AssistRankerServiceImpl::AssistRankerServiceImpl(
     base::FilePath base_path,
-    net::URLRequestContextGetter* url_request_context_getter)
-    : url_request_context_getter_(url_request_context_getter),
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
+    : url_loader_factory_(std::move(url_loader_factory)),
       base_path_(std::move(base_path)) {}
 
 AssistRankerServiceImpl::~AssistRankerServiceImpl() {}
@@ -35,7 +35,7 @@
   DVLOG(1) << "Initializing predictor: " << model_name;
   std::unique_ptr<BinaryClassifierPredictor> predictor =
       BinaryClassifierPredictor::Create(config, GetModelPath(model_name),
-                                        url_request_context_getter_.get());
+                                        url_loader_factory_);
   base::WeakPtr<BinaryClassifierPredictor> weak_ptr =
       base::AsWeakPtr(predictor.get());
   predictor_map_[model_name] = std::move(predictor);
diff --git a/components/assist_ranker/assist_ranker_service_impl.h b/components/assist_ranker/assist_ranker_service_impl.h
index 1b75ff4..e1b00c2 100644
--- a/components/assist_ranker/assist_ranker_service_impl.h
+++ b/components/assist_ranker/assist_ranker_service_impl.h
@@ -15,8 +15,8 @@
 #include "components/assist_ranker/assist_ranker_service.h"
 #include "components/assist_ranker/predictor_config.h"
 
-namespace net {
-class URLRequestContextGetter;
+namespace network {
+class SharedURLLoaderFactory;
 }
 
 namespace assist_ranker {
@@ -28,7 +28,7 @@
  public:
   AssistRankerServiceImpl(
       base::FilePath base_path,
-      net::URLRequestContextGetter* url_request_context_getter);
+      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
   ~AssistRankerServiceImpl() override;
 
   // AssistRankerService...
@@ -39,8 +39,8 @@
   // Returns the full path to the model cache.
   base::FilePath GetModelPath(const std::string& model_filename);
 
-  // Request Context Getter used for RankerURLFetcher.
-  scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
+  // URL loader factory used for RankerURLFetcher.
+  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
 
   // Base path where models are stored.
   const base::FilePath base_path_;
diff --git a/components/assist_ranker/binary_classifier_predictor.cc b/components/assist_ranker/binary_classifier_predictor.cc
index 1200cfe..651eaab8 100644
--- a/components/assist_ranker/binary_classifier_predictor.cc
+++ b/components/assist_ranker/binary_classifier_predictor.cc
@@ -13,7 +13,7 @@
 #include "components/assist_ranker/proto/ranker_model.pb.h"
 #include "components/assist_ranker/ranker_model.h"
 #include "components/assist_ranker/ranker_model_loader_impl.h"
-#include "net/url_request/url_request_context_getter.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
 
 namespace assist_ranker {
 
@@ -26,7 +26,7 @@
 std::unique_ptr<BinaryClassifierPredictor> BinaryClassifierPredictor::Create(
     const PredictorConfig& config,
     const base::FilePath& model_path,
-    net::URLRequestContextGetter* request_context_getter) {
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) {
   std::unique_ptr<BinaryClassifierPredictor> predictor(
       new BinaryClassifierPredictor(config));
   if (!predictor->is_query_enabled()) {
@@ -40,7 +40,7 @@
       base::BindRepeating(&BinaryClassifierPredictor::ValidateModel),
       base::BindRepeating(&BinaryClassifierPredictor::OnModelAvailable,
                           base::Unretained(predictor.get())),
-      request_context_getter, model_path, model_url, config.uma_prefix);
+      url_loader_factory, model_path, model_url, config.uma_prefix);
   predictor->LoadModel(std::move(model_loader));
   return predictor;
 }
diff --git a/components/assist_ranker/binary_classifier_predictor.h b/components/assist_ranker/binary_classifier_predictor.h
index e932c91..6aa1a9f 100644
--- a/components/assist_ranker/binary_classifier_predictor.h
+++ b/components/assist_ranker/binary_classifier_predictor.h
@@ -13,8 +13,8 @@
 class FilePath;
 }
 
-namespace net {
-class URLRequestContextGetter;
+namespace network {
+class SharedURLLoaderFactory;
 }
 
 namespace assist_ranker {
@@ -32,7 +32,8 @@
   static std::unique_ptr<BinaryClassifierPredictor> Create(
       const PredictorConfig& config,
       const base::FilePath& model_path,
-      net::URLRequestContextGetter* request_context_getter) WARN_UNUSED_RESULT;
+      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
+      WARN_UNUSED_RESULT;
 
   // Fills in a boolean decision given a RankerExample. Returns false if a
   // prediction could not be made (e.g. the model is not loaded yet).
diff --git a/components/assist_ranker/ranker_model_loader_impl.cc b/components/assist_ranker/ranker_model_loader_impl.cc
index e03529f..2f908be 100644
--- a/components/assist_ranker/ranker_model_loader_impl.cc
+++ b/components/assist_ranker/ranker_model_loader_impl.cc
@@ -22,6 +22,7 @@
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "components/assist_ranker/proto/ranker_model.pb.h"
 #include "components/assist_ranker/ranker_url_fetcher.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
 
 namespace assist_ranker {
 namespace {
@@ -90,7 +91,7 @@
 RankerModelLoaderImpl::RankerModelLoaderImpl(
     ValidateModelCallback validate_model_cb,
     OnModelAvailableCallback on_model_available_cb,
-    net::URLRequestContextGetter* request_context_getter,
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
     base::FilePath model_path,
     GURL model_url,
     std::string uma_prefix)
@@ -99,7 +100,7 @@
            base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})),
       validate_model_cb_(std::move(validate_model_cb)),
       on_model_available_cb_(std::move(on_model_available_cb)),
-      request_context_getter_(request_context_getter),
+      url_loader_factory_(std::move(url_loader_factory)),
       model_path_(std::move(model_path)),
       model_url_(std::move(model_url)),
       uma_prefix_(std::move(uma_prefix)),
@@ -222,7 +223,7 @@
       url_fetcher_->Request(model_url_,
                             base::Bind(&RankerModelLoaderImpl::OnURLFetched,
                                        weak_ptr_factory_.GetWeakPtr()),
-                            request_context_getter_.get());
+                            url_loader_factory_.get());
 
   // |url_fetcher_| maintains a request retry counter. If all allowed attempts
   // have already been exhausted, then the loader is finished and has abandoned
diff --git a/components/assist_ranker/ranker_model_loader_impl.h b/components/assist_ranker/ranker_model_loader_impl.h
index 4ef151c3..1a94ac3f4 100644
--- a/components/assist_ranker/ranker_model_loader_impl.h
+++ b/components/assist_ranker/ranker_model_loader_impl.h
@@ -16,13 +16,16 @@
 #include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
 #include "base/time/time.h"
-#include "net/url_request/url_request_context_getter.h"
 #include "url/gurl.h"
 
 namespace base {
 class SequencedTaskRunner;
 }  // namespace base
 
+namespace network {
+class SharedURLLoaderFactory;
+}
+
 namespace assist_ranker {
 
 class RankerURLFetcher;
@@ -48,12 +51,13 @@
   //
   // |uma_prefix| will be used as a prefix for the names of all UMA metrics
   // generated by this loader.
-  RankerModelLoaderImpl(ValidateModelCallback validate_model_callback,
-                        OnModelAvailableCallback on_model_available_callback,
-                        net::URLRequestContextGetter* request_context_getter,
-                        base::FilePath model_path,
-                        GURL model_url,
-                        std::string uma_prefix);
+  RankerModelLoaderImpl(
+      ValidateModelCallback validate_model_callback,
+      OnModelAvailableCallback on_model_available_callback,
+      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
+      base::FilePath model_path,
+      GURL model_url,
+      std::string uma_prefix);
 
   ~RankerModelLoaderImpl() override;
 
@@ -130,8 +134,8 @@
   // constructed.
   const OnModelAvailableCallback on_model_available_cb_;
 
-  // Request Context Getter used for RankerURLFetcher.
-  scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
+  // URL loader factory used for RankerURLFetcher.
+  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
 
   // The path at which the model is (or should be) cached.
   const base::FilePath model_path_;
diff --git a/components/assist_ranker/ranker_model_loader_impl_unittest.cc b/components/assist_ranker/ranker_model_loader_impl_unittest.cc
index 9799c9c..32b2760 100644
--- a/components/assist_ranker/ranker_model_loader_impl_unittest.cc
+++ b/components/assist_ranker/ranker_model_loader_impl_unittest.cc
@@ -20,8 +20,9 @@
 #include "components/assist_ranker/proto/ranker_model.pb.h"
 #include "components/assist_ranker/proto/translate_ranker_model.pb.h"
 #include "components/assist_ranker/ranker_model.h"
-#include "net/url_request/test_url_fetcher_factory.h"
-#include "net/url_request/url_request_test_util.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
+#include "services/network/test/test_url_loader_factory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
@@ -76,15 +77,13 @@
   // Sets up the task scheduling/task-runner environment for each test.
   base::test::ScopedTaskEnvironment scoped_task_environment_;
 
-  // Override the default URL fetcher to return custom responses for tests.
-  net::FakeURLFetcherFactory url_fetcher_factory_;
+  // Override the default URL loader to return custom responses for tests.
+  network::TestURLLoaderFactory test_loader_factory_;
+  scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
 
   // Temporary directory for model files.
   base::ScopedTempDir scoped_temp_dir_;
 
-  // Used for URLFetcher.
-  scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_;
-
   // A queue of responses to return from Validate(). If empty, validate will
   // return 'OK'.
   base::circular_deque<RankerModelStatus> validate_model_response_;
@@ -114,13 +113,13 @@
   DISALLOW_COPY_AND_ASSIGN(RankerModelLoaderImplTest);
 };
 
-RankerModelLoaderImplTest::RankerModelLoaderImplTest()
-    : url_fetcher_factory_(nullptr) {}
+RankerModelLoaderImplTest::RankerModelLoaderImplTest() {
+  test_shared_loader_factory_ =
+      base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
+          &test_loader_factory_);
+}
 
 void RankerModelLoaderImplTest::SetUp() {
-  request_context_getter_ =
-      new net::TestURLRequestContextGetter(base::ThreadTaskRunnerHandle::Get());
-
   ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir());
   const auto& temp_dir_path = scoped_temp_dir_.GetPath();
 
@@ -172,7 +171,7 @@
                  base::Unretained(this)),
       base::Bind(&RankerModelLoaderImplTest::OnModelAvailable,
                  base::Unretained(this)),
-      request_context_getter_.get(), model_path, model_url,
+      test_shared_loader_factory_, model_path, model_url,
       "RankerModelLoaderImplTest");
   loader->NotifyOfRankerActivity();
   scoped_task_environment_.RunUntilIdle();
@@ -182,15 +181,13 @@
 
 void RankerModelLoaderImplTest::InitRemoteModels() {
   InitModel(remote_model_url_, base::Time(), base::TimeDelta(), &remote_model_);
-  url_fetcher_factory_.SetFakeResponse(
-      remote_model_url_, remote_model_.SerializeAsString(), net::HTTP_OK,
-      net::URLRequestStatus::SUCCESS);
-  url_fetcher_factory_.SetFakeResponse(invalid_model_url_, kInvalidModelData,
-                                       net::HTTP_OK,
-                                       net::URLRequestStatus::SUCCESS);
-  url_fetcher_factory_.SetFakeResponse(failed_model_url_, "",
-                                       net::HTTP_INTERNAL_SERVER_ERROR,
-                                       net::URLRequestStatus::FAILED);
+  test_loader_factory_.AddResponse(remote_model_url_.spec(),
+                                   remote_model_.SerializeAsString());
+  test_loader_factory_.AddResponse(invalid_model_url_.spec(),
+                                   kInvalidModelData);
+  test_loader_factory_.AddResponse(
+      failed_model_url_, network::ResourceResponseHead(), "",
+      network::URLLoaderCompletionStatus(net::HTTP_INTERNAL_SERVER_ERROR));
 }
 
 void RankerModelLoaderImplTest::InitLocalModels() {
diff --git a/components/assist_ranker/ranker_url_fetcher.cc b/components/assist_ranker/ranker_url_fetcher.cc
index 0f8989e..d46a84f 100644
--- a/components/assist_ranker/ranker_url_fetcher.cc
+++ b/components/assist_ranker/ranker_url_fetcher.cc
@@ -9,8 +9,9 @@
 #include "net/base/load_flags.h"
 #include "net/http/http_status_code.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
-#include "net/url_request/url_fetcher.h"
-#include "net/url_request/url_request_status.h"
+#include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/cpp/simple_url_loader.h"
+#include "services/network/public/mojom/url_loader_factory.mojom.h"
 
 namespace assist_ranker {
 
@@ -28,7 +29,7 @@
 bool RankerURLFetcher::Request(
     const GURL& url,
     const RankerURLFetcher::Callback& callback,
-    net::URLRequestContextGetter* request_context_getter) {
+    network::mojom::URLLoaderFactory* url_loader_factory) {
   // This function is not supposed to be called if the previous operation is not
   // finished.
   if (state_ == REQUESTING) {
@@ -44,7 +45,7 @@
   url_ = url;
   callback_ = callback;
 
-  if (request_context_getter == nullptr)
+  if (url_loader_factory == nullptr)
     return false;
 
   net::NetworkTrafficAnnotationTag traffic_annotation =
@@ -73,38 +74,37 @@
           policy_exception_justification:
             "Not implemented, considered not necessary as no user data is sent."
         })");
-  // Create and initialize the URL fetcher.
-  fetcher_ = net::URLFetcher::Create(url_, net::URLFetcher::GET, this,
-                                     traffic_annotation);
-  data_use_measurement::DataUseUserData::AttachToFetcher(
-      fetcher_.get(),
-      data_use_measurement::DataUseUserData::MACHINE_INTELLIGENCE);
-  fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES |
-                         net::LOAD_DO_NOT_SAVE_COOKIES);
-  fetcher_->SetRequestContext(request_context_getter);
-
-  // Set retry parameter for HTTP status code 5xx. This doesn't work against
-  // 106 (net::ERR_INTERNET_DISCONNECTED) and so on.
-  fetcher_->SetMaxRetriesOn5xx(max_retry_on_5xx_);
-  fetcher_->Start();
+  auto resource_request = std::make_unique<network::ResourceRequest>();
+  resource_request->url = url_;
+  resource_request->load_flags =
+      net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DO_NOT_SAVE_COOKIES;
+  // TODO(https://crbug.com/808498): Re-add data use measurement once
+  // SimpleURLLoader supports it.
+  // ID=data_use_measurement::DataUseUserData::MACHINE_INTELLIGENCE
+  simple_url_loader_ = network::SimpleURLLoader::Create(
+      std::move(resource_request), traffic_annotation);
+  if (max_retry_on_5xx_ > 0) {
+    simple_url_loader_->SetRetryOptions(max_retry_on_5xx_,
+                                        network::SimpleURLLoader::RETRY_ON_5XX);
+  }
+  simple_url_loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
+      url_loader_factory,
+      base::BindOnce(&RankerURLFetcher::OnSimpleLoaderComplete,
+                     base::Unretained(this)));
 
   return true;
 }
 
-void RankerURLFetcher::OnURLFetchComplete(const net::URLFetcher* source) {
-  DCHECK(fetcher_.get() == source);
-
+void RankerURLFetcher::OnSimpleLoaderComplete(
+    std::unique_ptr<std::string> response_body) {
   std::string data;
-  if (source->GetStatus().status() == net::URLRequestStatus::SUCCESS &&
-      source->GetResponseCode() == net::HTTP_OK) {
+  if (response_body) {
     state_ = COMPLETED;
-    source->GetResponseAsString(&data);
+    data = std::move(*response_body);
   } else {
     state_ = FAILED;
   }
-
-  // Transfer URLFetcher's ownership before invoking a callback.
-  std::unique_ptr<const net::URLFetcher> delete_ptr(fetcher_.release());
+  simple_url_loader_.reset();
   callback_.Run(state_ == COMPLETED, data);
 }
 
diff --git a/components/assist_ranker/ranker_url_fetcher.h b/components/assist_ranker/ranker_url_fetcher.h
index 7c2305a9..2a62e851 100644
--- a/components/assist_ranker/ranker_url_fetcher.h
+++ b/components/assist_ranker/ranker_url_fetcher.h
@@ -9,14 +9,19 @@
 
 #include "base/callback.h"
 #include "base/macros.h"
-#include "net/url_request/url_fetcher_delegate.h"
-#include "net/url_request/url_request_context_getter.h"
 #include "url/gurl.h"
 
+namespace network {
+class SimpleURLLoader;
+namespace mojom {
+class URLLoaderFactory;
+}  // namespace mojom
+}  // namespace network
+
 namespace assist_ranker {
 
 // Downloads Ranker models.
-class RankerURLFetcher : public net::URLFetcherDelegate {
+class RankerURLFetcher {
  public:
   // Callback type for Request().
   typedef base::Callback<void(bool, const std::string&)> Callback;
@@ -30,7 +35,7 @@
   };
 
   RankerURLFetcher();
-  ~RankerURLFetcher() override;
+  ~RankerURLFetcher();
 
   int max_retry_on_5xx() { return max_retry_on_5xx_; }
   void set_max_retry_on_5xx(int count) { max_retry_on_5xx_ = count; }
@@ -41,23 +46,22 @@
   // is omitted due to retry limitation.
   bool Request(const GURL& url,
                const Callback& callback,
-               net::URLRequestContextGetter* request_context);
+               network::mojom::URLLoaderFactory* url_loader_factory);
 
   // Gets internal state.
   State state() { return state_; }
 
-  // net::URLFetcherDelegate implementation:
-  void OnURLFetchComplete(const net::URLFetcher* source) override;
-
  private:
+  void OnSimpleLoaderComplete(std::unique_ptr<std::string> response_body);
+
   // URL to send the request.
   GURL url_;
 
   // Internal state.
   enum State state_;
 
-  // URLFetcher instance.
-  std::unique_ptr<net::URLFetcher> fetcher_;
+  // SimpleURLLoader instance.
+  std::unique_ptr<network::SimpleURLLoader> simple_url_loader_;
 
   // Callback passed at Request(). It will be invoked when an asynchronous
   // fetch operation is finished.
diff --git a/components/translate/DEPS b/components/translate/DEPS
index b57e62f4..347a17c 100644
--- a/components/translate/DEPS
+++ b/components/translate/DEPS
@@ -12,6 +12,7 @@
   "+components/variations",
   "+google_apis",
   "+net",
+  "+services/network/public/cpp",
   "+ui",
   "+third_party/metrics_proto",
 
diff --git a/components/translate/core/browser/BUILD.gn b/components/translate/core/browser/BUILD.gn
index d4a3cbe..302c08c 100644
--- a/components/translate/core/browser/BUILD.gn
+++ b/components/translate/core/browser/BUILD.gn
@@ -63,6 +63,7 @@
     "//net",
     "//services/metrics/public/cpp:metrics_cpp",
     "//services/metrics/public/cpp:ukm_builders",
+    "//services/network/public/cpp:cpp",
     "//third_party/icu",
     "//third_party/metrics_proto",
     "//ui/base",
diff --git a/components/translate/core/browser/translate_download_manager.h b/components/translate/core/browser/translate_download_manager.h
index fab5051..e645cb6 100644
--- a/components/translate/core/browser/translate_download_manager.h
+++ b/components/translate/core/browser/translate_download_manager.h
@@ -13,6 +13,7 @@
 #include "components/translate/core/browser/translate_language_list.h"
 #include "components/translate/core/browser/translate_script.h"
 #include "net/url_request/url_request_context_getter.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
 
 namespace base {
 template <typename T> struct DefaultSingletonTraits;
@@ -38,6 +39,16 @@
     request_context_ = context;
   }
 
+  // The URL loader factory used to download the resources.
+  // Should be set before this class can be used.
+  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory() {
+    return url_loader_factory_;
+  }
+  void set_url_loader_factory(
+      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) {
+    url_loader_factory_ = std::move(url_loader_factory);
+  }
+
   // The application locale.
   // Should be set before this class can be used.
   const std::string& application_locale() {
@@ -110,6 +121,7 @@
 
   std::string application_locale_;
   scoped_refptr<net::URLRequestContextGetter> request_context_;
+  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
 };
 
 }  // namespace translate
diff --git a/components/translate/core/browser/translate_ranker_impl.cc b/components/translate/core/browser/translate_ranker_impl.cc
index aa5abc4..a7dbc9d 100644
--- a/components/translate/core/browser/translate_ranker_impl.cc
+++ b/components/translate/core/browser/translate_ranker_impl.cc
@@ -168,8 +168,8 @@
         base::Bind(&ValidateModel),
         base::Bind(&TranslateRankerImpl::OnModelAvailable,
                    weak_ptr_factory_.GetWeakPtr()),
-        TranslateDownloadManager::GetInstance()->request_context(), model_path,
-        model_url, kUmaPrefix);
+        TranslateDownloadManager::GetInstance()->url_loader_factory(),
+        model_path, model_url, kUmaPrefix);
     // Kick off the initial load from cache.
     model_loader_->NotifyOfRankerActivity();
   }