Migrate DeviceManagementService to use SimpleURLLoader.
TBR=atwilson
Bug: 844950
Cq-Include-Trybots: luci.chromium.try:linux_mojo
Change-Id: I92e5e1f9f28489ec265c89a11c932af47a8a48b7
Reviewed-on: https://chromium-review.googlesource.com/1113029
Commit-Queue: John Abd-El-Malek <jam@chromium.org>
Reviewed-by: Pavol Marko <pmarko@chromium.org>
Cr-Commit-Position: refs/heads/master@{#571184}diff --git a/chrome/browser/chromeos/arc/auth/arc_active_directory_enrollment_token_fetcher.cc b/chrome/browser/chromeos/arc/auth/arc_active_directory_enrollment_token_fetcher.cc
index 57b20f2..1814328 100644
--- a/chrome/browser/chromeos/arc/auth/arc_active_directory_enrollment_token_fetcher.cc
+++ b/chrome/browser/chromeos/arc/auth/arc_active_directory_enrollment_token_fetcher.cc
@@ -14,8 +14,9 @@
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
 #include "chrome/browser/chromeos/policy/dm_token_storage.h"
 #include "chrome/browser/chromeos/settings/install_attributes.h"
+#include "chrome/browser/net/system_network_context_manager.h"
 #include "components/policy/core/common/cloud/device_management_service.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 em = enterprise_management;
@@ -90,7 +91,8 @@
   fetch_request_job_.reset(
       service->CreateJob(policy::DeviceManagementRequestJob::
                              TYPE_ACTIVE_DIRECTORY_ENROLL_PLAY_USER,
-                         g_browser_process->system_request_context()));
+                         g_browser_process->system_network_context_manager()
+                             ->GetSharedURLLoaderFactory()));
 
   fetch_request_job_->SetDMToken(dm_token_);
   fetch_request_job_->SetClientID(GetClientId());
diff --git a/chrome/browser/chromeos/arc/auth/arc_robot_auth_code_fetcher.cc b/chrome/browser/chromeos/arc/auth/arc_robot_auth_code_fetcher.cc
index 7eb49f14..fd96b1e 100644
--- a/chrome/browser/chromeos/arc/auth/arc_robot_auth_code_fetcher.cc
+++ b/chrome/browser/chromeos/arc/auth/arc_robot_auth_code_fetcher.cc
@@ -9,10 +9,11 @@
 #include "base/bind.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
+#include "chrome/browser/net/system_network_context_manager.h"
 #include "components/policy/core/common/cloud/device_management_service.h"
 #include "google_apis/gaia/gaia_constants.h"
 #include "google_apis/gaia/gaia_urls.h"
-#include "net/url_request/url_request_context_getter.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
 
 namespace {
 
@@ -49,7 +50,8 @@
   policy::DeviceManagementService* service = GetDeviceManagementService();
   fetch_request_job_.reset(service->CreateJob(
       policy::DeviceManagementRequestJob::TYPE_API_AUTH_CODE_FETCH,
-      g_browser_process->system_request_context()));
+      g_browser_process->system_network_context_manager()
+          ->GetSharedURLLoaderFactory()));
 
   fetch_request_job_->SetDMToken(client->dm_token());
   fetch_request_job_->SetClientID(client->client_id());
diff --git a/chrome/browser/chromeos/arc/policy/arc_android_management_checker.cc b/chrome/browser/chromeos/arc/policy/arc_android_management_checker.cc
index 54d7366..a369091 100644
--- a/chrome/browser/chromeos/arc/policy/arc_android_management_checker.cc
+++ b/chrome/browser/chromeos/arc/policy/arc_android_management_checker.cc
@@ -13,10 +13,12 @@
 #include "chrome/browser/browser_process_platform_part.h"
 #include "chrome/browser/chromeos/arc/policy/arc_policy_util.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
+#include "chrome/browser/net/system_network_context_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/policy/core/browser/browser_policy_connector.h"
 #include "components/policy/core/common/cloud/device_management_service.h"
 #include "components/signin/core/browser/profile_oauth2_token_service.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
 
 namespace arc {
 
@@ -43,10 +45,12 @@
       account_id_(account_id),
       retry_on_error_(retry_on_error),
       retry_delay_(kRetryDelayMin),
-      android_management_client_(GetDeviceManagementService(),
-                                 g_browser_process->system_request_context(),
-                                 account_id,
-                                 token_service),
+      android_management_client_(
+          GetDeviceManagementService(),
+          g_browser_process->system_network_context_manager()
+              ->GetSharedURLLoaderFactory(),
+          account_id,
+          token_service),
       weak_ptr_factory_(this) {}
 
 ArcAndroidManagementChecker::~ArcAndroidManagementChecker() {
diff --git a/chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.cc b/chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.cc
index 38cea6a5..f54237b9 100644
--- a/chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.cc
+++ b/chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.cc
@@ -16,6 +16,7 @@
 #include "chrome/browser/chromeos/policy/auto_enrollment_client_impl.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
 #include "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h"
+#include "chrome/browser/net/system_network_context_manager.h"
 #include "chromeos/chromeos_switches.h"
 #include "chromeos/dbus/cryptohome/rpc.pb.h"
 #include "chromeos/dbus/cryptohome_client.h"
@@ -24,7 +25,7 @@
 #include "chromeos/system/factory_ping_embargo_check.h"
 #include "chromeos/system/statistics_provider.h"
 #include "components/policy/core/common/cloud/device_management_service.h"
-#include "net/url_request/url_request_context_getter.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
 
 namespace chromeos {
 
@@ -678,8 +679,9 @@
       base::BindRepeating(&AutoEnrollmentController::UpdateState,
                           weak_ptr_factory_.GetWeakPtr()),
       service, g_browser_process->local_state(),
-      g_browser_process->system_request_context(), state_keys.front(),
-      power_initial, power_limit);
+      g_browser_process->system_network_context_manager()
+          ->GetSharedURLLoaderFactory(),
+      state_keys.front(), power_initial, power_limit);
 
   VLOG(1) << "Starting auto-enrollment client for FRE.";
   client_->Start();
@@ -717,8 +719,9 @@
       base::BindRepeating(&AutoEnrollmentController::UpdateState,
                           weak_ptr_factory_.GetWeakPtr()),
       service, g_browser_process->local_state(),
-      g_browser_process->system_request_context(), serial_number,
-      rlz_brand_code, power_initial, power_limit,
+      g_browser_process->system_network_context_manager()
+          ->GetSharedURLLoaderFactory(),
+      serial_number, rlz_brand_code, power_initial, power_limit,
       kInitialEnrollmentModulusPowerOutdatedServer);
 
   VLOG(1) << "Starting auto-enrollment client for Initial Enrollment.";
diff --git a/chrome/browser/chromeos/policy/android_management_client.cc b/chrome/browser/chromeos/policy/android_management_client.cc
index ebb82c1..952479c 100644
--- a/chrome/browser/chromeos/policy/android_management_client.cc
+++ b/chrome/browser/chromeos/policy/android_management_client.cc
@@ -13,6 +13,7 @@
 #include "components/policy/proto/device_management_backend.pb.h"
 #include "google_apis/gaia/gaia_constants.h"
 #include "google_apis/gaia/google_service_auth_error.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
 
 namespace em = enterprise_management;
 
@@ -20,12 +21,12 @@
 
 AndroidManagementClient::AndroidManagementClient(
     DeviceManagementService* device_management_service,
-    scoped_refptr<net::URLRequestContextGetter> request_context,
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
     const std::string& account_id,
     OAuth2TokenService* token_service)
     : OAuth2TokenService::Consumer("android_management_client"),
       device_management_service_(device_management_service),
-      request_context_(request_context),
+      url_loader_factory_(url_loader_factory),
       account_id_(account_id),
       token_service_(token_service),
       weak_ptr_factory_(this) {}
@@ -77,7 +78,7 @@
     const std::string& access_token) {
   request_job_.reset(device_management_service_->CreateJob(
       DeviceManagementRequestJob::TYPE_ANDROID_MANAGEMENT_CHECK,
-      request_context_.get()));
+      url_loader_factory_));
   request_job_->SetOAuthToken(access_token);
   request_job_->SetClientID(base::GenerateGUID());
   request_job_->GetRequest()->mutable_check_android_management_request();
diff --git a/chrome/browser/chromeos/policy/android_management_client.h b/chrome/browser/chromeos/policy/android_management_client.h
index 57f732a..faaa8768 100644
--- a/chrome/browser/chromeos/policy/android_management_client.h
+++ b/chrome/browser/chromeos/policy/android_management_client.h
@@ -15,12 +15,15 @@
 #include "base/memory/weak_ptr.h"
 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
 #include "google_apis/gaia/oauth2_token_service.h"
-#include "net/url_request/url_request_context_getter.h"
 
 namespace enterprise_management {
 class DeviceManagementResponse;
 }
 
+namespace network {
+class SharedURLLoaderFactory;
+}
+
 namespace policy {
 
 class DeviceManagementRequestJob;
@@ -43,7 +46,7 @@
 
   AndroidManagementClient(
       DeviceManagementService* service,
-      scoped_refptr<net::URLRequestContextGetter> request_context,
+      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
       const std::string& account_id,
       OAuth2TokenService* token_service);
   ~AndroidManagementClient() override;
@@ -79,7 +82,7 @@
 
   // Used to communicate with the device management service.
   DeviceManagementService* const device_management_service_;
-  scoped_refptr<net::URLRequestContextGetter> request_context_;
+  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
   std::unique_ptr<DeviceManagementRequestJob> request_job_;
 
   // The account ID that will be used for the access token fetch.
diff --git a/chrome/browser/chromeos/policy/android_management_client_unittest.cc b/chrome/browser/chromeos/policy/android_management_client_unittest.cc
index 2d89611..3794294f 100644
--- a/chrome/browser/chromeos/policy/android_management_client_unittest.cc
+++ b/chrome/browser/chromeos/policy/android_management_client_unittest.cc
@@ -15,8 +15,8 @@
 #include "components/policy/core/common/cloud/mock_device_management_service.h"
 #include "components/policy/proto/device_management_backend.pb.h"
 #include "components/signin/core/browser/fake_profile_oauth2_token_service.h"
-#include "net/url_request/url_request_context_getter.h"
-#include "net/url_request/url_request_test_util.h"
+#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
+#include "services/network/test/test_url_loader_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -49,10 +49,11 @@
 
   // testing::Test:
   void SetUp() override {
-    request_context_ =
-        new net::TestURLRequestContextGetter(loop_.task_runner());
-    client_.reset(new AndroidManagementClient(&service_, request_context_,
-                                              kAccountId, &token_service_));
+    shared_url_loader_factory_ =
+        base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
+            &url_loader_factory_);
+    client_.reset(new AndroidManagementClient(
+        &service_, shared_url_loader_factory_, kAccountId, &token_service_));
   }
 
   // Request protobuf is used as extectation for the client requests.
@@ -66,8 +67,8 @@
   StrictMock<base::MockCallback<AndroidManagementClient::StatusCallback>>
       callback_observer_;
   std::unique_ptr<AndroidManagementClient> client_;
-  // Pointer to the client's request context.
-  scoped_refptr<net::URLRequestContextGetter> request_context_;
+  network::TestURLLoaderFactory url_loader_factory_;
+  scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory_;
   std::string oauh_token_;
   FakeProfileOAuth2TokenService token_service_;
 };
@@ -77,7 +78,7 @@
   EXPECT_CALL(
       service_,
       CreateJob(DeviceManagementRequestJob::TYPE_ANDROID_MANAGEMENT_CHECK,
-                request_context_))
+                shared_url_loader_factory_))
       .WillOnce(service_.SucceedJob(android_management_response_));
   EXPECT_CALL(service_,
               StartJob(dm_protocol::kValueRequestCheckAndroidManagement,
diff --git a/chrome/browser/chromeos/policy/auto_enrollment_client.h b/chrome/browser/chromeos/policy/auto_enrollment_client.h
index 4dcb20e1..0d815ab 100644
--- a/chrome/browser/chromeos/policy/auto_enrollment_client.h
+++ b/chrome/browser/chromeos/policy/auto_enrollment_client.h
@@ -13,8 +13,8 @@
 
 class PrefService;
 
-namespace net {
-class URLRequestContextGetter;
+namespace network {
+class SharedURLLoaderFactory;
 }
 
 namespace policy {
@@ -67,7 +67,7 @@
         const ProgressCallback& progress_callback,
         DeviceManagementService* device_management_service,
         PrefService* local_state,
-        scoped_refptr<net::URLRequestContextGetter> system_request_context,
+        scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
         const std::string& server_backed_state_key,
         int power_initial,
         int power_limit) = 0;
@@ -87,7 +87,7 @@
         const ProgressCallback& progress_callback,
         DeviceManagementService* device_management_service,
         PrefService* local_state,
-        scoped_refptr<net::URLRequestContextGetter> system_request_context,
+        scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
         const std::string& device_serial_number,
         const std::string& device_brand_code,
         int power_initial,
diff --git a/chrome/browser/chromeos/policy/auto_enrollment_client_impl.cc b/chrome/browser/chromeos/policy/auto_enrollment_client_impl.cc
index 5cf1dc1..9121532b 100644
--- a/chrome/browser/chromeos/policy/auto_enrollment_client_impl.cc
+++ b/chrome/browser/chromeos/policy/auto_enrollment_client_impl.cc
@@ -24,7 +24,7 @@
 #include "components/prefs/scoped_user_pref_update.h"
 #include "content/public/browser/browser_thread.h"
 #include "crypto/sha2.h"
-#include "net/url_request/url_request_context_getter.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "url/gurl.h"
 
 using content::BrowserThread;
@@ -338,13 +338,13 @@
     const ProgressCallback& progress_callback,
     DeviceManagementService* device_management_service,
     PrefService* local_state,
-    scoped_refptr<net::URLRequestContextGetter> system_request_context,
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
     const std::string& server_backed_state_key,
     int power_initial,
     int power_limit) {
   return base::WrapUnique(new AutoEnrollmentClientImpl(
       progress_callback, device_management_service, local_state,
-      system_request_context,
+      url_loader_factory,
       std::make_unique<DeviceIdentifierProviderFRE>(server_backed_state_key),
       std::make_unique<StateDownloadMessageProcessorFRE>(
           server_backed_state_key),
@@ -356,7 +356,7 @@
     const ProgressCallback& progress_callback,
     DeviceManagementService* device_management_service,
     PrefService* local_state,
-    scoped_refptr<net::URLRequestContextGetter> system_request_context,
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
     const std::string& device_serial_number,
     const std::string& device_brand_code,
     int power_initial,
@@ -364,7 +364,7 @@
     int power_outdated_server_detect) {
   return base::WrapUnique(new AutoEnrollmentClientImpl(
       progress_callback, device_management_service, local_state,
-      system_request_context,
+      url_loader_factory,
       std::make_unique<DeviceIdentifierProviderInitialEnrollment>(
           device_serial_number, device_brand_code),
       std::make_unique<StateDownloadMessageProcessorInitialEnrollment>(
@@ -437,7 +437,7 @@
     const ProgressCallback& callback,
     DeviceManagementService* service,
     PrefService* local_state,
-    scoped_refptr<net::URLRequestContextGetter> system_request_context,
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
     std::unique_ptr<DeviceIdentifierProvider> device_identifier_provider,
     std::unique_ptr<StateDownloadMessageProcessor>
         state_download_message_processor,
@@ -456,7 +456,7 @@
       modulus_updates_received_(0),
       device_management_service_(service),
       local_state_(local_state),
-      request_context_(system_request_context),
+      url_loader_factory_(url_loader_factory),
       device_identifier_provider_(std::move(device_identifier_provider)),
       state_download_message_processor_(
           std::move(state_download_message_processor)),
@@ -563,8 +563,7 @@
 
   VLOG(1) << "Request bucket #" << remainder;
   request_job_.reset(device_management_service_->CreateJob(
-      DeviceManagementRequestJob::TYPE_AUTO_ENROLLMENT,
-      request_context_.get()));
+      DeviceManagementRequestJob::TYPE_AUTO_ENROLLMENT, url_loader_factory_));
   request_job_->SetClientID(device_id_);
   em::DeviceAutoEnrollmentRequest* request =
       request_job_->GetRequest()->mutable_auto_enrollment_request();
@@ -582,7 +581,7 @@
   ReportProgress(AUTO_ENROLLMENT_STATE_PENDING);
 
   request_job_.reset(device_management_service_->CreateJob(
-      state_download_message_processor_->GetJobType(), request_context_.get()));
+      state_download_message_processor_->GetJobType(), url_loader_factory_));
   request_job_->SetClientID(device_id_);
   state_download_message_processor_->FillRequest(request_job_->GetRequest());
   request_job_->Start(base::BindRepeating(
diff --git a/chrome/browser/chromeos/policy/auto_enrollment_client_impl.h b/chrome/browser/chromeos/policy/auto_enrollment_client_impl.h
index 52c0a58..56595c0 100644
--- a/chrome/browser/chromeos/policy/auto_enrollment_client_impl.h
+++ b/chrome/browser/chromeos/policy/auto_enrollment_client_impl.h
@@ -25,10 +25,6 @@
 class DeviceManagementResponse;
 }
 
-namespace net {
-class URLRequestContextGetter;
-}
-
 namespace policy {
 
 class DeviceManagementService;
@@ -59,7 +55,7 @@
         const ProgressCallback& progress_callback,
         DeviceManagementService* device_management_service,
         PrefService* local_state,
-        scoped_refptr<net::URLRequestContextGetter> system_request_context,
+        scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
         const std::string& server_backed_state_key,
         int power_initial,
         int power_limit) override;
@@ -68,7 +64,7 @@
         const ProgressCallback& progress_callback,
         DeviceManagementService* device_management_service,
         PrefService* local_state,
-        scoped_refptr<net::URLRequestContextGetter> system_request_context,
+        scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
         const std::string& device_serial_number,
         const std::string& device_brand_code,
         int power_initial,
@@ -104,7 +100,7 @@
       const ProgressCallback& progress_callback,
       DeviceManagementService* device_management_service,
       PrefService* local_state,
-      scoped_refptr<net::URLRequestContextGetter> system_request_context,
+      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
       std::unique_ptr<DeviceIdentifierProvider> device_identifier_provider,
       std::unique_ptr<StateDownloadMessageProcessor>
           state_download_message_processor,
@@ -202,8 +198,8 @@
   // PrefService where the protocol's results are cached.
   PrefService* local_state_;
 
-  // The request context to use to perform the auto enrollment request.
-  scoped_refptr<net::URLRequestContextGetter> request_context_;
+  // The loader factory to use to perform the auto enrollment request.
+  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
 
   // Specifies the identifier set and the hash of the device's current
   // identifier.
diff --git a/chrome/browser/chromeos/policy/auto_enrollment_client_impl_unittest.cc b/chrome/browser/chromeos/policy/auto_enrollment_client_impl_unittest.cc
index 0d2777d..d07e02b 100644
--- a/chrome/browser/chromeos/policy/auto_enrollment_client_impl_unittest.cc
+++ b/chrome/browser/chromeos/policy/auto_enrollment_client_impl_unittest.cc
@@ -24,8 +24,8 @@
 #include "components/prefs/testing_pref_service.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "crypto/sha2.h"
-#include "net/url_request/url_request_context_getter.h"
-#include "net/url_request/url_request_test_util.h"
+#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
+#include "services/network/test/test_url_loader_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -87,17 +87,18 @@
     auto progress_callback =
         base::BindRepeating(&AutoEnrollmentClientImplTest::ProgressCallback,
                             base::Unretained(this));
-    auto* url_request_context_getter = new net::TestURLRequestContextGetter(
-        base::ThreadTaskRunnerHandle::Get());
+    shared_url_loader_factory_ =
+        base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
+            &url_loader_factory_);
     if (GetParam() == AutoEnrollmentProtocol::kFRE) {
       client_ = AutoEnrollmentClientImpl::FactoryImpl().CreateForFRE(
           progress_callback, service_.get(), local_state_,
-          url_request_context_getter, kStateKey, power_initial, power_limit);
+          shared_url_loader_factory_, kStateKey, power_initial, power_limit);
     } else {
       client_ =
           AutoEnrollmentClientImpl::FactoryImpl().CreateForInitialEnrollment(
               progress_callback, service_.get(), local_state_,
-              url_request_context_getter, kSerialNumber, kBrandCode,
+              shared_url_loader_factory_, kSerialNumber, kBrandCode,
               power_initial, power_limit,
               kInitialEnrollmentModulusPowerOutdatedServer);
     }
@@ -296,6 +297,8 @@
   AutoEnrollmentState state_;
 
  private:
+  network::TestURLLoaderFactory url_loader_factory_;
+  scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory_;
   std::unique_ptr<AutoEnrollmentClient> client_;
   DISALLOW_COPY_AND_ASSIGN(AutoEnrollmentClientImplTest);
 };
diff --git a/chrome/browser/chromeos/policy/fake_auto_enrollment_client.cc b/chrome/browser/chromeos/policy/fake_auto_enrollment_client.cc
index 0d1b50b..b0f865f 100644
--- a/chrome/browser/chromeos/policy/fake_auto_enrollment_client.cc
+++ b/chrome/browser/chromeos/policy/fake_auto_enrollment_client.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/chromeos/policy/fake_auto_enrollment_client.h"
 
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+
 namespace policy {
 
 FakeAutoEnrollmentClient::FactoryImpl::FactoryImpl(
@@ -18,7 +20,7 @@
     const AutoEnrollmentClient::ProgressCallback& progress_callback,
     DeviceManagementService* device_management_service,
     PrefService* local_state,
-    scoped_refptr<net::URLRequestContextGetter> system_request_context,
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
     const std::string& server_backed_state_key,
     int power_initial,
     int power_limit) {
@@ -33,7 +35,7 @@
     const AutoEnrollmentClient::ProgressCallback& progress_callback,
     DeviceManagementService* device_management_service,
     PrefService* local_state,
-    scoped_refptr<net::URLRequestContextGetter> system_request_context,
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
     const std::string& device_serial_number,
     const std::string& device_brand_code,
     int power_initial,
diff --git a/chrome/browser/chromeos/policy/fake_auto_enrollment_client.h b/chrome/browser/chromeos/policy/fake_auto_enrollment_client.h
index d7899b5..9fe6b00b 100644
--- a/chrome/browser/chromeos/policy/fake_auto_enrollment_client.h
+++ b/chrome/browser/chromeos/policy/fake_auto_enrollment_client.h
@@ -14,10 +14,6 @@
 
 class PrefService;
 
-namespace net {
-class URLRequestContextGetter;
-}
-
 namespace policy {
 
 class DeviceManagementService;
@@ -38,7 +34,7 @@
         const ProgressCallback& progress_callback,
         DeviceManagementService* device_management_service,
         PrefService* local_state,
-        scoped_refptr<net::URLRequestContextGetter> system_request_context,
+        scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
         const std::string& server_backed_state_key,
         int power_initial,
         int power_limit) override;
@@ -47,7 +43,7 @@
         const ProgressCallback& progress_callback,
         DeviceManagementService* device_management_service,
         PrefService* local_state,
-        scoped_refptr<net::URLRequestContextGetter> system_request_context,
+        scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
         const std::string& device_serial_number,
         const std::string& device_brand_code,
         int power_initial,
diff --git a/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_unittest.cc b/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_unittest.cc
index 3eeb2a37..b48535a 100644
--- a/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_unittest.cc
+++ b/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_unittest.cc
@@ -261,7 +261,8 @@
   void SimulateOAuth2TokenResponse(const std::string& content) {
     GURL url = GaiaUrls::GetInstance()->oauth2_token_url();
     ASSERT_TRUE(test_url_loader_factory_.IsPending(url.spec()));
-    ASSERT_EQ(url, (*test_url_loader_factory_.pending_requests())[0].url);
+    ASSERT_EQ(url,
+              (*test_url_loader_factory_.pending_requests())[0].request.url);
 
     network::TestURLLoaderFactory::PendingRequest request =
         std::move((*test_url_loader_factory_.pending_requests())[0]);
diff --git a/chrome/browser/policy/cloud/cloud_policy_manager_browsertest.cc b/chrome/browser/policy/cloud/cloud_policy_manager_browsertest.cc
index e73aa4e..4ac58fa 100644
--- a/chrome/browser/policy/cloud/cloud_policy_manager_browsertest.cc
+++ b/chrome/browser/policy/cloud/cloud_policy_manager_browsertest.cc
@@ -6,6 +6,7 @@
 
 #include "base/command_line.h"
 #include "base/run_loop.h"
+#include "base/test/bind_test_util.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/policy/chrome_browser_policy_connector.h"
@@ -22,7 +23,10 @@
 #include "components/policy/proto/device_management_backend.pb.h"
 #include "content/public/browser/browser_thread.h"
 #include "net/base/net_errors.h"
+#include "net/http/http_status_code.h"
 #include "net/url_request/url_request_context_getter.h"
+#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
+#include "services/network/test/test_url_loader_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -67,14 +71,20 @@
     ASSERT_TRUE(PolicyServiceIsEmpty(g_browser_process->policy_service()))
         << "Pre-existing policies in this machine will make this test fail.";
 
-    interceptor_.reset(new TestRequestInterceptor(
-        "localhost", BrowserThread::GetTaskRunnerForThread(BrowserThread::IO)));
+    test_url_loader_factory_ =
+        std::make_unique<network::TestURLLoaderFactory>();
+    test_shared_loader_factory_ =
+        base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
+            test_url_loader_factory_.get());
 
     BrowserPolicyConnector* connector =
         g_browser_process->browser_policy_connector();
     connector->ScheduleServiceInitialization(0);
 
-#if !defined(OS_CHROMEOS)
+#if defined(OS_CHROMEOS)
+    policy_manager()->core()->client()->SetURLLoaderFactoryForTesting(
+        test_shared_loader_factory_);
+#else
     // Mock a signed-in user. This is used by the UserCloudPolicyStore to pass
     // the username to the UserCloudPolicyValidator.
     SigninManager* signin_manager =
@@ -83,22 +93,22 @@
     signin_manager->SetAuthenticatedAccountInfo("12345", "user@example.com");
 
     ASSERT_TRUE(policy_manager());
-    policy_manager()->Connect(
-        g_browser_process->local_state(),
-        g_browser_process->system_request_context(),
-        UserCloudPolicyManager::CreateCloudPolicyClient(
-            connector->device_management_service(),
-            g_browser_process->system_request_context(),
-            g_browser_process->system_network_context_manager()
-                ->GetSharedURLLoaderFactory()));
+    policy_manager()->Connect(g_browser_process->local_state(),
+                              g_browser_process->system_request_context(),
+                              UserCloudPolicyManager::CreateCloudPolicyClient(
+                                  connector->device_management_service(),
+                                  g_browser_process->system_request_context(),
+                                  test_shared_loader_factory_));
 #endif
   }
 
   void TearDownOnMainThread() override {
+    // Need to detach since |test_url_loader_factory_| will go away after this
+    // destructor, but other code might be referencing
+    // |test_shared_loader_factory_|.
+    test_shared_loader_factory_->Detach();
     // Verify that all the expected requests were handled.
-    EXPECT_EQ(0u, interceptor_->GetPendingSize());
-
-    interceptor_.reset();
+    EXPECT_EQ(0, test_url_loader_factory_->NumPending());
   }
 
 #if defined(OS_CHROMEOS)
@@ -147,7 +157,9 @@
     policy_manager()->core()->client()->RemoveObserver(&observer);
   }
 
-  std::unique_ptr<TestRequestInterceptor> interceptor_;
+  std::unique_ptr<network::TestURLLoaderFactory> test_url_loader_factory_;
+  scoped_refptr<network::WeakWrapperSharedURLLoaderFactory>
+      test_shared_loader_factory_;
 };
 
 IN_PROC_BROWSER_TEST_F(CloudPolicyManagerTest, Register) {
@@ -160,8 +172,12 @@
       em::DeviceRegisterRequest::BROWSER;
 #endif
   const bool expect_reregister = false;
-  interceptor_->PushJobCallback(
-      TestRequestInterceptor::RegisterJob(expected_type, expect_reregister));
+  test_url_loader_factory_->SetInterceptor(
+      base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
+        TestRequestInterceptor::RespondToRegisterWithSuccess(
+            expected_type, expect_reregister, request,
+            test_url_loader_factory_.get());
+      }));
 
   EXPECT_FALSE(policy_manager()->core()->client()->is_registered());
   ASSERT_NO_FATAL_FAILURE(Register());
@@ -169,8 +185,12 @@
 }
 
 IN_PROC_BROWSER_TEST_F(CloudPolicyManagerTest, RegisterFails) {
-  // The interceptor makes all requests fail by default; this will trigger
-  // an OnClientError() call on the observer.
+  test_url_loader_factory_->SetInterceptor(
+      base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
+        test_url_loader_factory_->AddResponse(request.url.spec(), std::string(),
+                                              net::HTTP_BAD_REQUEST);
+      }));
+
   EXPECT_FALSE(policy_manager()->core()->client()->is_registered());
   ASSERT_NO_FATAL_FAILURE(Register());
   EXPECT_FALSE(policy_manager()->core()->client()->is_registered());
@@ -180,21 +200,23 @@
   // Fail 4 times with ERR_NETWORK_CHANGED; the first 3 will trigger a retry,
   // the last one will forward the error to the client and unblock the
   // register process.
-  for (int i = 0; i < 4; ++i) {
-    interceptor_->PushJobCallback(
-        TestRequestInterceptor::ErrorJob(net::ERR_NETWORK_CHANGED));
-  }
+  int count = 0;
+  test_url_loader_factory_->SetInterceptor(
+      base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
+        network::URLLoaderCompletionStatus status(net::ERR_NETWORK_CHANGED);
+        test_url_loader_factory_->AddResponse(request.url,
+                                              network::ResourceResponseHead(),
+                                              std::string(), status);
+        ++count;
+      }));
 
   EXPECT_FALSE(policy_manager()->core()->client()->is_registered());
   ASSERT_NO_FATAL_FAILURE(Register());
   EXPECT_FALSE(policy_manager()->core()->client()->is_registered());
+  EXPECT_EQ(4, count);
 }
 
 IN_PROC_BROWSER_TEST_F(CloudPolicyManagerTest, RegisterWithRetry) {
-  // Accept one register request after failing once. The retry request should
-  // set the reregister flag.
-  interceptor_->PushJobCallback(
-      TestRequestInterceptor::ErrorJob(net::ERR_NETWORK_CHANGED));
   em::DeviceRegisterRequest::Type expected_type =
 #if defined(OS_CHROMEOS)
       em::DeviceRegisterRequest::USER;
@@ -202,8 +224,25 @@
       em::DeviceRegisterRequest::BROWSER;
 #endif
   const bool expect_reregister = true;
-  interceptor_->PushJobCallback(
-      TestRequestInterceptor::RegisterJob(expected_type, expect_reregister));
+
+  // Accept one register request after failing once. The retry request should
+  // set the reregister flag.
+  bool gave_error = false;
+  test_url_loader_factory_->SetInterceptor(
+      base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
+        if (!gave_error) {
+          gave_error = true;
+          network::URLLoaderCompletionStatus status(net::ERR_NETWORK_CHANGED);
+          test_url_loader_factory_->AddResponse(request.url,
+                                                network::ResourceResponseHead(),
+                                                std::string(), status);
+          return;
+        }
+
+        TestRequestInterceptor::RespondToRegisterWithSuccess(
+            expected_type, expect_reregister, request,
+            test_url_loader_factory_.get());
+      }));
 
   EXPECT_FALSE(policy_manager()->core()->client()->is_registered());
   ASSERT_NO_FATAL_FAILURE(Register());
diff --git a/chrome/browser/policy/cloud/device_management_service_browsertest.cc b/chrome/browser/policy/cloud/device_management_service_browsertest.cc
index 3d69d00..00c39e6 100644
--- a/chrome/browser/policy/cloud/device_management_service_browsertest.cc
+++ b/chrome/browser/policy/cloud/device_management_service_browsertest.cc
@@ -12,6 +12,7 @@
 #include "base/run_loop.h"
 #include "base/stl_util.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/net/system_network_context_manager.h"
 #include "chrome/browser/policy/cloud/test_request_interceptor.h"
 #include "chrome/browser/policy/test/local_policy_test_server.h"
 #include "chrome/test/base/in_process_browser_test.h"
@@ -21,10 +22,10 @@
 #include "content/public/browser/browser_thread.h"
 #include "net/base/upload_bytes_element_reader.h"
 #include "net/base/upload_data_stream.h"
-#include "net/url_request/url_fetcher.h"
 #include "net/url_request/url_request.h"
-#include "net/url_request/url_request_context_getter.h"
-#include "net/url_request/url_request_test_job.h"
+#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
+#include "services/network/test/test_url_loader_factory.h"
+#include "services/network/test/test_utils.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -42,11 +43,10 @@
 
 // Parses the DeviceManagementRequest in |request_data| and writes a serialized
 // DeviceManagementResponse to |response_data|.
-void ConstructResponse(const char* request_data,
-                       uint64_t request_data_length,
+void ConstructResponse(const std::string& request_data,
                        std::string* response_data) {
   em::DeviceManagementRequest request;
-  ASSERT_TRUE(request.ParseFromArray(request_data, request_data_length));
+  ASSERT_TRUE(request.ParseFromString(request_data));
   em::DeviceManagementResponse response;
   if (request.has_register_request()) {
     response.mutable_register_response()->set_device_management_token(
@@ -68,30 +68,15 @@
   ASSERT_TRUE(response.SerializeToString(response_data));
 }
 
-// JobCallback for the interceptor.
-net::URLRequestJob* ResponseJob(
-    net::URLRequest* request,
-    net::NetworkDelegate* network_delegate) {
-  const net::UploadDataStream* upload = request->get_upload();
-  if (upload != NULL &&
-      upload->GetElementReaders() &&
-      upload->GetElementReaders()->size() == 1 &&
-      (*upload->GetElementReaders())[0]->AsBytesReader()) {
-    std::string response_data;
-    const net::UploadBytesElementReader* bytes_reader =
-        (*upload->GetElementReaders())[0]->AsBytesReader();
-    ConstructResponse(bytes_reader->bytes(),
-                      bytes_reader->length(),
-                      &response_data);
-    return new net::URLRequestTestJob(
-        request,
-        network_delegate,
-        net::URLRequestTestJob::test_headers(),
-        response_data,
-        true);
-  }
+void OnRequest(network::TestURLLoaderFactory* test_factory,
+               const network::ResourceRequest& request) {
+  std::string upload_data(network::GetUploadData(request));
+  if (upload_data.empty())
+    return;
 
-  return NULL;
+  std::string response_data;
+  ConstructResponse(upload_data, &response_data);
+  test_factory->AddResponse(request.url.spec(), response_data);
 }
 
 }  // namespace
@@ -105,8 +90,14 @@
                                const em::DeviceManagementResponse&));
 
   std::string InitCannedResponse() {
-    interceptor_.reset(new TestRequestInterceptor(
-        "localhost", BrowserThread::GetTaskRunnerForThread(BrowserThread::IO)));
+    test_url_loader_factory_ =
+        std::make_unique<network::TestURLLoaderFactory>();
+    test_shared_loader_factory_ =
+        base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
+            test_url_loader_factory_.get());
+    test_url_loader_factory_->SetInterceptor(
+        base::BindRepeating(&OnRequest, test_url_loader_factory_.get()));
+
     return "http://localhost";
   }
 
@@ -122,21 +113,21 @@
   }
 
  protected:
-  void ExpectRequest() {
-    if (interceptor_)
-      interceptor_->PushJobCallback(base::Bind(&ResponseJob));
+  scoped_refptr<network::SharedURLLoaderFactory> GetFactory() {
+    return test_shared_loader_factory_
+               ? test_shared_loader_factory_
+               : g_browser_process->system_network_context_manager()
+                     ->GetSharedURLLoaderFactory();
   }
 
   void PerformRegistration() {
-    ExpectRequest();
     base::RunLoop run_loop;
     EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _, _))
         .WillOnce(DoAll(
             Invoke(this, &DeviceManagementServiceIntegrationTest::RecordToken),
             InvokeWithoutArgs(&run_loop, &base::RunLoop::QuitWhenIdle)));
-    std::unique_ptr<DeviceManagementRequestJob> job(
-        service_->CreateJob(DeviceManagementRequestJob::TYPE_REGISTRATION,
-                            g_browser_process->system_request_context()));
+    std::unique_ptr<DeviceManagementRequestJob> job(service_->CreateJob(
+        DeviceManagementRequestJob::TYPE_REGISTRATION, GetFactory()));
     job->SetGaiaToken("gaia_auth_token");
     job->SetOAuthToken("oauth_token");
     job->SetClientID("testid");
@@ -157,7 +148,6 @@
   void TearDownOnMainThread() override {
     service_.reset();
     test_server_.reset();
-    interceptor_.reset();
   }
 
   void StartTestServer() {
@@ -176,7 +166,8 @@
   std::string robot_auth_code_;
   std::unique_ptr<DeviceManagementService> service_;
   std::unique_ptr<LocalPolicyTestServer> test_server_;
-  std::unique_ptr<TestRequestInterceptor> interceptor_;
+  std::unique_ptr<network::TestURLLoaderFactory> test_url_loader_factory_;
+  scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
 };
 
 IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, Registration) {
@@ -188,15 +179,13 @@
                        ApiAuthCodeFetch) {
   PerformRegistration();
 
-  ExpectRequest();
   base::RunLoop run_loop;
   EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _, _))
       .WillOnce(DoAll(
           Invoke(this, &DeviceManagementServiceIntegrationTest::RecordAuthCode),
           InvokeWithoutArgs(&run_loop, &base::RunLoop::QuitWhenIdle)));
-  std::unique_ptr<DeviceManagementRequestJob> job(
-      service_->CreateJob(DeviceManagementRequestJob::TYPE_API_AUTH_CODE_FETCH,
-                          g_browser_process->system_request_context()));
+  std::unique_ptr<DeviceManagementRequestJob> job(service_->CreateJob(
+      DeviceManagementRequestJob::TYPE_API_AUTH_CODE_FETCH, GetFactory()));
   job->SetDMToken(token_);
   job->SetClientID("testid");
   em::DeviceServiceApiAccessRequest* request =
@@ -212,13 +201,11 @@
 IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, PolicyFetch) {
   PerformRegistration();
 
-  ExpectRequest();
   base::RunLoop run_loop;
   EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _, _))
       .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::QuitWhenIdle));
-  std::unique_ptr<DeviceManagementRequestJob> job(
-      service_->CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH,
-                          g_browser_process->system_request_context()));
+  std::unique_ptr<DeviceManagementRequestJob> job(service_->CreateJob(
+      DeviceManagementRequestJob::TYPE_POLICY_FETCH, GetFactory()));
   job->SetDMToken(token_);
   job->SetClientID("testid");
   em::DevicePolicyRequest* request =
@@ -232,13 +219,11 @@
 IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, Unregistration) {
   PerformRegistration();
 
-  ExpectRequest();
   base::RunLoop run_loop;
   EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _, _))
       .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::QuitWhenIdle));
-  std::unique_ptr<DeviceManagementRequestJob> job(
-      service_->CreateJob(DeviceManagementRequestJob::TYPE_UNREGISTRATION,
-                          g_browser_process->system_request_context()));
+  std::unique_ptr<DeviceManagementRequestJob> job(service_->CreateJob(
+      DeviceManagementRequestJob::TYPE_UNREGISTRATION, GetFactory()));
   job->SetDMToken(token_);
   job->SetClientID("testid");
   job->GetRequest()->mutable_unregister_request();
@@ -248,13 +233,11 @@
 }
 
 IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, AutoEnrollment) {
-  ExpectRequest();
   base::RunLoop run_loop;
   EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _, _))
       .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::QuitWhenIdle));
-  std::unique_ptr<DeviceManagementRequestJob> job(
-      service_->CreateJob(DeviceManagementRequestJob::TYPE_AUTO_ENROLLMENT,
-                          g_browser_process->system_request_context()));
+  std::unique_ptr<DeviceManagementRequestJob> job(service_->CreateJob(
+      DeviceManagementRequestJob::TYPE_AUTO_ENROLLMENT, GetFactory()));
   job->SetClientID("testid");
   job->GetRequest()->mutable_auto_enrollment_request()->set_remainder(0);
   job->GetRequest()->mutable_auto_enrollment_request()->set_modulus(1);
@@ -267,13 +250,12 @@
                        AppInstallReport) {
   PerformRegistration();
 
-  ExpectRequest();
   base::RunLoop run_loop;
   EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _, _))
       .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::QuitWhenIdle));
   std::unique_ptr<DeviceManagementRequestJob> job(service_->CreateJob(
       DeviceManagementRequestJob::TYPE_UPLOAD_APP_INSTALL_REPORT,
-      g_browser_process->system_request_context()));
+      GetFactory()));
   job->SetDMToken(token_);
   job->SetClientID("testid");
   job->GetRequest()->mutable_app_install_report_request();
diff --git a/chrome/browser/policy/cloud/machine_level_user_cloud_policy_browsertest.cc b/chrome/browser/policy/cloud/machine_level_user_cloud_policy_browsertest.cc
index 1eedd0c6..dbdd4867 100644
--- a/chrome/browser/policy/cloud/machine_level_user_cloud_policy_browsertest.cc
+++ b/chrome/browser/policy/cloud/machine_level_user_cloud_policy_browsertest.cc
@@ -20,6 +20,7 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_browser_main.h"
 #include "chrome/browser/chrome_browser_main_extra_parts.h"
+#include "chrome/browser/net/system_network_context_manager.h"
 #include "chrome/browser/policy/browser_dm_token_storage.h"
 #include "chrome/browser/policy/chrome_browser_policy_connector.h"
 #include "chrome/browser/policy/machine_level_user_cloud_policy_controller.h"
@@ -38,10 +39,6 @@
 #include "content/public/browser/browser_thread.h"
 #include "net/base/upload_bytes_element_reader.h"
 #include "net/base/upload_data_stream.h"
-#include "net/url_request/url_fetcher.h"
-#include "net/url_request/url_request.h"
-#include "net/url_request/url_request_context_getter.h"
-#include "net/url_request/url_request_test_job.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/views/test/widget_test.h"
@@ -187,7 +184,8 @@
     }
     std::unique_ptr<DeviceManagementRequestJob> job(
         service_->CreateJob(DeviceManagementRequestJob::TYPE_TOKEN_ENROLLMENT,
-                            g_browser_process->system_request_context()));
+                            g_browser_process->system_network_context_manager()
+                                ->GetSharedURLLoaderFactory()));
     job->GetRequest()->mutable_register_browser_request();
     if (!machine_name.empty()) {
       job->GetRequest()->mutable_register_browser_request()->set_machine_name(
@@ -213,7 +211,8 @@
 
     std::unique_ptr<DeviceManagementRequestJob> job(service_->CreateJob(
         DeviceManagementRequestJob::TYPE_CHROME_DESKTOP_REPORT,
-        g_browser_process->system_request_context()));
+        g_browser_process->system_network_context_manager()
+            ->GetSharedURLLoaderFactory()));
 
     em::DeviceManagementRequest* request = job->GetRequest();
     if (chrome_desktop_report) {
diff --git a/chrome/browser/policy/cloud/test_request_interceptor.cc b/chrome/browser/policy/cloud/test_request_interceptor.cc
index 423c72f..ae4a200 100644
--- a/chrome/browser/policy/cloud/test_request_interceptor.cc
+++ b/chrome/browser/policy/cloud/test_request_interceptor.cc
@@ -25,6 +25,8 @@
 #include "net/url_request/url_request_filter.h"
 #include "net/url_request/url_request_interceptor.h"
 #include "net/url_request/url_request_test_job.h"
+#include "services/network/test/test_url_loader_factory.h"
+#include "services/network/test/test_utils.h"
 #include "url/gurl.h"
 
 namespace em = enterprise_management;
@@ -68,87 +70,23 @@
 // request. The query string in the URL must contain the |expected_type| for
 // the "request" parameter. Returns true if all checks succeeded, and the
 // request data has been parsed into |request_msg|.
-bool ValidRequest(net::URLRequest* request,
+bool ValidRequest(const std::string& method,
+                  const GURL& url,
+                  const std::string& data,
                   const std::string& expected_type,
                   em::DeviceManagementRequest* request_msg) {
-  if (request->method() != "POST")
+  if (method != "POST")
     return false;
-  std::string spec = request->url().spec();
+  std::string spec = url.spec();
   if (spec.find("request=" + expected_type) == std::string::npos)
     return false;
 
-  // This assumes that the payload data was set from a single string. In that
-  // case the UploadDataStream has a single UploadBytesElementReader with the
-  // data in memory.
-  const net::UploadDataStream* stream = request->get_upload();
-  if (!stream)
-    return false;
-  const std::vector<std::unique_ptr<net::UploadElementReader>>* readers =
-      stream->GetElementReaders();
-  if (!readers || readers->size() != 1u)
-    return false;
-  const net::UploadBytesElementReader* reader = (*readers)[0]->AsBytesReader();
-  if (!reader)
-    return false;
-  std::string data(reader->bytes(), reader->length());
   if (!request_msg->ParseFromString(data))
     return false;
 
   return true;
 }
 
-// Helper callback for register jobs that should suceed. Validates the request
-// parameters and returns an appropriate response job. If |expect_reregister|
-// is true then the reregister flag must be set in the DeviceRegisterRequest
-// protobuf.
-net::URLRequestJob* RegisterJobCallback(
-    em::DeviceRegisterRequest::Type expected_type,
-    bool expect_reregister,
-    net::URLRequest* request,
-    net::NetworkDelegate* network_delegate) {
-  em::DeviceManagementRequest request_msg;
-  if (!ValidRequest(request, "register", &request_msg))
-    return BadRequestJobCallback(request, network_delegate);
-
-  if (!request_msg.has_register_request() ||
-      request_msg.has_unregister_request() ||
-      request_msg.has_policy_request() ||
-      request_msg.has_device_status_report_request() ||
-      request_msg.has_session_status_report_request() ||
-      request_msg.has_auto_enrollment_request()) {
-    return BadRequestJobCallback(request, network_delegate);
-  }
-
-  const em::DeviceRegisterRequest& register_request =
-      request_msg.register_request();
-  if (expect_reregister &&
-      (!register_request.has_reregister() || !register_request.reregister())) {
-    return BadRequestJobCallback(request, network_delegate);
-  } else if (!expect_reregister &&
-             register_request.has_reregister() &&
-             register_request.reregister()) {
-    return BadRequestJobCallback(request, network_delegate);
-  }
-
-  if (!register_request.has_type() || register_request.type() != expected_type)
-    return BadRequestJobCallback(request, network_delegate);
-
-  em::DeviceManagementResponse response;
-  em::DeviceRegisterResponse* register_response =
-      response.mutable_register_response();
-  register_response->set_device_management_token("s3cr3t70k3n");
-  std::string data;
-  response.SerializeToString(&data);
-
-  static const char kGoodHeaders[] =
-      "HTTP/1.1 200 OK\n"
-      "Content-type: application/protobuf\n"
-      "\n";
-  std::string headers(kGoodHeaders, arraysize(kGoodHeaders));
-  return new net::URLRequestTestJob(
-      request, network_delegate, headers, data, true);
-}
-
 void RegisterHttpInterceptor(
     const std::string& hostname,
     std::unique_ptr<net::URLRequestInterceptor> interceptor) {
@@ -160,6 +98,14 @@
   net::URLRequestFilter::GetInstance()->RemoveHostnameHandler("http", hostname);
 }
 
+void RespondWithBadResponse(const network::ResourceRequest& request,
+                            network::TestURLLoaderFactory* factory) {
+  network::URLLoaderCompletionStatus status;
+  factory->AddResponse(
+      request.url, network::ResourceResponseHead(), std::string(),
+      network::URLLoaderCompletionStatus(net::ERR_NETWORK_CHANGED));
+}
+
 }  // namespace
 
 class TestRequestInterceptor::Delegate : public net::URLRequestInterceptor {
@@ -320,10 +266,63 @@
 }
 
 // static
-TestRequestInterceptor::JobCallback TestRequestInterceptor::RegisterJob(
+void TestRequestInterceptor::RespondToRegisterWithSuccess(
     em::DeviceRegisterRequest::Type expected_type,
-    bool expect_reregister) {
-  return base::Bind(&RegisterJobCallback, expected_type, expect_reregister);
+    bool expect_reregister,
+    const network::ResourceRequest& request,
+    network::TestURLLoaderFactory* factory) {
+  em::DeviceManagementRequest request_msg;
+  if (!ValidRequest(request.method, request.url,
+                    network::GetUploadData(request), "register",
+                    &request_msg)) {
+    RespondWithBadResponse(request, factory);
+    return;
+  }
+
+  if (!request_msg.has_register_request() ||
+      request_msg.has_unregister_request() ||
+      request_msg.has_policy_request() ||
+      request_msg.has_device_status_report_request() ||
+      request_msg.has_session_status_report_request() ||
+      request_msg.has_auto_enrollment_request()) {
+    RespondWithBadResponse(request, factory);
+    return;
+  }
+
+  const em::DeviceRegisterRequest& register_request =
+      request_msg.register_request();
+  if (expect_reregister &&
+      (!register_request.has_reregister() || !register_request.reregister())) {
+    RespondWithBadResponse(request, factory);
+    return;
+  } else if (!expect_reregister && register_request.has_reregister() &&
+             register_request.reregister()) {
+    RespondWithBadResponse(request, factory);
+    return;
+  }
+
+  if (!register_request.has_type() ||
+      register_request.type() != expected_type) {
+    RespondWithBadResponse(request, factory);
+    return;
+  }
+
+  std::string content;
+  network::URLLoaderCompletionStatus status;
+
+  em::DeviceManagementResponse response;
+  em::DeviceRegisterResponse* register_response =
+      response.mutable_register_response();
+  register_response->set_device_management_token("s3cr3t70k3n");
+  response.SerializeToString(&content);
+
+  status.decoded_body_length = content.size();
+
+  network::ResourceResponseHead head =
+      network::TestURLLoaderFactory::CreateResourceResponseHead(net::HTTP_OK);
+  head.mime_type = "application/protobuf";
+
+  factory->AddResponse(request.url, head, content, status);
 }
 
 // static
diff --git a/chrome/browser/policy/cloud/test_request_interceptor.h b/chrome/browser/policy/cloud/test_request_interceptor.h
index 952a8bcd..ff6a405 100644
--- a/chrome/browser/policy/cloud/test_request_interceptor.h
+++ b/chrome/browser/policy/cloud/test_request_interceptor.h
@@ -25,6 +25,11 @@
 class URLRequestJob;
 }
 
+namespace network {
+struct ResourceRequest;
+class TestURLLoaderFactory;
+}  // namespace network
+
 namespace policy {
 
 // Intercepts all requests to the given hostname while in scope, and allows
@@ -64,15 +69,17 @@
   // "404 Not Found").
   static JobCallback HttpErrorJob(std::string error);
 
-  // Returns a JobCallback that will process a policy register request that
-  // should succeed. The request parameters are validated, and an appropriate
-  // response is sent back.
+  // Process a policy register request that should succeed. The request
+  // parameters are validated, and an appropriate response is registered with
+  // |factory|.
   // |expected_type| is the expected type in the register request.
   // If |expect_reregister| is true then the request must have the reregister
   // flag set; otherwise the flag must be not set.
-  static JobCallback RegisterJob(
+  static void RespondToRegisterWithSuccess(
       enterprise_management::DeviceRegisterRequest::Type expected_type,
-      bool expect_reregister);
+      bool expect_reregister,
+      const network::ResourceRequest& request,
+      network::TestURLLoaderFactory* factory);
 
   // Returns a JobCallback that will send the contents of |file_path|.
   static JobCallback FileJob(const base::FilePath& file_path);
diff --git a/components/policy/core/common/BUILD.gn b/components/policy/core/common/BUILD.gn
index d36c8c4..791e76d 100644
--- a/components/policy/core/common/BUILD.gn
+++ b/components/policy/core/common/BUILD.gn
@@ -376,6 +376,7 @@
     "//extensions/buildflags",
     "//google_apis",
     "//net:test_support",
+    "//services/network:test_support",
     "//testing/gmock",
     "//testing/gtest",
     "//third_party/libxml",
diff --git a/components/policy/core/common/DEPS b/components/policy/core/common/DEPS
index f3bf9a7..f22be7b3 100644
--- a/components/policy/core/common/DEPS
+++ b/components/policy/core/common/DEPS
@@ -4,5 +4,6 @@
   "+components/crash/core/common/crash_key.h",  # Remove once https://crbug.com/685996 is fixed.
   "+components/data_use_measurement/core",
   "+extensions/buildflags",
+  "+services/network/test",
   "+third_party/libxml",
 ]
diff --git a/components/policy/core/common/cloud/cloud_policy_client.cc b/components/policy/core/common/cloud/cloud_policy_client.cc
index 5c781a9..ee50856 100644
--- a/components/policy/core/common/cloud/cloud_policy_client.cc
+++ b/components/policy/core/common/cloud/cloud_policy_client.cc
@@ -160,9 +160,8 @@
 
   SetClientId(client_id);
 
-  policy_fetch_request_job_.reset(
-      service_->CreateJob(DeviceManagementRequestJob::TYPE_REGISTRATION,
-                          GetRequestContext()));
+  policy_fetch_request_job_.reset(service_->CreateJob(
+      DeviceManagementRequestJob::TYPE_REGISTRATION, GetURLLoaderFactory()));
   policy_fetch_request_job_->SetOAuthToken(auth_token);
   policy_fetch_request_job_->SetClientID(client_id_);
 
@@ -248,8 +247,9 @@
 
   SetClientId(client_id);
 
-  policy_fetch_request_job_.reset(service_->CreateJob(
-      DeviceManagementRequestJob::TYPE_TOKEN_ENROLLMENT, GetRequestContext()));
+  policy_fetch_request_job_.reset(
+      service_->CreateJob(DeviceManagementRequestJob::TYPE_TOKEN_ENROLLMENT,
+                          GetURLLoaderFactory()));
   policy_fetch_request_job_->SetEnrollmentToken(token);
   policy_fetch_request_job_->SetClientID(client_id_);
 
@@ -276,10 +276,9 @@
     return;
   }
 
-  policy_fetch_request_job_.reset(
-      service_->CreateJob(
-          DeviceManagementRequestJob::TYPE_CERT_BASED_REGISTRATION,
-          GetRequestContext()));
+  policy_fetch_request_job_.reset(service_->CreateJob(
+      DeviceManagementRequestJob::TYPE_CERT_BASED_REGISTRATION,
+      GetURLLoaderFactory()));
   policy_fetch_request_job_->SetClientID(client_id_);
   em::SignedData* signed_request = policy_fetch_request_job_->GetRequest()->
       mutable_certificate_based_register_request()->mutable_signed_request();
@@ -304,9 +303,8 @@
   CHECK(is_registered());
   CHECK(!types_to_fetch_.empty());
 
-  policy_fetch_request_job_.reset(
-      service_->CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH,
-                          GetRequestContext()));
+  policy_fetch_request_job_.reset(service_->CreateJob(
+      DeviceManagementRequestJob::TYPE_POLICY_FETCH, GetURLLoaderFactory()));
   policy_fetch_request_job_->SetDMToken(dm_token_);
   policy_fetch_request_job_->SetClientID(client_id_);
   if (!public_key_version_valid_)
@@ -368,9 +366,9 @@
 void CloudPolicyClient::FetchRobotAuthCodes(const std::string& auth_token) {
   CHECK(is_registered());
 
-  policy_fetch_request_job_.reset(service_->CreateJob(
-      DeviceManagementRequestJob::TYPE_API_AUTH_CODE_FETCH,
-      GetRequestContext()));
+  policy_fetch_request_job_.reset(
+      service_->CreateJob(DeviceManagementRequestJob::TYPE_API_AUTH_CODE_FETCH,
+                          GetURLLoaderFactory()));
   policy_fetch_request_job_->SetOAuthToken(auth_token);
   policy_fetch_request_job_->SetDMToken(dm_token_);
   policy_fetch_request_job_->SetClientID(client_id_);
@@ -390,9 +388,8 @@
 
 void CloudPolicyClient::Unregister() {
   DCHECK(service_);
-  policy_fetch_request_job_.reset(
-      service_->CreateJob(DeviceManagementRequestJob::TYPE_UNREGISTRATION,
-                          GetRequestContext()));
+  policy_fetch_request_job_.reset(service_->CreateJob(
+      DeviceManagementRequestJob::TYPE_UNREGISTRATION, GetURLLoaderFactory()));
   policy_fetch_request_job_->SetDMToken(dm_token_);
   policy_fetch_request_job_->SetClientID(client_id_);
   policy_fetch_request_job_->GetRequest()->mutable_unregister_request();
@@ -423,7 +420,7 @@
   CHECK(is_registered());
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       service_->CreateJob(DeviceManagementRequestJob::TYPE_UPLOAD_CERTIFICATE,
-                          GetRequestContext()));
+                          GetURLLoaderFactory()));
   request_job->SetDMToken(dm_token_);
   request_job->SetClientID(client_id_);
 
@@ -448,7 +445,7 @@
   // Should pass in at least one type of status.
   DCHECK(device_status || session_status);
   std::unique_ptr<DeviceManagementRequestJob> request_job(service_->CreateJob(
-      DeviceManagementRequestJob::TYPE_UPLOAD_STATUS, GetRequestContext()));
+      DeviceManagementRequestJob::TYPE_UPLOAD_STATUS, GetURLLoaderFactory()));
   request_job->SetDMToken(dm_token_);
   request_job->SetClientID(client_id_);
 
@@ -474,7 +471,7 @@
   DCHECK(chrome_desktop_report);
   std::unique_ptr<DeviceManagementRequestJob> request_job(service_->CreateJob(
       DeviceManagementRequestJob::TYPE_CHROME_DESKTOP_REPORT,
-      GetRequestContext()));
+      GetURLLoaderFactory()));
 
   request_job->SetDMToken(dm_token_);
   request_job->SetClientID(client_id_);
@@ -499,7 +496,7 @@
 
   std::unique_ptr<DeviceManagementRequestJob> request_job(service_->CreateJob(
       DeviceManagementRequestJob::TYPE_UPLOAD_APP_INSTALL_REPORT,
-      GetRequestContext()));
+      GetURLLoaderFactory()));
   request_job->SetDMToken(dm_token_);
   request_job->SetClientID(client_id_);
 
@@ -529,7 +526,7 @@
     const RemoteCommandCallback& callback) {
   CHECK(is_registered());
   std::unique_ptr<DeviceManagementRequestJob> request_job(service_->CreateJob(
-      DeviceManagementRequestJob::TYPE_REMOTE_COMMANDS, GetRequestContext()));
+      DeviceManagementRequestJob::TYPE_REMOTE_COMMANDS, GetURLLoaderFactory()));
 
   request_job->SetDMToken(dm_token_);
   request_job->SetClientID(client_id_);
@@ -559,7 +556,7 @@
 
   std::unique_ptr<DeviceManagementRequestJob> request_job(service_->CreateJob(
       DeviceManagementRequestJob::TYPE_ATTRIBUTE_UPDATE_PERMISSION,
-      GetRequestContext()));
+      GetURLLoaderFactory()));
 
   request_job->SetOAuthToken(auth_token);
   request_job->SetClientID(client_id_);
@@ -583,8 +580,9 @@
   CHECK(is_registered());
   DCHECK(!auth_token.empty());
 
-  std::unique_ptr<DeviceManagementRequestJob> request_job(service_->CreateJob(
-      DeviceManagementRequestJob::TYPE_ATTRIBUTE_UPDATE, GetRequestContext()));
+  std::unique_ptr<DeviceManagementRequestJob> request_job(
+      service_->CreateJob(DeviceManagementRequestJob::TYPE_ATTRIBUTE_UPDATE,
+                          GetURLLoaderFactory()));
 
   request_job->SetOAuthToken(auth_token);
   request_job->SetClientID(client_id_);
@@ -610,7 +608,7 @@
 
   std::unique_ptr<DeviceManagementRequestJob> request_job(service_->CreateJob(
       DeviceManagementRequestJob::TYPE_REQUEST_LICENSE_TYPES,
-      GetRequestContext()));
+      GetURLLoaderFactory()));
 
   request_job->SetOAuthToken(auth_token);
 
@@ -630,7 +628,7 @@
   CHECK(is_registered());
 
   std::unique_ptr<DeviceManagementRequestJob> request_job(service_->CreateJob(
-      DeviceManagementRequestJob::TYPE_GCM_ID_UPDATE, GetRequestContext()));
+      DeviceManagementRequestJob::TYPE_GCM_ID_UPDATE, GetURLLoaderFactory()));
 
   request_job->SetDMToken(dm_token_);
   request_job->SetClientID(client_id_);
@@ -694,6 +692,11 @@
   return request_jobs_.size();
 }
 
+void CloudPolicyClient::SetURLLoaderFactoryForTesting(
+    scoped_refptr<network::SharedURLLoaderFactory> factory) {
+  url_loader_factory_ = factory;
+}
+
 void CloudPolicyClient::UploadCertificate(
     const std::string& certificate_data,
     em::DeviceCertUploadRequest::CertificateType certificate_type,
@@ -701,7 +704,7 @@
   CHECK(is_registered());
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       service_->CreateJob(DeviceManagementRequestJob::TYPE_UPLOAD_CERTIFICATE,
-                          GetRequestContext()));
+                          GetURLLoaderFactory()));
   request_job->SetDMToken(dm_token_);
   request_job->SetClientID(client_id_);
 
diff --git a/components/policy/core/common/cloud/cloud_policy_client.h b/components/policy/core/common/cloud/cloud_policy_client.h
index f0a7e025..fb691219 100644
--- a/components/policy/core/common/cloud/cloud_policy_client.h
+++ b/components/policy/core/common/cloud/cloud_policy_client.h
@@ -360,6 +360,9 @@
   // Returns the number of active requests.
   int GetActiveRequestCountForTest() const;
 
+  void SetURLLoaderFactoryForTesting(
+      scoped_refptr<network::SharedURLLoaderFactory> factory);
+
  protected:
   // A set of (policy type, settings entity ID) pairs to fetch.
   typedef std::set<std::pair<std::string, std::string>> PolicyTypeSet;
diff --git a/components/policy/core/common/cloud/cloud_policy_client_unittest.cc b/components/policy/core/common/cloud/cloud_policy_client_unittest.cc
index 0d2d3d2..af54fed 100644
--- a/components/policy/core/common/cloud/cloud_policy_client_unittest.cc
+++ b/components/policy/core/common/cloud/cloud_policy_client_unittest.cc
@@ -24,8 +24,8 @@
 #include "components/policy/core/common/cloud/mock_signing_service.h"
 #include "components/policy/proto/device_management_backend.pb.h"
 #include "net/url_request/url_request_context_getter.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/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -268,11 +268,12 @@
     if (client_)
       client_->RemoveObserver(&observer_);
 
-    request_context_ =
-        new net::TestURLRequestContextGetter(loop_.task_runner());
+    shared_url_loader_factory_ =
+        base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
+            &url_loader_factory_);
     client_ = std::make_unique<CloudPolicyClient>(
-        kMachineID, kMachineModel, kBrandCode, &service_, request_context_,
-        /*url_loader_factory_*/ nullptr, &fake_signing_service_,
+        kMachineID, kMachineModel, kBrandCode, &service_, nullptr,
+        shared_url_loader_factory_, &fake_signing_service_,
         base::BindRepeating(
             &MockDeviceDMTokenCallbackObserver::OnDeviceDMTokenRequested,
             base::Unretained(&device_dmtoken_callback_observer_)));
@@ -283,7 +284,7 @@
   void ExpectRegistration(const std::string& oauth_token) {
     EXPECT_CALL(service_,
                 CreateJob(DeviceManagementRequestJob::TYPE_REGISTRATION,
-                          request_context_))
+                          shared_url_loader_factory_))
         .WillOnce(service_.SucceedJob(registration_response_));
     EXPECT_CALL(service_,
                 StartJob(dm_protocol::kValueRequestRegister, std::string(),
@@ -295,9 +296,10 @@
   void ExpectCertBasedRegistration() {
     EXPECT_CALL(device_dmtoken_callback_observer_, OnDeviceDMTokenRequested(_))
         .WillOnce(Return(kDeviceDMToken));
-    EXPECT_CALL(service_, CreateJob(
-        DeviceManagementRequestJob::TYPE_CERT_BASED_REGISTRATION,
-        request_context_))
+    EXPECT_CALL(
+        service_,
+        CreateJob(DeviceManagementRequestJob::TYPE_CERT_BASED_REGISTRATION,
+                  shared_url_loader_factory_))
         .WillOnce(service_.SucceedJob(registration_response_));
     EXPECT_CALL(service_,
                 StartJob(dm_protocol::kValueRequestCertBasedRegister,
@@ -309,7 +311,7 @@
   void ExpectEnrollmentTokenBasedRegistration() {
     EXPECT_CALL(service_,
                 CreateJob(DeviceManagementRequestJob::TYPE_TOKEN_ENROLLMENT,
-                          request_context_))
+                          shared_url_loader_factory_))
         .WillOnce(service_.SucceedJob(registration_response_));
     EXPECT_CALL(service_, StartJob(dm_protocol::kValueRequestTokenEnrollment,
                                    std::string(), std::string(), std::string(),
@@ -320,7 +322,7 @@
   void ExpectPolicyFetch(const std::string& dm_token) {
     EXPECT_CALL(service_,
                 CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH,
-                          request_context_))
+                          shared_url_loader_factory_))
         .WillOnce(service_.SucceedJob(policy_response_));
     EXPECT_CALL(service_,
                 StartJob(dm_protocol::kValueRequestPolicy, std::string(),
@@ -331,7 +333,7 @@
   void ExpectUnregistration(const std::string& dm_token) {
     EXPECT_CALL(service_,
                 CreateJob(DeviceManagementRequestJob::TYPE_UNREGISTRATION,
-                          request_context_))
+                          shared_url_loader_factory_))
         .WillOnce(service_.SucceedJob(unregistration_response_));
     EXPECT_CALL(service_,
                 StartJob(dm_protocol::kValueRequestUnregister, std::string(),
@@ -342,7 +344,7 @@
   void ExpectUploadCertificate(const em::DeviceManagementRequest& request) {
     EXPECT_CALL(service_,
                 CreateJob(DeviceManagementRequestJob::TYPE_UPLOAD_CERTIFICATE,
-                          request_context_))
+                          shared_url_loader_factory_))
         .WillOnce(service_.SucceedJob(upload_certificate_response_));
     EXPECT_CALL(service_, StartJob(dm_protocol::kValueRequestUploadCertificate,
                                    std::string(), std::string(), kDMToken,
@@ -352,7 +354,7 @@
   void ExpectUploadStatus() {
     EXPECT_CALL(service_,
                 CreateJob(DeviceManagementRequestJob::TYPE_UPLOAD_STATUS,
-                          request_context_))
+                          shared_url_loader_factory_))
         .WillOnce(service_.SucceedJob(upload_status_response_));
     EXPECT_CALL(service_,
                 StartJob(dm_protocol::kValueRequestUploadStatus,
@@ -364,7 +366,7 @@
     EXPECT_CALL(
         service_,
         CreateJob(DeviceManagementRequestJob::TYPE_CHROME_DESKTOP_REPORT,
-                  request_context_))
+                  shared_url_loader_factory_))
         .WillOnce(service_.SucceedJob(chrome_desktop_report_response_));
     EXPECT_CALL(service_,
                 StartJob(dm_protocol::kValueRequestChromeDesktopReport,
@@ -375,7 +377,7 @@
   void ExpectFetchRemoteCommands() {
     EXPECT_CALL(service_,
                 CreateJob(DeviceManagementRequestJob::TYPE_REMOTE_COMMANDS,
-                          request_context_))
+                          shared_url_loader_factory_))
         .WillOnce(service_.SucceedJob(remote_command_response_));
     EXPECT_CALL(service_,
                 StartJob(dm_protocol::kValueRequestRemoteCommands,
@@ -384,11 +386,11 @@
   }
 
   void ExpectAttributeUpdatePermission(const std::string& oauth_token) {
-    EXPECT_CALL(service_,
-          CreateJob(
-              DeviceManagementRequestJob::TYPE_ATTRIBUTE_UPDATE_PERMISSION,
-              request_context_))
-          .WillOnce(service_.SucceedJob(attribute_update_permission_response_));
+    EXPECT_CALL(
+        service_,
+        CreateJob(DeviceManagementRequestJob::TYPE_ATTRIBUTE_UPDATE_PERMISSION,
+                  shared_url_loader_factory_))
+        .WillOnce(service_.SucceedJob(attribute_update_permission_response_));
     EXPECT_CALL(service_,
                 StartJob(
                     dm_protocol::kValueRequestDeviceAttributeUpdatePermission,
@@ -400,7 +402,7 @@
   void ExpectAttributeUpdate(const std::string& oauth_token) {
     EXPECT_CALL(service_,
                 CreateJob(DeviceManagementRequestJob::TYPE_ATTRIBUTE_UPDATE,
-                          request_context_))
+                          shared_url_loader_factory_))
         .WillOnce(service_.SucceedJob(attribute_update_response_));
     EXPECT_CALL(service_,
                 StartJob(dm_protocol::kValueRequestDeviceAttributeUpdate,
@@ -411,7 +413,7 @@
   void ExpectGcmIdUpdate() {
     EXPECT_CALL(service_,
                 CreateJob(DeviceManagementRequestJob::TYPE_GCM_ID_UPDATE,
-                          request_context_))
+                          shared_url_loader_factory_))
         .WillOnce(service_.SucceedJob(gcm_id_update_response_));
     EXPECT_CALL(service_,
                 StartJob(dm_protocol::kValueRequestGcmIdUpdate, std::string(),
@@ -424,7 +426,7 @@
     EXPECT_CALL(
         service_,
         CreateJob(DeviceManagementRequestJob::TYPE_REQUEST_LICENSE_TYPES,
-                  request_context_))
+                  shared_url_loader_factory_))
         .WillOnce(service_.SucceedJob(response));
     EXPECT_CALL(service_, StartJob(dm_protocol::kValueRequestCheckDeviceLicense,
                                    std::string(), oauth_token, std::string(),
@@ -438,13 +440,13 @@
       EXPECT_CALL(
           service_,
           CreateJob(DeviceManagementRequestJob::TYPE_UPLOAD_APP_INSTALL_REPORT,
-                    request_context_))
+                    shared_url_loader_factory_))
           .WillOnce(service_.CreateAsyncJob(async_job));
     } else {
       EXPECT_CALL(
           service_,
           CreateJob(DeviceManagementRequestJob::TYPE_UPLOAD_APP_INSTALL_REPORT,
-                    request_context_))
+                    shared_url_loader_factory_))
           .WillOnce(service_.SucceedJob(upload_app_install_report_response_));
     }
     EXPECT_CALL(service_, StartJob(dm_protocol::kValueRequestAppInstallReport,
@@ -508,8 +510,8 @@
       device_dmtoken_callback_observer_;
   FakeSigningService fake_signing_service_;
   std::unique_ptr<CloudPolicyClient> client_;
-  // Pointer to the client's request context.
-  scoped_refptr<net::URLRequestContextGetter> request_context_;
+  network::TestURLLoaderFactory url_loader_factory_;
+  scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory_;
 };
 
 TEST_F(CloudPolicyClientTest, Init) {
@@ -646,9 +648,8 @@
 }
 
 TEST_F(CloudPolicyClientTest, RegistrationFailure) {
-  EXPECT_CALL(service_,
-              CreateJob(DeviceManagementRequestJob::TYPE_REGISTRATION,
-                        request_context_))
+  EXPECT_CALL(service_, CreateJob(DeviceManagementRequestJob::TYPE_REGISTRATION,
+                                  shared_url_loader_factory_))
       .WillOnce(service_.FailJob(DM_STATUS_REQUEST_FAILED));
   EXPECT_CALL(service_, StartJob(_, _, _, _, _, _));
   EXPECT_CALL(observer_, OnClientError(_));
@@ -667,9 +668,8 @@
   EXPECT_FALSE(
       registration_request_.mutable_register_request()->has_reregister());
   MockDeviceManagementJob* register_job = nullptr;
-  EXPECT_CALL(service_,
-              CreateJob(DeviceManagementRequestJob::TYPE_REGISTRATION,
-                        request_context_))
+  EXPECT_CALL(service_, CreateJob(DeviceManagementRequestJob::TYPE_REGISTRATION,
+                                  shared_url_loader_factory_))
       .WillOnce(service_.CreateAsyncJob(®ister_job));
   EXPECT_CALL(service_,
               StartJob(dm_protocol::kValueRequestRegister, std::string(),
@@ -793,9 +793,8 @@
 TEST_F(CloudPolicyClientTest, PolicyRequestFailure) {
   Register();
 
-  EXPECT_CALL(service_,
-              CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH,
-                        request_context_))
+  EXPECT_CALL(service_, CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH,
+                                  shared_url_loader_factory_))
       .WillOnce(service_.FailJob(DM_STATUS_REQUEST_FAILED));
   EXPECT_CALL(service_, StartJob(_, _, _, _, _, _));
   EXPECT_CALL(observer_, OnClientError(_));
@@ -820,7 +819,7 @@
   unregistration_response_.clear_unregister_response();
   EXPECT_CALL(service_,
               CreateJob(DeviceManagementRequestJob::TYPE_UNREGISTRATION,
-                        request_context_))
+                        shared_url_loader_factory_))
       .WillOnce(service_.SucceedJob(unregistration_response_));
   EXPECT_CALL(service_, StartJob(_, _, _, _, _, _));
   EXPECT_CALL(observer_, OnRegistrationStateChanged(_));
@@ -834,7 +833,7 @@
 
   EXPECT_CALL(service_,
               CreateJob(DeviceManagementRequestJob::TYPE_UNREGISTRATION,
-                        request_context_))
+                        shared_url_loader_factory_))
       .WillOnce(service_.FailJob(DM_STATUS_REQUEST_FAILED));
   EXPECT_CALL(service_, StartJob(_, _, _, _, _, _));
   EXPECT_CALL(observer_, OnClientError(_));
@@ -875,9 +874,8 @@
   }
 
   // Make a policy fetch.
-  EXPECT_CALL(service_,
-              CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH,
-                        request_context_))
+  EXPECT_CALL(service_, CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH,
+                                  shared_url_loader_factory_))
       .WillOnce(service_.SucceedJob(policy_response_));
   EXPECT_CALL(
       service_,
@@ -972,7 +970,7 @@
   EXPECT_CALL(callback_observer_, OnCallbackComplete(false)).Times(1);
   EXPECT_CALL(service_,
               CreateJob(DeviceManagementRequestJob::TYPE_UPLOAD_CERTIFICATE,
-                        request_context_))
+                        shared_url_loader_factory_))
       .WillOnce(service_.FailJob(DM_STATUS_REQUEST_FAILED));
   EXPECT_CALL(service_, StartJob(_, _, _, _, _, _));
   EXPECT_CALL(observer_, OnClientError(_));
@@ -1014,7 +1012,7 @@
   MockDeviceManagementJob* upload_status_job = nullptr;
   EXPECT_CALL(service_,
               CreateJob(DeviceManagementRequestJob::TYPE_UPLOAD_STATUS,
-                        request_context_))
+                        shared_url_loader_factory_))
       .WillOnce(service_.CreateAsyncJob(&upload_status_job));
   EXPECT_CALL(service_, StartJob(_, _, _, _, _, _));
   EXPECT_CALL(callback_observer_, OnCallbackComplete(true)).Times(1);
@@ -1057,7 +1055,7 @@
   MockDeviceManagementJob* upload_status_job = nullptr;
   EXPECT_CALL(service_,
               CreateJob(DeviceManagementRequestJob::TYPE_UPLOAD_STATUS,
-                        request_context_))
+                        shared_url_loader_factory_))
       .WillOnce(service_.CreateAsyncJob(&upload_status_job));
   EXPECT_CALL(service_, StartJob(_, _, _, _, _, _));
   CloudPolicyClient::StatusCallback callback = base::Bind(
@@ -1071,7 +1069,7 @@
   MockDeviceManagementJob* upload_certificate_job = nullptr;
   EXPECT_CALL(service_,
               CreateJob(DeviceManagementRequestJob::TYPE_UPLOAD_CERTIFICATE,
-                        request_context_))
+                        shared_url_loader_factory_))
       .WillOnce(service_.CreateAsyncJob(&upload_certificate_job));
   EXPECT_CALL(service_, StartJob(_, _, _, _, _, _));
 
@@ -1100,7 +1098,7 @@
   EXPECT_CALL(callback_observer_, OnCallbackComplete(false)).Times(1);
   EXPECT_CALL(service_,
               CreateJob(DeviceManagementRequestJob::TYPE_UPLOAD_STATUS,
-                        request_context_))
+                        shared_url_loader_factory_))
       .WillOnce(service_.FailJob(DM_STATUS_REQUEST_FAILED));
   EXPECT_CALL(service_, StartJob(_, _, _, _, _, _));
   EXPECT_CALL(observer_, OnClientError(_));
@@ -1121,7 +1119,7 @@
   MockDeviceManagementJob* upload_status_job = nullptr;
   EXPECT_CALL(service_,
               CreateJob(DeviceManagementRequestJob::TYPE_UPLOAD_STATUS,
-                        request_context_))
+                        shared_url_loader_factory_))
       .WillOnce(service_.CreateAsyncJob(&upload_status_job));
   EXPECT_CALL(service_, StartJob(_, _, _, _, _, _));
   CloudPolicyClient::StatusCallback callback = base::Bind(
diff --git a/components/policy/core/common/cloud/device_management_service.cc b/components/policy/core/common/cloud/device_management_service.cc
index 31da1dee..bed68ec 100644
--- a/components/policy/core/common/cloud/device_management_service.cc
+++ b/components/policy/core/common/cloud/device_management_service.cc
@@ -19,9 +19,8 @@
 #include "net/base/net_errors.h"
 #include "net/http/http_response_headers.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
-#include "net/url_request/url_fetcher.h"
-#include "net/url_request/url_request_context_getter.h"
-#include "net/url_request/url_request_status.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/public/cpp/simple_url_loader.h"
 #include "url/gurl.h"
 
 namespace em = enterprise_management;
@@ -32,10 +31,10 @@
 
 const char kPostContentType[] = "application/protobuf";
 
-const char kServiceTokenAuthHeader[] = "Authorization: GoogleLogin auth=";
-const char kDMTokenAuthHeader[] = "Authorization: GoogleDMToken token=";
-const char kEnrollmentTokenAuthHeader[] =
-    "Authorization: GoogleEnrollmentToken token=";
+const char kAuthHeader[] = "Authorization";
+const char kServiceTokenAuthHeaderPrefix[] = "GoogleLogin auth=";
+const char kDMTokenAuthHeaderPrefix[] = "GoogleDMToken token=";
+const char kEnrollmentTokenAuthHeaderPrefix[] = "GoogleEnrollmentToken token=";
 
 // Number of times to retry on ERR_NETWORK_CHANGED errors.
 const int kMaxRetries = 3;
@@ -64,8 +63,8 @@
 // timeouts.
 long g_retry_delay_ms = 10000;
 
-bool IsProxyError(const net::URLRequestStatus status) {
-  switch (status.error()) {
+bool IsProxyError(int net_error) {
+  switch (net_error) {
     case net::ERR_PROXY_CONNECTION_FAILED:
     case net::ERR_TUNNEL_CONNECTION_FAILED:
     case net::ERR_PROXY_AUTH_UNSUPPORTED:
@@ -79,8 +78,8 @@
   return false;
 }
 
-bool IsConnectionError(const net::URLRequestStatus status) {
-  switch (status.error()) {
+bool IsConnectionError(int net_error) {
+  switch (net_error) {
     case net::ERR_NETWORK_CHANGED:
     case net::ERR_NAME_NOT_RESOLVED:
     case net::ERR_INTERNET_DISCONNECTED:
@@ -92,28 +91,21 @@
   return false;
 }
 
-bool IsProtobufMimeType(const net::URLFetcher* fetcher) {
-  std::string mime_type;
-  return fetcher->GetResponseHeaders()->GetMimeType(&mime_type) &&
-         mime_type == "application/x-protobuffer";
+bool IsProtobufMimeType(const std::string& mime_type) {
+  return mime_type == "application/x-protobuffer";
 }
 
-bool FailedWithProxy(const net::URLFetcher* fetcher) {
-  if ((fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY) != 0) {
-    // The request didn't use a proxy.
-    return false;
-  }
-
-  if (!fetcher->GetStatus().is_success() &&
-      IsProxyError(fetcher->GetStatus())) {
+bool FailedWithProxy(const std::string& mime_type,
+                     int response_code,
+                     int net_error,
+                     bool was_fetched_via_proxy) {
+  if (IsProxyError(net_error)) {
     LOG(WARNING) << "Proxy failed while contacting dmserver.";
     return true;
   }
 
-  if (fetcher->GetStatus().is_success() &&
-      fetcher->GetResponseCode() == kSuccess &&
-      fetcher->WasFetchedViaProxy() &&
-      !IsProtobufMimeType(fetcher)) {
+  if (net_error == net::OK && response_code == kSuccess &&
+      was_fetched_via_proxy && !IsProtobufMimeType(mime_type)) {
     // The proxy server can be misconfigured but pointing to an existing
     // server that replies to requests. Try to recover if a successful
     // request that went through a proxy returns an unexpected mime type.
@@ -184,19 +176,22 @@
       const std::string& agent_parameter,
       const std::string& platform_parameter,
       DeviceManagementService* service,
-      const scoped_refptr<net::URLRequestContextGetter>& request_context);
+      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
   ~DeviceManagementRequestJobImpl() override;
 
   // Handles the URL request response.
-  void HandleResponse(const net::URLRequestStatus& status,
+  void HandleResponse(int net_error,
                       int response_code,
                       const std::string& data);
 
   // Gets the URL to contact.
   GURL GetURL(const std::string& server_url);
 
-  // Configures the fetcher, setting up payload and headers.
-  void ConfigureRequest(net::URLFetcher* fetcher);
+  // Configures the headers and flags.
+  void ConfigureRequest(network::ResourceRequest* resource_request);
+
+  // Attaches the payload.
+  void AddPayload(network::SimpleURLLoader* loader);
 
   enum RetryMethod {
     // No retry required for this request.
@@ -207,10 +202,11 @@
     RETRY_WITH_DELAY
   };
 
-  // Returns if and how this job should be retried. |fetcher| has just
-  // completed, and can be inspected to determine if the request failed and
-  // should be retried.
-  RetryMethod ShouldRetry(const net::URLFetcher* fetcher);
+  // Returns if and how this job should be retried.
+  RetryMethod ShouldRetry(const std::string& mime_type,
+                          int response_code,
+                          int net_error,
+                          bool was_fetched_via_proxy);
 
   // Returns the delay before the next retry with the specified RetryMethod.
   int GetRetryDelay(RetryMethod method);
@@ -218,6 +214,10 @@
   // Invoked right before retrying this job.
   void PrepareRetry();
 
+  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory() {
+    return url_loader_factory_;
+  }
+
   // Get weak pointer
   base::WeakPtr<DeviceManagementRequestJobImpl> GetWeakPtr() {
     return weak_ptr_factory_.GetWeakPtr();
@@ -243,8 +243,8 @@
   // The last error why we had to retry.
   int last_error_ = 0;
 
-  // The request context to use for this job.
-  scoped_refptr<net::URLRequestContextGetter> request_context_;
+  // The URLLoaderFactory to use for this job.
+  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
 
   // Used to get notified if the job has been canceled while waiting for retry.
   base::WeakPtrFactory<DeviceManagementRequestJobImpl> weak_ptr_factory_;
@@ -273,12 +273,12 @@
     const std::string& agent_parameter,
     const std::string& platform_parameter,
     DeviceManagementService* service,
-    const scoped_refptr<net::URLRequestContextGetter>& request_context)
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
     : DeviceManagementRequestJob(type, agent_parameter, platform_parameter),
       service_(service),
       bypass_proxy_(false),
       retries_count_(0),
-      request_context_(request_context),
+      url_loader_factory_(url_loader_factory),
       weak_ptr_factory_(this) {}
 
 DeviceManagementRequestJobImpl::~DeviceManagementRequestJobImpl() {
@@ -289,18 +289,16 @@
   service_->AddJob(this);
 }
 
-void DeviceManagementRequestJobImpl::HandleResponse(
-    const net::URLRequestStatus& status,
-    int response_code,
-    const std::string& data) {
-  if (status.status() != net::URLRequestStatus::SUCCESS) {
+void DeviceManagementRequestJobImpl::HandleResponse(int net_error,
+                                                    int response_code,
+                                                    const std::string& data) {
+  if (net_error != net::OK) {
     UMA_HISTOGRAM_ENUMERATION("Enterprise.DMServerRequestSuccess",
                               DMServerRequestSuccess::REQUEST_FAILED,
                               DMServerRequestSuccess::REQUEST_MAX);
-    LOG(WARNING) << "DMServer request failed, status: " << status.status()
-                 << ", error: " << status.error();
+    LOG(WARNING) << "DMServer request failed, error: " << net_error;
     em::DeviceManagementResponse dummy_response;
-    callback_.Run(DM_STATUS_REQUEST_FAILED, status.error(), dummy_response);
+    callback_.Run(DM_STATUS_REQUEST_FAILED, net_error, dummy_response);
     return;
   }
 
@@ -405,31 +403,40 @@
 }
 
 void DeviceManagementRequestJobImpl::ConfigureRequest(
-    net::URLFetcher* fetcher) {
-  // TODO(dcheng): It might make sense to make this take a const
-  // scoped_refptr<T>& too eventually.
-  fetcher->SetRequestContext(request_context_.get());
-  fetcher->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES |
-                        net::LOAD_DO_NOT_SAVE_COOKIES |
-                        net::LOAD_DISABLE_CACHE |
-                        (bypass_proxy_ ? net::LOAD_BYPASS_PROXY : 0));
+    network::ResourceRequest* resource_request) {
+  resource_request->load_flags =
+      net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DO_NOT_SAVE_COOKIES |
+      net::LOAD_DISABLE_CACHE | (bypass_proxy_ ? net::LOAD_BYPASS_PROXY : 0);
+  if (!gaia_token_.empty()) {
+    resource_request->headers.SetHeader(
+        kAuthHeader, std::string(kServiceTokenAuthHeaderPrefix) + gaia_token_);
+  }
+  if (!dm_token_.empty()) {
+    resource_request->headers.SetHeader(
+        kAuthHeader, std::string(kDMTokenAuthHeaderPrefix) + dm_token_);
+  }
+  if (!enrollment_token_.empty()) {
+    resource_request->headers.SetHeader(
+        kAuthHeader,
+        std::string(kEnrollmentTokenAuthHeaderPrefix) + enrollment_token_);
+  }
+}
+
+void DeviceManagementRequestJobImpl::AddPayload(
+    network::SimpleURLLoader* loader) {
   std::string payload;
   CHECK(request_.SerializeToString(&payload));
-  fetcher->SetUploadData(kPostContentType, payload);
-  std::string extra_headers;
-  if (!gaia_token_.empty())
-    extra_headers += kServiceTokenAuthHeader + gaia_token_ + "\n";
-  if (!dm_token_.empty())
-    extra_headers += kDMTokenAuthHeader + dm_token_ + "\n";
-  if (!enrollment_token_.empty())
-    extra_headers += kEnrollmentTokenAuthHeader + enrollment_token_ + "\n";
-  fetcher->SetExtraRequestHeaders(extra_headers);
+  loader->AttachStringForUpload(payload, kPostContentType);
 }
 
 DeviceManagementRequestJobImpl::RetryMethod
-DeviceManagementRequestJobImpl::ShouldRetry(const net::URLFetcher* fetcher) {
-  last_error_ = fetcher->GetStatus().error();
-  if (FailedWithProxy(fetcher) && !bypass_proxy_) {
+DeviceManagementRequestJobImpl::ShouldRetry(const std::string& mime_type,
+                                            int response_code,
+                                            int net_error,
+                                            bool was_fetched_via_proxy) {
+  last_error_ = net_error;
+  if (!bypass_proxy_ && FailedWithProxy(mime_type, response_code, net_error,
+                                        was_fetched_via_proxy)) {
     // Retry the job immediately if it failed due to a broken proxy, by
     // bypassing the proxy on the next try.
     bypass_proxy_ = true;
@@ -440,7 +447,7 @@
   // often interrupted during ChromeOS startup when network is not yet ready.
   // Allowing the fetcher to retry once after that is enough to recover; allow
   // it to retry up to 3 times just in case.
-  if (IsConnectionError(fetcher->GetStatus()) && retries_count_ < kMaxRetries) {
+  if (IsConnectionError(net_error) && retries_count_ < kMaxRetries) {
     ++retries_count_;
     if (type_ == DeviceManagementRequestJob::TYPE_POLICY_FETCH) {
       // We must not delay when retrying policy fetch, because it is a blocking
@@ -536,9 +543,6 @@
   query_params_.push_back(std::make_pair(name, value));
 }
 
-// A random value that other fetchers won't likely use.
-const int DeviceManagementService::kURLFetcherID = 0xde71ce1d;
-
 DeviceManagementService::~DeviceManagementService() {
   // All running jobs should have been cancelled by now.
   DCHECK(pending_jobs_.empty());
@@ -547,15 +551,12 @@
 
 DeviceManagementRequestJob* DeviceManagementService::CreateJob(
     DeviceManagementRequestJob::JobType type,
-    const scoped_refptr<net::URLRequestContextGetter>& request_context) {
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
   return new DeviceManagementRequestJobImpl(
-      type,
-      configuration_->GetAgentParameter(),
-      configuration_->GetPlatformParameter(),
-      this,
-      request_context);
+      type, configuration_->GetAgentParameter(),
+      configuration_->GetPlatformParameter(), this, url_loader_factory);
 }
 
 void DeviceManagementService::ScheduleInitialization(
@@ -641,17 +642,22 @@
             }
           }
         })");
-  net::URLFetcher* fetcher =
-      net::URLFetcher::Create(kURLFetcherID, std::move(url),
-                              net::URLFetcher::POST, this, traffic_annotation)
+  auto resource_request = std::make_unique<network::ResourceRequest>();
+  resource_request->url = std::move(url);
+  resource_request->method = "POST";
+  job->ConfigureRequest(resource_request.get());
+  network::SimpleURLLoader* fetcher =
+      network::SimpleURLLoader::Create(std::move(resource_request),
+                                       traffic_annotation)
           .release();
-  data_use_measurement::DataUseUserData::AttachToFetcher(
-      fetcher, data_use_measurement::DataUseUserData::POLICY);
-  fetcher->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES |
-                        net::LOAD_DO_NOT_SEND_COOKIES);
-  job->ConfigureRequest(fetcher);
+  job->AddPayload(fetcher);
+  fetcher->SetAllowHttpErrorResults(true);
+  fetcher->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
+      job->url_loader_factory().get(),
+      base::BindOnce(&DeviceManagementService::OnURLLoaderComplete,
+                     base::Unretained(this), fetcher));
+
   pending_jobs_[fetcher] = job;
-  fetcher->Start();
 }
 
 void DeviceManagementService::StartJobAfterDelay(
@@ -674,19 +680,46 @@
   g_retry_delay_ms = retry_delay_ms;
 }
 
-void DeviceManagementService::OnURLFetchComplete(
-    const net::URLFetcher* source) {
-  JobFetcherMap::iterator entry(pending_jobs_.find(source));
+void DeviceManagementService::OnURLLoaderComplete(
+    network::SimpleURLLoader* url_loader,
+    std::unique_ptr<std::string> response_body) {
+  int response_code = 0;
+  bool was_fetched_via_proxy = false;
+  std::string mime_type;
+  if (url_loader->ResponseInfo()) {
+    was_fetched_via_proxy = url_loader->ResponseInfo()->was_fetched_via_proxy;
+    mime_type = url_loader->ResponseInfo()->mime_type;
+    if (url_loader->ResponseInfo()->headers)
+      response_code = url_loader->ResponseInfo()->headers->response_code();
+  }
+
+  std::string response_body_str;
+  if (response_body.get())
+    response_body_str = std::move(*response_body.get());
+
+  OnURLLoaderCompleteInternal(url_loader, response_body_str, mime_type,
+                              url_loader->NetError(), response_code,
+                              was_fetched_via_proxy);
+}
+
+void DeviceManagementService::OnURLLoaderCompleteInternal(
+    network::SimpleURLLoader* url_loader,
+    const std::string& response_body,
+    const std::string& mime_type,
+    int net_error,
+    int response_code,
+    bool was_fetched_via_proxy) {
+  JobFetcherMap::iterator entry(pending_jobs_.find(url_loader));
   if (entry == pending_jobs_.end()) {
-    NOTREACHED() << "Callback from foreign URL fetcher";
+    NOTREACHED() << "Callback from foreign URL loader";
     return;
   }
 
   DeviceManagementRequestJobImpl* job = entry->second;
   pending_jobs_.erase(entry);
 
-  DeviceManagementRequestJobImpl::RetryMethod retry_method =
-      job->ShouldRetry(source);
+  DeviceManagementRequestJobImpl::RetryMethod retry_method = job->ShouldRetry(
+      mime_type, response_code, net_error, was_fetched_via_proxy);
   if (retry_method != DeviceManagementRequestJobImpl::RetryMethod::NO_RETRY) {
     job->PrepareRetry();
     int delay = job->GetRetryDelay(retry_method);
@@ -698,11 +731,15 @@
                    weak_ptr_factory_.GetWeakPtr(), job->GetWeakPtr()),
         base::TimeDelta::FromMilliseconds(delay));
   } else {
-    std::string data;
-    source->GetResponseAsString(&data);
-    job->HandleResponse(source->GetStatus(), source->GetResponseCode(), data);
+    job->HandleResponse(net_error, response_code, response_body);
   }
-  delete source;
+  delete url_loader;
+}
+
+network::SimpleURLLoader*
+DeviceManagementService::GetSimpleURLLoaderForTesting() {
+  DCHECK_EQ(1u, pending_jobs_.size());
+  return const_cast<network::SimpleURLLoader*>(pending_jobs_.begin()->first);
 }
 
 void DeviceManagementService::AddJob(DeviceManagementRequestJobImpl* job) {
diff --git a/components/policy/core/common/cloud/device_management_service.h b/components/policy/core/common/cloud/device_management_service.h
index 28816b39..a964d90d 100644
--- a/components/policy/core/common/cloud/device_management_service.h
+++ b/components/policy/core/common/cloud/device_management_service.h
@@ -29,9 +29,10 @@
 class SequencedTaskRunner;
 }
 
-namespace net {
-class URLRequestContextGetter;
-}
+namespace network {
+class SharedURLLoaderFactory;
+class SimpleURLLoader;
+}  // namespace network
 
 namespace policy {
 
@@ -133,7 +134,7 @@
 // communication with the device management server. It creates the backends
 // objects that the device management policy provider and friends use to issue
 // requests.
-class POLICY_EXPORT DeviceManagementService : public net::URLFetcherDelegate {
+class POLICY_EXPORT DeviceManagementService {
  public:
   // Obtains the parameters used to contact the server.
   // This allows creating the DeviceManagementService early and getting these
@@ -155,18 +156,13 @@
 
   explicit DeviceManagementService(
       std::unique_ptr<Configuration> configuration);
-  ~DeviceManagementService() override;
-
-  // The ID of URLFetchers created by the DeviceManagementService. This can be
-  // used by tests that use a TestURLFetcherFactory to get the pending fetchers
-  // created by the DeviceManagementService.
-  static const int kURLFetcherID;
+  virtual ~DeviceManagementService();
 
   // Creates a new device management request job. Ownership is transferred to
   // the caller.
   virtual DeviceManagementRequestJob* CreateJob(
       DeviceManagementRequestJob::JobType type,
-      const scoped_refptr<net::URLRequestContextGetter>& request_context);
+      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
 
   // Schedules a task to run |Initialize| after |delay_milliseconds| had passed.
   void ScheduleInitialization(int64_t delay_milliseconds);
@@ -177,20 +173,33 @@
   // Gets the URL that the DMServer requests are sent to.
   std::string GetServerUrl();
 
+  // Called by SimpleURLLoader.
+  void OnURLLoaderComplete(network::SimpleURLLoader* url_loader,
+                           std::unique_ptr<std::string> response_body);
+
+  // Called by OnURLLoaderComplete, exposed publicly to ease unit testing.
+  void OnURLLoaderCompleteInternal(network::SimpleURLLoader* url_loader,
+                                   const std::string& response_body,
+                                   const std::string& mime_type,
+                                   int net_error,
+                                   int response_code,
+                                   bool was_fetched_via_proxy);
+
+  // Returns the SimpleURLLoader for testing. Expects that there's only one.
+  network::SimpleURLLoader* GetSimpleURLLoaderForTesting();
+
   // Sets the retry delay to a shorter time to prevent browser tests from
   // timing out.
   static void SetRetryDelayForTesting(long retryDelayMs);
 
  private:
-  typedef std::map<const net::URLFetcher*,
-                   DeviceManagementRequestJobImpl*> JobFetcherMap;
+  typedef std::map<const network::SimpleURLLoader*,
+                   DeviceManagementRequestJobImpl*>
+      JobFetcherMap;
   typedef base::circular_deque<DeviceManagementRequestJobImpl*> JobQueue;
 
   friend class DeviceManagementRequestJobImpl;
 
-  // net::URLFetcherDelegate override.
-  void OnURLFetchComplete(const net::URLFetcher* source) override;
-
   // Starts processing any queued jobs.
   void Initialize();
 
diff --git a/components/policy/core/common/cloud/device_management_service_unittest.cc b/components/policy/core/common/cloud/device_management_service_unittest.cc
index d5b6b82d..6b1ccdb 100644
--- a/components/policy/core/common/cloud/device_management_service_unittest.cc
+++ b/components/policy/core/common/cloud/device_management_service_unittest.cc
@@ -20,9 +20,9 @@
 #include "net/base/load_flags.h"
 #include "net/base/net_errors.h"
 #include "net/http/http_response_headers.h"
-#include "net/url_request/test_url_fetcher_factory.h"
-#include "net/url_request/url_request_status.h"
-#include "net/url_request/url_request_test_util.h"
+#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
+#include "services/network/test/test_url_loader_factory.h"
+#include "services/network/test/test_utils.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -57,8 +57,9 @@
     // Set retry delay to prevent timeouts.
     policy::DeviceManagementService::SetRetryDelayForTesting(0);
 
-    request_context_ =
-        new net::TestURLRequestContextGetter(loop_.task_runner());
+    shared_url_loader_factory_ =
+        base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
+            &url_loader_factory_);
     ResetService();
     InitializeService();
   }
@@ -79,13 +80,17 @@
     base::RunLoop().RunUntilIdle();
   }
 
-  net::TestURLFetcher* GetFetcher() {
-    return factory_.GetFetcherByID(DeviceManagementService::kURLFetcherID);
+  network::TestURLLoaderFactory::PendingRequest* GetPendingRequest(
+      size_t index = 0) {
+    if (index >= url_loader_factory_.pending_requests()->size())
+      return nullptr;
+    return &(*url_loader_factory_.pending_requests())[index];
   }
 
   DeviceManagementRequestJob* StartRegistrationJob() {
-    DeviceManagementRequestJob* job = service_->CreateJob(
-        DeviceManagementRequestJob::TYPE_REGISTRATION, request_context_.get());
+    DeviceManagementRequestJob* job =
+        service_->CreateJob(DeviceManagementRequestJob::TYPE_REGISTRATION,
+                            shared_url_loader_factory_);
     job->SetGaiaToken(kGaiaAuthToken);
     job->SetOAuthToken(kOAuthToken);
     job->SetClientID(kClientID);
@@ -100,7 +105,7 @@
   DeviceManagementRequestJob* StartCertBasedRegistrationJob() {
     DeviceManagementRequestJob* job = service_->CreateJob(
         DeviceManagementRequestJob::TYPE_CERT_BASED_REGISTRATION,
-        request_context_.get());
+        shared_url_loader_factory_);
     job->SetGaiaToken(kGaiaAuthToken);
     job->SetClientID(kClientID);
     job->GetRequest()->mutable_register_request();
@@ -114,7 +119,7 @@
   DeviceManagementRequestJob* StartTokenEnrollmentJob() {
     DeviceManagementRequestJob* job =
         service_->CreateJob(DeviceManagementRequestJob::TYPE_TOKEN_ENROLLMENT,
-                            request_context_.get());
+                            shared_url_loader_factory_);
     job->SetEnrollmentToken(kEnrollmentToken);
     job->SetClientID(kClientID);
     job->GetRequest()->mutable_register_request();
@@ -128,7 +133,7 @@
   DeviceManagementRequestJob* StartApiAuthCodeFetchJob() {
     DeviceManagementRequestJob* job = service_->CreateJob(
         DeviceManagementRequestJob::TYPE_API_AUTH_CODE_FETCH,
-        request_context_.get());
+        shared_url_loader_factory_);
     job->SetGaiaToken(kGaiaAuthToken);
     job->SetOAuthToken(kOAuthToken);
     job->SetClientID(kClientID);
@@ -143,7 +148,7 @@
   DeviceManagementRequestJob* StartUnregistrationJob() {
     DeviceManagementRequestJob* job =
         service_->CreateJob(DeviceManagementRequestJob::TYPE_UNREGISTRATION,
-                            request_context_.get());
+                            shared_url_loader_factory_);
     job->SetDMToken(kDMToken);
     job->SetClientID(kClientID);
     job->GetRequest()->mutable_unregister_request();
@@ -155,8 +160,9 @@
   }
 
   DeviceManagementRequestJob* StartPolicyFetchJob() {
-    DeviceManagementRequestJob* job = service_->CreateJob(
-        DeviceManagementRequestJob::TYPE_POLICY_FETCH, request_context_.get());
+    DeviceManagementRequestJob* job =
+        service_->CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH,
+                            shared_url_loader_factory_);
     job->SetGaiaToken(kGaiaAuthToken);
     job->SetOAuthToken(kOAuthToken);
     job->SetClientID(kClientID);
@@ -171,8 +177,9 @@
   }
 
   DeviceManagementRequestJob* StartCriticalPolicyFetchJob() {
-    DeviceManagementRequestJob* job = service_->CreateJob(
-        DeviceManagementRequestJob::TYPE_POLICY_FETCH, request_context_.get());
+    DeviceManagementRequestJob* job =
+        service_->CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH,
+                            shared_url_loader_factory_);
     job->SetGaiaToken(kGaiaAuthToken);
     job->SetOAuthToken(kOAuthToken);
     job->SetClientID(kClientID);
@@ -190,7 +197,7 @@
   DeviceManagementRequestJob* StartAutoEnrollmentJob() {
     DeviceManagementRequestJob* job =
         service_->CreateJob(DeviceManagementRequestJob::TYPE_AUTO_ENROLLMENT,
-                            request_context_.get());
+                            shared_url_loader_factory_);
     job->SetClientID(kClientID);
     em::DeviceAutoEnrollmentRequest* request =
         job->GetRequest()->mutable_auto_enrollment_request();
@@ -206,7 +213,7 @@
   DeviceManagementRequestJob* StartAppInstallReportJob() {
     DeviceManagementRequestJob* job = service_->CreateJob(
         DeviceManagementRequestJob::TYPE_UPLOAD_APP_INSTALL_REPORT,
-        request_context_.get());
+        shared_url_loader_factory_);
     job->SetDMToken(kDMToken);
     job->SetClientID(kClientID);
     job->GetRequest()->mutable_app_install_report_request();
@@ -217,25 +224,27 @@
     return job;
   }
 
-  void SendResponse(net::TestURLFetcher* fetcher,
-                    net::Error error,
+  void SendResponse(net::Error error,
                     int http_status,
-                    const std::string& response) {
-    fetcher->set_url(GURL(kServiceUrl));
-    fetcher->set_status(net::URLRequestStatus::FromError(error));
-    fetcher->set_response_code(http_status);
-    fetcher->SetResponseString(response);
-    fetcher->delegate()->OnURLFetchComplete(fetcher);
+                    const std::string& response,
+                    const std::string& mime_type = std::string(),
+                    bool was_fetched_via_proxy = false) {
+    service_->OnURLLoaderCompleteInternal(
+        service_->GetSimpleURLLoaderForTesting(), response, mime_type, error,
+        http_status, was_fetched_via_proxy);
   }
 
-  MOCK_METHOD3(OnJobDone, void(DeviceManagementStatus, int,
-                               const em::DeviceManagementResponse&));
+  MOCK_METHOD3(OnJobDone,
+               void(DeviceManagementStatus,
+                    int,
+                    const em::DeviceManagementResponse&));
 
   MOCK_METHOD1(OnJobRetry, void(DeviceManagementRequestJob*));
 
   base::MessageLoop loop_;
-  scoped_refptr<net::TestURLRequestContextGetter> request_context_;
-  net::TestURLFetcherFactory factory_;
+  network::TestURLLoaderFactory url_loader_factory_;
+  scoped_refptr<network::WeakWrapperSharedURLLoaderFactory>
+      shared_url_loader_factory_;
   std::unique_ptr<DeviceManagementService> service_;
 };
 
@@ -256,27 +265,25 @@
 };
 
 void PrintTo(const FailedRequestParams& params, std::ostream* os) {
-  *os << "FailedRequestParams " << params.expected_status_
-      << " " << params.error_
-      << " " << params.http_status_;
+  *os << "FailedRequestParams " << params.expected_status_ << " "
+      << params.error_ << " " << params.http_status_;
 }
 
 // A parameterized test case for erroneous response situations, they're mostly
 // the same for all kinds of requests.
 class DeviceManagementServiceFailedRequestTest
     : public DeviceManagementServiceTestBase,
-      public testing::WithParamInterface<FailedRequestParams> {
-};
+      public testing::WithParamInterface<FailedRequestParams> {};
 
 TEST_P(DeviceManagementServiceFailedRequestTest, RegisterRequest) {
   EXPECT_CALL(*this, OnJobDone(GetParam().expected_status_, _, _));
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartRegistrationJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
-  SendResponse(fetcher, GetParam().error_, GetParam().http_status_,
+  SendResponse(GetParam().error_, GetParam().http_status_,
                GetParam().response_);
 }
 
@@ -285,10 +292,10 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartCertBasedRegistrationJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
-  SendResponse(fetcher, GetParam().error_, GetParam().http_status_,
+  SendResponse(GetParam().error_, GetParam().http_status_,
                GetParam().response_);
 }
 
@@ -297,10 +304,10 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartTokenEnrollmentJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
-  SendResponse(fetcher, GetParam().error_, GetParam().http_status_,
+  SendResponse(GetParam().error_, GetParam().http_status_,
                GetParam().response_);
 }
 
@@ -309,10 +316,10 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartApiAuthCodeFetchJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
-  SendResponse(fetcher, GetParam().error_, GetParam().http_status_,
+  SendResponse(GetParam().error_, GetParam().http_status_,
                GetParam().response_);
 }
 
@@ -321,10 +328,10 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartUnregistrationJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
-  SendResponse(fetcher, GetParam().error_, GetParam().http_status_,
+  SendResponse(GetParam().error_, GetParam().http_status_,
                GetParam().response_);
 }
 
@@ -333,10 +340,10 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartPolicyFetchJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
-  SendResponse(fetcher, GetParam().error_, GetParam().http_status_,
+  SendResponse(GetParam().error_, GetParam().http_status_,
                GetParam().response_);
 }
 
@@ -345,10 +352,10 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartAutoEnrollmentJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
-  SendResponse(fetcher, GetParam().error_, GetParam().http_status_,
+  SendResponse(GetParam().error_, GetParam().http_status_,
                GetParam().response_);
 }
 
@@ -357,10 +364,10 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartAppInstallReportJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
-  SendResponse(fetcher, GetParam().error_, GetParam().http_status_,
+  SendResponse(GetParam().error_, GetParam().http_status_,
                GetParam().response_);
 }
 
@@ -462,12 +469,14 @@
 class DeviceManagementServiceTest
     : public DeviceManagementServiceTestBase {
  protected:
-  void CheckURLAndQueryParams(const GURL& request_url,
-                              const std::string& request_type,
-                              const std::string& device_id,
-                              const std::string& last_error,
-                              bool critical = false) {
+  void CheckURLAndQueryParams(
+      const network::TestURLLoaderFactory::PendingRequest* request,
+      const std::string& request_type,
+      const std::string& device_id,
+      const std::string& last_error,
+      bool critical = false) {
     const GURL service_url(kServiceUrl);
+    const auto& request_url = request->request.url;
     EXPECT_EQ(service_url.scheme(), request_url.scheme());
     EXPECT_EQ(service_url.host(), request_url.host());
     EXPECT_EQ(service_url.port(), request_url.port());
@@ -508,30 +517,30 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartRegistrationJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
-  CheckURLAndQueryParams(fetcher->GetOriginalURL(),
-                         dm_protocol::kValueRequestRegister, kClientID, "");
+  CheckURLAndQueryParams(request, dm_protocol::kValueRequestRegister, kClientID,
+                         "");
 
   std::string expected_data;
   ASSERT_TRUE(request_job->GetRequest()->SerializeToString(&expected_data));
-  EXPECT_EQ(expected_data, fetcher->upload_data());
+  EXPECT_EQ(expected_data, network::GetUploadData(request->request));
 
   // Generate the response.
   std::string response_data;
   ASSERT_TRUE(expected_response.SerializeToString(&response_data));
-  SendResponse(fetcher, net::OK, 200, response_data);
+  SendResponse(net::OK, 200, response_data);
 }
 
 TEST_F(DeviceManagementServiceTest, CriticalRequest) {
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartCriticalPolicyFetchJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
-  CheckURLAndQueryParams(fetcher->GetOriginalURL(),
-                         dm_protocol::kValueRequestPolicy, kClientID, "", true);
+  CheckURLAndQueryParams(request, dm_protocol::kValueRequestPolicy, kClientID,
+                         "", true);
 }
 
 TEST_F(DeviceManagementServiceTest, CertBasedRegisterRequest) {
@@ -543,21 +552,20 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartCertBasedRegistrationJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
-  CheckURLAndQueryParams(fetcher->GetOriginalURL(),
-                         dm_protocol::kValueRequestCertBasedRegister, kClientID,
-                         "");
+  CheckURLAndQueryParams(request, dm_protocol::kValueRequestCertBasedRegister,
+                         kClientID, "");
 
   std::string expected_data;
   ASSERT_TRUE(request_job->GetRequest()->SerializeToString(&expected_data));
-  EXPECT_EQ(expected_data, fetcher->upload_data());
+  EXPECT_EQ(expected_data, network::GetUploadData(request->request));
 
   // Generate the response.
   std::string response_data;
   ASSERT_TRUE(expected_response.SerializeToString(&response_data));
-  SendResponse(fetcher, net::OK, 200, response_data);
+  SendResponse(net::OK, 200, response_data);
 }
 
 TEST_F(DeviceManagementServiceTest, TokenEnrollmentRequest) {
@@ -569,28 +577,25 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartTokenEnrollmentJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
-  CheckURLAndQueryParams(fetcher->GetOriginalURL(),
-                         dm_protocol::kValueRequestTokenEnrollment, kClientID,
-                         "");
+  CheckURLAndQueryParams(request, dm_protocol::kValueRequestTokenEnrollment,
+                         kClientID, "");
 
   // Make sure request is properly authorized.
-  net::HttpRequestHeaders headers;
-  fetcher->GetExtraRequestHeaders(&headers);
   std::string header;
-  ASSERT_TRUE(headers.GetHeader("Authorization", &header));
+  ASSERT_TRUE(request->request.headers.GetHeader("Authorization", &header));
   EXPECT_EQ("GoogleEnrollmentToken token=enrollment_token", header);
 
   std::string expected_data;
   ASSERT_TRUE(request_job->GetRequest()->SerializeToString(&expected_data));
-  EXPECT_EQ(expected_data, fetcher->upload_data());
+  EXPECT_EQ(expected_data, network::GetUploadData(request->request));
 
   // Generate the response.
   std::string response_data;
   ASSERT_TRUE(expected_response.SerializeToString(&response_data));
-  SendResponse(fetcher, net::OK, 200, response_data);
+  SendResponse(net::OK, 200, response_data);
 }
 
 TEST_F(DeviceManagementServiceTest, ApiAuthCodeFetchRequest) {
@@ -602,21 +607,20 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartApiAuthCodeFetchJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
-  CheckURLAndQueryParams(fetcher->GetOriginalURL(),
-                         dm_protocol::kValueRequestApiAuthorization, kClientID,
-                         "");
+  CheckURLAndQueryParams(request, dm_protocol::kValueRequestApiAuthorization,
+                         kClientID, "");
 
   std::string expected_data;
   ASSERT_TRUE(request_job->GetRequest()->SerializeToString(&expected_data));
-  EXPECT_EQ(expected_data, fetcher->upload_data());
+  EXPECT_EQ(expected_data, network::GetUploadData(request->request));
 
   // Generate the response.
   std::string response_data;
   ASSERT_TRUE(expected_response.SerializeToString(&response_data));
-  SendResponse(fetcher, net::OK, 200, response_data);
+  SendResponse(net::OK, 200, response_data);
 }
 
 TEST_F(DeviceManagementServiceTest, UnregisterRequest) {
@@ -627,28 +631,28 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartUnregistrationJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
   // Check the data the fetcher received.
-  const GURL& request_url(fetcher->GetOriginalURL());
+  const GURL& request_url(request->request.url);
   const GURL service_url(kServiceUrl);
   EXPECT_EQ(service_url.scheme(), request_url.scheme());
   EXPECT_EQ(service_url.host(), request_url.host());
   EXPECT_EQ(service_url.port(), request_url.port());
   EXPECT_EQ(service_url.path(), request_url.path());
 
-  CheckURLAndQueryParams(fetcher->GetOriginalURL(),
-                         dm_protocol::kValueRequestUnregister, kClientID, "");
+  CheckURLAndQueryParams(request, dm_protocol::kValueRequestUnregister,
+                         kClientID, "");
 
   std::string expected_data;
   ASSERT_TRUE(request_job->GetRequest()->SerializeToString(&expected_data));
-  EXPECT_EQ(expected_data, fetcher->upload_data());
+  EXPECT_EQ(expected_data, network::GetUploadData(request->request));
 
   // Generate the response.
   std::string response_data;
   ASSERT_TRUE(expected_response.SerializeToString(&response_data));
-  SendResponse(fetcher, net::OK, 200, response_data);
+  SendResponse(net::OK, 200, response_data);
 }
 
 TEST_F(DeviceManagementServiceTest, AppInstallReportRequest) {
@@ -659,21 +663,20 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartAppInstallReportJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
-  CheckURLAndQueryParams(fetcher->GetOriginalURL(),
-                         dm_protocol::kValueRequestAppInstallReport, kClientID,
-                         "");
+  CheckURLAndQueryParams(request, dm_protocol::kValueRequestAppInstallReport,
+                         kClientID, "");
 
   std::string expected_data;
   ASSERT_TRUE(request_job->GetRequest()->SerializeToString(&expected_data));
-  EXPECT_EQ(expected_data, fetcher->upload_data());
+  EXPECT_EQ(expected_data, network::GetUploadData(request->request));
 
   // Generate the response.
   std::string response_data;
   ASSERT_TRUE(expected_response.SerializeToString(&response_data));
-  SendResponse(fetcher, net::OK, 200, response_data);
+  SendResponse(net::OK, 200, response_data);
 }
 
 TEST_F(DeviceManagementServiceTest, CancelRegisterRequest) {
@@ -681,8 +684,8 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartRegistrationJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
   // There shouldn't be any callbacks.
   request_job.reset();
@@ -693,8 +696,8 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartCertBasedRegistrationJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
   // There shouldn't be any callbacks.
   request_job.reset();
@@ -705,8 +708,8 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartTokenEnrollmentJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
   // There shouldn't be any callbacks.
   request_job.reset();
@@ -717,8 +720,8 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartApiAuthCodeFetchJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
   // There shouldn't be any callbacks.
   request_job.reset();
@@ -729,8 +732,8 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartUnregistrationJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
   // There shouldn't be any callbacks.
   request_job.reset();
@@ -741,8 +744,8 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartPolicyFetchJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
   // There shouldn't be any callbacks.
   request_job.reset();
@@ -753,8 +756,8 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartAppInstallReportJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
   // There shouldn't be any callbacks.
   request_job.reset();
@@ -774,19 +777,18 @@
   // Make a request. We should not see any fetchers being created.
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartRegistrationJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_FALSE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_FALSE(request);
 
   // Now initialize the service. That should start the job.
   InitializeService();
-  fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
-  factory_.RemoveFetcherFromMap(DeviceManagementService::kURLFetcherID);
+  request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
   // Check that the request is processed as expected.
   std::string response_data;
   ASSERT_TRUE(expected_response.SerializeToString(&response_data));
-  SendResponse(fetcher, net::OK, 200, response_data);
+  SendResponse(net::OK, 200, response_data);
 }
 
 TEST_F(DeviceManagementServiceTest, CancelRequestAfterShutdown) {
@@ -794,8 +796,8 @@
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartPolicyFetchJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
   // Shutdown the service and cancel the job afterwards.
   service_->Shutdown();
@@ -810,15 +812,15 @@
   // Make a request.
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartRegistrationJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
+  ASSERT_TRUE(request);
 
   EXPECT_CALL(*this, OnJobDone(_, _, _))
       .WillOnce(ResetPointer(&request_job));
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
 
   // Generate a callback.
-  SendResponse(fetcher, net::OK, 500, std::string());
+  SendResponse(net::OK, 500, std::string());
 
   // Job should have been reset.
   EXPECT_FALSE(request_job);
@@ -831,26 +833,24 @@
 
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartRegistrationJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
-  EXPECT_EQ(0, fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY);
+  auto* request = GetPendingRequest();
+  EXPECT_EQ(0, request->request.load_flags & net::LOAD_BYPASS_PROXY);
   // Not a retry.
-  CheckURLAndQueryParams(fetcher->GetOriginalURL(),
-                         dm_protocol::kValueRequestRegister, kClientID, "");
-  const std::string upload_data(fetcher->upload_data());
+  CheckURLAndQueryParams(request, dm_protocol::kValueRequestRegister, kClientID,
+                         "");
+  const std::string upload_data(network::GetUploadData(request->request));
 
   // Generate a callback with a proxy failure.
-  SendResponse(fetcher, net::ERR_PROXY_CONNECTION_FAILED, 200, std::string());
+  SendResponse(net::ERR_PROXY_CONNECTION_FAILED, 200, std::string());
   base::RunLoop().RunUntilIdle();
 
   // Verify that a new URLFetcher was started that bypasses the proxy.
-  fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
-  EXPECT_TRUE(fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY);
-  EXPECT_EQ(upload_data, fetcher->upload_data());
+  request = GetPendingRequest(1);
+  ASSERT_TRUE(request);
+  EXPECT_TRUE(request->request.load_flags & net::LOAD_BYPASS_PROXY);
+  EXPECT_EQ(upload_data, network::GetUploadData(request->request));
   // Retry with last error net::ERR_PROXY_CONNECTION_FAILED.
-  CheckURLAndQueryParams(fetcher->GetOriginalURL(),
-                         dm_protocol::kValueRequestRegister, kClientID,
+  CheckURLAndQueryParams(request, dm_protocol::kValueRequestRegister, kClientID,
                          std::to_string(net::ERR_PROXY_CONNECTION_FAILED));
 }
 
@@ -861,79 +861,40 @@
 
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartRegistrationJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
-  EXPECT_EQ(0, fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY);
-  const GURL original_url(fetcher->GetOriginalURL());
-  const std::string upload_data(fetcher->upload_data());
-  fetcher->set_was_fetched_via_proxy(true);
-  scoped_refptr<net::HttpResponseHeaders> headers =
-      base::MakeRefCounted<net::HttpResponseHeaders>(
-          std::string() /* raw_headers */);
-  headers->ReplaceStatusLine("HTTP/1.1 200 OK");
-  headers->AddHeader("Content-type: bad/type");
-  fetcher->set_response_headers(headers);
+  auto* request = GetPendingRequest();
+  EXPECT_EQ(0, request->request.load_flags & net::LOAD_BYPASS_PROXY);
+  const GURL original_url(request->request.url);
+  const std::string upload_data(network::GetUploadData(request->request));
 
   // Generate a callback with a valid http response, that was generated by
   // a bad/wrong proxy.
-  SendResponse(fetcher, net::OK, 200, std::string());
+  SendResponse(net::OK, 200, std::string(), "bad/type",
+               true /* was_fetched_via_proxy */);
   base::RunLoop().RunUntilIdle();
 
   // Verify that a new URLFetcher was started that bypasses the proxy.
-  fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
-  EXPECT_NE(0, fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY);
-  EXPECT_EQ(original_url, fetcher->GetOriginalURL());
-  EXPECT_EQ(upload_data, fetcher->upload_data());
+  request = GetPendingRequest(1);
+  ASSERT_TRUE(request);
+  EXPECT_NE(0, request->request.load_flags & net::LOAD_BYPASS_PROXY);
+  EXPECT_EQ(original_url, request->request.url);
+  EXPECT_EQ(upload_data, network::GetUploadData(request->request));
 }
 
-TEST_F(DeviceManagementServiceTest, AcceptMimeTypeWithCharsetFromProxy) {
+TEST_F(DeviceManagementServiceTest, AcceptMimeTypeFromProxy) {
   // Make a request and expect that it will succeed.
   EXPECT_CALL(*this, OnJobDone(_, _, _)).Times(1);
 
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartRegistrationJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
-  EXPECT_EQ(0, fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY);
-  const GURL original_url(fetcher->GetOriginalURL());
-  const std::string upload_data(fetcher->upload_data());
-  fetcher->set_was_fetched_via_proxy(true);
-  scoped_refptr<net::HttpResponseHeaders> headers =
-      base::MakeRefCounted<net::HttpResponseHeaders>(
-          std::string() /* raw_headers */);
-  headers->ReplaceStatusLine("HTTP/1.1 200 OK");
-  headers->AddHeader("Content-type: application/x-protobuffer; charset=utf-8");
-  fetcher->set_response_headers(headers);
+  auto* request = GetPendingRequest();
+  EXPECT_EQ(0, request->request.load_flags & net::LOAD_BYPASS_PROXY);
+  const GURL original_url(request->request.url);
+  const std::string upload_data(network::GetUploadData(request->request));
 
   // Generate a callback with a valid http response, containing a charset in the
   // Content-type header.
-  SendResponse(fetcher, net::OK, 200, std::string());
-  base::RunLoop().RunUntilIdle();
-}
-
-TEST_F(DeviceManagementServiceTest, AcceptMimeTypeWithoutCharsetFromProxy) {
-  // Make a request and expect that it will succeed.
-  EXPECT_CALL(*this, OnJobDone(_, _, _)).Times(1);
-
-  std::unique_ptr<DeviceManagementRequestJob> request_job(
-      StartRegistrationJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
-  EXPECT_EQ(0, fetcher->GetLoadFlags() & net::LOAD_BYPASS_PROXY);
-  const GURL original_url(fetcher->GetOriginalURL());
-  const std::string upload_data(fetcher->upload_data());
-  fetcher->set_was_fetched_via_proxy(true);
-  scoped_refptr<net::HttpResponseHeaders> headers =
-      base::MakeRefCounted<net::HttpResponseHeaders>(
-          std::string() /* raw_headers */);
-  headers->ReplaceStatusLine("HTTP/1.1 200 OK");
-  headers->AddHeader("Content-type: application/x-protobuffer");
-  fetcher->set_response_headers(headers);
-
-  // Generate a callback with a valid http response and a valid Content-type
-  // header.
-  SendResponse(fetcher, net::OK, 200, std::string());
+  SendResponse(net::OK, 200, std::string(), "application/x-protobuffer",
+               true /* was_fetched_via_proxy */);
   base::RunLoop().RunUntilIdle();
 }
 
@@ -944,30 +905,25 @@
 
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartRegistrationJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
   // Not a retry.
-  CheckURLAndQueryParams(fetcher->GetOriginalURL(),
-                         dm_protocol::kValueRequestRegister, kClientID, "");
-  const std::string original_upload_data(fetcher->upload_data());
+  CheckURLAndQueryParams(request, dm_protocol::kValueRequestRegister, kClientID,
+                         "");
+  const std::string original_upload_data(
+      network::GetUploadData(request->request));
 
   // Make it fail with ERR_NETWORK_CHANGED.
-  fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED,
-                                            net::ERR_NETWORK_CHANGED));
-  fetcher->set_url(GURL(kServiceUrl));
-  fetcher->delegate()->OnURLFetchComplete(fetcher);
+  SendResponse(net::ERR_NETWORK_CHANGED, 0, std::string());
   base::RunLoop().RunUntilIdle();
 
   // Verify that a new URLFetcher was started that retries this job, after
   // having called OnJobRetry.
   Mock::VerifyAndClearExpectations(this);
-  fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
-  EXPECT_EQ(original_upload_data, fetcher->upload_data());
-  EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher->GetStatus().status());
+  request = GetPendingRequest(1);
+  ASSERT_TRUE(request);
+  EXPECT_EQ(original_upload_data, network::GetUploadData(request->request));
   // Retry with last error net::ERR_NETWORK_CHANGED.
-  CheckURLAndQueryParams(fetcher->GetOriginalURL(),
-                         dm_protocol::kValueRequestRegister, kClientID,
+  CheckURLAndQueryParams(request, dm_protocol::kValueRequestRegister, kClientID,
                          std::to_string(net::ERR_NETWORK_CHANGED));
 }
 
@@ -981,30 +937,25 @@
 
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartPolicyFetchJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
+  auto* request = GetPendingRequest();
   // Not a retry.
-  CheckURLAndQueryParams(fetcher->GetOriginalURL(),
-                         dm_protocol::kValueRequestPolicy, kClientID, "");
-  const std::string original_upload_data(fetcher->upload_data());
+  CheckURLAndQueryParams(request, dm_protocol::kValueRequestPolicy, kClientID,
+                         "");
+  const std::string original_upload_data(
+      network::GetUploadData(request->request));
 
   // Make it fail with ERR_NETWORK_CHANGED.
-  fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED,
-                                            net::ERR_NETWORK_CHANGED));
-  fetcher->set_url(GURL(kServiceUrl));
-  fetcher->delegate()->OnURLFetchComplete(fetcher);
+  SendResponse(net::ERR_NETWORK_CHANGED, 0, std::string());
   base::RunLoop().RunUntilIdle();
 
   // Verify that a new URLFetcher was started that retries this job, after
   // having called OnJobRetry.
   Mock::VerifyAndClearExpectations(this);
-  fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
-  EXPECT_EQ(original_upload_data, fetcher->upload_data());
-  EXPECT_EQ(net::URLRequestStatus::SUCCESS, fetcher->GetStatus().status());
+  request = GetPendingRequest(1);
+  ASSERT_TRUE(request);
+  EXPECT_EQ(original_upload_data, network::GetUploadData(request->request));
   // Retry with last error net::ERR_NETWORK_CHANGED.
-  CheckURLAndQueryParams(fetcher->GetOriginalURL(),
-                         dm_protocol::kValueRequestPolicy, kClientID,
+  CheckURLAndQueryParams(request, dm_protocol::kValueRequestPolicy, kClientID,
                          std::to_string(net::ERR_NETWORK_CHANGED));
 }
 
@@ -1015,38 +966,29 @@
   // Simulate 3 failed network requests.
   for (int i = 0; i < 3; ++i) {
     // Make the current fetcher fail with ERR_NETWORK_CHANGED.
-    net::TestURLFetcher* fetcher = GetFetcher();
-    ASSERT_TRUE(fetcher);
+    auto* request = GetPendingRequest(i);
     EXPECT_CALL(*this, OnJobDone(_, _, _)).Times(0);
     EXPECT_CALL(*this, OnJobRetry(_));
-    fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED,
-                                              net::ERR_NETWORK_CHANGED));
-    fetcher->set_url(GURL(kServiceUrl));
     if (i == 0) {
       // Not a retry.
-      CheckURLAndQueryParams(fetcher->GetOriginalURL(),
-                             dm_protocol::kValueRequestRegister, kClientID, "");
+      CheckURLAndQueryParams(request, dm_protocol::kValueRequestRegister,
+                             kClientID, "");
     } else {
       // Retry with last error net::ERR_NETWORK_CHANGED.
-      CheckURLAndQueryParams(fetcher->GetOriginalURL(),
-                             dm_protocol::kValueRequestRegister, kClientID,
+      CheckURLAndQueryParams(request, dm_protocol::kValueRequestRegister,
+                             kClientID,
                              std::to_string(net::ERR_NETWORK_CHANGED));
     }
-    fetcher->delegate()->OnURLFetchComplete(fetcher);
+    SendResponse(net::ERR_NETWORK_CHANGED, 0, std::string());
     base::RunLoop().RunUntilIdle();
     Mock::VerifyAndClearExpectations(this);
   }
 
   // At the next failure the DeviceManagementService should give up retrying and
   // pass the error code to the job's owner.
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
   EXPECT_CALL(*this, OnJobDone(DM_STATUS_REQUEST_FAILED, _, _));
   EXPECT_CALL(*this, OnJobRetry(_)).Times(0);
-  fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED,
-                                            net::ERR_NETWORK_CHANGED));
-  fetcher->set_url(GURL(kServiceUrl));
-  fetcher->delegate()->OnURLFetchComplete(fetcher);
+  SendResponse(net::ERR_NETWORK_CHANGED, 0, std::string());
   base::RunLoop().RunUntilIdle();
   Mock::VerifyAndClearExpectations(this);
 }
@@ -1058,14 +1000,9 @@
 
   std::unique_ptr<DeviceManagementRequestJob> request_job(
       StartRegistrationJob());
-  net::TestURLFetcher* fetcher = GetFetcher();
-  ASSERT_TRUE(fetcher);
 
   // Make it fail with ERR_NETWORK_CHANGED.
-  fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED,
-                                            net::ERR_NETWORK_CHANGED));
-  fetcher->set_url(GURL(kServiceUrl));
-  fetcher->delegate()->OnURLFetchComplete(fetcher);
+  SendResponse(net::ERR_NETWORK_CHANGED, 0, std::string());
 
   // Before we retry, cancel the job
   request_job.reset();
diff --git a/components/policy/core/common/cloud/mock_device_management_service.cc b/components/policy/core/common/cloud/mock_device_management_service.cc
index 9dd25d0..4172146 100644
--- a/components/policy/core/common/cloud/mock_device_management_service.cc
+++ b/components/policy/core/common/cloud/mock_device_management_service.cc
@@ -7,7 +7,7 @@
 #include "base/macros.h"
 #include "base/strings/string_util.h"
 #include "net/base/net_errors.h"
-#include "net/url_request/url_request_context_getter.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
 
 using testing::Action;
 
diff --git a/components/policy/core/common/cloud/mock_device_management_service.h b/components/policy/core/common/cloud/mock_device_management_service.h
index 71b2bee8..9c8ddc0 100644
--- a/components/policy/core/common/cloud/mock_device_management_service.h
+++ b/components/policy/core/common/cloud/mock_device_management_service.h
@@ -48,7 +48,7 @@
 
   typedef DeviceManagementRequestJob* CreateJobFunction(
       DeviceManagementRequestJob::JobType,
-      const scoped_refptr<net::URLRequestContextGetter>&);
+      scoped_refptr<network::SharedURLLoaderFactory>);
 
   MOCK_METHOD2(CreateJob, CreateJobFunction);
   MOCK_METHOD6(
diff --git a/content/browser/speech/speech_recognition_engine_unittest.cc b/content/browser/speech/speech_recognition_engine_unittest.cc
index c542e3f..e5cc094 100644
--- a/content/browser/speech/speech_recognition_engine_unittest.cc
+++ b/content/browser/speech/speech_recognition_engine_unittest.cc
@@ -500,7 +500,7 @@
 const network::TestURLLoaderFactory::PendingRequest*
 SpeechRecognitionEngineTest::GetUpstreamRequest() {
   for (const auto& pending_request : *url_loader_factory_.pending_requests()) {
-    if (pending_request.url.spec().find("/up") != std::string::npos)
+    if (pending_request.request.url.spec().find("/up") != std::string::npos)
       return &pending_request;
   }
   return nullptr;
@@ -509,7 +509,7 @@
 const network::TestURLLoaderFactory::PendingRequest*
 SpeechRecognitionEngineTest::GetDownstreamRequest() {
   for (const auto& pending_request : *url_loader_factory_.pending_requests()) {
-    if (pending_request.url.spec().find("/down") != std::string::npos)
+    if (pending_request.request.url.spec().find("/down") != std::string::npos)
       return &pending_request;
   }
   return nullptr;
@@ -708,16 +708,17 @@
       const network::TestURLLoaderFactory::PendingRequest* upstream_request =
           GetUpstreamRequest();
       EXPECT_TRUE(upstream_request);
-      EXPECT_TRUE(upstream_request->request_body);
-      EXPECT_EQ(1u, upstream_request->request_body->elements()->size());
-      EXPECT_EQ(network::DataElement::TYPE_CHUNKED_DATA_PIPE,
-                (*upstream_request->request_body->elements())[0].type());
+      EXPECT_TRUE(upstream_request->request.request_body);
+      EXPECT_EQ(1u, upstream_request->request.request_body->elements()->size());
+      EXPECT_EQ(
+          network::DataElement::TYPE_CHUNKED_DATA_PIPE,
+          (*upstream_request->request.request_body->elements())[0].type());
       network::TestURLLoaderFactory::PendingRequest* mutable_upstream_request =
           const_cast<network::TestURLLoaderFactory::PendingRequest*>(
               upstream_request);
-      chunked_data_pipe_getter_ =
-          (*mutable_upstream_request->request_body->elements_mutable())[0]
-              .ReleaseChunkedDataPipeGetter();
+      chunked_data_pipe_getter_ = (*mutable_upstream_request->request
+                                        .request_body->elements_mutable())[0]
+                                      .ReleaseChunkedDataPipeGetter();
     }
     mojo::DataPipe data_pipe;
     chunked_data_pipe_getter_->StartReading(
diff --git a/content/browser/speech/speech_recognizer_impl_unittest.cc b/content/browser/speech/speech_recognizer_impl_unittest.cc
index c61bc853..0ef14a5d 100644
--- a/content/browser/speech/speech_recognizer_impl_unittest.cc
+++ b/content/browser/speech/speech_recognizer_impl_unittest.cc
@@ -142,7 +142,8 @@
       const char* url_substring) WARN_UNUSED_RESULT {
     for (const auto& pending_request :
          *url_loader_factory_.pending_requests()) {
-      if (pending_request.url.spec().find(url_substring) != std::string::npos) {
+      if (pending_request.request.url.spec().find(url_substring) !=
+          std::string::npos) {
         *pending_request_out = &pending_request;
         return true;
       }
@@ -419,16 +420,17 @@
       base::RunLoop().RunUntilIdle();
       const network::TestURLLoaderFactory::PendingRequest* upstream_request;
       ASSERT_TRUE(GetUpstreamRequest(&upstream_request));
-      ASSERT_TRUE(upstream_request->request_body);
-      ASSERT_EQ(1u, upstream_request->request_body->elements()->size());
-      ASSERT_EQ(network::DataElement::TYPE_CHUNKED_DATA_PIPE,
-                (*upstream_request->request_body->elements())[0].type());
+      ASSERT_TRUE(upstream_request->request.request_body);
+      ASSERT_EQ(1u, upstream_request->request.request_body->elements()->size());
+      ASSERT_EQ(
+          network::DataElement::TYPE_CHUNKED_DATA_PIPE,
+          (*upstream_request->request.request_body->elements())[0].type());
       network::TestURLLoaderFactory::PendingRequest* mutable_upstream_request =
           const_cast<network::TestURLLoaderFactory::PendingRequest*>(
               upstream_request);
-      chunked_data_pipe_getter =
-          (*mutable_upstream_request->request_body->elements_mutable())[0]
-              .ReleaseChunkedDataPipeGetter();
+      chunked_data_pipe_getter = (*mutable_upstream_request->request
+                                       .request_body->elements_mutable())[0]
+                                     .ReleaseChunkedDataPipeGetter();
       chunked_data_pipe_getter->StartReading(
           std::move(data_pipe.producer_handle));
     }
@@ -485,7 +487,8 @@
   // Issue the network callback to complete the process.
   const network::TestURLLoaderFactory::PendingRequest* downstream_request;
   ASSERT_TRUE(GetDownstreamRequest(&downstream_request));
-  url_loader_factory_.AddResponse(downstream_request->url.spec(), msg_string);
+  url_loader_factory_.AddResponse(downstream_request->request.url.spec(),
+                                  msg_string);
   base::RunLoop().RunUntilIdle();
 
   EXPECT_TRUE(recognition_ended_);
@@ -539,7 +542,7 @@
   const network::TestURLLoaderFactory::PendingRequest* pending_request;
   ASSERT_TRUE(GetUpstreamRequest(&pending_request));
   url_loader_factory_.AddResponse(
-      pending_request->url, network::ResourceResponseHead(), "",
+      pending_request->request.url, network::ResourceResponseHead(), "",
       network::URLLoaderCompletionStatus(net::ERR_CONNECTION_REFUSED));
 
   base::RunLoop().RunUntilIdle();
@@ -576,7 +579,7 @@
   const char kHeaders[] = "HTTP/1.0 500 Internal Server Error";
   response.headers = base::MakeRefCounted<net::HttpResponseHeaders>(
       net::HttpUtil::AssembleRawHeaders(kHeaders, base::size(kHeaders)));
-  url_loader_factory_.AddResponse(pending_request->url, response, "",
+  url_loader_factory_.AddResponse(pending_request->request.url, response, "",
                                   network::URLLoaderCompletionStatus());
 
   base::RunLoop().RunUntilIdle();
diff --git a/services/network/test/test_url_loader_factory.cc b/services/network/test/test_url_loader_factory.cc
index aaa3c99..e92bf79 100644
--- a/services/network/test/test_url_loader_factory.cc
+++ b/services/network/test/test_url_loader_factory.cc
@@ -14,21 +14,6 @@
 
 namespace network {
 
-namespace {
-
-ResourceResponseHead CreateResourceResponseHead(
-    net::HttpStatusCode http_status) {
-  ResourceResponseHead head;
-  std::string headers(base::StringPrintf(
-      "HTTP/1.1 %d %s\nContent-type: text/html\n\n",
-      static_cast<int>(http_status), net::GetHttpReasonPhrase(http_status)));
-  head.headers = new net::HttpResponseHeaders(
-      net::HttpUtil::AssembleRawHeaders(headers.c_str(), headers.size()));
-  return head;
-}
-
-}  // namespace
-
 TestURLLoaderFactory::PendingRequest::PendingRequest() = default;
 TestURLLoaderFactory::PendingRequest::~PendingRequest() = default;
 
@@ -59,7 +44,7 @@
   responses_[url] = response;
 
   for (auto it = pending_requests_.begin(); it != pending_requests_.end();) {
-    if (CreateLoaderAndStartInternal(it->url, it->client.get())) {
+    if (CreateLoaderAndStartInternal(it->request.url, it->client.get())) {
       it = pending_requests_.erase(it);
     } else {
       ++it;
@@ -81,9 +66,9 @@
                                      int* load_flags_out) {
   base::RunLoop().RunUntilIdle();
   for (const auto& candidate : pending_requests_) {
-    if (candidate.url == url) {
+    if (candidate.request.url == url) {
       if (load_flags_out)
-        *load_flags_out = candidate.load_flags;
+        *load_flags_out = candidate.request.load_flags;
       return !candidate.client.encountered_error();
     }
   }
@@ -123,10 +108,8 @@
     return;
 
   PendingRequest pending_request;
-  pending_request.url = url_request.url;
-  pending_request.load_flags = url_request.load_flags;
   pending_request.client = std::move(client);
-  pending_request.request_body = std::move(url_request.request_body);
+  pending_request.request = url_request;
   pending_requests_.push_back(std::move(pending_request));
 }
 
@@ -160,6 +143,18 @@
 }
 
 // static
+ResourceResponseHead TestURLLoaderFactory::CreateResourceResponseHead(
+    net::HttpStatusCode http_status) {
+  ResourceResponseHead head;
+  std::string headers(base::StringPrintf(
+      "HTTP/1.1 %d %s\nContent-type: text/html\n\n",
+      static_cast<int>(http_status), net::GetHttpReasonPhrase(http_status)));
+  head.headers = new net::HttpResponseHeaders(
+      net::HttpUtil::AssembleRawHeaders(headers.c_str(), headers.size()));
+  return head;
+}
+
+// static
 void TestURLLoaderFactory::SimulateResponseImpl(
     mojom::URLLoaderClient* client,
     TestURLLoaderFactory::Redirects redirects,
diff --git a/services/network/test/test_url_loader_factory.h b/services/network/test/test_url_loader_factory.h
index 5aca2f6..bbfd6cd 100644
--- a/services/network/test/test_url_loader_factory.h
+++ b/services/network/test/test_url_loader_factory.h
@@ -11,12 +11,11 @@
 #include "base/macros.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "net/http/http_status_code.h"
+#include "services/network/public/cpp/resource_request.h"
 #include "services/network/public/mojom/url_loader_factory.mojom.h"
 
 namespace network {
 
-class ResourceRequestBody;
-
 // A helper class to ease testing code that uses URLLoader interface. A test
 // would pass this factory instead of the production factory to code, and
 // would prime it with response data for arbitrary URLs.
@@ -28,10 +27,8 @@
     PendingRequest(PendingRequest&& other);
     PendingRequest& operator=(PendingRequest&& other);
 
-    GURL url;
-    int load_flags;
     mojom::URLLoaderClientPtr client;
-    scoped_refptr<ResourceRequestBody> request_body;
+    ResourceRequest request;
   };
 
   TestURLLoaderFactory();
@@ -83,6 +80,9 @@
                                std::string content,
                                int net_error = net::OK);
 
+  static ResourceResponseHead CreateResourceResponseHead(
+      net::HttpStatusCode http_status);
+
   // mojom::URLLoaderFactory implementation.
   void CreateLoaderAndStart(mojom::URLLoaderRequest request,
                             int32_t routing_id,
diff --git a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
index a6eee82..1aa1e64f 100644
--- a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
+++ b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
@@ -24,20 +24,11 @@
 # https://crbug.com/844950
 # https://crbug.com/844951
 # https://crbug.com/844952
--CloudPolicyManagerTest.Register
--CloudPolicyManagerTest.RegisterFailsWithRetries
--CloudPolicyManagerTest.RegisterWithRetry
--CloudPolicyTest.FetchPolicy
--CloudPolicyTest.InvalidatePolicy
 -ComponentCloudPolicyTest.FetchExtensionPolicy
 -ComponentCloudPolicyTest.InstallNewExtension
 -ComponentCloudPolicyTest.SignOutAndBackIn
 -ComponentCloudPolicyTest.UpdateExtensionPolicy
 -KeyRotationComponentCloudPolicyTest.Basic
--MachineLevelUserCloudPolicyEnrollmentTest.Test/2
--MachineLevelUserCloudPolicyEnrollmentTest.Test/3
--MachineLevelUserCloudPolicyServiceIntegrationTestInstance/MachineLevelUserCloudPolicyServiceIntegrationTest.ChromeDesktopReport/0
--MachineLevelUserCloudPolicyServiceIntegrationTestInstance/MachineLevelUserCloudPolicyServiceIntegrationTest.Registration/0
 
 # These tests uses net::URLRequestFilter (through TestRequestInterceptor) to
 # mock out network responses. Unclear if the code being tested uses
@@ -54,21 +45,6 @@
 -PolicyUpdateServiceTest.FailedUpdateRetries
 -PolicyUpdateServiceTest.PolicyCorruptedOnStartup
 
-# components/policy/core/common/cloud/device_management_service.cc still uses URLFetcher.
-# https://crbug.com/844950
--DeviceManagementServiceIntegrationTestInstance/DeviceManagementServiceIntegrationTest.ApiAuthCodeFetch/0
--DeviceManagementServiceIntegrationTestInstance/DeviceManagementServiceIntegrationTest.ApiAuthCodeFetch/1
--DeviceManagementServiceIntegrationTestInstance/DeviceManagementServiceIntegrationTest.AppInstallReport/0
--DeviceManagementServiceIntegrationTestInstance/DeviceManagementServiceIntegrationTest.AppInstallReport/1
--DeviceManagementServiceIntegrationTestInstance/DeviceManagementServiceIntegrationTest.AutoEnrollment/0
--DeviceManagementServiceIntegrationTestInstance/DeviceManagementServiceIntegrationTest.AutoEnrollment/1
--DeviceManagementServiceIntegrationTestInstance/DeviceManagementServiceIntegrationTest.PolicyFetch/0
--DeviceManagementServiceIntegrationTestInstance/DeviceManagementServiceIntegrationTest.PolicyFetch/1
--DeviceManagementServiceIntegrationTestInstance/DeviceManagementServiceIntegrationTest.Registration/0
--DeviceManagementServiceIntegrationTestInstance/DeviceManagementServiceIntegrationTest.Registration/1
--DeviceManagementServiceIntegrationTestInstance/DeviceManagementServiceIntegrationTest.Unregistration/0
--DeviceManagementServiceIntegrationTestInstance/DeviceManagementServiceIntegrationTest.Unregistration/1
-
 # Domain Reliability has yet to be hookup to the NetworkService.
 # https://crbug.com/853251
 -DomainReliabilityBrowserTest.Upload